2012-05-09 187 views
0

我有以下創建Berkeley DB環境的程序。Berkeley DB SIGBUS錯誤

#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創建的一個),並重新運行該程序,打開環境時,它會得到一個SIGBUS(試映射一個不存在的文件)。有沒有什麼辦法可以避免使用他們的API或這是一個錯誤?

+0

爲什麼如果你檢查文件是否存在,如果沒有,創建一個空文件? –

+0

api不應該這樣做嗎? – florinp

回答

0

弗洛林普,我認爲這是伯克利DB的錯誤。它確實應該檢查環境中的文件在未來之前是否完好無損。

當然,對於這樣被刪除的CDP數據庫,你可以做的不多,除了刪除它並重新開始。如果這是一種常見的失敗類型,你必須處理,你可以用一個shell腳本來封裝你的程序,這個腳本會查找退出狀態135,然後烘烤舊的數據庫並重新啓動程序......但這可能是有風險的,這取決於你的應用程序。

您也可以移動到事務數據存儲。這會給你更多的恢復選項,並可能更少的SIGBUSes。 :)