POSKeyError: ’No blob file’を何とかする
Ploneのサイトでページがエラーになって見えないとのレポート。
event.logをみるとこんなエラーが。
(前略) File "/export/home/zope3/buildout-cache/eggs/ZODB3-3.8.3-py2.4-linux-x86_64.egg/ZODB/Connection.py", line 876, in _setstate obj._p_blob_committed = self._storage.loadBlob(obj._p_oid, serial) File "/export/home/zope3/buildout-cache/eggs/ZODB3-3.8.3-py2.4-linux-x86_64.egg/ZODB/Connection.py", line 1270, in loadBlob return self._storage.loadBlob(oid, serial) File "/export/home/zope3/buildout-cache/eggs/ZODB3-3.8.3-py2.4-linux-x86_64.egg/ZEO/ClientStorage.py", line 934, in loadBlob raise POSException.POSKeyError("No blob file", oid, serial) POSKeyError: 'No blob file'
うーむ、blobにしているファイルがないとのことです。実はこれと同じ現象は当該Ploneを別マシンへ移行した12月にも遭遇しています。
そのときは旧環境のBlobファイルをtarで固めて新環境へコピーしたんですが、Solarisに入っている純正のtarにはファイルパスが100文字までっていう制限があって、階層が深いところのBlobファイルを拾ってこられなかったことが原因でした。ちなみにgnutarにはそんな制限はないみたいなのでこのときはgnutarを利用して解決。
Blobファイルがないって言っているのでどのファイルがないのかを確認。エラーを吐いているClientStorage.pyのloadBlob()関数中にファイル名をログに出すようなコードを一行入れます。loadBlob()中の if self.shared_blob_dir:のところです。
if self.shared_blob_dir: # We're using a server shared cache. If the file isn't # here, it's not anywhere. log2("blob file %s" % blob_filename) raise POSException.POSKeyError("No blob file", oid, serial)
インスタンスを再起動。現象を再現させてファイルを確認すると確かにありません。しかし旧環境のBlobディレクトリにもありません。移動し損ねたってことではないようです。
うーんどうしよう
ダミーのファイルを作ってやるとどうだろう。ってことでログに現れたないぞっていうファイルをtouchでいくつか作成。
うまく動作しましたが、それでいいんだろうか。。この処置をやって3日ほど経過していますがいまのところなんともありません。