سؤال

يعلق طلبي عند محاولة فتح قاعدة بيانات متزامنة لخزن البيانات (CDB) للقراءة:

#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

أظن أن بيئة قاعدة البيانات تعتقد أن عملية أخرى لديها قاعدة البيانات مفتوحة للكتابة. ومع ذلك ، لا يمكن أن يكون هذا هو الحال ، حيث أن جميع التطبيقات التي تصل إلى قاعدة البيانات تقوم بذلك عبر مكتبة واجهة ، كتبت أن تسجيل وظيفة الإنهاء عبر نظام ATEXIT () للتأكد من أن مقابض DB و DB_ENV مغلقة بشكل صحيح- وجميع التطبيقات التي تم تنفيذها مسبقًا تم إنهاءها بشكل طبيعي.

تفتح مكتبة الواجهة قاعدة البيانات مثل هذا:

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 */

لا يواجه هذا الرمز أي أخطاء.

تقوم مكتبة الواجهة أيضًا بتسجيل الكود التالي المراد تنفيذه عند خروج أي عملية تستخدم مكتبة الواجهة:

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 */
        }
    }
}

كما أشرت ، فإن جميع العمليات التي تم تنفيذها مسبقًا تستخدم مكتبة الواجهة التي تم إنهاءها بشكل طبيعي. كل هذه العمليات ذات الخيوط الواحدة.

أنا أستخدم الإصدار 4.8.24.nc من بيركلي دي بي على النظام الأساسي التالي:

$ 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

أيه أفكار؟

هل كانت مفيدة؟

المحلول

أعتذر أن هذا السؤال لم يتم إجراؤه لفترة طويلة. في المستقبل قد ترغب في نشر سؤالك إلى منتدى بيركلي دي بي على شبكة تكنولوجيا أوراكل هنا. هذا منتدى نشط للغاية حيث يتفاعل مطورو التطبيقات والهندسة والتطبيقات BDB مباشرة.

وصفك للمشكلة يتحقق من صحة افتراضك بأن بيئة BDB قد تعتقد أن الجدول مفتوح بالفعل للوصول إلى الكتابة. يمكنك استخدام DB_STAT للنظر في إحصائيات البيئة. من المحتمل أن تكون هذه مشكلة في التطبيق ، ولكن من المحتمل أن يساعدك أحد مهندسي BDB في عزل المشكلة في منتدى BDB المذكور أعلاه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top