2012-05-09 3 views
0

J'ai le programme suivant qui crée un environnement Berkeley DB.Berkeley DB SIGBUS erreur

#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; 
} 

Si vous supprimez le fichier /tmp/cc/__db.002 (qui est l'un des indices Berkeley DB) crée et re-exécuter le programme, il obtiendra un SIGBUS lors de l'ouverture de l'environnement (essais pour mapper un fichier inexistant). Est-il possible d'éviter cela en utilisant leur API ou est-ce un bug?

+0

Pourquoi si vous vérifiez si le fichier existe et si non, créez un fichier vide? –

+0

L'API ne devrait-elle pas faire cela? – florinp

Répondre

0

florinp, je pense que c'est le bug de Berkeley DB. Il devrait vraiment vérifier que les fichiers dans l'environnement sont tous intacts avant d'aller de l'avant.

Bien sûr, vous ne pouvez pas faire grand-chose à propos d'une base de données CDP qui a été détruite de cette façon, à part le supprimer et recommencer. S'il s'agit d'un type d'échec commun, vous pouvez envelopper votre programme avec un script shell qui recherche l'état de sortie 135, puis rature l'ancienne base de données et redémarre le programme ... mais cela pourrait être risqué selon votre application .

Vous pouvez également passer à un magasin de données transactionnel. Cela vous donnerait plus d'options de récupération, et probablement moins de SIGBUS. :)

Questions connexes