2012年10月12日金曜日

(FreeBSD) portsnapで、Latest snapshot on server is older than what we already have!

先日のことです。



これまでcvsup mirrorサーバをローカルに立てておいて、それを使ってportsを最新に更新していたのですが、portsをcvsupで配布するのをやめるよ、というアナウンスが出てしまったので、そろそろportsnapへ乗り換えなければならぬ、ということになりました。



でもって、portsnapを実行して動作確認しているうちに、こんなメッセージがでました。

Looking up portsnap.FreeBSD.org mirrors... none found.
Fetching snapshot tag from portsnap.FreeBSD.org... done.
Latest snapshot on server is older than what we already have!
Cowardly refusing to downgrade from Wed Sep 19 09:11:07 JST 2012
to Tue Sep 18 17:32:04 JST 2012.

ネットからダウンロードしようとしたファイルが、すでに持っているファイルよりも古いぞ、っていうことですが。
え~っと、どういうこと?と3秒ほど悩んで、ピンときました。



  • http proxyサーバが、おそらく複数あって、


  • それぞれ個別にキャッシュしていて、


  • proxyサーバは、最新データを本当のサーバに問い合わせることなく、自身がもっているキャッシュデータを返している


  • ハズレなproxyサーバを使ってしまったとき、古いファイルを送り返されてしまう


そんなところでしょうか。



というわけで、portsnapの中を眺めてみます。ただのshスクリプトです。
どうやらここらしいな、というところを発見。

またfetchか・・・

どうもfetchは、出来が悪いです。http proxyサーバのcacheを使わせないようにするために、Pragma: no-cacheみたいのを出してやればいいはずですが、その機能がfetchには無いみたいです。



というわけで、fetchをwgetに置き換えました。



# Fetch a snapshot tag
fetch_tag() {
        rm -f snapshot.ssl tag.new



        echo ${NDEBUG} "Fetching snapshot tag from ${SERVERNAME}... "
        #fetch ${QUIETFLAG} http://${SERVERNAME}/$1.ssl         \
        /usr/local/bin/wget --no-cache ${QUIETFLAG} http://${SERVERNAME}/$1.ssl        \
            2>${QUIETREDIR} || true
        if ! [ -r $1.ssl ]; then
                echo "failed."
                return 1
        fi



一発目の、このファイルだけ、cacheを使わせないようにしておけば十分なようです。
それ以外のファイルは、cacheを使っても大丈夫。というか、そうしないと、portsnapのサーバに負担をかけすぎることになるので、cacheを使うべきでしょう。







20121011





0 件のコメント:

コメントを投稿