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

Jane Austine janeaustine50 at hotmail.com
Thu Aug 14 05:12:44 CEST 2003


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='test_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_MPOOL)
    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>
>>> from bsddb import dbshelve
>>> dbenv2=getDbEnv('test_dbenv2')
>>> d2=dbshelve.open(dbname,dbenv=dbenv2)
>>> try:
...     dbenv2.close()
... except db.DBError:
...     pass
... else:
...     assert 0
... 
>>>
>>> 
Exception bsddb._db.DBError: (0, 'DBEnv object has been closed') in
Segmentation fault
</code>




More information about the Python-list mailing list