]> git.sur5r.net Git - openldap/commitdiff
More for indexing, drop dbcache
authorHoward Chu <hyc@openldap.org>
Tue, 23 Aug 2011 20:04:34 +0000 (13:04 -0700)
committerHoward Chu <hyc@openldap.org>
Tue, 23 Aug 2011 20:29:16 +0000 (13:29 -0700)
13 files changed:
servers/slapd/back-mdb/Makefile.in
servers/slapd/back-mdb/attr.c
servers/slapd/back-mdb/back-mdb.h
servers/slapd/back-mdb/config.c
servers/slapd/back-mdb/dbcache.c [deleted file]
servers/slapd/back-mdb/dn2id.c
servers/slapd/back-mdb/filterindex.c
servers/slapd/back-mdb/id2entry.c
servers/slapd/back-mdb/index.c
servers/slapd/back-mdb/init.c
servers/slapd/back-mdb/nextid.c
servers/slapd/back-mdb/proto-mdb.h
servers/slapd/back-mdb/tools.c

index 909048ec01a4ba52ec0d1d897e41e8ca31f6b5b4..78366a15b2f3fbfd895c7957416920aec2d35bdb 100644 (file)
@@ -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
 
index 2fd40aea84b31fe56b92c6c068983f9f39354a99..bc84d30a5b91515ddf2f3b016cd28ab86390e805 100644 (file)
@@ -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; i<mdb->mi_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; i<mdb->mi_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,
index abe0eefb27e6834d65aa0018bc311a589f8c1763..114ffc1ecdf3b8131338db79cdda8e6ab7e9b800 100644 (file)
@@ -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! */
index 52c789e01c0c6add85c2c8d545e61deb7d8d241a..6281032de260b449502e9ee80d50eb9751bcdd16 100644 (file)
@@ -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 (file)
index a90474a..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/* dbcache.c - manage cache of open databases */
-/* $OpenLDAP$ */
-/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
- *
- * 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
- * <http://www.OpenLDAP.org/license.html>.
- */
-
-#include "portable.h"
-
-#include <stdio.h>
-
-#include <ac/errno.h>
-#include <ac/socket.h>
-#include <ac/string.h>
-#include <ac/time.h>
-#include <sys/stat.h>
-
-#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;
-}
index 2cbfed89d6957b3b969aff2eca43920c96dc47cf..d696830d90d4d13f5c01d80429dd559a6e995813 100644 (file)
@@ -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;
index 4f610603618c26709517dd95b28c9412b9578786..86dd11ba7c14bcce234f8fa9aa035b67fd2b9558 100644 (file)
@@ -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;
index d407a4458c78daa039f9fc1f909fdeb9c8f0016e..0eb8cb702a3a76c7782db3cc8f83d42299c98239 100644 (file)
@@ -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;
 
index 79977c7f39e6fc5ec5d6247e478d531280e54dbb..15057333df4dddbf9fa24f56e8337cfec679d4e5 100644 (file)
@@ -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 );
index 589c53cc957f7a7e64127295b997f500153f9d14..7bb9bd11e2937ec33ca548ee0dd8c2199aa18d8a 100644 (file)
@@ -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; i<MDB_NDB; i++ )
+                               mdb_close( txn, mdb->mi_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;
 
index e98ca0cf46ff51d25571dea6913032937eac10c2..1d7b3893cb0d3c431154a5cea08cb866ee943eb4 100644 (file)
@@ -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);
index 120ef08d5da4bb5f83dc96318d579b7f1c8afce6..9843a559cf46a482eaeca3dd90127a6c8603b109 100644 (file)
@@ -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,
index 0cde539de354b241da0f3af12ba996fe05e67070..f2d3806ea55b5670858e3109ad6646aff51ffa4d 100644 (file)
@@ -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};