More for indexing, drop dbcache

This commit is contained in:
Howard Chu 2011-08-23 13:04:34 -07:00
parent 67ac2494eb
commit e6d1629b5c
13 changed files with 230 additions and 237 deletions

View 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

View 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,

View 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! */

View 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.

View file

@ -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;
}

View 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;

View 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;

View 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;

View 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 );

View 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;

View 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);

View 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,

View 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};