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
#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 *
* *
*****************************************************************/
typedef DB *LDBM;
-#define DB_TYPE DB_BTREE
-
/* for ldbm_open */
#ifdef HAVE_BERKELEY_DB2
typedef DBC 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 )
/*****************************************************************
#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 )
#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 )
#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
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;
-
};
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,
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 );
/* 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 );
#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 ); */
/* 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;
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",
assert( id2entry != NULL );
bdb2i_cache_close( be, id2entry );
- li->li_dbcachewsync = 1;
id2entry = NULL;
return 0;
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 );
{
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 ) {
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;
}
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 {
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 );
{
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 );
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 );
/* 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 );
#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 ); */
/* 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;
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;
}
flags = LDBM_READER;
}
- li->li_dbcachewsync = 0;
+ li->li_dbwritesync = 0;
if ( (id2entry = ldbm_cache_open( be, "id2entry", LDBM_SUFFIX, flags ))
== NULL ) {
assert( id2entry != NULL );
ldbm_cache_close( be, id2entry );
- li->li_dbcachewsync = 1;
+ li->li_dbwritesync = 1;
id2entry = NULL;
return 0;
index default none
# index default pres,eq,approx
lastmod on
-dbcachenowsync
index cn,sn,uid pres,eq,approx
index default none
lastmod on
-dbcachenowsync
+dbnosync
+dbnolocking