taka2の日記: portupgradeが動かない 1
FreeBSDを使ってるんですが、昨日あたりから、
% sudo portversion -OvL=
/usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:118:in `block (2 levels) in fill': MOVED file format error (PortsDB::MOVEDError)
from /usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:112:in `each'
…(以下略)
といったエラーが出て、portupgrade が動かなくなってる。
ちょっとググったところ、/usr/ports/MOVED が壊れてる(セパレータ | で区切られた項目数が狂ってる)と、このエラーが出るらしい。
% grep -v ^# /usr/ports/MOVED | sed -e 's/[^|]//g' | uniq -c
6415 |||
1 ||
% tail -2 /usr/ports/MOVED
news/husky-smapi||2014-08-19|Temporary, husky-smapi-devel will move here
news/husky-sqpack|2014-08-19|Obsolete due to husky-*-devel => husky-* migration
最後の一行を
news/husky-sqpack||2014-08-19|Obsolete due to husky-*-devel => husky-* migration
のように「|を二つ」に修正したら、portupgradeは無事動くようになりました。
FreeBSD機はどれも同じ症状なので、portsnap 元のサーバ側の問題でしょう。
そのうち修正されると思いますが、次回また同じ問題が起きた時のタメに備忘録がてら日記に書いておきます。
直ってた (スコア:1)
/usr/ports/MOVEDが壊れているという問題は、日本時間で8/20 03:21には修正済み [freebsd.org]だったっぽい。うちではcronで03:00に定期更新しているので、20日の更新には間に合わず21日の更新で反映されるはずで
実際、20日にはportupgradeが動かなくなっていた他のPCは、21日に再確認したら問題無く動きました。
どうやら、確認したマシンでだけ port tree の更新に失敗してた(1日古かった)もよう。
どちらかというとこっちの方が気になるので調べて見る。
port treeの更新は、cronで
とやってたました。
portsnap fetch(cron)が確実に終わってからupdateするように1時間の時間差を付けてたんですが、portsnap cron は、負荷分散のため1~3600秒の間のランダム時間sleepしてからfetchするので、運悪く3600秒近くsleepすると、04:00のupdate実行時点ではまだfetchが完了していないという事態になったみたい。
portsnapはコマンドを複数指定可能で、その場合は順次実行するようなので、cronの記述を複数に分ける必要ななく、
としておけば「ランダムsleep→fetch→update」という処理になってくれる。
というわけで、これでportsnapが更新されない問題は解決されたはず…