FC2ブログ

PCで: Bitcoin Coreでのデータベース破損について

 しばらく前にふとBitcoinに興味が湧いて色々試してみたのですが、その後ずっと放っておいて……昨年秋頃か、久し振りにネットに同期させてたら、なんかDBが壊れてるよん♪とエラーを吐いて使えなくなってしまいました。
 色々調べてみたんですが、Web上の情報だと、大体がメモリかHDD(かSSD)がエラー起こしたんじゃない?でおしまい。
 まあ、私のところも以前書いたようにちょっと危ないことをやっているので(若干の工夫はしていますが)、そんなこともあるかも知れないと放置してました。

 最近、これまたふと試してみたくなって色々調べたら、なんだかハードのエラーではなく(いやそれも原因としてあるんでしょうが)、使っているソフトのバグもあるんじゃないかなーと思うようになりました。

 使っているのは、今はBitcoin Coreの0.12.1。ログにあったエラーはこんなものでした。
LevelDB read failure: Corruption: block checksum mismatch
Corruption: block checksum mismatch

 ところでそのエラー、段々変ってきて、こんな風になって、
*** System error while flushing: CDB: Error -30974, can't open database
やがて条件によってはログファイルでなく標準エラー出力にこんなのを出して終わるように。
************************
EXCEPTION: St13runtime_error
CDB: Error -30974, can't open database
bitcoin in Runaway exception

bitcoin-qt: /home/ubuntu/build/bitcoin/depends/x86_64-unknown-linux-gnu/include/boost/thread/pthread/recursive_mutex.hpp:113: void boost::recursive_mutex::lock(): Assertion `!pthread_mutex_lock(&m)' が失敗しました.
アボートしました

 まあ、最初のエラーはもしかするとハード要因かも知れません。
 でも、最近のは一旦全部作り直したデータで出ているし、しかも、かなり頻繁にエラーが出ます。作り直しても。それだけエラーが出ると、じゃあ同じディスクにある他のデータはどうして(気が付かないほど)まともなのか。Memtest86とかbadblocksとかS.M.A.R.T.の情報とかを見ても何にも異常がみつからないのに。
 そうなると、実は最初のがハードのせいっても怪しいのではないか?などと思ったり。

 色々やった結果わかったことは、まず"-disablewallet"をつけて実行すると全くエラーが出ないこと。ということは、walletデータのみでエラーが出ているということですね。
 ブロックやインデックスはLiveDBでwalletはBerkeley DBなので、なんかソフト要因くさい。でも、どうやら新しいBerkeley DBを使うわけにはいかないらしい。

 次にもうひとつ、ちょっと決定的と言えること。
 実は、冒頭に書いたように私がBitcoin使っているのは基本的には実験のためです。なので、送ったり受け取ったりを色々試すために、複数のwalletを使い、たまに切り替えています。ちなみにまあそういうことなので、いつも"-txindex"オプションをつけています。よくわからないけどきっと必要なんですよね???
 さて。
 あるとき、もう何度もブロックデータをダウンロードするのも嫌なので、リファレンス用に"-disablewallet"でブロックデータのみを保存しバックアップも作り、必要に応じてそこからコピーするか読み込むかすればいいじゃんという挙に出ました。
 そして、そのデータに壊れたwalletを放り込み、Bitcoin Core(bitcoin-qt)を動かしてみたのです。
 ちなみに、名前は"wallet.dat"ではありません。

 そうしたら、エラーの出方が変りました。それまでそのwalletでは"-30974"のエラーが出ていた(上記二つ目のエラー)のですが、それ以降は三つ目の異常終了をするようになりました。
 結局、"wallet.dat"というファイルがあるかどうかで動作が違うようなのです。"-wallet=XXX"の指定をしていてもです。
 つまり、walletのファイルを指定していても、デフォルトの名前のwalletファイルを参照しているのでは?ということです。

 壊れてしまったらしいwalletファイルは"-salvagewallet"で治すことができたようなので、スクリプトを組み、walletを切り替えるときには"wallet.dat"というシンボリックリンクを作り、リンク先を切り替えるという方法を取ることにしました。
 その後、walletを切り替えたりしても全くエラーが出なくなりました。

 というわけで、どうやらデフォルト以外のwalletファイルを使うとバグを叩いているような気がします。
 それまでもソースを眺めたりしていましたが、ハードのエラーかと思って見ていたのでデータのどこが壊れているかを探すという観点でしたが、どうもwalletのファイル名の処理を見直さないといけないようです。

 ところが、そう思って見てみると、今GitHub上にあるソースは0.12.1からかなり改変されています。そのwalletのファイル名の辺りだけでも。
 ということは、もう改修されているかも知れない?
 gitのログにはそれっぽいのはないような気がしますが、そういう可能性があると思うとなんだか真面目にソースを追い掛ける気がしません。回避策も見つけちゃったし。

 というわけで、この間の「乗り換ればいいじゃん」的な問題よりはマシとは言えそうな気がしますが、それでも大した内容のないお話でした。

コメント

非公開コメント

プロフィール

水響俊二

Author:水響俊二
水響 俊二 [MIZUKI Shunji]

暫定的に、18禁作品の感想などは裏サイトで書いています。
   

最新記事
最新コメント
カテゴリ
検索フォーム
リンク
RSSリンクの表示
月別アーカイブ
アクセス解析中