Question

Mon application se bloque lorsque vous essayez d'ouvrir une base de données magasin de données simultanées (CDB) pour la lecture:

#0  0x0000003ad860b309 in pthread_cond_wait@@GLIBC_2.3.2 ()
   from /lib64/libpthread.so.0
#1  0x00007ffff7ce67de in __db_pthread_mutex_lock (env=0x610960, mutex=100)
    at /home/steve/ldm/package/src/Berkeley-DB/dist/../mutex/mut_pthread.c:318
#2  0x00007ffff7ce5ea5 in __db_tas_mutex_lock_int (env=0x610960, mutex=100, 
    nowait=0)
    at /home/steve/ldm/package/src/Berkeley-DB/dist/../mutex/mut_tas.c:218
#3  0x00007ffff7ce5c43 in __db_tas_mutex_lock (env=0x610960, mutex=100)
    at /home/steve/ldm/package/src/Berkeley-DB/dist/../mutex/mut_tas.c:248
#4  0x00007ffff7d3715b in __lock_id (env=0x610960, idp=0x0, lkp=0x610e88)
    at /home/steve/ldm/package/src/Berkeley-DB/dist/../lock/lock_id.c:68
#5  0x00007ffff7da1b4d in __fop_file_setup (dbp=0x610df0, ip=0x0, txn=0x0, 
    name=0x40b050 "registry.db", mode=0, flags=1024, retidp=0x7fffffffdd94)
    at /home/steve/ldm/package/src/Berkeley-DB/dist/../fileops/fop_util.c:243
#6  0x00007ffff7d70c8e in __db_open (dbp=0x610df0, ip=0x0, txn=0x0, 
    fname=0x40b050 "registry.db", dname=0x0, type=DB_BTREE, flags=1024, 
    mode=0, meta_pgno=0)
    at /home/steve/ldm/package/src/Berkeley-DB/dist/../db/db_open.c:176
#7  0x00007ffff7d673b2 in __db_open_pp (dbp=0x610df0, txn=0x0, 
    fname=0x40b050 "registry.db", dname=0x0, type=DB_BTREE, flags=1024, mode=0)
    at /home/steve/ldm/package/src/Berkeley-DB/dist/../db/db_iface.c:1146

Je soupçonne que l'environnement de base de données estime qu'un autre processus a la base de données ouverte pour l'écriture. Cela ne peut pas être le cas, cependant, comme toutes les applications qui accèdent à la base de données le font par l'intermédiaire d'une bibliothèque d'interface, j'ai écrit qui enregistre une fonction de terminaison via le système d'appel atexit () pour vous assurer que les deux poignées DB et DB_ENV sont bien fermés - et toutes les applications exécutées précédemment mis fin normalement.

La bibliothèque d'interface ouvre la base de données comme ceci:

int status;
Backend*    backend = (Backend*)malloc(sizeof(Backend));

if (NULL == backend) {
    ...
}
else {
    DB_ENV* env;

    if (status = db_env_create(&env, 0)) {
       ...
    }
    else {
        if (status = env->open(env, path,
                DB_CREATE | DB_INIT_CDB | DB_INIT_MPOOL, 0)) {
            ...
        }
        else {
            DB*     db;

            if (status = db_create(&db, env, 0)) {
            ...
            }
            else {
                if (status = db->open(db, NULL, DB_FILENAME, NULL,
                        DB_BTREE, forWriting ? DB_CREATE : DB_RDONLY, 0)) {
                    ...
                }
                else {
                    backend->db = db;
                }                   /* "db" opened */

                if (status)
                    db->close(db, 0);
           }                       /* "db" allocated */

           if (status) {
               env->close(env, 0);
               env = NULL;
           }
        }                       /* "env" opened */

        if (status && NULL != env)
            env->close(env, 0);
    }                               /* "env" allocated */

    if (status)
        free(backend);
}                                   /* "backend" allocated */

Ce code rencontre aucune erreur.

La bibliothèque d'interface enregistre également le code suivant à exécuter lorsque tout processus qui utilise les sorties de la bibliothèque d'interface:

if (NULL != backend) {
    DB*         db = backend->db;
    DB_ENV*     env = db->get_env(db);

    if (db->close(db, 0)) {
        ...
    }
    else {
        if (env->close(env, 0)) {
            ...
        }
        else {
            /* database properly closed */
        }
    }
}

Comme je l'ai indiqué, tous les processus précédemment exécutés qui utilisent la bibliothèque d'interface fin normalement. Tous ces processus sont mono-thread.

J'utilise 4.8.24.NC version de Berkeley DB sur la plate-forme suivante:

$ uname -a
Linux gilda.unidata.ucar.edu 2.6.27.41-170.2.117.fc10.x86_64 #1 SMP Thu Dec 10 10:36:29 EST 2009 x86_64 x86_64 x86_64 GNU/Linux

Toutes les idées?

Était-ce utile?

La solution

Toutes mes excuses que cette question est restée sans réponse depuis si longtemps. Dans l'avenir, vous voudrez peut-être poser votre question au Berkeley DB Forum sur Oracle Technology Network . Ceci est un forum très actif où le soutien, l'ingénierie et les développeurs d'applications BDB interagissent directement.

Votre description du problème valide votre hypothèse que l'environnement BDB peut penser que la table est déjà ouverte pour l'accès en écriture. Vous pouvez utiliser db_stat pour regarder les statistiques de l'environnement. Cela est probablement un problème d'application, mais l'un des ingénieurs BDB pourrait probablement vous aider à isoler le problème sur le forum BDB ci-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top