mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-02-19 02:28:47 -05:00
More for indexing, drop dbcache
This commit is contained in:
parent
67ac2494eb
commit
e6d1629b5c
13 changed files with 230 additions and 237 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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! */
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue