]> git.sur5r.net Git - openldap/commitdiff
Renamed BDB_ID2ENTRY_PAGESIZE to just BDB_PAGESIZE; set it on each database
authorHoward Chu <hyc@openldap.org>
Wed, 28 Nov 2001 20:48:06 +0000 (20:48 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 28 Nov 2001 20:48:06 +0000 (20:48 +0000)
instead of just the id2entry db. It helps. I also found that tweaking the
environment (set_lg_bsize 2MB; set_cachesize 2MB) helps but those can be
taken care of in a DB_CONFIG file. Tweaked the bdb_bt_compare function; it
really only needs to be set on little-endian machines. (On big-endian machines
a lexical sort gives the same result as an integer sort.) Moved the final
checkpoint back to the dbenv_close, I think this leaves a cleaner log file.

servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/dbcache.c
servers/slapd/back-bdb/init.c

index 26eb103c5ca74fdba5a530f0359844aae0392c6e..e8f3a6ae8393f200a691824c2e1e817762bb42f5 100644 (file)
@@ -47,10 +47,11 @@ LDAP_BEGIN_DECL
 /* The bdb on-disk entry format is pretty space-inefficient. Average
  * sized user entries are 3-4K each. You need at least two entries to
  * fit into a single database page, more is better. 64K is BDB's
- * upper bound.
+ * upper bound. The same issues arise with IDLs in the index databases,
+ * but it's nearly impossible to avoid overflows there.
  */
-#ifndef BDB_ID2ENTRY_PAGESIZE
-#define        BDB_ID2ENTRY_PAGESIZE   16384
+#ifndef BDB_PAGESIZE
+#define        BDB_PAGESIZE    16384
 #endif
 
 #define BDB_INDICES            128
index a959c23505b30546f398abe713d3d7e1e72d3846..580506e807a24da1a1cece66d9b422f6da60f2ad 100644 (file)
@@ -68,6 +68,8 @@ bdb_db_cache(
                return rc;
        }
 
+       rc = db->bdi_db->set_pagesize( db->bdi_db, BDB_PAGESIZE );
+
        file = ch_malloc( strlen( name ) + sizeof(BDB_SUFFIX) );
        sprintf( file, "%s" BDB_SUFFIX, name );
 
index b7775be791349e54402d83117c15c7c6a938d751..6672c3029b0cf4f52b8a5435664a6f3d92ebce5f 100644 (file)
@@ -102,14 +102,26 @@ static void *lock_detect_task( void *arg )
 int
 bdb_bt_compare(
        DB *db, 
-       DBT *usrkey,
-       DBT *curkey
+       const DBT *usrkey,
+       const DBT *curkey
 )
 {
-       ID usr, cur;
-       memcpy(&usr, usrkey->data, sizeof(ID));
-       memcpy(&cur, curkey->data, sizeof(ID));
-       return usr - cur;
+       unsigned char *u, *c;
+       int i;
+
+       u = usrkey->data;
+       c = curkey->data;
+
+#ifdef WORDS_BIGENDIAN
+       for( i = 0; i < sizeof(ID); i++)
+#else
+       for( i = sizeof(ID)-1; i >= 0; i--)
+#endif
+       {
+               if( u[i] - c[i] )
+                       return u[i] - c[i];
+       }
+       return 0;
 }
 
 static int
@@ -232,9 +244,9 @@ bdb_db_open( BackendDB *be )
                if( i == BDB_ID2ENTRY ) {
                        rc = db->bdi_db->set_bt_compare( db->bdi_db,
                                bdb_bt_compare );
-                       rc = db->bdi_db->set_pagesize( db->bdi_db,
-                               BDB_ID2ENTRY_PAGESIZE );
                }
+               rc = db->bdi_db->set_pagesize( db->bdi_db, BDB_PAGESIZE );
+
                rc = db->bdi_db->open( db->bdi_db,
                        bdbi_databases[i].file,
                /*      bdbi_databases[i].name, */ NULL,
@@ -283,17 +295,6 @@ bdb_db_close( BackendDB *be )
        int rc;
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
 
-       /* force a checkpoint */
-       if( bdb->bi_txn ) {
-               rc = txn_checkpoint( bdb->bi_dbenv, 0, 0, DB_FORCE );
-               if( rc != 0 ) {
-                       Debug( LDAP_DEBUG_ANY,
-                               "bdb_db_destroy: txn_checkpoint failed: %s (%d)\n",
-                               db_strerror(rc), rc, 0 );
-                       return rc;
-               }
-       }
-
        while( bdb->bi_ndatabases-- ) {
                rc = bdb->bi_databases[bdb->bi_ndatabases]->bdi_db->close(
                        bdb->bi_databases[bdb->bi_ndatabases]->bdi_db, 0 );
@@ -308,6 +309,16 @@ bdb_db_destroy( BackendDB *be )
        int rc;
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
 
+       /* force a checkpoint */
+       if( bdb->bi_txn ) {
+               rc = txn_checkpoint( bdb->bi_dbenv, 0, 0, DB_FORCE );
+               if( rc != 0 ) {
+                       Debug( LDAP_DEBUG_ANY,
+                               "bdb_db_destroy: txn_checkpoint failed: %s (%d)\n",
+                               db_strerror(rc), rc, 0 );
+               }
+       }
+
        /* close db environment */
        if( bdb->bi_dbenv ) {
                rc = bdb->bi_dbenv->close( bdb->bi_dbenv, 0 );