From: Howard Chu Date: Tue, 23 Aug 2011 20:04:34 +0000 (-0700) Subject: More for indexing, drop dbcache X-Git-Url: https://git.sur5r.net/?p=openldap;a=commitdiff_plain;h=e6d1629b5cc84d90aa26c19a5870bc03fb597603 More for indexing, drop dbcache --- diff --git a/servers/slapd/back-mdb/Makefile.in b/servers/slapd/back-mdb/Makefile.in index 909048ec01..78366a15b2 100644 --- a/servers/slapd/back-mdb/Makefile.in +++ b/servers/slapd/back-mdb/Makefile.in @@ -16,7 +16,7 @@ SRCS = init.c tools.c config.c \ add.c bind.c compare.c delete.c modify.c modrdn.c search.c \ extended.c referral.c operational.c \ - attr.c index.c key.c dbcache.c filterindex.c \ + attr.c index.c key.c filterindex.c \ dn2entry.c dn2id.c error.c id2entry.c idl.c \ nextid.c monitor.c @@ -26,7 +26,7 @@ XXHEADERS = mdb.h midl.h OBJS = init.lo tools.lo config.lo \ add.lo bind.lo compare.lo delete.lo modify.lo modrdn.lo search.lo \ extended.lo referral.lo operational.lo \ - attr.lo index.lo key.lo dbcache.lo filterindex.lo \ + attr.lo index.lo key.lo filterindex.lo \ dn2entry.lo dn2id.lo error.lo id2entry.lo idl.lo \ nextid.lo monitor.lo mdb.lo midl.lo diff --git a/servers/slapd/back-mdb/attr.c b/servers/slapd/back-mdb/attr.c index 2fd40aea84..bc84d30a5b 100644 --- a/servers/slapd/back-mdb/attr.c +++ b/servers/slapd/back-mdb/attr.c @@ -87,6 +87,84 @@ mdb_attr_mask( return i < 0 ? NULL : mdb->mi_attrs[i]; } +/* Open all un-opened index DB handles */ +int +mdb_attr_dbs_open( + BackendDB *be, MDB_txn *tx0, ConfigReply *cr ) +{ + struct mdb_info *mdb = (struct mdb_info *) be->be_private; + MDB_txn *txn; + int i, flags; + int rc; + + txn = tx0; + if ( txn == NULL ) { + rc = mdb_txn_begin( mdb->mi_dbenv, 0, &txn ); + if ( rc ) { + snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": " + "txn_begin failed: %s (%d).", + be->be_suffix[0].bv_val, mdb_strerror(rc), rc ); + Debug( LDAP_DEBUG_ANY, + LDAP_XSTRING(mdb_attr_dbs) ": %s\n", + cr->msg, 0, 0 ); + return rc; + } + } + + flags = MDB_DUPSORT|MDB_DUPFIXED|MDB_INTEGERDUP; + if ( !(slapMode & SLAP_TOOL_READONLY) ) + flags |= MDB_CREATE; + + for ( i=0; imi_nattrs; i++ ) { + if ( mdb->mi_attrs[i]->ai_dbi ) /* already open */ + continue; + rc = mdb_open( txn, mdb->mi_attrs[i]->ai_desc->ad_type->sat_cname.bv_val, + flags, &mdb->mi_attrs[i]->ai_dbi ); + if ( rc ) { + snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": " + "mdb_open(%s) failed: %s (%d).", + be->be_suffix[0].bv_val, + mdb->mi_attrs[i]->ai_desc->ad_type->sat_cname.bv_val, + mdb_strerror(rc), rc ); + Debug( LDAP_DEBUG_ANY, + LDAP_XSTRING(mdb_attr_dbs) ": %s\n", + cr->msg, 0, 0 ); + break; + } + } + + /* Only commit if this is our txn */ + if ( tx0 == NULL ) { + if ( !rc ) { + rc = mdb_txn_commit( txn ); + if ( rc ) { + snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": " + "txn_commit failed: %s (%d).", + be->be_suffix[0].bv_val, mdb_strerror(rc), rc ); + Debug( LDAP_DEBUG_ANY, + LDAP_XSTRING(mdb_attr_dbs) ": %s\n", + cr->msg, 0, 0 ); + } + } else { + mdb_txn_abort( txn ); + } + } + + return rc; +} + +void +mdb_attr_dbs_close( + struct mdb_info *mdb, + MDB_txn *txn +) +{ + int i; + for ( i=0; imi_nattrs; i++ ) + if ( mdb->mi_attrs[i]->ai_dbi ) + mdb_close( txn, mdb->mi_attrs[i]->ai_dbi ); +} + int mdb_attr_index_config( struct mdb_info *mdb, diff --git a/servers/slapd/back-mdb/back-mdb.h b/servers/slapd/back-mdb/back-mdb.h index abe0eefb27..114ffc1ecd 100644 --- a/servers/slapd/back-mdb/back-mdb.h +++ b/servers/slapd/back-mdb/back-mdb.h @@ -43,11 +43,6 @@ LDAP_BEGIN_DECL /* Default to 10MB max */ #define DEFAULT_MAPSIZE (10*1048576) -struct mdb_db_info { - struct berval mdi_name; - MDB_dbi mdi_dbi; -}; - #ifdef LDAP_DEVEL #define MDB_MONITOR_IDX #endif /* LDAP_DEVEL */ @@ -71,11 +66,6 @@ struct mdb_info { size_t mi_mapsize; - int mi_ndatabases; - int mi_db_opflags; /* db-specific flags */ - struct mdb_db_info **mi_databases; - ldap_pvt_thread_mutex_t mi_database_mutex; - slap_mask_t mi_defaultmask; struct mdb_attrinfo **mi_attrs; int mi_nattrs; @@ -97,13 +87,16 @@ struct mdb_info { int mi_flags; #define MDB_IS_OPEN 0x01 +#define MDB_OPEN_INDEX 0x02 #define MDB_DEL_INDEX 0x08 #define MDB_RE_OPEN 0x10 + + MDB_dbi mi_dbis[MDB_NDB]; }; -#define mi_id2entry mi_databases[MDB_ID2ENTRY] -#define mi_dn2id mi_databases[MDB_DN2ID] -#define mi_ad2id mi_databases[MDB_AD2ID] +#define mi_id2entry mi_dbis[MDB_ID2ENTRY] +#define mi_dn2id mi_dbis[MDB_DN2ID] +#define mi_ad2id mi_dbis[MDB_AD2ID] struct mdb_op_info { OpExtra moi_oe; @@ -143,6 +136,7 @@ typedef struct mdb_attrinfo { ComponentReference* ai_cr; /*component indexing*/ #endif int ai_idx; /* position in AI array */ + MDB_dbi ai_dbi; } AttrInfo; /* These flags must not clash with SLAP_INDEX flags or ops in slap.h! */ diff --git a/servers/slapd/back-mdb/config.c b/servers/slapd/back-mdb/config.c index 52c789e01c..6281032de2 100644 --- a/servers/slapd/back-mdb/config.c +++ b/servers/slapd/back-mdb/config.c @@ -95,7 +95,7 @@ mdb_checkpoint( void *ctx, void *arg ) { struct re_s *rtask = arg; struct mdb_info *mdb = rtask->arg; - + mdb_env_sync( mdb->mi_dbenv, 0 ); ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); ldap_pvt_runqueue_stoptask( &slapd_rq, rtask ); @@ -132,7 +132,7 @@ mdb_online_index( void *ctx, void *arg ) DBTzero( &key ); DBTzero( &data ); - + id = 1; key.data = &nid; key.size = key.ulen = sizeof(ID); @@ -146,7 +146,7 @@ mdb_online_index( void *ctx, void *arg ) break; rc = TXN_BEGIN( mdb->bi_dbenv, NULL, &txn, mdb->bi_db_opflags ); - if ( rc ) + if ( rc ) break; if ( getnext ) { getnext = 0; @@ -236,7 +236,7 @@ mdb_cf_cleanup( ConfigArgs *c ) mdb_attr_flush( mdb ); mdb->mi_flags ^= MDB_DEL_INDEX; } - + 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 ); @@ -252,6 +252,12 @@ mdb_cf_cleanup( ConfigArgs *c ) rc = LDAP_OTHER; } } + + if ( mdb->mi_flags & MDB_OPEN_INDEX ) { + rc = mdb_attr_dbs_open( c->be, NULL, &c->reply ); + if ( rc ) + rc = LDAP_OTHER; + } return rc; } @@ -305,7 +311,7 @@ mdb_cf_gen( ConfigArgs *c ) if ( mdb->mi_dbenv_flags & MDB_NOSYNC ) c->value_int = 1; break; - + case MDB_INDEX: mdb_attr_index_unparse( mdb, &c->rvalue_vals ); if ( !c->rvalue_vals ) rc = 1; @@ -543,6 +549,8 @@ mdb_cf_gen( ConfigArgs *c ) c->argc - 1, &c->argv[1], &c->reply); if( rc != LDAP_SUCCESS ) return 1; + c->cleanup = mdb_cf_cleanup; + mdb->mi_flags |= MDB_OPEN_INDEX; 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. diff --git a/servers/slapd/back-mdb/dbcache.c b/servers/slapd/back-mdb/dbcache.c deleted file mode 100644 index a90474ae19..0000000000 --- a/servers/slapd/back-mdb/dbcache.c +++ /dev/null @@ -1,119 +0,0 @@ -/* dbcache.c - manage cache of open databases */ -/* $OpenLDAP$ */ -/* This work is part of OpenLDAP Software . - * - * Copyright 2000-2011 The OpenLDAP Foundation. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted only as authorized by the OpenLDAP - * Public License. - * - * A copy of this license is available in the file LICENSE in the - * top-level directory of the distribution or, alternatively, at - * . - */ - -#include "portable.h" - -#include - -#include -#include -#include -#include -#include - -#include "slap.h" -#include "back-mdb.h" - -int -mdb_db_cache( - Backend *be, - struct berval *name, - MDB_dbi *dbout ) -{ - int i, flags; - int rc; - struct mdb_info *mdb = (struct mdb_info *) be->be_private; - struct mdb_db_info *db; - char *file; - - *dbout = 0; - - for( i=MDB_NDB; i < mdb->mi_ndatabases; i++ ) { - if( !ber_bvcmp( &mdb->mi_databases[i]->mdi_name, name) ) { - *dbout = mdb->mi_databases[i]->mdi_dbi; - return 0; - } - } - - ldap_pvt_thread_mutex_lock( &mdb->mi_database_mutex ); - - /* check again! may have been added by another thread */ - for( i=MDB_NDB; i < mdb->mi_ndatabases; i++ ) { - if( !ber_bvcmp( &mdb->mi_databases[i]->mdi_name, name) ) { - *dbout = mdb->mi_databases[i]->mdi_dbi; - ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex ); - return 0; - } - } - - if( i >= MDB_INDICES ) { - ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex ); - return -1; - } - - db = (struct mdb_db_info *) ch_calloc(1, sizeof(struct mdb_db_info)); - - ber_dupbv( &db->mdi_name, name ); - - rc = db_create( &db->mdi_dbi, mdb->mi_dbenv, 0 ); - if( rc != 0 ) { - Debug( LDAP_DEBUG_ANY, - "mdb_db_cache: db_create(%s) failed: %s (%d)\n", - mdb->mi_dbenv_home, mdb_strerror(rc), rc ); - ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex ); - ch_free( db ); - return rc; - } - - file = ch_malloc( db->mdi_name.bv_len + sizeof(MDB_SUFFIX) ); - strcpy( file, db->mdi_name.bv_val ); - strcpy( file+db->mdi_name.bv_len, MDB_SUFFIX ); - -#ifdef HAVE_EBCDIC - __atoe( file ); -#endif - flags = DB_CREATE | DB_THREAD; -#ifdef DB_AUTO_COMMIT - if ( !( slapMode & SLAP_TOOL_QUICK )) - flags |= DB_AUTO_COMMIT; -#endif - /* Cannot Truncate when Transactions are in use */ - if ( (slapMode & (SLAP_TOOL_QUICK|SLAP_TRUNCATE_MODE)) == - (SLAP_TOOL_QUICK|SLAP_TRUNCATE_MODE)) - flags |= DB_TRUNCATE; - - rc = DB_OPEN( db->mdi_dbi, - file, NULL /* name */, - MDB_INDEXTYPE, mdb->mi_db_opflags | flags, mdb->mi_dbenv_mode ); - - ch_free( file ); - - if( rc != 0 ) { - Debug( LDAP_DEBUG_ANY, - "mdb_db_cache: db_open(%s) failed: %s (%d)\n", - name->bv_val, mdb_strerror(rc), rc ); - ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex ); - return rc; - } - - mdb->mi_databases[i] = db; - mdb->mi_ndatabases = i+1; - - *dbout = db->mdi_dbi; - - ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex ); - return 0; -} diff --git a/servers/slapd/back-mdb/dn2id.c b/servers/slapd/back-mdb/dn2id.c index 2cbfed89d6..d696830d90 100644 --- a/servers/slapd/back-mdb/dn2id.c +++ b/servers/slapd/back-mdb/dn2id.c @@ -141,7 +141,7 @@ mdb_dn2id_add( Entry *e ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; - MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi; + MDB_dbi dbi = mdb->mi_dn2id; MDB_val key, data; ID nid; int rc, rlen, nrlen; @@ -211,7 +211,7 @@ mdb_dn2id_delete( Entry *e ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; - MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi; + MDB_dbi dbi = mdb->mi_dn2id; MDB_val key, data; diskNode *d; int rc, nrlen; @@ -263,7 +263,7 @@ mdb_dn2id( { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; MDB_cursor *cursor; - MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi; + MDB_dbi dbi = mdb->mi_dn2id; MDB_val key, data; int rc = 0, nrlen; diskNode *d; @@ -363,6 +363,86 @@ done: return rc; } +/* return IDs from root to parent of DN */ +int +mdb_dn2sups( + Operation *op, + MDB_txn *txn, + struct berval *in, + ID *ids ) +{ + struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; + MDB_cursor *cursor; + MDB_dbi dbi = mdb->mi_dn2id; + MDB_val key, data; + int rc = 0, nrlen; + diskNode *d; + char *ptr; + ID pid, nid; + struct berval tmp; + + Debug( LDAP_DEBUG_TRACE, "=> mdb_dn2sups(\"%s\")\n", in->bv_val, 0, 0 ); + + if ( !in->bv_len ) { + goto done; + } + + tmp = *in; + + nrlen = tmp.bv_len - op->o_bd->be_nsuffix[0].bv_len; + tmp.bv_val += nrlen; + tmp.bv_len = op->o_bd->be_nsuffix[0].bv_len; + nid = 0; + key.mv_size = sizeof(ID); + + rc = mdb_cursor_open( txn, dbi, &cursor ); + if ( rc ) return rc; + + for (;;) { + key.mv_data = &pid; + pid = nid; + + data.mv_size = sizeof(diskNode) + tmp.bv_len; + d = op->o_tmpalloc( data.mv_size, op->o_tmpmemctx ); + d->nrdnlen[1] = tmp.bv_len & 0xff; + d->nrdnlen[0] = (tmp.bv_len >> 8) | 0x80; + ptr = lutil_strncopy( d->nrdn, tmp.bv_val, tmp.bv_len ); + *ptr = '\0'; + data.mv_data = d; + rc = mdb_cursor_get( cursor, &key, &data, MDB_GET_BOTH ); + op->o_tmpfree( d, op->o_tmpmemctx ); + if ( rc ) { + mdb_cursor_close( cursor ); + break; + } + ptr = (char *) data.mv_data + data.mv_size - sizeof(ID); + memcpy( &nid, ptr, sizeof(ID)); + + if ( pid ) + mdb_idl_insert( ids, pid ); + + if ( tmp.bv_val > in->bv_val ) { + for (ptr = tmp.bv_val - 2; ptr > in->bv_val && + !DN_SEPARATOR(*ptr); ptr--) /* empty */; + if ( ptr >= in->bv_val ) { + if (DN_SEPARATOR(*ptr)) ptr++; + tmp.bv_len = tmp.bv_val - ptr - 1; + tmp.bv_val = ptr; + } + } else { + break; + } + } + +done: + if( rc != 0 ) { + Debug( LDAP_DEBUG_TRACE, "<= mdb_dn2sups: get failed: %s (%d)\n", + mdb_strerror( rc ), rc, 0 ); + } + + return rc; +} + #if 0 int mdb_dn2id_parent( @@ -429,7 +509,7 @@ mdb_dn2id_children( Entry *e ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; - MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi; + MDB_dbi dbi = mdb->mi_dn2id; MDB_val key, data; MDB_cursor *cursor; int rc; @@ -463,7 +543,7 @@ mdb_id2name( struct berval *nname ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; - MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi; + MDB_dbi dbi = mdb->mi_dn2id; MDB_val key, data; MDB_cursor *cursor; int rc, len, nlen; diff --git a/servers/slapd/back-mdb/filterindex.c b/servers/slapd/back-mdb/filterindex.c index 4f61060361..86dd11ba7c 100644 --- a/servers/slapd/back-mdb/filterindex.c +++ b/servers/slapd/back-mdb/filterindex.c @@ -488,6 +488,7 @@ ext_candidates( MDB_IDL_ZERO( ids ); if ( mra->ma_rule == slap_schema.si_mr_distinguishedNameMatch ) { +base: rc = mdb_dn2id( op, rtxn, &mra->ma_value, &id, NULL ); if ( rc == MDB_SUCCESS ) { mdb_idl_insert( ids, id ); @@ -498,15 +499,7 @@ ext_candidates( op->o_bd->be_nsuffix )) { int scope; if ( mra->ma_rule == slap_schema.si_mr_dnSuperiorMatch ) { - struct berval pdn; - dnParent( &mra->ma_value, &pdn ); - rc = mdb_dn2id( op, rtxn, &pdn, &id, NULL ); - if ( rc == MDB_SUCCESS ) { - while ( ei && ei->bei_id ) { - mdb_idl_insert( ids, ei->bei_id ); - ei = ei->bei_parent; - } - } + mdb_dn2sups( op, rtxn, &mra->ma_value, ids ); return 0; } if ( mra->ma_rule == slap_schema.si_mr_dnSubtreeMatch ) @@ -516,7 +509,8 @@ ext_candidates( else if ( mra->ma_rule == slap_schema.si_mr_dnSubordinateMatch ) scope = LDAP_SCOPE_SUBORDINATE; else - scope = LDAP_SCOPE_BASE; + goto base; /* scope = LDAP_SCOPE_BASE; */ +#if 0 if ( scope > LDAP_SCOPE_BASE ) { ei = NULL; rc = mdb_cache_find_ndn( op, rtxn, &mra->ma_value, &ei ); @@ -531,6 +525,7 @@ ext_candidates( } return 0; } +#endif } } @@ -682,7 +677,6 @@ equality_candidates( ID *ids, ID *tmp ) { - struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; MDB_dbi dbi; int i; int rc; diff --git a/servers/slapd/back-mdb/id2entry.c b/servers/slapd/back-mdb/id2entry.c index d407a4458c..0eb8cb702a 100644 --- a/servers/slapd/back-mdb/id2entry.c +++ b/servers/slapd/back-mdb/id2entry.c @@ -29,7 +29,7 @@ static int mdb_id2entry_put( int flag ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; - MDB_dbi dbi = mdb->mi_id2entry->mdi_dbi; + MDB_dbi dbi = mdb->mi_id2entry; MDB_val key, data; struct berval bv; int rc; @@ -89,7 +89,7 @@ int mdb_id2entry( Entry **e ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; - MDB_dbi dbi = mdb->mi_id2entry->mdi_dbi; + MDB_dbi dbi = mdb->mi_id2entry; MDB_val key, data; EntryHeader eh; int rc = 0; @@ -128,7 +128,7 @@ int mdb_id2entry_delete( Entry *e ) { struct mdb_info *mdb = (struct mdb_info *) be->be_private; - MDB_dbi dbi = mdb->mi_id2entry->mdi_dbi; + MDB_dbi dbi = mdb->mi_id2entry; MDB_val key; int rc; diff --git a/servers/slapd/back-mdb/index.c b/servers/slapd/back-mdb/index.c index 79977c7f39..15057333df 100644 --- a/servers/slapd/back-mdb/index.c +++ b/servers/slapd/back-mdb/index.c @@ -81,9 +81,7 @@ int mdb_index_param( struct berval *prefixp ) { AttrInfo *ai; - int rc; slap_mask_t mask, type = 0; - MDB_dbi dbi; ai = mdb_index_mask( be, desc, prefixp ); @@ -112,12 +110,6 @@ int mdb_index_param( } mask = ai->ai_indexmask; - rc = mdb_db_cache( be, prefixp, &dbi ); - - if( rc != LDAP_SUCCESS ) { - return rc; - } - switch( ftype ) { case LDAP_FILTER_PRESENT: type = SLAP_INDEX_PRESENT; @@ -164,7 +156,7 @@ int mdb_index_param( return LDAP_INAPPROPRIATE_MATCHING; done: - *dbip = dbi; + *dbip = ai->ai_dbi; *maskp = mask; return LDAP_SUCCESS; } @@ -172,6 +164,7 @@ done: static int indexer( Operation *op, MDB_txn *txn, + MDB_dbi dbi, AttributeDescription *ad, struct berval *atname, BerVarray vals, @@ -180,20 +173,10 @@ static int indexer( slap_mask_t mask ) { int rc, i; - MDB_dbi dbi; struct berval *keys; assert( mask != 0 ); - rc = mdb_db_cache( op->o_bd, atname, &dbi ); - - if ( rc != LDAP_SUCCESS ) { - Debug( LDAP_DEBUG_ANY, - "mdb_index_read: Could not open DB %s\n", - atname->bv_val, 0, 0 ); - return LDAP_OTHER; - } - if( IS_SLAP_INDEX( mask, SLAP_INDEX_PRESENT ) ) { rc = mdb_key_change( op->o_bd, txn, dbi, &presence_key, id, opid ); if( rc ) { @@ -314,7 +297,7 @@ static int index_at_values( if ( ai->ai_cr ) { ComponentReference *cr; for( cr = ai->ai_cr ; cr ; cr = cr->cr_next ) { - rc = indexer( op, txn, cr->cr_ad, &type->sat_cname, + rc = indexer( op, txn, ai->ai_dbi, cr->cr_ad, &type->sat_cname, cr->cr_nvals, id, ixop, cr->cr_indexmask ); } @@ -332,7 +315,7 @@ static int index_at_values( */ mask = ai->ai_newmask ? ai->ai_newmask : ai->ai_indexmask; if( mask ) { - rc = indexer( op, txn, ad, &type->sat_cname, + rc = indexer( op, txn, ai->ai_dbi, ad, &type->sat_cname, vals, id, ixop, mask ); if( rc ) return rc; @@ -353,7 +336,7 @@ static int index_at_values( else mask = ai->ai_newmask ? ai->ai_newmask : ai->ai_indexmask; if ( mask ) { - rc = indexer( op, txn, desc, &desc->ad_cname, + rc = indexer( op, txn, ai->ai_dbi, desc, &desc->ad_cname, vals, id, ixop, mask ); if( rc ) { @@ -455,7 +438,7 @@ int mdb_index_recrun( if ( !ir->ai ) continue; while (( al = ir->attrs )) { ir->attrs = al->next; - rc = indexer( op, NULL, ir->ai->ai_desc, + rc = indexer( op, NULL, ir->ai->ai_dbi, ir->ai->ai_desc, &ir->ai->ai_desc->ad_type->sat_cname, al->attr->a_nvals, id, SLAP_INDEX_ADD_OP, ir->ai->ai_indexmask ); diff --git a/servers/slapd/back-mdb/init.c b/servers/slapd/back-mdb/init.c index 589c53cc95..7bb9bd11e2 100644 --- a/servers/slapd/back-mdb/init.c +++ b/servers/slapd/back-mdb/init.c @@ -57,8 +57,6 @@ mdb_db_init( BackendDB *be, ConfigReply *cr ) mdb->mi_mapsize = DEFAULT_MAPSIZE; - ldap_pvt_thread_mutex_init( &mdb->mi_database_mutex ); - be->be_private = mdb; be->be_cf_ocs = be->bd_info->bi_cf_ocs; @@ -79,11 +77,9 @@ mdb_db_open( BackendDB *be, ConfigReply *cr ) { int rc, i; struct mdb_info *mdb = (struct mdb_info *) be->be_private; - struct stat stat1, stat2; + struct stat stat1; u_int32_t flags; - char path[MAXPATHLEN]; char *dbhome; - Entry *e = NULL; MDB_txn *txn; if ( be->be_suffix == NULL ) { @@ -169,9 +165,6 @@ mdb_db_open( BackendDB *be, ConfigReply *cr ) goto fail; } - mdb->mi_databases = (struct mdb_db_info **) ch_malloc( - MDB_INDICES * sizeof(struct mdb_db_info *) ); - rc = mdb_txn_begin( mdb->mi_dbenv, 0, &txn ); if ( rc ) { Debug( LDAP_DEBUG_ANY, @@ -183,10 +176,6 @@ mdb_db_open( BackendDB *be, ConfigReply *cr ) /* open (and create) main databases */ for( i = 0; mdmi_databases[i].bv_val; i++ ) { - struct mdb_db_info *db; - - db = (struct mdb_db_info *) ch_calloc(1, sizeof(struct mdb_db_info)); - flags = MDB_INTEGERKEY; if( i == MDB_ID2ENTRY ) { if ( !(slapMode & (SLAP_TOOL_READMAIN|SLAP_TOOL_READONLY) )) @@ -201,7 +190,7 @@ mdb_db_open( BackendDB *be, ConfigReply *cr ) rc = mdb_open( txn, mdmi_databases[i].bv_val, flags, - &db->mdi_dbi ); + &mdb->mi_dbis[i] ); if ( rc != 0 ) { snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": " @@ -216,10 +205,14 @@ mdb_db_open( BackendDB *be, ConfigReply *cr ) } if ( i == MDB_DN2ID ) - mdb_set_dupsort( txn, db->mdi_dbi, mdb_dup_compare ); + mdb_set_dupsort( txn, mdb->mi_dbis[i], mdb_dup_compare ); - db->mdi_name = mdmi_databases[i]; - mdb->mi_databases[i] = db; + } + + rc = mdb_attr_dbs_open( be, txn, cr ); + if ( rc ) { + mdb_txn_abort( txn ); + goto fail; } rc = mdb_txn_commit(txn); @@ -227,9 +220,6 @@ mdb_db_open( BackendDB *be, ConfigReply *cr ) goto fail; } - mdb->mi_databases[i] = NULL; - mdb->mi_ndatabases = i; - /* monitor setup */ rc = mdb_monitor_db_open( be ); if ( rc != 0 ) { @@ -250,7 +240,6 @@ mdb_db_close( BackendDB *be, ConfigReply *cr ) { int rc; struct mdb_info *mdb = (struct mdb_info *) be->be_private; - struct mdb_db_info *db; MDB_txn *txn; /* monitor handling */ @@ -265,17 +254,14 @@ mdb_db_close( BackendDB *be, ConfigReply *cr ) #endif if ( mdb->mi_dbenv ) { - if ( mdb->mi_ndatabases ) { + if ( mdb->mi_dbis[0] ) { + int i; rc = mdb_txn_begin( mdb->mi_dbenv, 1, &txn ); - while( mdb->mi_databases && mdb->mi_ndatabases-- ) { - db = mdb->mi_databases[mdb->mi_ndatabases]; - mdb_close( txn, db->mdi_dbi ); - /* Lower numbered names are not strdup'd */ - if( mdb->mi_ndatabases >= MDB_NDB ) - free( db->mdi_name.bv_val ); - free( db ); - } + mdb_attr_dbs_close( mdb, txn ); + for ( i=0; imi_dbis[i] ); + mdb_txn_abort( txn ); /* force a sync */ @@ -292,9 +278,6 @@ mdb_db_close( BackendDB *be, ConfigReply *cr ) mdb->mi_dbenv = NULL; } - free( mdb->mi_databases ); - mdb->mi_databases = NULL; - return 0; } @@ -321,8 +304,6 @@ mdb_db_destroy( BackendDB *be, ConfigReply *cr ) mdb_attr_index_destroy( mdb ); - ldap_pvt_thread_mutex_destroy( &mdb->mi_database_mutex ); - ch_free( mdb ); be->be_private = NULL; diff --git a/servers/slapd/back-mdb/nextid.c b/servers/slapd/back-mdb/nextid.c index e98ca0cf46..1d7b3893cb 100644 --- a/servers/slapd/back-mdb/nextid.c +++ b/servers/slapd/back-mdb/nextid.c @@ -30,7 +30,7 @@ int mdb_next_id( BackendDB *be, MDB_txn *tid, ID *out ) MDB_cursor *cursor; /* Get a read cursor */ - rc = mdb_cursor_open( tid, mdb->mi_id2entry->mdi_dbi, &cursor ); + rc = mdb_cursor_open( tid, mdb->mi_id2entry, &cursor ); if (rc == 0) { rc = mdb_cursor_get(cursor, &key, NULL, MDB_LAST); diff --git a/servers/slapd/back-mdb/proto-mdb.h b/servers/slapd/back-mdb/proto-mdb.h index 120ef08d5d..9843a559cf 100644 --- a/servers/slapd/back-mdb/proto-mdb.h +++ b/servers/slapd/back-mdb/proto-mdb.h @@ -32,6 +32,9 @@ void mdb_attr_flush( struct mdb_info *mdb ); int mdb_attr_slot( struct mdb_info *mdb, AttributeDescription *desc, int *insert ); +int mdb_attr_dbs_open( BackendDB *be, MDB_txn *txn, struct config_reply_s *cr ); +void mdb_attr_dbs_close( struct mdb_info *mdb, MDB_txn *txn ); + int mdb_attr_index_config LDAP_P(( struct mdb_info *mdb, const char *fname, int lineno, int argc, char **argv, struct config_reply_s *cr )); @@ -49,16 +52,6 @@ void mdb_attr_info_free( AttrInfo *ai ); int mdb_back_init_cf( BackendInfo *bi ); -/* - * dbcache.c - */ - -int -mdb_db_cache( - Backend *be, - struct berval *name, - MDB_dbi *dbi ); - /* * dn2entry.c */ @@ -94,6 +87,13 @@ int mdb_dn2id_children( MDB_txn *tid, Entry *e ); +int mdb_dn2sups ( + Operation *op, + MDB_txn *tid, + struct berval *dn, + ID *sups + ); + int mdb_dn2idl( Operation *op, MDB_txn *txn, diff --git a/servers/slapd/back-mdb/tools.c b/servers/slapd/back-mdb/tools.c index 0cde539de3..f2d3806ea5 100644 --- a/servers/slapd/back-mdb/tools.c +++ b/servers/slapd/back-mdb/tools.c @@ -29,7 +29,6 @@ static MDB_cursor *cursor = NULL; static MDB_val key, data; static EntryHeader eh; static ID previd = NOID; -static char ehbuf[16]; typedef struct dn_id { ID id; @@ -41,13 +40,12 @@ static dn_id hbuf[HOLE_SIZE], *holes = hbuf; static unsigned nhmax = HOLE_SIZE; static unsigned nholes; -static int index_nattrs; - static struct berval *tool_base; static int tool_scope; static Filter *tool_filter; static Entry *tool_next_entry; +#if 0 static ID mdb_tool_ix_id; static Operation *mdb_tool_ix_op; static int *mdb_tool_index_threads, mdb_tool_index_tcount; @@ -56,19 +54,17 @@ static struct mdb_info *mdb_tool_info; 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; +static void * mdb_tool_index_task( void *ctx, void *ptr ); +#endif static int mdb_writes, mdb_writes_per_commit; -static void * mdb_tool_index_task( void *ctx, void *ptr ); - static int mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep ); int mdb_tool_entry_open( BackendDB *be, int mode ) { - struct mdb_info *mdb = (struct mdb_info *) be->be_private; - /* In Quick mode, commit once per 1000 entries */ mdb_writes = 0; if ( slapMode & SLAP_TOOL_QUICK ) @@ -188,7 +184,7 @@ ID mdb_tool_entry_next( rc = mdb_txn_begin( mdb->mi_dbenv, 1, &txn ); if ( rc ) return NOID; - rc = mdb_cursor_open( txn, mdb->mi_id2entry->mdi_dbi, &cursor ); + rc = mdb_cursor_open( txn, mdb->mi_id2entry, &cursor ); if ( rc ) { mdb_txn_abort( txn ); return NOID; @@ -266,9 +262,8 @@ static int 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; + int rc; assert( be != NULL ); assert( slapMode & SLAP_TOOL_MODE ); @@ -290,7 +285,6 @@ mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep ) } if ( slapMode & SLAP_TOOL_READONLY ) { - struct mdb_info *mdb = (struct mdb_info *) be->be_private; Operation op = {0}; Opheader ohdr = {0};