0

Berkeley DB 環境を作成する次のプログラムがあります。

#include <db.h>
#include <stdio.h>

int main()
{
DB_ENV *env=NULL;
DB* m_db=NULL;

if(db_env_create(&env,0)==-1) printf("fail create\n");
env->set_lk_max_locks(env, 100000);
env->set_lk_max_lockers(env, 100000);
env->set_lk_max_objects(env, 100000);

if(env->open(env,"/tmp/cc", DB_INIT_MPOOL | DB_INIT_CDB, 0)!=0) 
{
    printf("No env, creating one\n");
    if(env->open(env, "/tmp/cc", DB_CREATE | DB_INIT_MPOOL | DB_INIT_CDB, 0) == -1)
        printf("Failed creating env\n");
}

env->close(env,0);  

return 0;
}

/tmp/cc/__db.002 ファイル (Berkeley DB が作成するインデックスの 1 つ) を削除してプログラムを再実行すると、環境を開くときに SIGBUS が発生します (存在しないファイルをマップしようとします)。 )。API を使用してこれを回避する方法はありますか、それともバグですか?

4

1 に答える 1

0

florinp、これは Berkeley DB のバグだと思います。先に進む前に、環境内のファイルがすべて完全であることを確認する必要があります。

もちろん、このようにゴミ箱に入れられた CDP データベースに対してできることは、削除して最初からやり直す以外にありません。これが対処しなければならない一般的な障害タイプである場合は、終了ステータス 135 を探し、古いデータベースをローストしてプログラムを再起動するシェル スクリプトでプログラムをラップできますが、アプリケーションによっては危険な場合があります。 .

トランザクション データ ストアに移動することもできます。これにより、より多くの回復オプションが得られ、おそらく SIGBUS が少なくなります。:)

于 2012-07-07T16:40:06.543 に答える