bsddb module bug?: doesn't release locks and seg faults

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jane Austine

    bsddb module bug?: doesn't release locks and seg faults

    There is a test code named test_env_close in bsddb/test, but it
    doesn't test the case thoroughly. There seems to be a bug in closing
    the db environment first -- the lock is not released, and sometimes it
    seg-faults.

    Following is the code that shows this bug.

    <code>
    import os
    from bsddb import db

    dir,dbname='tes t_dbenv','test_ db'

    def getDbEnv(dir):
    try:
    os.mkdir(dir)
    except:
    pass
    dbenv = db.DBEnv()
    dbenv.open(dir, db.DB_INIT_CDB| db.DB_CREATE |db.DB_INIT_MPO OL)
    return dbenv

    def getDbHandler(db _env,db_name):
    d = db.DB(dbenv)
    d.open(db_name, db.DB_BTREE, db.DB_CREATE)
    return d

    dbenv=getDbEnv( dir)
    assert dbenv.lock_stat ()['nlocks']==0
    d=getDbHandler( dbenv,dbname)
    assert dbenv.lock_stat ()['nlocks']==1
    try:
    dbenv.close()
    except db.DBError:
    pass
    else:
    assert 0

    del d
    import gc
    gc.collect()
    dbenv=getDbEnv( dir)
    assert dbenv.lock_stat ()['nlocks']==0,'number of current locks should
    be 0' #this fails
    </code>

    If you close dbenv before db handler, the lock is not released.
    Moreover, try this with dbshelve and it segfaults.

    <code>[color=blue][color=green][color=darkred]
    >>> from bsddb import dbshelve
    >>> dbenv2=getDbEnv ('test_dbenv2')
    >>> d2=dbshelve.ope n(dbname,dbenv= dbenv2)
    >>> try:[/color][/color][/color]
    .... dbenv2.close()
    .... except db.DBError:
    .... pass
    .... else:
    .... assert 0
    ....[color=blue][color=green][color=darkred]
    >>>
    >>>[/color][/color][/color]
    Exception bsddb._db.DBErr or: (0, 'DBEnv object has been closed') in
    Segmentation fault
    </code>
Working...