From: Howard Chu Date: Wed, 17 Aug 2011 00:09:24 +0000 (-0700) Subject: Getting basic functions compiling X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b38c87287794a914dd5e5cc9bf074209020e4fe6;p=thirdparty%2Fopenldap.git Getting basic functions compiling --- diff --git a/servers/slapd/back-mdb/back-mdb.h b/servers/slapd/back-mdb/back-mdb.h index 9e728da922..b32c8b9e3d 100644 --- a/servers/slapd/back-mdb/back-mdb.h +++ b/servers/slapd/back-mdb/back-mdb.h @@ -95,6 +95,7 @@ struct mdb_info { int mi_flags; #define MDB_IS_OPEN 0x01 #define MDB_DEL_INDEX 0x08 +#define MDB_RE_OPEN 0x10 }; #define mi_id2entry mi_databases[MDB_ID2ENTRY] diff --git a/servers/slapd/back-mdb/config.c b/servers/slapd/back-mdb/config.c index 5b26bece1f..d23c3388c5 100644 --- a/servers/slapd/back-mdb/config.c +++ b/servers/slapd/back-mdb/config.c @@ -28,31 +28,16 @@ #include "lutil.h" #include "ldap_rq.h" -#ifdef DB_DIRTY_READ -# define SLAP_MDB_ALLOW_DIRTY_READ -#endif - -#define mdb_cf_gen MDB_SYMBOL(cf_gen) -#define mdb_cf_cleanup MDB_SYMBOL(cf_cleanup) -#define mdb_checkpoint MDB_SYMBOL(checkpoint) -#define mdb_online_index MDB_SYMBOL(online_index) - static ConfigDriver mdb_cf_gen; enum { MDB_CHKPT = 1, - MDB_CONFIG, - MDB_CRYPTFILE, - MDB_CRYPTKEY, MDB_DIRECTORY, - MDB_NOSYNC, - MDB_DIRTYR, + MDB_DBNOSYNC, MDB_INDEX, - MDB_LOCKD, - MDB_SSTACK, + MDB_MAXSIZE, MDB_MODE, - MDB_PGSIZE, - MDB_CHECKSUM + MDB_SSTACK, }; static ConfigTable mdbcfg[] = { @@ -61,78 +46,23 @@ static ConfigTable mdbcfg[] = { "DESC 'Directory for database content' " "EQUALITY caseIgnoreMatch " "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL }, - { "cachefree", "size", 2, 2, 0, ARG_ULONG|ARG_OFFSET, - (void *)offsetof(struct mdb_info, bi_cache.c_minfree), - "( OLcfgDbAt:1.11 NAME 'olcDbCacheFree' " - "DESC 'Number of extra entries to free when max is reached' " - "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL }, - { "cachesize", "size", 2, 2, 0, ARG_ULONG|ARG_OFFSET, - (void *)offsetof(struct mdb_info, bi_cache.c_maxsize), - "( OLcfgDbAt:1.1 NAME 'olcDbCacheSize' " - "DESC 'Entry cache size in entries' " - "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL }, { "checkpoint", "kbyte> <[pres,eq,approx,sub]", 2, 3, 0, ARG_MAGIC|MDB_INDEX, mdb_cf_gen, "( OLcfgDbAt:0.2 NAME 'olcDbIndex' " "DESC 'Attribute index parameters' " "EQUALITY caseIgnoreMatch " "SYNTAX OMsDirectoryString )", NULL, NULL }, - { "linearindex", NULL, 1, 2, 0, ARG_ON_OFF|ARG_OFFSET, - (void *)offsetof(struct mdb_info, bi_linear_index), - "( OLcfgDbAt:1.7 NAME 'olcDbLinearIndex' " - "DESC 'Index attributes one at a time' " - "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL }, - { "lockdetect", "policy", 2, 2, 0, ARG_MAGIC|MDB_LOCKD, - mdb_cf_gen, "( OLcfgDbAt:1.8 NAME 'olcDbLockDetect' " - "DESC 'Deadlock detection algorithm' " - "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL }, + { "maxsize", "size", 2, 2, 0, ARG_INT|ARG_MAGIC|MDB_MODE, + mdb_cf_gen, "( OLcfgDbAt:12.1 NAME 'olcDbMaxSize' " + "DESC 'Maximum size of DB in bytes' " + "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL }, { "mode", "mode", 2, 2, 0, ARG_MAGIC|MDB_MODE, mdb_cf_gen, "( OLcfgDbAt:0.3 NAME 'olcDbMode' " "DESC 'Unix permissions of database files' " @@ -141,56 +71,32 @@ static ConfigTable mdbcfg[] = { mdb_cf_gen, "( OLcfgDbAt:1.9 NAME 'olcDbSearchStack' " "DESC 'Depth of search stack in IDLs' " "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL }, - { "shm_key", "key", 2, 2, 0, ARG_LONG|ARG_OFFSET, - (void *)offsetof(struct mdb_info, bi_shm_key), - "( OLcfgDbAt:1.10 NAME 'olcDbShmKey' " - "DESC 'Key for shared memory region' " - "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL }, { NULL, NULL, 0, 0, 0, ARG_IGNORED, NULL, NULL, NULL, NULL } }; static ConfigOCs mdbocs[] = { { -#ifdef MDB_HIER - "( OLcfgDbOc:1.2 " - "NAME 'olcHdbConfig' " - "DESC 'HDB backend configuration' " -#else - "( OLcfgDbOc:1.1 " - "NAME 'olcBdbConfig' " + "( OLcfgDbOc:12.1 " + "NAME 'olcMdbConfig' " "DESC 'MDB backend configuration' " -#endif "SUP olcDatabaseConfig " "MUST olcDbDirectory " - "MAY ( olcDbCacheSize $ olcDbCheckpoint $ olcDbConfig $ " - "olcDbCryptFile $ olcDbCryptKey $ " - "olcDbNoSync $ olcDbDirtyRead $ olcDbIDLcacheSize $ " - "olcDbIndex $ olcDbLinearIndex $ olcDbLockDetect $ " - "olcDbMode $ olcDbSearchStack $ olcDbShmKey $ " - "olcDbCacheFree $ olcDbDNcacheSize $ olcDbPageSize ) )", + "MAY ( olcDbCheckpoint $ " + "olcDbNoSync $ olcDbIndex $ olcDbMaxsize $ " + "olcDbMode $ olcDbSearchStack ) )", Cft_Database, mdbcfg }, { NULL, 0, NULL } }; -static slap_verbmasks mdb_lockd[] = { - { BER_BVC("default"), DB_LOCK_DEFAULT }, - { BER_BVC("oldest"), DB_LOCK_OLDEST }, - { BER_BVC("random"), DB_LOCK_RANDOM }, - { BER_BVC("youngest"), DB_LOCK_YOUNGEST }, - { BER_BVC("fewest"), DB_LOCK_MINLOCKS }, - { BER_BVNULL, 0 } -}; - -/* perform periodic checkpoints */ +/* perform periodic syncs */ static void * mdb_checkpoint( void *ctx, void *arg ) { struct re_s *rtask = arg; struct mdb_info *mdb = rtask->arg; - TXN_CHECKPOINT( mdb->bi_dbenv, mdb->bi_txn_cp_kbyte, - mdb->bi_txn_cp_min, 0 ); + mdb_env_sync( mdb->mi_dbenv, 0 ); ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); ldap_pvt_runqueue_stoptask( &slapd_rq, rtask ); ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); @@ -201,6 +107,7 @@ mdb_checkpoint( void *ctx, void *arg ) static void * mdb_online_index( void *ctx, void *arg ) { +#if 0 struct re_s *rtask = arg; BackendDB *be = rtask->arg; struct mdb_info *mdb = be->be_private; @@ -314,6 +221,7 @@ mdb_online_index( void *ctx, void *arg ) ldap_pvt_runqueue_remove( &slapd_rq, rtask ); ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); +#endif return NULL; } @@ -324,28 +232,13 @@ mdb_cf_cleanup( ConfigArgs *c ) struct mdb_info *mdb = c->be->be_private; int rc = 0; - if ( mdb->bi_flags & MDB_UPD_CONFIG ) { - if ( mdb->bi_db_config ) { - int i; - FILE *f = fopen( mdb->bi_db_config_path, "w" ); - if ( f ) { - for (i=0; mdb->bi_db_config[i].bv_val; i++) - fprintf( f, "%s\n", mdb->bi_db_config[i].bv_val ); - fclose( f ); - } - } else { - unlink( mdb->bi_db_config_path ); - } - mdb->bi_flags ^= MDB_UPD_CONFIG; - } - - if ( mdb->bi_flags & MDB_DEL_INDEX ) { + if ( mdb->mi_flags & MDB_DEL_INDEX ) { mdb_attr_flush( mdb ); - mdb->bi_flags ^= MDB_DEL_INDEX; + mdb->mi_flags ^= MDB_DEL_INDEX; } - if ( mdb->bi_flags & MDB_RE_OPEN ) { - mdb->bi_flags ^= MDB_RE_OPEN; + if ( mdb->mi_flags & MDB_RE_OPEN ) { + mdb->mi_flags ^= MDB_RE_OPEN; rc = c->be->bd_info->bi_db_close( c->be, &c->reply ); if ( rc == 0 ) rc = c->be->bd_info->bi_db_open( c->be, &c->reply ); @@ -374,7 +267,7 @@ mdb_cf_gen( ConfigArgs *c ) case MDB_MODE: { char buf[64]; struct berval bv; - bv.bv_len = snprintf( buf, sizeof(buf), "0%o", mdb->bi_dbenv_mode ); + bv.bv_len = snprintf( buf, sizeof(buf), "0%o", mdb->mi_dbenv_mode ); if ( bv.bv_len > 0 && bv.bv_len < sizeof(buf) ) { bv.bv_val = buf; value_add_one( &c->rvalue_vals, &bv ); @@ -384,11 +277,11 @@ mdb_cf_gen( ConfigArgs *c ) } break; case MDB_CHKPT: - if ( mdb->bi_txn_cp ) { + if ( mdb->mi_txn_cp ) { char buf[64]; struct berval bv; bv.bv_len = snprintf( buf, sizeof(buf), "%ld %ld", - (long) mdb->bi_txn_cp_kbyte, (long) mdb->bi_txn_cp_min ); + (long) mdb->mi_txn_cp_kbyte, (long) mdb->mi_txn_cp_min ); if ( bv.bv_len > 0 && bv.bv_len < sizeof(buf) ) { bv.bv_val = buf; value_add_one( &c->rvalue_vals, &bv ); @@ -400,122 +293,28 @@ mdb_cf_gen( ConfigArgs *c ) } break; - case MDB_CRYPTFILE: - if ( mdb->bi_db_crypt_file ) { - c->value_string = ch_strdup( mdb->bi_db_crypt_file ); - } else { - rc = 1; - } - break; - - /* If a crypt file has been set, its contents are copied here. - * But we don't want the key to be incorporated here. - */ - case MDB_CRYPTKEY: - if ( !mdb->bi_db_crypt_file && !BER_BVISNULL( &mdb->bi_db_crypt_key )) { - value_add_one( &c->rvalue_vals, &mdb->bi_db_crypt_key ); - } else { - rc = 1; - } - break; - case MDB_DIRECTORY: - if ( mdb->bi_dbenv_home ) { - c->value_string = ch_strdup( mdb->bi_dbenv_home ); + if ( mdb->mi_dbenv_home ) { + c->value_string = ch_strdup( mdb->mi_dbenv_home ); } else { rc = 1; } break; - case MDB_CONFIG: - if ( !( mdb->bi_flags & MDB_IS_OPEN ) - && !mdb->bi_db_config ) - { - char buf[SLAP_TEXT_BUFLEN]; - FILE *f = fopen( mdb->bi_db_config_path, "r" ); - struct berval bv; - - if ( f ) { - mdb->bi_flags |= MDB_HAS_CONFIG; - while ( fgets( buf, sizeof(buf), f )) { - ber_str2bv( buf, 0, 1, &bv ); - if ( bv.bv_len > 0 && bv.bv_val[bv.bv_len-1] == '\n' ) { - bv.bv_len--; - bv.bv_val[bv.bv_len] = '\0'; - } - /* shouldn't need this, but ... */ - if ( bv.bv_len > 0 && bv.bv_val[bv.bv_len-1] == '\r' ) { - bv.bv_len--; - bv.bv_val[bv.bv_len] = '\0'; - } - ber_bvarray_add( &mdb->bi_db_config, &bv ); - } - fclose( f ); - } - } - if ( mdb->bi_db_config ) { - int i; - struct berval bv; - - bv.bv_val = c->log; - for (i=0; !BER_BVISNULL(&mdb->bi_db_config[i]); i++) { - bv.bv_len = sprintf( bv.bv_val, "{%d}%s", i, - mdb->bi_db_config[i].bv_val ); - value_add_one( &c->rvalue_vals, &bv ); - } - } - if ( !c->rvalue_vals ) rc = 1; - break; - - case MDB_NOSYNC: - if ( mdb->bi_dbenv_xflags & DB_TXN_NOSYNC ) + case MDB_DBNOSYNC: + if ( mdb->mi_dbenv_flags & MDB_NOSYNC ) c->value_int = 1; break; - case MDB_CHECKSUM: - if ( mdb->bi_flags & MDB_CHKSUM ) - c->value_int = 1; - break; - case MDB_INDEX: mdb_attr_index_unparse( mdb, &c->rvalue_vals ); if ( !c->rvalue_vals ) rc = 1; break; - case MDB_LOCKD: - rc = 1; - if ( mdb->bi_lock_detect != DB_LOCK_DEFAULT ) { - int i; - for (i=0; !BER_BVISNULL(&mdb_lockd[i].word); i++) { - if ( mdb->bi_lock_detect == (u_int32_t)mdb_lockd[i].mask ) { - value_add_one( &c->rvalue_vals, &mdb_lockd[i].word ); - rc = 0; - break; - } - } - } - break; - case MDB_SSTACK: - c->value_int = mdb->bi_search_stack_depth; + c->value_int = mdb->mi_search_stack_depth; break; - case MDB_PGSIZE: { - struct mdb_db_pgsize *ps; - char buf[SLAP_TEXT_BUFLEN]; - struct berval bv; - int rc = 1; - - bv.bv_val = buf; - for ( ps = mdb->bi_pagesizes; ps; ps = ps->bdp_next ) { - bv.bv_len = sprintf( buf, "%s %d", ps->bdp_name.bv_val, - ps->bdp_size / 1024 ); - value_add_one( &c->rvalue_vals, &bv ); - rc = 0; - - } - break; - } } return rc; } else if ( c->op == LDAP_MOD_DELETE ) { @@ -530,75 +329,40 @@ mdb_cf_gen( ConfigArgs *c ) #endif /* single-valued no-ops */ - case MDB_LOCKD: case MDB_SSTACK: break; case MDB_CHKPT: - if ( mdb->bi_txn_cp_task ) { - struct re_s *re = mdb->bi_txn_cp_task; - mdb->bi_txn_cp_task = NULL; + if ( mdb->mi_txn_cp_task ) { + struct re_s *re = mdb->mi_txn_cp_task; + mdb->mi_txn_cp_task = NULL; ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); if ( ldap_pvt_runqueue_isrunning( &slapd_rq, re ) ) ldap_pvt_runqueue_stoptask( &slapd_rq, re ); ldap_pvt_runqueue_remove( &slapd_rq, re ); ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); } - mdb->bi_txn_cp = 0; - break; - case MDB_CONFIG: - if ( c->valx < 0 ) { - ber_bvarray_free( mdb->bi_db_config ); - mdb->bi_db_config = NULL; - } else { - int i = c->valx; - ch_free( mdb->bi_db_config[i].bv_val ); - for (; mdb->bi_db_config[i].bv_val; i++) - mdb->bi_db_config[i] = mdb->bi_db_config[i+1]; - } - mdb->bi_flags |= MDB_UPD_CONFIG; - c->cleanup = mdb_cf_cleanup; - break; - /* Doesn't really make sense to change these on the fly; - * the entire DB must be dumped and reloaded - */ - case MDB_CRYPTFILE: - if ( mdb->bi_db_crypt_file ) { - ch_free( mdb->bi_db_crypt_file ); - mdb->bi_db_crypt_file = NULL; - } - /* FALLTHRU */ - case MDB_CRYPTKEY: - if ( !BER_BVISNULL( &mdb->bi_db_crypt_key )) { - ch_free( mdb->bi_db_crypt_key.bv_val ); - BER_BVZERO( &mdb->bi_db_crypt_key ); - } + mdb->mi_txn_cp = 0; break; case MDB_DIRECTORY: - mdb->bi_flags |= MDB_RE_OPEN; - mdb->bi_flags ^= MDB_HAS_CONFIG; - ch_free( mdb->bi_dbenv_home ); - mdb->bi_dbenv_home = NULL; - ch_free( mdb->bi_db_config_path ); - mdb->bi_db_config_path = NULL; + mdb->mi_flags |= MDB_RE_OPEN; + ch_free( mdb->mi_dbenv_home ); + mdb->mi_dbenv_home = NULL; c->cleanup = mdb_cf_cleanup; - ldap_pvt_thread_pool_purgekey( mdb->bi_dbenv ); + ldap_pvt_thread_pool_purgekey( mdb->mi_dbenv ); break; case MDB_NOSYNC: - mdb->bi_dbenv->set_flags( mdb->bi_dbenv, DB_TXN_NOSYNC, 0 ); - break; - case MDB_CHECKSUM: - mdb->bi_flags &= ~MDB_CHKSUM; + mdb_env_set_flags( mdb->mi_dbenv, MDB_NOSYNC, 0 ); break; case MDB_INDEX: if ( c->valx == -1 ) { int i; /* delete all (FIXME) */ - for ( i = 0; i < mdb->bi_nattrs; i++ ) { - mdb->bi_attrs[i]->ai_indexmask |= MDB_INDEX_DELETING; + for ( i = 0; i < mdb->mi_nattrs; i++ ) { + mdb->mi_attrs[i]->ai_indexmask |= MDB_INDEX_DELETING; } - mdb->bi_flags |= MDB_DEL_INDEX; + mdb->mi_flags |= MDB_DEL_INDEX; c->cleanup = mdb_cf_cleanup; } else { @@ -610,7 +374,7 @@ mdb_cf_gen( ConfigArgs *c ) bv.bv_val = c->line; bv.bv_len = ptr - bv.bv_val; if ( bvmatch( &bv, &def )) { - mdb->bi_defaultmask = 0; + mdb->mi_defaultmask = 0; } else { int i; @@ -635,7 +399,7 @@ mdb_cf_gen( ConfigArgs *c ) assert( ai != NULL ); ai->ai_indexmask |= MDB_INDEX_DELETING; - mdb->bi_flags |= MDB_DEL_INDEX; + mdb->mi_flags |= MDB_DEL_INDEX; c->cleanup = mdb_cf_cleanup; } @@ -644,24 +408,6 @@ mdb_cf_gen( ConfigArgs *c ) } } break; - /* doesn't make sense on the fly; the DB file must be - * recreated - */ - case MDB_PGSIZE: { - struct mdb_db_pgsize *ps, **prev; - int i; - - for ( i = 0, prev = &mdb->bi_pagesizes, ps = *prev; ps; - prev = &ps->bdp_next, ps = ps->bdp_next, i++ ) { - if ( c->valx == -1 || i == c->valx ) { - *prev = ps->bdp_next; - ch_free( ps ); - ps = *prev; - if ( i == c->valx ) break; - } - } - } - break; } return rc; } @@ -679,7 +425,7 @@ mdb_cf_gen( ConfigArgs *c ) c->log, c->argv[1] ); return 1; } - mdb->bi_dbenv_mode = mode; + mdb->mi_dbenv_mode = mode; } else { char *m = c->argv[1]; @@ -704,33 +450,33 @@ mdb_cf_gen( ConfigArgs *c ) mode += ((1 << (2 - what)) << 3*(2 - who)); } } - mdb->bi_dbenv_mode = mode; + mdb->mi_dbenv_mode = mode; } break; case MDB_CHKPT: { long l; - mdb->bi_txn_cp = 1; + mdb->mi_txn_cp = 1; if ( lutil_atolx( &l, c->argv[1], 0 ) != 0 ) { fprintf( stderr, "%s: " "invalid kbyte \"%s\" in \"checkpoint\".\n", c->log, c->argv[1] ); return 1; } - mdb->bi_txn_cp_kbyte = l; + mdb->mi_txn_cp_kbyte = l; if ( lutil_atolx( &l, c->argv[2], 0 ) != 0 ) { fprintf( stderr, "%s: " "invalid minutes \"%s\" in \"checkpoint\".\n", c->log, c->argv[2] ); return 1; } - mdb->bi_txn_cp_min = l; + mdb->mi_txn_cp_min = l; /* If we're in server mode and time-based checkpointing is enabled, * submit a task to perform periodic checkpoints. */ - if ((slapMode & SLAP_SERVER_MODE) && mdb->bi_txn_cp_min ) { - struct re_s *re = mdb->bi_txn_cp_task; + if ((slapMode & SLAP_SERVER_MODE) && mdb->mi_txn_cp_min ) { + struct re_s *re = mdb->mi_txn_cp_task; if ( re ) { - re->interval.tv_sec = mdb->bi_txn_cp_min * 60; + re->interval.tv_sec = mdb->mi_txn_cp_min * 60; } else { if ( c->be->be_suffix == NULL || BER_BVISNULL( &c->be->be_suffix[0] ) ) { fprintf( stderr, "%s: " @@ -739,64 +485,14 @@ mdb_cf_gen( ConfigArgs *c ) return 1; } ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); - mdb->bi_txn_cp_task = ldap_pvt_runqueue_insert( &slapd_rq, - mdb->bi_txn_cp_min * 60, mdb_checkpoint, mdb, + mdb->mi_txn_cp_task = ldap_pvt_runqueue_insert( &slapd_rq, + mdb->mi_txn_cp_min * 60, mdb_checkpoint, mdb, LDAP_XSTRING(mdb_checkpoint), c->be->be_suffix[0].bv_val ); ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); } } } break; - case MDB_CONFIG: { - char *ptr = c->line; - struct berval bv; - - if ( c->op == SLAP_CONFIG_ADD ) { - ptr += STRLENOF("dbconfig"); - while (!isspace((unsigned char)*ptr)) ptr++; - while (isspace((unsigned char)*ptr)) ptr++; - } - - if ( mdb->bi_flags & MDB_IS_OPEN ) { - mdb->bi_flags |= MDB_UPD_CONFIG; - c->cleanup = mdb_cf_cleanup; - } else { - /* If we're just starting up... - */ - FILE *f; - /* If a DB_CONFIG file exists, or we don't know the path - * to the DB_CONFIG file, ignore these directives - */ - if (( mdb->bi_flags & MDB_HAS_CONFIG ) || !mdb->bi_db_config_path ) - break; - f = fopen( mdb->bi_db_config_path, "a" ); - if ( f ) { - /* FIXME: EBCDIC probably needs special handling */ - fprintf( f, "%s\n", ptr ); - fclose( f ); - } - } - ber_str2bv( ptr, 0, 1, &bv ); - ber_bvarray_add( &mdb->bi_db_config, &bv ); - } - break; - - case MDB_CRYPTFILE: - rc = lutil_get_filed_password( c->value_string, &mdb->bi_db_crypt_key ); - if ( rc == 0 ) { - mdb->bi_db_crypt_file = c->value_string; - } - break; - - /* Cannot set key if file was already set */ - case MDB_CRYPTKEY: - if ( mdb->bi_db_crypt_file ) { - rc = 1; - } else { - mdb->bi_db_crypt_key = c->value_bv; - } - break; - case MDB_DIRECTORY: { FILE *f; char *ptr, *testpath; @@ -820,51 +516,30 @@ mdb_cf_gen( ConfigArgs *c ) return -1; } - if ( mdb->bi_dbenv_home ) - ch_free( mdb->bi_dbenv_home ); - mdb->bi_dbenv_home = c->value_string; - - /* See if a DB_CONFIG file already exists here */ - if ( mdb->bi_db_config_path ) - ch_free( mdb->bi_db_config_path ); - mdb->bi_db_config_path = ch_malloc( len + - STRLENOF(LDAP_DIRSEP) + STRLENOF("DB_CONFIG") + 1 ); - ptr = lutil_strcopy( mdb->bi_db_config_path, mdb->bi_dbenv_home ); - *ptr++ = LDAP_DIRSEP[0]; - strcpy( ptr, "DB_CONFIG" ); + if ( mdb->mi_dbenv_home ) + ch_free( mdb->mi_dbenv_home ); + mdb->mi_dbenv_home = c->value_string; - f = fopen( mdb->bi_db_config_path, "r" ); - if ( f ) { - mdb->bi_flags |= MDB_HAS_CONFIG; - fclose(f); - } } break; case MDB_NOSYNC: if ( c->value_int ) - mdb->bi_dbenv_xflags |= DB_TXN_NOSYNC; + mdb->mi_dbenv_flags |= MDB_NOSYNC; else - mdb->bi_dbenv_xflags &= ~DB_TXN_NOSYNC; - if ( mdb->bi_flags & MDB_IS_OPEN ) { - mdb->bi_dbenv->set_flags( mdb->bi_dbenv, DB_TXN_NOSYNC, + mdb->mi_dbenv_flags ^= MDB_NOSYNC; + if ( mdb->mi_flags & MDB_IS_OPEN ) { + mdb_env_set_flags( mdb->mi_dbenv, MDB_NOSYNC, c->value_int ); } break; - case MDB_CHECKSUM: - if ( c->value_int ) - mdb->bi_flags |= MDB_CHKSUM; - else - mdb->bi_flags &= ~MDB_CHKSUM; - break; - case MDB_INDEX: rc = mdb_attr_index_config( mdb, c->fname, c->lineno, c->argc - 1, &c->argv[1], &c->reply); if( rc != LDAP_SUCCESS ) return 1; - if (( mdb->bi_flags & MDB_IS_OPEN ) && !mdb->bi_index_task ) { + if (( mdb->mi_flags & MDB_IS_OPEN ) && !mdb->mi_index_task ) { /* Start the task as soon as we finish here. Set a long * interval (10 hours) so that it only gets scheduled once. */ @@ -875,24 +550,13 @@ mdb_cf_gen( ConfigArgs *c ) return 1; } ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); - mdb->bi_index_task = ldap_pvt_runqueue_insert( &slapd_rq, 36000, + mdb->mi_index_task = ldap_pvt_runqueue_insert( &slapd_rq, 36000, mdb_online_index, c->be, LDAP_XSTRING(mdb_online_index), c->be->be_suffix[0].bv_val ); ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); } break; - case MDB_LOCKD: - rc = verb_to_mask( c->argv[1], mdb_lockd ); - if ( BER_BVISNULL(&mdb_lockd[rc].word) ) { - fprintf( stderr, "%s: " - "bad policy (%s) in \"lockDetect \" line\n", - c->log, c->argv[1] ); - return 1; - } - mdb->bi_lock_detect = (u_int32_t)rc; - break; - case MDB_SSTACK: if ( c->value_int < MINIMUM_SEARCH_STACK_DEPTH ) { fprintf( stderr, @@ -900,32 +564,7 @@ mdb_cf_gen( ConfigArgs *c ) c->log, c->value_int, MINIMUM_SEARCH_STACK_DEPTH ); c->value_int = MINIMUM_SEARCH_STACK_DEPTH; } - mdb->bi_search_stack_depth = c->value_int; - break; - - case MDB_PGSIZE: { - struct mdb_db_pgsize *ps, **prev; - int i, s; - - s = atoi(c->argv[2]); - if ( s < 1 || s > 64 ) { - snprintf( c->cr_msg, sizeof( c->cr_msg ), - "%s: size must be > 0 and <= 64: %d", - c->log, s ); - Debug( LDAP_DEBUG_ANY, "%s\n", c->cr_msg, 0, 0 ); - return -1; - } - i = strlen(c->argv[1]); - ps = ch_malloc( sizeof(struct mdb_db_pgsize) + i + 1 ); - ps->bdp_next = NULL; - ps->bdp_name.bv_len = i; - ps->bdp_name.bv_val = (char *)(ps+1); - strcpy( ps->bdp_name.bv_val, c->argv[1] ); - ps->bdp_size = s * 1024; - for ( prev = &mdb->bi_pagesizes; *prev; prev = &(*prev)->bdp_next ) - ; - *prev = ps; - } + mdb->mi_search_stack_depth = c->value_int; break; } return 0; diff --git a/servers/slapd/back-mdb/dn2entry.c b/servers/slapd/back-mdb/dn2entry.c index fb9e18c2d8..448593c553 100644 --- a/servers/slapd/back-mdb/dn2entry.c +++ b/servers/slapd/back-mdb/dn2entry.c @@ -30,54 +30,28 @@ int mdb_dn2entry( Operation *op, - DB_TXN *tid, + MDB_txn *tid, struct berval *dn, - EntryInfo **e, - int matched, - DB_LOCK *lock ) + Entry **e, + struct berval *matched ) { - EntryInfo *ei = NULL; int rc, rc2; + ID id; Debug(LDAP_DEBUG_TRACE, "mdb_dn2entry(\"%s\")\n", dn->bv_val, 0, 0 ); *e = NULL; - rc = mdb_cache_find_ndn( op, tid, dn, &ei ); + rc = mdb_dn2id( op, tid, dn, &id ); if ( rc ) { - if ( matched && rc == DB_NOTFOUND ) { - /* Set the return value, whether we have its entry - * or not. - */ - *e = ei; - if ( ei && ei->bei_id ) { - rc2 = mdb_cache_find_id( op, tid, ei->bei_id, - &ei, ID_LOCKED, lock ); - if ( rc2 ) rc = rc2; - } else if ( ei ) { - mdb_cache_entryinfo_unlock( ei ); - memset( lock, 0, sizeof( *lock )); - lock->mode = DB_LOCK_NG; - } - } else if ( ei ) { - mdb_cache_entryinfo_unlock( ei ); + *e = NULL; + if ( matched && rc == MDB_NOTFOUND ) { + /* Get the parent's DN */ + mdb_id2name( op, tid, id, matched, NULL ); } } else { - rc = mdb_cache_find_id( op, tid, ei->bei_id, &ei, ID_LOCKED, - lock ); - if ( rc == 0 ) { - *e = ei; - } else if ( matched && rc == DB_NOTFOUND ) { - /* always return EntryInfo */ - if ( ei->bei_parent ) { - ei = ei->bei_parent; - rc2 = mdb_cache_find_id( op, tid, ei->bei_id, &ei, 0, - lock ); - if ( rc2 ) rc = rc2; - } - *e = ei; - } + rc = mdb_id2entry( op, tid, id, e ); } return rc; diff --git a/servers/slapd/back-mdb/id2entry.c b/servers/slapd/back-mdb/id2entry.c index f7d026b342..1a028f39de 100644 --- a/servers/slapd/back-mdb/id2entry.c +++ b/servers/slapd/back-mdb/id2entry.c @@ -45,7 +45,7 @@ static int mdb_id2entry_put( key.mv_data = &e->e_id; key.mv_size = sizeof(ID); - rc = mdb_entry_encode( op, e, &bv ); + rc = entry_encode( e, &bv ); e->e_name = odn; e->e_nname = ondn; if( rc != LDAP_SUCCESS ) { return -1; @@ -104,7 +104,12 @@ int mdb_id2entry( rc = mdb_get( tid, dbi, &key, &data ); if ( rc ) return rc; - rc = mdb_entry_decode(&eh, e); + eh.bv.bv_val = data.mv_data; + eh.bv.bv_len = data.mv_size; + rc = entry_header( &eh ); + if ( rc ) return rc; + + rc = entry_decode(&eh, e); if( rc == 0 ) { (*e)->e_id = id; @@ -165,6 +170,7 @@ int mdb_entry_release( Entry *e, int rw ) { +#if 0 struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; struct mdb_op_info *moi; OpExtra *oex; @@ -215,6 +221,9 @@ int mdb_entry_release( } return 0; +#else + return mdb_entry_return( e ); +#endif } /* return LDAP_SUCCESS IFF we can retrieve the specified entry. @@ -227,16 +236,15 @@ int mdb_entry_get( int rw, Entry **ent ) { +#if 0 struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; struct mdb_op_info *boi = NULL; - DB_TXN *txn = NULL; + MDB_txn *txn = NULL; Entry *e = NULL; EntryInfo *ei; int rc; const char *at_name = at ? at->ad_cname.bv_val : "(null)"; - DB_LOCK lock; - Debug( LDAP_DEBUG_ARGS, "=> mdb_entry_get: ndn: \"%s\"\n", ndn->bv_val, 0, 0 ); Debug( LDAP_DEBUG_ARGS, @@ -342,4 +350,5 @@ return_results: "mdb_entry_get: rc=%d\n", rc, 0, 0 ); return(rc); +#endif } diff --git a/servers/slapd/back-mdb/proto-mdb.h b/servers/slapd/back-mdb/proto-mdb.h index fab2f63f54..28b80467cc 100644 --- a/servers/slapd/back-mdb/proto-mdb.h +++ b/servers/slapd/back-mdb/proto-mdb.h @@ -64,7 +64,7 @@ mdb_db_cache( */ int mdb_dn2entry LDAP_P(( Operation *op, MDB_txn *tid, - struct berval *dn, Entry *e, int matched )); + struct berval *dn, Entry **e, struct berval *matched )); /* * dn2id.c diff --git a/servers/slapd/back-mdb/tools.c b/servers/slapd/back-mdb/tools.c index 208afab1b3..6fbd223c86 100644 --- a/servers/slapd/back-mdb/tools.c +++ b/servers/slapd/back-mdb/tools.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2011 The OpenLDAP Foundation. + * Copyright 2011 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,10 +24,11 @@ #include "back-mdb.h" #include "idl.h" -static DBC *cursor = NULL; -static DBT key, data; +static MDB_txn *txn = NULL; +static MDB_cursor *cursor = NULL; +static MDB_val key, data; static EntryHeader eh; -static ID nid, previd = NOID; +static ID previd = NOID; static char ehbuf[16]; typedef struct dn_id { @@ -56,22 +57,6 @@ static ldap_pvt_thread_mutex_t mdb_tool_index_mutex; static ldap_pvt_thread_cond_t mdb_tool_index_cond_main; static ldap_pvt_thread_cond_t mdb_tool_index_cond_work; -#if DB_VERSION_FULL >= 0x04060000 -#define USE_TRICKLE 1 -#else -/* Seems to slow things down too much in MDB 4.5 */ -#undef USE_TRICKLE -#endif - -#ifdef USE_TRICKLE -static ldap_pvt_thread_mutex_t mdb_tool_trickle_mutex; -static ldap_pvt_thread_cond_t mdb_tool_trickle_cond; -static ldap_pvt_thread_cond_t mdb_tool_trickle_cond_end; - -static void * mdb_tool_trickle_task( void *ctx, void *ptr ); -static int mdb_tool_trickle_active; -#endif - static void * mdb_tool_index_task( void *ctx, void *ptr ); static int @@ -82,33 +67,10 @@ int mdb_tool_entry_open( { struct mdb_info *mdb = (struct mdb_info *) be->be_private; - /* initialize key and data thangs */ - DBTzero( &key ); - DBTzero( &data ); - key.flags = DB_DBT_USERMEM; - key.data = &nid; - key.size = key.ulen = sizeof( nid ); - data.flags = DB_DBT_USERMEM; - - if (cursor == NULL) { - int rc = mdb->bi_id2entry->bdi_db->cursor( - mdb->bi_id2entry->bdi_db, mdb->bi_cache.c_txn, &cursor, - mdb->bi_db_opflags ); - if( rc != 0 ) { - return -1; - } - } - +#if 0 /* Set up for threaded slapindex */ if (( slapMode & (SLAP_TOOL_QUICK|SLAP_TOOL_READONLY)) == SLAP_TOOL_QUICK ) { if ( !mdb_tool_info ) { -#ifdef USE_TRICKLE - ldap_pvt_thread_mutex_init( &mdb_tool_trickle_mutex ); - ldap_pvt_thread_cond_init( &mdb_tool_trickle_cond ); - ldap_pvt_thread_cond_init( &mdb_tool_trickle_cond_end ); - ldap_pvt_thread_pool_submit( &connection_pool, mdb_tool_trickle_task, mdb->bi_dbenv ); -#endif - ldap_pvt_thread_mutex_init( &mdb_tool_index_mutex ); ldap_pvt_thread_cond_init( &mdb_tool_index_cond_main ); ldap_pvt_thread_cond_init( &mdb_tool_index_cond_work ); @@ -127,6 +89,7 @@ int mdb_tool_entry_open( mdb_tool_info = mdb; } } +#endif return 0; } @@ -134,22 +97,9 @@ int mdb_tool_entry_open( int mdb_tool_entry_close( BackendDB *be ) { +#if 0 if ( mdb_tool_info ) { slapd_shutdown = 1; -#ifdef USE_TRICKLE - ldap_pvt_thread_mutex_lock( &mdb_tool_trickle_mutex ); - - /* trickle thread may not have started yet */ - while ( !mdb_tool_trickle_active ) - ldap_pvt_thread_cond_wait( &mdb_tool_trickle_cond_end, - &mdb_tool_trickle_mutex ); - - ldap_pvt_thread_cond_signal( &mdb_tool_trickle_cond ); - while ( mdb_tool_trickle_active ) - ldap_pvt_thread_cond_wait( &mdb_tool_trickle_cond_end, - &mdb_tool_trickle_mutex ); - ldap_pvt_thread_mutex_unlock( &mdb_tool_trickle_mutex ); -#endif ldap_pvt_thread_mutex_lock( &mdb_tool_index_mutex ); /* There might still be some threads starting */ @@ -174,16 +124,16 @@ int mdb_tool_entry_close( ch_free( mdb_tool_index_rec ); mdb_tool_index_tcount = slap_tool_thread_max - 1; } - - if( eh.bv.bv_val ) { - ch_free( eh.bv.bv_val ); - eh.bv.bv_val = NULL; - } +#endif if( cursor ) { - cursor->c_close( cursor ); + mdb_cursor_close( cursor ); cursor = NULL; } + if( txn ) { + if ( mdb_txn_commit( txn )) + return -1; + } if( nholes ) { unsigned i; @@ -225,33 +175,25 @@ ID mdb_tool_entry_next( mdb = (struct mdb_info *) be->be_private; assert( mdb != NULL ); + if ( !txn ) { + rc = mdb_txn_begin( mdb->mi_dbenv, 1, &txn ); + if ( rc ) + return NOID; + rc = mdb_cursor_open( txn, mdb->mi_id2entry->mdi_dbi, &cursor ); + if ( rc ) { + mdb_txn_abort( txn ); + return NOID; + } + } + next:; - /* Get the header */ - data.ulen = data.dlen = sizeof( ehbuf ); - data.data = ehbuf; - data.flags |= DB_DBT_PARTIAL; - rc = cursor->c_get( cursor, &key, &data, DB_NEXT ); + rc = mdb_cursor_get( cursor, &key, &data, MDB_NEXT ); if( rc ) { - /* If we're doing linear indexing and there are more attrs to - * index, and we're at the end of the database, start over. - */ - if ( index_nattrs && rc == DB_NOTFOUND ) { - /* optional - do a checkpoint here? */ - mdb_attr_info_free( mdb->bi_attrs[0] ); - mdb->bi_attrs[0] = mdb->bi_attrs[index_nattrs]; - index_nattrs--; - rc = cursor->c_get( cursor, &key, &data, DB_FIRST ); - if ( rc ) { - return NOID; - } - } else { - return NOID; - } + return NOID; } - MDB_DISK2ID( key.data, &id ); - previd = id; + previd = *(ID *)key.mv_data; if ( tool_filter || tool_base ) { static Operation op = {0}; @@ -274,17 +216,6 @@ next:; assert( tool_next_entry != NULL ); -#ifdef MDB_HIER - /* TODO: needed until MDB_HIER is handled accordingly - * in mdb_tool_entry_get_int() */ - if ( tool_base && !dnIsSuffixScope( &tool_next_entry->e_nname, tool_base, tool_scope ) ) - { - mdb_entry_release( &op, tool_next_entry, 0 ); - tool_next_entry = NULL; - goto next; - } -#endif - if ( tool_filter && test_filter( NULL, tool_next_entry, tool_filter ) != LDAP_COMPARE_TRUE ) { mdb_entry_release( &op, tool_next_entry, 0 ); @@ -303,7 +234,7 @@ ID mdb_tool_dn2id_get( { Operation op = {0}; Opheader ohdr = {0}; - EntryInfo *ei = NULL; + ID id; int rc; if ( BER_BVISEMPTY(dn) ) @@ -314,12 +245,11 @@ ID mdb_tool_dn2id_get( op.o_tmpmemctx = NULL; op.o_tmpmfuncs = &ch_mfuncs; - rc = mdb_cache_find_ndn( &op, 0, dn, &ei ); - if ( ei ) mdb_cache_entryinfo_unlock( ei ); - if ( rc == DB_NOTFOUND ) + rc = mdb_dn2id( &op, txn, dn, &id ); + if ( rc == MDB_NOTFOUND ) return NOID; - return ei->bei_id; + return id; } static int @@ -328,6 +258,7 @@ mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep ) Entry *e = NULL; char *dptr; int rc, eoff; + struct berval dn = BER_BVNULL, ndn = BER_BVNULL; assert( be != NULL ); assert( slapMode & SLAP_TOOL_MODE ); @@ -339,100 +270,54 @@ mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep ) } if ( id != previd ) { - data.ulen = data.dlen = sizeof( ehbuf ); - data.data = ehbuf; - data.flags |= DB_DBT_PARTIAL; - - MDB_ID2DISK( id, &nid ); - rc = cursor->c_get( cursor, &key, &data, DB_SET ); + rc = mdb_cursor_get( cursor, &key, &data, MDB_SET ); if ( rc ) { rc = LDAP_OTHER; goto done; } } - /* Get the header */ - dptr = eh.bv.bv_val; - eh.bv.bv_val = ehbuf; - eh.bv.bv_len = data.size; - rc = entry_header( &eh ); - eoff = eh.data - eh.bv.bv_val; - eh.bv.bv_val = dptr; - if ( rc ) { - rc = LDAP_OTHER; - goto done; - } - - /* Get the size */ - data.flags &= ~DB_DBT_PARTIAL; - data.ulen = 0; - rc = cursor->c_get( cursor, &key, &data, DB_CURRENT ); - if ( rc != DB_BUFFER_SMALL ) { - rc = LDAP_OTHER; - goto done; - } + if ( slapMode & SLAP_TOOL_READONLY ) { + struct mdb_info *mdb = (struct mdb_info *) be->be_private; + Operation op = {0}; + Opheader ohdr = {0}; - /* Allocate a block and retrieve the data */ - eh.bv.bv_len = eh.nvals * sizeof( struct berval ) + data.size; - eh.bv.bv_val = ch_realloc( eh.bv.bv_val, eh.bv.bv_len ); - eh.data = eh.bv.bv_val + eh.nvals * sizeof( struct berval ); - data.data = eh.data; - data.ulen = data.size; + op.o_hdr = &ohdr; + op.o_bd = be; + op.o_tmpmemctx = NULL; + op.o_tmpmfuncs = &ch_mfuncs; - /* Skip past already parsed nattr/nvals */ - eh.data += eoff; + rc = mdb_id2name( &op, txn, id, &dn, &ndn ); + if ( rc ) { + rc = LDAP_OTHER; + mdb_entry_return( e ); + e = NULL; + goto done; + } + if ( tool_base != NULL ) { + if ( !dnIsSuffixScope( &ndn, tool_base, tool_scope ) ) { + ch_free( dn.bv_val ); + ch_free( ndn.bv_val ); + rc = LDAP_NO_SUCH_OBJECT; + } + } + } + /* Get the header */ + eh.bv.bv_val = data.mv_data; + eh.bv.bv_len = data.mv_size; - rc = cursor->c_get( cursor, &key, &data, DB_CURRENT ); + rc = entry_header( &eh ); if ( rc ) { rc = LDAP_OTHER; goto done; } - -#ifndef MDB_HIER - /* TODO: handle MDB_HIER accordingly */ - if ( tool_base != NULL ) { - struct berval ndn; - entry_decode_dn( &eh, NULL, &ndn ); - - if ( !dnIsSuffixScope( &ndn, tool_base, tool_scope ) ) { - return LDAP_NO_SUCH_OBJECT; - } - } -#endif - -#ifdef SLAP_ZONE_ALLOC - /* FIXME: will add ctx later */ - rc = entry_decode( &eh, &e, NULL ); -#else rc = entry_decode( &eh, &e ); -#endif - - if( rc == LDAP_SUCCESS ) { - e->e_id = id; -#ifdef MDB_HIER - if ( slapMode & SLAP_TOOL_READONLY ) { - struct mdb_info *mdb = (struct mdb_info *) be->be_private; - EntryInfo *ei = NULL; - Operation op = {0}; - Opheader ohdr = {0}; - - op.o_hdr = &ohdr; - op.o_bd = be; - op.o_tmpmemctx = NULL; - op.o_tmpmfuncs = &ch_mfuncs; - - rc = mdb_cache_find_parent( &op, mdb->bi_cache.c_txn, id, &ei ); - if ( rc == LDAP_SUCCESS ) { - mdb_cache_entryinfo_unlock( ei ); - e->e_private = ei; - ei->bei_e = e; - mdb_fix_dn( e, 0 ); - ei->bei_e = NULL; - e->e_private = NULL; - } - } -#endif + e->e_id = id; + if ( !BER_BVISNULL( &dn )) { + e->e_name = dn; + e->e_nname = ndn; } + done: if ( e != NULL ) { *ep = e; @@ -450,9 +335,10 @@ mdb_tool_entry_get( BackendDB *be, ID id ) return e; } +#if 0 static int mdb_tool_next_id( Operation *op, - DB_TXN *tid, + MDB_txn *tid, Entry *e, struct berval *text, int hole ) @@ -601,6 +487,7 @@ mdb_tool_index_add( return mdb_index_entry_add( op, txn, e ); } } +#endif ID mdb_tool_entry_put( BackendDB *be, @@ -609,7 +496,6 @@ ID mdb_tool_entry_put( { int rc; struct mdb_info *mdb; - DB_TXN *tid = NULL; Operation op = {0}; Opheader ohdr = {0}; @@ -625,13 +511,12 @@ ID mdb_tool_entry_put( mdb = (struct mdb_info *) be->be_private; - if (! (slapMode & SLAP_TOOL_QUICK)) { - rc = TXN_BEGIN( mdb->bi_dbenv, NULL, &tid, - mdb->bi_db_opflags ); + if ( !txn ) { + rc = mdb_txn_begin( mdb->mi_dbenv, 0, &txn ); if( rc != 0 ) { snprintf( text->bv_val, text->bv_len, "txn_begin failed: %s (%d)", - db_strerror(rc), rc ); + mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_put) ": %s\n", text->bv_val, 0, 0 ); @@ -644,18 +529,15 @@ ID mdb_tool_entry_put( op.o_tmpmemctx = NULL; op.o_tmpmfuncs = &ch_mfuncs; +#if 0 /* add dn2id indices */ rc = mdb_tool_next_id( &op, tid, e, text, 0 ); if( rc != 0 ) { goto done; } - -#ifdef USE_TRICKLE - if (( slapMode & SLAP_TOOL_QUICK ) && (( e->e_id & 0xfff ) == 0xfff )) { - ldap_pvt_thread_cond_signal( &mdb_tool_trickle_cond ); - } #endif +#if 0 if ( !mdb->bi_linear_index ) rc = mdb_tool_index_add( &op, tid, e ); if( rc != 0 ) { @@ -668,13 +550,15 @@ ID mdb_tool_entry_put( text->bv_val, 0, 0 ); goto done; } +#endif + /* id2entry index */ - rc = mdb_id2entry_add( be, tid, e ); + rc = mdb_id2entry_add( &op, txn, e ); if( rc != 0 ) { snprintf( text->bv_val, text->bv_len, "id2entry_add failed: %s (%d)", - db_strerror(rc), rc ); + mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_put) ": %s\n", text->bv_val, 0, 0 ); @@ -684,11 +568,11 @@ ID mdb_tool_entry_put( done: if( rc == 0 ) { if ( !( slapMode & SLAP_TOOL_QUICK )) { - rc = TXN_COMMIT( tid, 0 ); + rc = mdb_txn_commit( txn ); if( rc != 0 ) { snprintf( text->bv_val, text->bv_len, "txn_commit failed: %s (%d)", - db_strerror(rc), rc ); + mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_put) ": %s\n", text->bv_val, 0, 0 ); @@ -697,22 +581,22 @@ done: } } else { - if ( !( slapMode & SLAP_TOOL_QUICK )) { - TXN_ABORT( tid ); + mdb_txn_abort( txn ); + txn = NULL; snprintf( text->bv_val, text->bv_len, "txn_aborted! %s (%d)", rc == LDAP_OTHER ? "Internal error" : - db_strerror(rc), rc ); + mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_put) ": %s\n", text->bv_val, 0, 0 ); - } e->e_id = NOID; } return e->e_id; } +#if 0 int mdb_tool_entry_reindex( BackendDB *be, ID id, @@ -851,6 +735,7 @@ done: return rc; } +#endif ID mdb_tool_entry_modify( BackendDB *be, @@ -859,7 +744,7 @@ ID mdb_tool_entry_modify( { int rc; struct mdb_info *mdb; - DB_TXN *tid = NULL; + MDB_txn *tid; Operation op = {0}; Opheader ohdr = {0}; @@ -878,22 +763,19 @@ ID mdb_tool_entry_modify( mdb = (struct mdb_info *) be->be_private; - if (! (slapMode & SLAP_TOOL_QUICK)) { - if( cursor ) { - cursor->c_close( cursor ); - cursor = NULL; - } - rc = TXN_BEGIN( mdb->bi_dbenv, NULL, &tid, - mdb->bi_db_opflags ); - if( rc != 0 ) { - snprintf( text->bv_val, text->bv_len, - "txn_begin failed: %s (%d)", - db_strerror(rc), rc ); - Debug( LDAP_DEBUG_ANY, - "=> " LDAP_XSTRING(mdb_tool_entry_modify) ": %s\n", - text->bv_val, 0, 0 ); - return NOID; - } + if( cursor ) { + mdb_cursor_close( cursor ); + cursor = NULL; + } + rc = mdb_txn_begin( mdb->mi_dbenv, 0, &tid ); + if( rc != 0 ) { + snprintf( text->bv_val, text->bv_len, + "txn_begin failed: %s (%d)", + mdb_strerror(rc), rc ); + Debug( LDAP_DEBUG_ANY, + "=> " LDAP_XSTRING(mdb_tool_entry_modify) ": %s\n", + text->bv_val, 0, 0 ); + return NOID; } op.o_hdr = &ohdr; @@ -902,11 +784,11 @@ ID mdb_tool_entry_modify( op.o_tmpmfuncs = &ch_mfuncs; /* id2entry index */ - rc = mdb_id2entry_update( be, tid, e ); + rc = mdb_id2entry_update( &op, tid, e ); if( rc != 0 ) { snprintf( text->bv_val, text->bv_len, "id2entry_add failed: %s (%d)", - db_strerror(rc), rc ); + mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_modify) ": %s\n", text->bv_val, 0, 0 ); @@ -915,60 +797,32 @@ ID mdb_tool_entry_modify( done: if( rc == 0 ) { - if (! (slapMode & SLAP_TOOL_QUICK)) { - rc = TXN_COMMIT( tid, 0 ); + rc = mdb_txn_commit( tid ); if( rc != 0 ) { snprintf( text->bv_val, text->bv_len, "txn_commit failed: %s (%d)", - db_strerror(rc), rc ); + mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_modify) ": " "%s\n", text->bv_val, 0, 0 ); e->e_id = NOID; } - } } else { - if (! (slapMode & SLAP_TOOL_QUICK)) { - TXN_ABORT( tid ); + mdb_txn_abort( tid ); snprintf( text->bv_val, text->bv_len, "txn_aborted! %s (%d)", - db_strerror(rc), rc ); + mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_modify) ": %s\n", text->bv_val, 0, 0 ); - } e->e_id = NOID; } return e->e_id; } -#ifdef USE_TRICKLE -static void * -mdb_tool_trickle_task( void *ctx, void *ptr ) -{ - DB_ENV *env = ptr; - int wrote; - - ldap_pvt_thread_mutex_lock( &mdb_tool_trickle_mutex ); - mdb_tool_trickle_active = 1; - ldap_pvt_thread_cond_signal( &mdb_tool_trickle_cond_end ); - while ( 1 ) { - ldap_pvt_thread_cond_wait( &mdb_tool_trickle_cond, - &mdb_tool_trickle_mutex ); - if ( slapd_shutdown ) - break; - env->memp_trickle( env, 30, &wrote ); - } - mdb_tool_trickle_active = 0; - ldap_pvt_thread_cond_signal( &mdb_tool_trickle_cond_end ); - ldap_pvt_thread_mutex_unlock( &mdb_tool_trickle_mutex ); - - return NULL; -} -#endif - +#if 0 static void * mdb_tool_index_task( void *ctx, void *ptr ) { @@ -997,3 +851,4 @@ mdb_tool_index_task( void *ctx, void *ptr ) return NULL; } +#endif