2015年5月10日日曜日

Solaris11.2 pkgbuildでエラーのその後...


先日 @ftnk 先生にお願いしてあったpkgbuildのエラーの件で私なりに調べてみました。

Solaris の pkgbuild でエラーが出た場合の対処

で書いてあるように「/usr/lib/python2.6/vendor-packages/pkg/server/depot.py」にそれ系の設定があったのを思いだし、気にかかったので調べてみました。

でエラーの内容

Framework error: code: 28 reason: Operation too slow. Less than 1024 bytes/sec transfered the last 30


このエラーコード28とは「pycurl.E_OPERATION_TIMEOUTED」で定義されていて

>>> import pycurl
>>> pycurl.E_OPERATION_TIMEOUTED
28
>>>

こいつかraiseされて止まっているっぽい、コードでいうと

「/usr/lib/python2.6/vendor-packages/pkg/client/transport/engine.py:305」

    errors_seen += 1
else:
    timeout = en == pycurl.E_OPERATION_TIMEOUTED
    ex = tx.TransportFrameworkError(en, url, em,
        repourl=urlstem, uuid=uuid)
    repostats.record_error(decayable=ex.decayable,
        timeout=timeout)
    errors_seen += 1

ここでTransportFrameworkErrorが飛んできていました、でpycurlのTIMEOUT系のパラメータでグローバルな変数を調べて見ましたところ

PKG_CLIENT_CONNECT_TIMEOUT
PKG_CLIENT_LOWSPEED_TIMEOUT

という2パラメータを発見、このうちPKG_CLIENT_LOWSPEED_TIMEOUTはcurlの処理がストールしたかどうかを判断するための設定値らしくディフォルトだと

>>> pycurl.LOW_SPEED_TIME
20

で設定されていました、そしてこの値はオーバーライド出きるらしく以下のファイル、「/usr/lib/python2.6/vendor-packages/pkg/client/__init__.py」で定義されていて、

try:
# Number of seconds below lowspeed limit before # transaction is aborted. self.PKG_CLIENT_LOWSPEED_TIMEOUT = int(os.environ.get( "PKG_CLIENT_LOWSPEED_TIMEOUT", self.pkg_client_lowspeed_timeout_default)) except ValueError: self.PKG_CLIENT_LOWSPEED_TIMEOUT = \ self.pkg_client_lowspeed_timeout_default


このパラメータを環境変数にセットしておくとその値を使ってくれるっぽい、なので.bash_profileに以下を追加してみた

export PKG_CLIENT_LOWSPEED_TIMEOUT=3600

3600は適当

これで試した結果エラーが発生せずビルドに成功しました。
これでいいのかどうか不明ですが、非力なPCだった場合、この設定を増やした方が良さそうです、ちなみに調べた訳ではないのですが、この設定値を0に設定すると無限に待つような動きっぽいです。

たしかにローカルでpkgsendするならcurlじゃなくて直接ファイルに書いた方が早いような気もしますが、間違っていたらごめんなさい。

とりあえず @ftnk 先生ありがとうございました。



0 件のコメント:

コメントを投稿