[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: Tests fail on RedHat 6.0 (ITS#156)



Hi,

your problem is obviously caused by the following lines in db2/db/db.c,
part of the BerkeleyDB2 implementation of glibs 2.1:

	if (dbinfo != NULL && dbinfo->db_cachesize != 0) {
		__db_err(dbenv,
		    "cachesize will be ignored if environment exists");
		return (EINVAL);
	}

In other words, the reason lies in libraries/libldbm/ldbm.c:

    #ifdef HAVE_BERKELEY_DB2
	DB_INFO dbinfo;
	int result;

	memset( &dbinfo, 0, sizeof( dbinfo ));
	dbinfo.db_cachesize = dbcachesize;
	dbinfo.db_pagesize  = DEFAULT_DB_PAGE_SIZE;
	dbinfo.db_malloc    = ldbm_malloc;

	LDBM_LOCK;
	result = db_open( name, DB_TYPE, rw, mode, &ldbm_Env, &dbinfo, &ret );
	printf("db_open returns %d\n", result);
	LDBM_UNLOCK;

The above code will *always* send a Non-NULL ldbm_Env, thus any value
for dbcachesize different from 0 will cause the db2 library to return
EINVAL immediately.

I don't know why this problem arises suddenly, perhaps something
changed between glibc 2.0 and 2.1.

As a workaround I have changed

	dbinfo.db_cachesize = dbcachesize;

to

	dbinfo.db_cachesize = 0;

which is obviously not the ultimate solution, but I don't understand the
details of the BerkeleyDB implementation, in particular not why both
an "environment" (ldbm_Env) and the dbinfo variables are used.

An optimal solution would try to detect whether glibc 2.1 is used and
then enable some workaround.


Bye,

Jochen


-- 
Jochen Wiedmann						joe@ispsoft.de
How come the .45 is the worlds only functional		+49 7123 14887
point and click interface? (Alan Cox)