]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Reimplement LDBM_SYNC/LDBM_NOSYNC code (dbnosync).
authorKurt Zeilenga <kurt@openldap.org>
Thu, 23 Sep 1999 19:49:20 +0000 (19:49 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Thu, 23 Sep 1999 19:49:20 +0000 (19:49 +0000)
Old code applied sync flags to store(), however supported DBMs
require such flags to be specified during open().  The new
code now applies flags in ldbm_cache_open (which calls ldbm_open).
ldbm_cache_close() now calls ldbm_sync().  This will force
a updating of on-disk contents after each LDAP operation.
The old code either failed to sync the on-disk contents until
close or synced on every store.   Per LDBM operation syncing
*should* be safe enough... real data safety requires transactions.
Removed nosync option from BDB2 as it is not compatible with
txn support.
Also added code to disable DBM level locking as slapd is only
process acessing the databases (dbnolocking).

21 files changed:
doc/man/man5/slapd.conf.5
include/ldbm.h
servers/slapd/back-bdb2/back-bdb2.h
servers/slapd/back-bdb2/config.c
servers/slapd/back-bdb2/dn2id.c
servers/slapd/back-bdb2/id2entry.c
servers/slapd/back-bdb2/idl.c
servers/slapd/back-bdb2/init.c
servers/slapd/back-bdb2/tools.c
servers/slapd/back-bdb2/txn.c
servers/slapd/back-ldbm/back-ldbm.h
servers/slapd/back-ldbm/config.c
servers/slapd/back-ldbm/dbcache.c
servers/slapd/back-ldbm/dn2id.c
servers/slapd/back-ldbm/id2entry.c
servers/slapd/back-ldbm/idl.c
servers/slapd/back-ldbm/init.c
servers/slapd/back-ldbm/nextid.c
servers/slapd/back-ldbm/tools.c
tests/data/slapd-bdb2-repl-slave.conf
tests/data/slapd-master.conf

index 14b1b5649c1934715c62c947a62f5d50a24e5c27..6f92c102ba98d40dcc54f0274e52c5a673a3d5e1 100644 (file)
@@ -387,10 +387,13 @@ Specify the size in bytes of the in-memory cache associated
 with each open index file. If not supported by the underlying database 
 method, this option is ignored without comment.  The default is 100000 bytes.
 .TP
-.B dbcachenowsync
-Specify that database writes should not be immediately synchronized
-with in memory changes.  Enabling this option may improve performance
-at the expense of data security.
+.B dbnolocking
+Specify that no database locking should be performed.  
+Enabling this option may improve performance at the expense of data security.
+.B dbnosync
+Specify that on-disk database contents should not be immediately
+synchronized with in memory changes.  Enabling this option may improve
+performance at the expense of data security.
 .TP
 .B directory <directory>
 Specify the directory where the LDBM files containing the database and
index cf5a75e4292d8d7d24f101a554248dac99208b24..6f5b78affc87118672b2ed6175c6453e7b77c9fd 100644 (file)
 
 #include <ldap_cdefs.h>
 
-#ifdef LDBM_USE_DBBTREE
+#if defined( LDBM_USE_DBBTREE ) || defined( LDBM_USE_DBHASH )
 
 /*****************************************************************
  *                                                               *
- * use berkeley db btree package                                 *
+ * use berkeley db btree or hash package                         *
  *                                                               *
  *****************************************************************/
 
@@ -51,8 +51,6 @@ typedef DBT   Datum;
 typedef DB     *LDBM;
 
 
-#define DB_TYPE                DB_BTREE
-
 /* for ldbm_open */
 #ifdef HAVE_BERKELEY_DB2
 typedef DBC    LDBMCursor;
@@ -77,77 +75,25 @@ typedef int LDBMCursor;
 
 LDAP_END_DECL
 
-#  define LDBM_FAST    0
-
-#define LDBM_SUFFIX    ".dbb"
-#define LDBM_ORDERED   1
+/* for ldbm_open */
+#define LDBM_NOSYNC    0
+#define LDBM_SYNC      0
+#define LDBM_LOCKING   0
+#define LDBM_NOLOCKING 0
 
 /* for ldbm_insert */
 #define LDBM_INSERT    R_NOOVERWRITE
 #define LDBM_REPLACE   0
-#define LDBM_SYNC      0x80000000
-
-#elif defined( LDBM_USE_DBHASH )
-
-/*****************************************************************
- *                                                               *
- * use berkeley db hash package                                  *
- *                                                               *
- *****************************************************************/
-
-#include <sys/types.h>
-#include <limits.h>
-#include <fcntl.h>
-
-#ifdef HAVE_DB_185_H
-#      include <db_185.h>
-#else
-#      ifdef HAVE_DB1_DB_H
-#              include <db1/db.h>
-#      else
-#              include <db.h>
-#      endif
-#      ifdef LDBM_USE_DB2
-#              define R_NOOVERWRITE DB_NOOVERWRITE
-#              define DEFAULT_DB_PAGE_SIZE 1024
-#      endif
-#endif
-
-LDAP_BEGIN_DECL
-
-typedef DBT    Datum;
-#define dsize  size
-#define dptr   data
-
-typedef DB     *LDBM;
 
-#define DB_TYPE                DB_HASH
-
-/* for ldbm_open */
-#ifdef LDBM_USE_DB2
-typedef DBC    LDBMCursor;
-#      define LDBM_READER      DB_RDONLY
-#      define LDBM_WRITER      0x00000      /* hopefully */
-#      define LDBM_WRCREAT     (DB_NOMMAP|DB_CREATE|DB_THREAD)
-#      define LDBM_NEWDB       (DB_TRUNCATE|DB_CREATE|DB_THREAD)
+#ifdef LDBM_USE_DBBTREE
+#      define LDBM_ORDERED     1
+#      define LDBM_SUFFIX      ".dbb"
+#      define DB_TYPE          DB_BTREE
 #else
-typedef int LDBMCursor;
-#      define LDBM_READER      O_RDONLY
-#      define LDBM_WRITER      O_RDWR
-#      define LDBM_WRCREAT     (O_RDWR|O_CREAT)
-#      define LDBM_NEWDB       (O_RDWR|O_TRUNC|O_CREAT)
-#      define LDBM_FAST        0
+#      define LDBM_SUFFIX      ".dbh"
+#      define DB_TYPE          DB_HASH
 #endif
 
-LDAP_END_DECL
-
-#define LDBM_SUFFIX    ".dbh"
-
-/* for ldbm_insert */
-#define LDBM_INSERT    R_NOOVERWRITE
-#define LDBM_REPLACE   0
-#define LDBM_SYNC      0x80000000
-
 #elif defined( HAVE_GDBM )
 
 /*****************************************************************
@@ -173,14 +119,29 @@ LDAP_END_DECL
 #define LDBM_WRITER    GDBM_WRITER
 #define LDBM_WRCREAT   GDBM_WRCREAT
 #define LDBM_NEWDB     GDBM_NEWDB
-#define LDBM_FAST      GDBM_FAST
+
+#ifdef GDBM_FAST
+#define LDBM_NOSYNC    GDBM_FAST
+#else
+#define LDBM_NOSYNC    0
+#endif
+
+#ifdef GDBM_SYNC
+#define LDBM_SYNC      GDBM_SYNC
+#else
+#define LDBM_SYNC      0
+#endif
+
+#define LDBM_LOCKING   0
+#ifdef GDBM_NOLOCK
+#define LDBM_NOLOCKING GDBM_NOLOCK
+#endif
 
 #define LDBM_SUFFIX    ".gdbm"
 
 /* for ldbm_insert */
 #define LDBM_INSERT    GDBM_INSERT
 #define LDBM_REPLACE   GDBM_REPLACE
-#define LDBM_SYNC      0x80000000
 
 #elif defined( HAVE_MDBM )
 
@@ -209,15 +170,17 @@ LDAP_END_DECL
 #define LDBM_WRITER    O_RDWR
 #define LDBM_WRCREAT   (O_RDWR|O_CREAT)
 #define LDBM_NEWDB     (O_RDWR|O_TRUNC|O_CREAT)
-#define LDBM_FAST      0
+
+#define LDBM_SYNC      0
+#define LDBM_NOSYNC    0
+#define LDBM_LOCKING   0
+#define LDBM_NOLOCKING 0
 
 #define LDBM_SUFFIX    ".mdbm"
 
 /* for ldbm_insert */
 #define LDBM_INSERT    MDBM_INSERT
 #define LDBM_REPLACE   MDBM_REPLACE
-#define LDBM_SYNC      0x80000000
-
 
 #elif defined( HAVE_NDBM )
 
@@ -246,14 +209,17 @@ LDAP_END_DECL
 #define LDBM_WRITER    O_WRONLY
 #define LDBM_WRCREAT   (O_RDWR|O_CREAT)
 #define LDBM_NEWDB     (O_RDWR|O_TRUNC|O_CREAT)
-#define LDBM_FAST      0
+
+#define LDBM_NOSYNC    0
+#define LDBM_SYNC      0
+#define LDBM_NOLOCK    0
+#define LDBM_SYNC      0
 
 #define LDBM_SUFFIX    ".ndbm"
 
 /* for ldbm_insert */
 #define LDBM_INSERT    DBM_INSERT
 #define LDBM_REPLACE   DBM_REPLACE
-#define LDBM_SYNC      0
 
 #endif
 
index 4ebc54422c467322d91658eb87a83e9731da2ca5..082052d2ff1290d21683624ce482c069382e7913 100644 (file)
@@ -192,11 +192,9 @@ struct ldbminfo {
        struct cache            li_cache;
        Avlnode                 *li_attrs;
        int                     li_dbcachesize;
-       int                     li_dbcachewsync;
 
        /*  a list of all files of the database  */
        BDB2_TXN_HEAD           li_txn_head;
-
 };
 
 
index 87d739204ac518ad70ef2604e295fac931a49862..c21d3f5ca18f8c0a311eee142b36f1d44046c726 100644 (file)
@@ -163,10 +163,6 @@ bdb2i_back_db_config_internal(
                if ( li->li_dbcachesize < DEFAULT_DBCACHE_SIZE )
                        li->li_dbcachesize = DEFAULT_DBCACHE_SIZE;
 
-       /* no write sync */
-       } else if ( strcasecmp( argv[0], "dbcachenowsync" ) == 0 ) {
-               li->li_dbcachewsync = 0;
-
        /* anything else */
        } else {
                fprintf( stderr,
index 1d4599a826a87b38f0a05cbc7c81495fc161781e..8610a4c067a2c396840f2a1fecca8566fdd5716b 100644 (file)
@@ -43,8 +43,6 @@ bdb2i_dn2id_add(
        data.dsize = sizeof(ID);
 
        flags = LDBM_INSERT;
-       if ( li->li_dbcachewsync ) flags |= LDBM_SYNC;
-
        rc = bdb2i_cache_store( db, key, data, flags );
 
        free( key.dptr );
index 1a151fb1d6aa18d10a80f7dbe3758fe849440848..9d79590dcc44778874c738a3418531cb5242ca33 100644 (file)
@@ -45,7 +45,6 @@ bdb2i_id2entry_add( BackendDB *be, Entry *e )
 
        /* store it */
        flags = LDBM_REPLACE;
-       if ( li->li_dbcachewsync ) flags |= LDBM_SYNC;
        rc = bdb2i_cache_store( db, key, data, flags );
 
        ldap_pvt_thread_mutex_unlock( &entry2str_mutex );
index c062642d8e525227b29180e0eb2e3402b57d31f7..bae985a860db1524ad92c283982cf3bb60e127cb 100644 (file)
@@ -214,7 +214,6 @@ idl_store(
 #endif
 
        flags = LDBM_REPLACE;
-       if( li->li_dbcachewsync ) flags |= LDBM_SYNC;
        rc = bdb2i_cache_store( db, key, data, flags );
 
        /* Debug( LDAP_DEBUG_TRACE, "<= idl_store %d\n", rc, 0, 0 ); */
index 0eb5080460de57ce218991167f28474f2691f9bf..10ee85f14f886c660415bf6597e5cced71fb9e4f 100644 (file)
@@ -169,9 +169,6 @@ bdb2i_back_db_init_internal(
        /* default database cache size */
        li->li_dbcachesize = DEFAULT_DBCACHE_SIZE;
 
-       /* default cache mode is sync on write */
-       li->li_dbcachewsync = 1;
-
        /* default file creation mode */
        li->li_mode = DEFAULT_MODE;
 
index 662381dfb09f8b4b4929828585c2f711e5ccc032..d2ab6a70f6ba37f6c69f2971ce4a4ae12861133c 100644 (file)
@@ -42,8 +42,6 @@ int bdb2_tool_entry_open(
                flags = LDBM_READER;
        }
 
-       li->li_dbcachewsync = 0;
-
        if ( (id2entry = bdb2i_cache_open( be, "id2entry", BDB2_SUFFIX, flags ))
            == NULL ) {
                Debug( LDAP_DEBUG_ANY, "Could not open/create id2entry" BDB2_SUFFIX "\n",
@@ -63,7 +61,6 @@ int bdb2_tool_entry_close(
        assert( id2entry != NULL );
 
        bdb2i_cache_close( be, id2entry );
-       li->li_dbcachewsync = 1;
        id2entry = NULL;
 
        return 0;
index 2a711385d13e8c217137bafaf7550618f025ac3c..d4ddc384361e4ca6cbca8069bae9b82aa570074c 100644 (file)
@@ -481,8 +481,6 @@ bdb2i_put_nextid( BackendDB *be, ID id )
        data.size = sizeof( buf );
 
        flags = LDBM_REPLACE;
-       if ( li->li_dbcachewsync ) flags |= LDBM_SYNC;
-
        if (( rc = bdb2i_db_store( head->nextidFile, key, data, flags )) != 0 ) {
                Debug( LDAP_DEBUG_ANY, "next_id_write(%ld): store failed (%d)\n",
                        id, rc, 0 );
@@ -522,7 +520,7 @@ bdb2i_db_store( LDBM ldbm, Datum key, Datum data, int flags )
 {
        int     rc;
 
-       rc = (*ldbm->put)( ldbm, txnid, &key, &data, flags & ~LDBM_SYNC );
+       rc = (*ldbm->put)( ldbm, txnid, &key, &data, flags );
        rc = (-1 ) * rc;
 
        if ( txnid != NULL ) {
index cf381da96f4f0627df6e0cf0a347c32b568de4cc..1c1154ec3727fc00d5412e6d39b69c871f2b36e1 100644 (file)
@@ -138,8 +138,9 @@ struct ldbminfo {
        char                    *li_directory;
        Cache           li_cache;
        Avlnode                 *li_attrs;
+       int                     li_dblocking;   /* lock databases */
+       int                     li_dbwritesync; /* write sync */
        int                     li_dbcachesize;
-       int                     li_dbcachewsync;
        DBCache         li_dbcache[MAXDBCACHE];
        ldap_pvt_thread_mutex_t         li_dbcache_mutex;
        ldap_pvt_thread_cond_t          li_dbcache_cv;
index ef06a4fcc729e66300479246e1f5d41227fa3ed5..daad7e9b7ef49c69485a60023e72597a686c9b0f 100644 (file)
@@ -89,9 +89,15 @@ ldbm_back_db_config(
                }
                li->li_dbcachesize = atoi( argv[1] );
 
-       /* no write sync */
-       } else if ( strcasecmp( argv[0], "dbcachenowsync" ) == 0 ) {
-               li->li_dbcachewsync = 0;
+       /* no locking (not safe) */
+       } else if ( strcasecmp( argv[0], "dbnolocking" ) == 0 ) {
+               li->li_dblocking = 0;
+
+       /* no write sync (not safe) */
+       } else if ( ( strcasecmp( argv[0], "dbnosync" ) == 0 )
+               || ( strcasecmp( argv[0], "dbcachenowsync" ) == 0 ) )
+       {
+               li->li_dbwritesync = 0;
 
        /* anything else */
        } else {
index eecf2c954b3f39690dd24b7bc4e2afc9e8f21186..614a643bbeffcd3d1e9eb33d78ebc795f739b532 100644 (file)
@@ -42,6 +42,18 @@ ldbm_cache_open(
        sprintf( buf, "%s" LDAP_DIRSEP "%s%s",
                li->li_directory, name, suffix );
 
+       if( li->li_dblocking ) {
+               flags |= LDBM_LOCKING;
+       } else {
+               flags |= LDBM_NOLOCKING;
+       }
+       
+       if( li->li_dbwritesync ) {
+               flags |= LDBM_SYNC;
+       } else {
+               flags |= LDBM_NOSYNC;
+       }
+       
        Debug( LDAP_DEBUG_TRACE, "=> ldbm_cache_open( \"%s\", %d, %o )\n", buf,
            flags, li->li_mode );
 
@@ -135,6 +147,10 @@ ldbm_cache_close( Backend *be, DBCache *db )
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
 
+       if( li->li_dbwritesync ) {
+               ldbm_sync( db->dbc_db );
+       }
+
        ldap_pvt_thread_mutex_lock( &li->li_dbcache_mutex );
        if ( --db->dbc_refcnt == 0 ) {
                ldap_pvt_thread_cond_signal( &li->li_dbcache_cv );
index afa1c27de6d4c9c18e8b8321af44bba3eaabb32f..567ff24d0c5fed38a767403b689d5c7d65a3b23f 100644 (file)
@@ -48,8 +48,6 @@ dn2id_add(
        data.dsize = sizeof(ID);
 
        flags = LDBM_INSERT;
-       if ( li->li_dbcachewsync ) flags |= LDBM_SYNC;
-
        rc = ldbm_cache_store( db, key, data, flags );
 
        free( key.dptr );
index 53f52d85a52e6a1263627375869f1daac6078f33..f042e020445241292c601927cf27a49db5635356 100644 (file)
@@ -49,7 +49,6 @@ id2entry_add( Backend *be, Entry *e )
 
        /* store it */
        flags = LDBM_REPLACE;
-       if ( li->li_dbcachewsync ) flags |= LDBM_SYNC;
        rc = ldbm_cache_store( db, key, data, flags );
 
        ldap_pvt_thread_mutex_unlock( &entry2str_mutex );
index f528fa8665f044e43e00fdfc1dd16d81058f25c7..22093a78e607efbf5936b3ed00f8309d9e5d25b2 100644 (file)
@@ -217,7 +217,6 @@ idl_store(
 #endif
 
        flags = LDBM_REPLACE;
-       if( li->li_dbcachewsync ) flags |= LDBM_SYNC;
        rc = ldbm_cache_store( db, key, data, flags );
 
        /* Debug( LDAP_DEBUG_TRACE, "<= idl_store %d\n", rc, 0, 0 ); */
index d7b6345e9fe2da2ac4b06367850756c975980629..110647f7a3244ceb9f3750f125115e13ff06fb1f 100644 (file)
@@ -130,8 +130,11 @@ ldbm_back_db_init(
        /* default database cache size */
        li->li_dbcachesize = DEFAULT_DBCACHE_SIZE;
 
-       /* default cache mode is sync on write */
-       li->li_dbcachewsync = 1;
+       /* default db mode is with locking */ 
+       li->li_dblocking = 1;
+
+       /* default db mode is with write synchronization */ 
+       li->li_dbwritesync = 1;
 
        /* default file creation mode */
        li->li_mode = DEFAULT_MODE;
index ebe6f3897119b5cbab989be08a2c4f497ee0850c..19cca1c399b743d0ca4fd70d26d28815b1a0ce00 100644 (file)
@@ -77,8 +77,6 @@ next_id_write( Backend *be, ID id )
        data.dsize = sizeof(ID);
 
        flags = LDBM_REPLACE;
-       if( li->li_dbcachewsync ) flags |= LDBM_SYNC;
-
        if ( ldbm_cache_store( db, key, data, flags ) != 0 ) {
                id = NOID;
        }
index 840449e473d87fa702cb6a9ea688fe55d6cd959c..c36d82cf2360543bb653fb1c3432edc0b028b96b 100644 (file)
@@ -42,7 +42,7 @@ int ldbm_tool_entry_open(
                flags = LDBM_READER;
        }
 
-       li->li_dbcachewsync = 0;
+       li->li_dbwritesync = 0;
 
        if ( (id2entry = ldbm_cache_open( be, "id2entry", LDBM_SUFFIX, flags ))
            == NULL ) {
@@ -63,7 +63,7 @@ int ldbm_tool_entry_close(
        assert( id2entry != NULL );
 
        ldbm_cache_close( be, id2entry );
-       li->li_dbcachewsync = 1;
+       li->li_dbwritesync = 1;
        id2entry = NULL;
 
        return 0;
index 7e2ad2c6122450145f46d2aae3b227b4995b5fe7..a0554a20164ffd57414e5d91f01aa27866a18478 100644 (file)
@@ -29,4 +29,3 @@ index         cn,sn,uid       pres,eq,approx
 index          default         none
 # index                default         pres,eq,approx
 lastmod                on
-dbcachenowsync
index d1c2387e20f6ec09c7365a2ae2d0a8a86644b8e2..e9facfe8dcb69868885fc6a2ccb4126e54524278 100644 (file)
@@ -20,4 +20,5 @@ rootpw                secret
 index          cn,sn,uid       pres,eq,approx
 index          default         none
 lastmod                on
-dbcachenowsync
+dbnosync
+dbnolocking