2015-05-08 Fri

[別の年の同じ日: 2006 2007 2008 2009 2010 2011 2013

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

今回のお題はこれ。

karky7のブログ: Solaris11.2 pkgbuildでエラー
http://blog.karky7.com/2015/05/solaris112-pkgbuild.html

これ、貼られているログにあるように、publisher へ pkgsend しているのが timeout しているだけ。

pkgbuild: pkgsend: \'add\' failed for transaction ID \'1430692081_pkg%3A%2F%2Fiichiko3-spec%2Fdatabase%2Fmysql-cluster-gpl-74%407.4.6%2C5.11-0.11.2%3A20150503T222801Z\': 1: Framework error: code: 28 reason: Operation too slow. Less than 1024 bytes/sec transfered the last 30\\
 seconds
pkgbuild: URL: \'http://iichiko3-spec:80/add/0/1430692081_pkg%3A%2F%2Fiichiko3-spec%2Fdatabase%2Fmysql-cluster-gpl-74%407.4.6%2C5.11-0.11.2%3A20150503T222801Z/file\' (happened 3 times)
pkgbuild: 2: Framework error: code: 28 reason: Connection time-out
pkgbuild: URL: \'http://iichiko3-spec:80/add/0/1430692081_pkg%3A%2F%2Fiichiko3-spec%2Fdatabase%2Fmysql-cluster-gpl-74%407.4.6%2C5.11-0.11.2%3A20150503T222801Z/file\'
pkgbuild:


@karky7 が書いているように、
pkg/server の pkg/socket_timeout プロパティを変更してもよさそうだけど、
以前に試してダメだった(結局、別の方法で対処した)気もするので、
試してください。

(/usr/lib/python2.6/vendor-packages/pkg/server/depot.py で
slow connection 用に response.timeout を 3600 にしているので、
socket_timeout より、こっちの方な気もするけど、
publish に失敗するまでに 1 時間もかかったか覚えていない。)

別解として、publisher が localhost の場合、
パッケージのビルド時に publish に失敗するのは問題にせず、
あとから手で pkgsend する方法がある。
ポイントは publisher に対して pkgsend するのではなく、
PATH に対して pkgsend すること。

ログを見るとわかるとおり、パッケージビルド時のパッケージの publish は
~/packages/PKGMAPS/scripts 以下の script を叩いて行なわれている。

ログだと、この部分

pkgbuild: Calling script /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74_ips.sh


この script はこんな感じのはず。

#!/usr/bin/bash
export PKG_REPO=${PKGBUILD_IPS_SERVER:-http://localhost:10000/} 
pkgsend publish -s "$PKG_REPO" /export/home/karky7/packages/PKGMAPS/manifests/database%2Fmysql-cluster-gpl-74.manifest || exit 1


publisher を指定して、pkgsend に .manifest を渡しているだけなので、

$ PKGBUILD_IPS_SERVER=$(svcprop -p pkg/inst_root pkg/server) \
sh /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74_ips.sh



$ pkgsend publish -s $(svcprop -p pkg/inst_root pkg/server) \
/export/home/karky7/packages/PKGMAPS/manifests/database%2Fmysql-cluster-gpl-74.manifest


という感じで、publisher に対してではなく、
PATH に対して publish してあげればよい。

publisher が localhost でない場合は、
~/packages 以下にできるファイルを publisher に持って行って、
同じように pkgsend を実行すればよい。

ただし、manifest には PATH が書かれているので、
ビルドした環境と同じ PATH にしておいた方がよい。

もちろん、manifest に書かれている PATH を書き換えてしまうことも可能だけど、
面倒くさいので避けた方がよいかと。

(追記)

karky7のブログ: Solaris11.2 pkgbuildでエラーのその後...
http://blog.karky7.com/2015/05/solaris112-pkgbuild_10.html

ということで、@karky7 がさらに調べてた。