From b11a372f8f0a63266c1c089c72e4ed7f4f94f3b1 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 22 Aug 2011 18:27:03 -0700 Subject: [PATCH] More porting --- servers/slapd/back-mdb/add.c | 134 +++----- servers/slapd/back-mdb/bind.c | 33 +- servers/slapd/back-mdb/compare.c | 30 +- servers/slapd/back-mdb/dbcache.c | 52 +-- servers/slapd/back-mdb/delete.c | 294 +++++------------ servers/slapd/back-mdb/dn2entry.c | 16 +- servers/slapd/back-mdb/dn2id.c | 36 +- servers/slapd/back-mdb/error.c | 62 ---- servers/slapd/back-mdb/id2entry.c | 20 -- servers/slapd/back-mdb/index.c | 36 +- servers/slapd/back-mdb/key.c | 36 +- servers/slapd/back-mdb/libmdb | 2 +- servers/slapd/back-mdb/modify.c | 163 +++------ servers/slapd/back-mdb/modrdn.c | 473 ++++++++------------------- servers/slapd/back-mdb/operational.c | 44 +-- servers/slapd/back-mdb/proto-mdb.h | 2 +- servers/slapd/back-mdb/referral.c | 29 +- 17 files changed, 436 insertions(+), 1026 deletions(-) delete mode 100644 servers/slapd/back-mdb/error.c diff --git a/servers/slapd/back-mdb/add.c b/servers/slapd/back-mdb/add.c index 58f3b18f70..8bcd805ab7 100644 --- a/servers/slapd/back-mdb/add.c +++ b/servers/slapd/back-mdb/add.c @@ -27,18 +27,15 @@ mdb_add(Operation *op, SlapReply *rs ) struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; struct berval pdn; Entry *p = NULL, *oe = op->ora_e; - EntryInfo *ei; char textbuf[SLAP_TEXT_BUFLEN]; size_t textlen = sizeof textbuf; AttributeDescription *children = slap_schema.si_ad_children; AttributeDescription *entry = slap_schema.si_ad_entry; - DB_TXN *ltid = NULL, *lt2; - ID eid = NOID; + MDB_txn *txn = NULL; + ID eid = NOID, pid = 0; struct mdb_op_info opinfo = {{{ 0 }}}; int subentry; - DB_LOCK lock; - int num_retries = 0; int success; LDAPControl **postread_ctrl = NULL; @@ -122,23 +119,22 @@ txnReturn: subentry = is_entry_subentry( op->ora_e ); /* begin transaction */ - rs->sr_err = TXN_BEGIN( mdb->bi_dbenv, NULL, <id, - mdb->bi_db_opflags ); + rs->sr_err = mdb_txn_begin( mdb->mi_dbenv, 0, &txn ); rs->sr_text = NULL; if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": txn_begin failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error"; goto return_results; } - opinfo.boi_oe.oe_key = mdb; - opinfo.boi_txn = ltid; - opinfo.boi_err = 0; - opinfo.boi_acl_cache = op->o_do_not_cache; - LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.boi_oe, oe_next ); + opinfo.moi_oe.oe_key = mdb; + opinfo.moi_txn = txn; + opinfo.moi_err = 0; + opinfo.moi_acl_cache = op->o_do_not_cache; + LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.moi_oe, oe_next ); /* * Get the parent dn and see if the corresponding entry exists. @@ -150,13 +146,14 @@ txnReturn: } /* get entry or parent */ - rs->sr_err = mdb_dn2entry( op, ltid, &op->ora_e->e_nname, &ei, - 1, &lock ); + rs->sr_err = mdb_dn2entry( op, txn, &op->ora_e->e_nname, &p, 1 ); switch( rs->sr_err ) { case 0: rs->sr_err = LDAP_ALREADY_EXISTS; + mdb_entry_return( p ); + p = NULL; goto return_results; - case DB_NOTFOUND: + case MDB_NOTFOUND: break; case LDAP_BUSY: rs->sr_text = "ldap server busy"; @@ -167,7 +164,6 @@ txnReturn: goto return_results; } - p = ei->bei_e; if ( !p ) p = (Entry *)&slap_entry_root; @@ -178,7 +174,7 @@ txnReturn: ? get_entry_referrals( op, p ) : NULL; if ( p != (Entry *)&slap_entry_root ) - mdb_unlocked_cache_return_entry_r( mdb, p ); + mdb_entry_return( p ); p = NULL; Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": parent " @@ -194,7 +190,7 @@ txnReturn: if ( ! rs->sr_err ) { if ( p != (Entry *)&slap_entry_root ) - mdb_unlocked_cache_return_entry_r( mdb, p ); + mdb_entry_return( p ); p = NULL; Debug( LDAP_DEBUG_TRACE, @@ -207,7 +203,7 @@ txnReturn: if ( p != (Entry *)&slap_entry_root ) { if ( is_entry_subentry( p ) ) { - mdb_unlocked_cache_return_entry_r( mdb, p ); + mdb_entry_return( p ); p = NULL; /* parent is a subentry, don't allow add */ Debug( LDAP_DEBUG_TRACE, @@ -219,7 +215,7 @@ txnReturn: } if ( is_entry_alias( p ) ) { - mdb_unlocked_cache_return_entry_r( mdb, p ); + mdb_entry_return( p ); p = NULL; /* parent is an alias, don't allow add */ Debug( LDAP_DEBUG_TRACE, @@ -235,7 +231,7 @@ txnReturn: rs->sr_matched = ber_strdup_x( p->e_name.bv_val, op->o_tmpmemctx ); rs->sr_ref = get_entry_referrals( op, p ); - mdb_unlocked_cache_return_entry_r( mdb, p ); + mdb_entry_return( p ); p = NULL; Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": parent is referral\n", @@ -255,6 +251,7 @@ txnReturn: /* free parent and reader lock */ if ( p != (Entry *)&slap_entry_root ) { + pid = p->e_id; if ( p->e_nname.bv_len ) { struct berval ppdn; @@ -276,7 +273,7 @@ txnReturn: } } - mdb_unlocked_cache_return_entry_r( mdb, p ); + mdb_entry_return( p ); } p = NULL; @@ -305,7 +302,7 @@ txnReturn: } if ( eid == NOID ) { - rs->sr_err = mdb_next_id( op->o_bd, &eid ); + rs->sr_err = mdb_next_id( op->o_bd, txn, &eid ); if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": next_id failed (%d)\n", @@ -317,28 +314,15 @@ txnReturn: op->ora_e->e_id = eid; } - /* nested transaction */ - rs->sr_err = TXN_BEGIN( mdb->bi_dbenv, ltid, <2, - mdb->bi_db_opflags ); - rs->sr_text = NULL; - if( rs->sr_err != 0 ) { - Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(mdb_add) ": txn_begin(2) failed: " - "%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 ); - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; - } - /* dn2id index */ - rs->sr_err = mdb_dn2id_add( op, lt2, ei, op->ora_e ); + rs->sr_err = mdb_dn2id_add( op, txn, pid, op->ora_e ); if ( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": dn2id_add failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + mdb_strerror(rs->sr_err), rs->sr_err, 0 ); switch( rs->sr_err ) { - case DB_KEYEXIST: + case MDB_KEYEXIST: rs->sr_err = LDAP_ALREADY_EXISTS; break; default: @@ -348,7 +332,7 @@ txnReturn: } /* attribute indexes */ - rs->sr_err = mdb_index_entry_add( op, lt2, op->ora_e ); + rs->sr_err = mdb_index_entry_add( op, txn, op->ora_e ); if ( rs->sr_err != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": index_entry_add failed\n", @@ -359,7 +343,7 @@ txnReturn: } /* id2entry index */ - rs->sr_err = mdb_id2entry_add( op->o_bd, lt2, op->ora_e ); + rs->sr_err = mdb_id2entry_add( op, txn, op->ora_e ); if ( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": id2entry_add failed\n", @@ -369,12 +353,6 @@ txnReturn: goto return_results; } - if ( TXN_COMMIT( lt2, 0 ) != 0 ) { - rs->sr_err = LDAP_OTHER; - rs->sr_text = "txn_commit(2) failed"; - goto return_results; - } - /* post-read */ if( op->o_postread ) { if( postread_ctrl == NULL ) { @@ -396,43 +374,24 @@ txnReturn: } if ( op->o_noop ) { - if (( rs->sr_err=TXN_ABORT( ltid )) != 0 ) { - rs->sr_text = "txn_abort (no-op) failed"; - } else { - rs->sr_err = LDAP_X_NO_OPERATION; - ltid = NULL; - goto return_results; - } - - } else { - struct berval nrdn; - - /* pick the RDN if not suffix; otherwise pick the entire DN */ - if (pdn.bv_len) { - nrdn.bv_val = op->ora_e->e_nname.bv_val; - nrdn.bv_len = pdn.bv_val - op->ora_e->e_nname.bv_val - 1; - } else { - nrdn = op->ora_e->e_nname; - } - - if(( rs->sr_err=TXN_COMMIT( ltid, 0 )) != 0 ) { - rs->sr_text = "txn_commit failed"; - } else { - rs->sr_err = LDAP_SUCCESS; - } + mdb_txn_abort( txn ); + rs->sr_err = LDAP_X_NO_OPERATION; + txn = NULL; + goto return_results; } - ltid = NULL; - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); - opinfo.boi_oe.oe_key = NULL; - - if ( rs->sr_err != LDAP_SUCCESS ) { + if (( rs->sr_err = mdb_txn_commit( txn )) != 0 ) { + rs->sr_text = "txn_commit failed"; Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": %s : %s (%d)\n", - rs->sr_text, db_strerror(rs->sr_err), rs->sr_err ); + rs->sr_text, mdb_strerror(rs->sr_err), rs->sr_err ); rs->sr_err = LDAP_OTHER; goto return_results; } + txn = NULL; + + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next ); + opinfo.moi_oe.oe_key = NULL; Debug(LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": added%s id=%08lx dn=\"%s\"\n", @@ -446,27 +405,20 @@ return_results: success = rs->sr_err; send_ldap_result( op, rs ); - if( ltid != NULL ) { - TXN_ABORT( ltid ); + if( txn != NULL ) { + mdb_txn_abort( txn ); } - if ( opinfo.boi_oe.oe_key ) { - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + if ( opinfo.moi_oe.oe_key ) { + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next ); } if( success == LDAP_SUCCESS ) { - /* We own the entry now, and it can be purged at will - * Check to make sure it's the same entry we entered with. - * Possibly a callback may have mucked with it, although - * in general callbacks should treat the entry as read-only. - */ - mdb_cache_deref( oe->e_private ); - if ( op->ora_e == oe ) - op->ora_e = NULL; - +#if 0 if ( mdb->bi_txn_cp_kbyte ) { TXN_CHECKPOINT( mdb->bi_dbenv, mdb->bi_txn_cp_kbyte, mdb->bi_txn_cp_min, 0 ); } +#endif } slap_graduate_commit_csn( op ); diff --git a/servers/slapd/back-mdb/bind.c b/servers/slapd/back-mdb/bind.c index 78a6b09658..c8d0191e57 100644 --- a/servers/slapd/back-mdb/bind.c +++ b/servers/slapd/back-mdb/bind.c @@ -28,12 +28,10 @@ mdb_bind( Operation *op, SlapReply *rs ) struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; Entry *e; Attribute *a; - EntryInfo *ei; AttributeDescription *password = slap_schema.si_ad_userPassword; - DB_TXN *rtxn; - DB_LOCK lock; + MDB_txn *rtxn; Debug( LDAP_DEBUG_ARGS, "==> " LDAP_XSTRING(mdb_bind) ": dn: %s\n", @@ -55,7 +53,7 @@ mdb_bind( Operation *op, SlapReply *rs ) break; } - rs->sr_err = mdb_reader_get(op, mdb->bi_dbenv, &rtxn); + rs->sr_err = mdb_reader_get(op, mdb->mi_dbenv, &rtxn); switch(rs->sr_err) { case 0: break; @@ -65,39 +63,24 @@ mdb_bind( Operation *op, SlapReply *rs ) return rs->sr_err; } -dn2entry_retry: /* get entry with reader lock */ - rs->sr_err = mdb_dn2entry( op, rtxn, &op->o_req_ndn, &ei, 1, - &lock ); + rs->sr_err = mdb_dn2entry( op, rtxn, &op->o_req_ndn, &e, 0 ); switch(rs->sr_err) { - case DB_NOTFOUND: + case MDB_NOTFOUND: + rs->sr_err = LDAP_INVALID_CREDENTIALS; + send_ldap_result( op, rs ); + return rs->sr_err; case 0: break; case LDAP_BUSY: send_ldap_error( op, rs, LDAP_BUSY, "ldap_server_busy" ); return LDAP_BUSY; - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto dn2entry_retry; default: send_ldap_error( op, rs, LDAP_OTHER, "internal error" ); return rs->sr_err; } - e = ei->bei_e; - if ( rs->sr_err == DB_NOTFOUND ) { - if( e != NULL ) { - mdb_cache_return_entry_r( mdb, e, &lock ); - e = NULL; - } - - rs->sr_err = LDAP_INVALID_CREDENTIALS; - send_ldap_result( op, rs ); - - return rs->sr_err; - } - ber_dupbv( &op->oq_bind.rb_edn, &e->e_name ); /* check for deleted */ @@ -151,7 +134,7 @@ dn2entry_retry: done: /* free entry and reader lock */ if( e != NULL ) { - mdb_cache_return_entry_r( mdb, e, &lock ); + mdb_entry_return( e ); } if ( rs->sr_err ) { diff --git a/servers/slapd/back-mdb/compare.c b/servers/slapd/back-mdb/compare.c index 55c1041720..b27ad9aa90 100644 --- a/servers/slapd/back-mdb/compare.c +++ b/servers/slapd/back-mdb/compare.c @@ -26,13 +26,11 @@ mdb_compare( Operation *op, SlapReply *rs ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; Entry *e = NULL; - EntryInfo *ei; int manageDSAit = get_manageDSAit( op ); - DB_TXN *rtxn; - DB_LOCK lock; + MDB_txn *rtxn; - rs->sr_err = mdb_reader_get(op, mdb->bi_dbenv, &rtxn); + rs->sr_err = mdb_reader_get(op, mdb->mi_dbenv, &rtxn); switch(rs->sr_err) { case 0: break; @@ -41,29 +39,22 @@ mdb_compare( Operation *op, SlapReply *rs ) return rs->sr_err; } -dn2entry_retry: /* get entry */ - rs->sr_err = mdb_dn2entry( op, rtxn, &op->o_req_ndn, &ei, 1, - &lock ); - + rs->sr_err = mdb_dn2entry( op, rtxn, &op->o_req_ndn, &e, 1 ); switch( rs->sr_err ) { - case DB_NOTFOUND: + case MDB_NOTFOUND: case 0: break; case LDAP_BUSY: rs->sr_text = "ldap server busy"; goto return_results; - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto dn2entry_retry; default: rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error"; goto return_results; } - e = ei->bei_e; - if ( rs->sr_err == DB_NOTFOUND ) { + if ( rs->sr_err == MDB_NOTFOUND ) { if ( e != NULL ) { /* return referral only if "disclose" is granted on the object */ if ( ! access_allowed( op, e, slap_schema.si_ad_entry, @@ -79,7 +70,7 @@ dn2entry_retry: rs->sr_err = LDAP_REFERRAL; } - mdb_cache_return_entry_r( mdb, e, &lock ); + mdb_entry_return( e ); e = NULL; } else { @@ -88,13 +79,8 @@ dn2entry_retry: rs->sr_err = rs->sr_ref ? LDAP_REFERRAL : LDAP_NO_SUCH_OBJECT; } + rs->sr_flags = REP_MATCHED_MUSTBEFREED | REP_REF_MUSTBEFREED; send_ldap_result( op, rs ); - - ber_bvarray_free( rs->sr_ref ); - free( (char *)rs->sr_matched ); - rs->sr_ref = NULL; - rs->sr_matched = NULL; - goto done; } @@ -136,7 +122,7 @@ return_results: done: /* free entry */ if ( e != NULL ) { - mdb_cache_return_entry_r( mdb, e, &lock ); + mdb_entry_return( e ); } return rs->sr_err; diff --git a/servers/slapd/back-mdb/dbcache.c b/servers/slapd/back-mdb/dbcache.c index fb7a0e174b..a90474ae19 100644 --- a/servers/slapd/back-mdb/dbcache.c +++ b/servers/slapd/back-mdb/dbcache.c @@ -31,7 +31,7 @@ int mdb_db_cache( Backend *be, struct berval *name, - DB **dbout ) + MDB_dbi *dbout ) { int i, flags; int rc; @@ -39,48 +39,48 @@ mdb_db_cache( struct mdb_db_info *db; char *file; - *dbout = NULL; + *dbout = 0; - for( i=MDB_NDB; i < mdb->bi_ndatabases; i++ ) { - if( !ber_bvcmp( &mdb->bi_databases[i]->bdi_name, name) ) { - *dbout = mdb->bi_databases[i]->bdi_db; + 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->bi_database_mutex ); + ldap_pvt_thread_mutex_lock( &mdb->mi_database_mutex ); /* check again! may have been added by another thread */ - for( i=MDB_NDB; i < mdb->bi_ndatabases; i++ ) { - if( !ber_bvcmp( &mdb->bi_databases[i]->bdi_name, name) ) { - *dbout = mdb->bi_databases[i]->bdi_db; - ldap_pvt_thread_mutex_unlock( &mdb->bi_database_mutex ); + 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->bi_database_mutex ); + 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->bdi_name, name ); + ber_dupbv( &db->mdi_name, name ); - rc = db_create( &db->bdi_db, mdb->bi_dbenv, 0 ); + 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->bi_dbenv_home, db_strerror(rc), rc ); - ldap_pvt_thread_mutex_unlock( &mdb->bi_database_mutex ); + 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->bdi_name.bv_len + sizeof(MDB_SUFFIX) ); - strcpy( file, db->bdi_name.bv_val ); - strcpy( file+db->bdi_name.bv_len, MDB_SUFFIX ); + 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 ); @@ -95,25 +95,25 @@ mdb_db_cache( (SLAP_TOOL_QUICK|SLAP_TRUNCATE_MODE)) flags |= DB_TRUNCATE; - rc = DB_OPEN( db->bdi_db, + rc = DB_OPEN( db->mdi_dbi, file, NULL /* name */, - MDB_INDEXTYPE, mdb->bi_db_opflags | flags, mdb->bi_dbenv_mode ); + 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, db_strerror(rc), rc ); - ldap_pvt_thread_mutex_unlock( &mdb->bi_database_mutex ); + name->bv_val, mdb_strerror(rc), rc ); + ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex ); return rc; } - mdb->bi_databases[i] = db; - mdb->bi_ndatabases = i+1; + mdb->mi_databases[i] = db; + mdb->mi_ndatabases = i+1; - *dbout = db->bdi_db; + *dbout = db->mdi_dbi; - ldap_pvt_thread_mutex_unlock( &mdb->bi_database_mutex ); + ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex ); return 0; } diff --git a/servers/slapd/back-mdb/delete.c b/servers/slapd/back-mdb/delete.c index d0981b3626..e6eeffa0a9 100644 --- a/servers/slapd/back-mdb/delete.c +++ b/servers/slapd/back-mdb/delete.c @@ -26,23 +26,14 @@ int mdb_delete( Operation *op, SlapReply *rs ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; - Entry *matched = NULL; struct berval pdn = {0, NULL}; Entry *e = NULL; Entry *p = NULL; - EntryInfo *ei = NULL, *eip = NULL; int manageDSAit = get_manageDSAit( op ); AttributeDescription *children = slap_schema.si_ad_children; AttributeDescription *entry = slap_schema.si_ad_entry; - DB_TXN *ltid = NULL, *lt2; + MDB_txn *txn = NULL; struct mdb_op_info opinfo = {{{ 0 }}}; - ID eid; - - DB_LOCK lock, plock; - - int num_retries = 0; - - int rc; LDAPControl **preread_ctrl = NULL; LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS]; @@ -108,72 +99,34 @@ txnReturn: slap_get_csn( op, &csn, 1 ); } - if( 0 ) { -retry: /* transaction retry */ - if( e != NULL ) { - mdb_unlocked_cache_return_entry_w(&mdb->bi_cache, e); - e = NULL; - } - if( p != NULL ) { - mdb_unlocked_cache_return_entry_r(&mdb->bi_cache, p); - p = NULL; - } - Debug( LDAP_DEBUG_TRACE, - "==> " LDAP_XSTRING(mdb_delete) ": retrying...\n", - 0, 0, 0 ); - rs->sr_err = TXN_ABORT( ltid ); - ltid = NULL; - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); - opinfo.boi_oe.oe_key = NULL; - op->o_do_not_cache = opinfo.boi_acl_cache; - if( rs->sr_err != 0 ) { - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; - } - if ( op->o_abandon ) { - rs->sr_err = SLAPD_ABANDON; - goto return_results; - } - parent_is_glue = 0; - parent_is_leaf = 0; - mdb_trans_backoff( ++num_retries ); - } - /* begin transaction */ - rs->sr_err = TXN_BEGIN( mdb->bi_dbenv, NULL, <id, - mdb->bi_db_opflags ); + rs->sr_err = mdb_txn_begin( mdb->mi_dbenv, 0, &txn ); rs->sr_text = NULL; if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_delete) ": txn_begin failed: " - "%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 ); + "%s (%d)\n", mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error"; goto return_results; } - opinfo.boi_oe.oe_key = mdb; - opinfo.boi_txn = ltid; - opinfo.boi_err = 0; - opinfo.boi_acl_cache = op->o_do_not_cache; - LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.boi_oe, oe_next ); + opinfo.moi_oe.oe_key = mdb; + opinfo.moi_txn = txn; + opinfo.moi_err = 0; + opinfo.moi_acl_cache = op->o_do_not_cache; + LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.moi_oe, oe_next ); if ( !be_issuffix( op->o_bd, &op->o_req_ndn ) ) { dnParent( &op->o_req_ndn, &pdn ); } - /* get entry */ - rs->sr_err = mdb_dn2entry( op, ltid, &op->o_req_ndn, &ei, 1, - &lock ); - + /* get parent */ + rs->sr_err = mdb_dn2entry( op, txn, &pdn, &p, 1 ); switch( rs->sr_err ) { case 0: - case DB_NOTFOUND: + case MDB_NOTFOUND: break; - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; case LDAP_BUSY: rs->sr_text = "ldap server busy"; goto return_results; @@ -182,28 +135,20 @@ retry: /* transaction retry */ rs->sr_text = "internal error"; goto return_results; } - - if ( rs->sr_err == 0 ) { - e = ei->bei_e; - eip = ei->bei_parent; - } else { - matched = ei->bei_e; - } - - /* FIXME : dn2entry() should return non-glue entry */ - if ( e == NULL || ( !manageDSAit && is_entry_glue( e ))) { + if ( rs->sr_err == MDB_NOTFOUND ) { Debug( LDAP_DEBUG_ARGS, "<=- " LDAP_XSTRING(mdb_delete) ": no such object %s\n", op->o_req_dn.bv_val, 0, 0); - if ( matched != NULL ) { - rs->sr_matched = ch_strdup( matched->e_dn ); - rs->sr_ref = is_entry_referral( matched ) - ? get_entry_referrals( op, matched ) + if ( !BER_BVISEMPTY( &p->e_name )) { + rs->sr_matched = ch_strdup( p->e_name.bv_val ); + rs->sr_ref = ( p && is_entry_referral( p )) + ? get_entry_referrals( op, p ) : NULL; - mdb_unlocked_cache_return_entry_r(&mdb->bi_cache, matched); - matched = NULL; - + if ( p ) { + mdb_entry_return( p ); + p = NULL; + } } else { rs->sr_ref = referral_rewrite( default_referral, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); @@ -214,42 +159,48 @@ retry: /* transaction retry */ goto return_results; } - rc = mdb_cache_find_id( op, ltid, eip->bei_id, &eip, 0, &plock ); - switch( rc ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; + /* get entry */ + rs->sr_err = mdb_dn2entry( op, txn, &op->o_req_ndn, &e, 0 ); + switch( rs->sr_err ) { case 0: - case DB_NOTFOUND: + case MDB_NOTFOUND: break; + case LDAP_BUSY: + rs->sr_text = "ldap server busy"; + goto return_results; default: rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error"; goto return_results; } - if ( eip ) p = eip->bei_e; - if ( pdn.bv_len != 0 ) { - if( p == NULL || !bvmatch( &pdn, &p->e_nname )) { - Debug( LDAP_DEBUG_TRACE, - "<=- " LDAP_XSTRING(mdb_delete) ": parent " - "does not exist\n", 0, 0, 0 ); - rs->sr_err = LDAP_OTHER; - rs->sr_text = "could not locate parent of entry"; - goto return_results; + /* FIXME : dn2entry() should return non-glue entry */ + if ( rs->sr_err == MDB_NOTFOUND || ( !manageDSAit && is_entry_glue( e ))) { + Debug( LDAP_DEBUG_ARGS, + "<=- " LDAP_XSTRING(mdb_delete) ": no such object %s\n", + op->o_req_dn.bv_val, 0, 0); + + rs->sr_matched = ch_strdup( p->e_dn ); + rs->sr_ref = is_entry_referral( p ) + ? get_entry_referrals( op, p ) : NULL; + if ( e ) { + mdb_entry_return( e ); + e = NULL; } + mdb_entry_return( p ); + p = NULL; + rs->sr_err = LDAP_REFERRAL; + rs->sr_flags = REP_MATCHED_MUSTBEFREED | REP_REF_MUSTBEFREED; + goto return_results; + } + + if ( pdn.bv_len != 0 ) { /* check parent for "children" acl */ rs->sr_err = access_allowed( op, p, children, NULL, ACL_WDEL, NULL ); if ( !rs->sr_err ) { - switch( opinfo.boi_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } - Debug( LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_delete) ": no write " "access to parent\n", 0, 0, 0 ); @@ -272,12 +223,6 @@ retry: /* transaction retry */ p = NULL; if ( !rs->sr_err ) { - switch( opinfo.boi_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } - Debug( LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_delete) ": no access to parent\n", @@ -308,12 +253,6 @@ retry: /* transaction retry */ entry, NULL, ACL_WDEL, NULL ); if ( !rs->sr_err ) { - switch( opinfo.boi_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } - Debug( LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_delete) ": no write access " "to entry\n", 0, 0, 0 ); @@ -356,29 +295,12 @@ retry: /* transaction retry */ } } - /* nested transaction */ - rs->sr_err = TXN_BEGIN( mdb->bi_dbenv, ltid, <2, - mdb->bi_db_opflags ); rs->sr_text = NULL; - if( rs->sr_err != 0 ) { - Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(mdb_delete) ": txn_begin(2) failed: " - "%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 ); - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; - } - - MDB_LOG_PRINTF( mdb->bi_dbenv, lt2, "slapd Starting delete %s(%d)", - e->e_nname.bv_val, e->e_id ); /* Can't do it if we have kids */ - rs->sr_err = mdb_cache_children( op, lt2, e ); - if( rs->sr_err != DB_NOTFOUND ) { + rs->sr_err = mdb_dn2id_children( op, txn, e ); + if( rs->sr_err != MDB_NOTFOUND ) { switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; case 0: Debug(LDAP_DEBUG_ARGS, "<=- " LDAP_XSTRING(mdb_delete) @@ -391,7 +313,7 @@ retry: /* transaction retry */ Debug(LDAP_DEBUG_ARGS, "<=- " LDAP_XSTRING(mdb_delete) ": has_children failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error"; } @@ -399,32 +321,22 @@ retry: /* transaction retry */ } /* delete from dn2id */ - rs->sr_err = mdb_dn2id_delete( op, lt2, eip, e ); + rs->sr_err = mdb_dn2id_delete( op, txn, p->e_id, e ); if ( rs->sr_err != 0 ) { Debug(LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_delete) ": dn2id failed: " - "%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 ); - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } + "%s (%d)\n", mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_text = "DN index delete failed"; rs->sr_err = LDAP_OTHER; goto return_results; } /* delete indices for old attributes */ - rs->sr_err = mdb_index_entry_del( op, lt2, e ); + rs->sr_err = mdb_index_entry_del( op, txn, e ); if ( rs->sr_err != LDAP_SUCCESS ) { Debug(LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_delete) ": index failed: " - "%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 ); - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } + "%s (%d)\n", mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_text = "entry index delete failed"; rs->sr_err = LDAP_OTHER; goto return_results; @@ -437,14 +349,9 @@ retry: /* transaction retry */ assert( !BER_BVISNULL( &op->o_csn ) ); vals[0] = op->o_csn; BER_BVZERO( &vals[1] ); - rs->sr_err = mdb_index_values( op, lt2, slap_schema.si_ad_entryCSN, + rs->sr_err = mdb_index_values( op, txn, slap_schema.si_ad_entryCSN, vals, 0, SLAP_INDEX_ADD_OP ); if ( rs->sr_err != LDAP_SUCCESS ) { - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } rs->sr_text = "entryCSN index update failed"; rs->sr_err = LDAP_OTHER; goto return_results; @@ -452,16 +359,11 @@ retry: /* transaction retry */ } /* delete from id2entry */ - rs->sr_err = mdb_id2entry_delete( op->o_bd, lt2, e ); + rs->sr_err = mdb_id2entry_delete( op->o_bd, txn, e ); if ( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_delete) ": id2entry failed: " - "%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 ); - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } + "%s (%d)\n", mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_text = "entry delete failed"; rs->sr_err = LDAP_OTHER; goto return_results; @@ -469,74 +371,43 @@ retry: /* transaction retry */ if ( pdn.bv_len != 0 ) { parent_is_glue = is_entry_glue(p); - rs->sr_err = mdb_cache_children( op, lt2, p ); - if ( rs->sr_err != DB_NOTFOUND ) { + rs->sr_err = mdb_dn2id_children( op, txn, p ); + if ( rs->sr_err != MDB_NOTFOUND ) { switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; case 0: break; default: Debug(LDAP_DEBUG_ARGS, "<=- " LDAP_XSTRING(mdb_delete) ": has_children failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error"; goto return_results; } parent_is_leaf = 1; } - mdb_unlocked_cache_return_entry_r(&mdb->bi_cache, p); + meb_entry_return( p ); p = NULL; } - MDB_LOG_PRINTF( mdb->bi_dbenv, lt2, "slapd Commit1 delete %s(%d)", - e->e_nname.bv_val, e->e_id ); - - if ( TXN_COMMIT( lt2, 0 ) != 0 ) { - rs->sr_err = LDAP_OTHER; - rs->sr_text = "txn_commit(2) failed"; - goto return_results; - } - - eid = e->e_id; - if( op->o_noop ) { - if ( ( rs->sr_err = TXN_ABORT( ltid ) ) != 0 ) { - rs->sr_text = "txn_abort (no-op) failed"; - } else { - rs->sr_err = LDAP_X_NO_OPERATION; - ltid = NULL; - goto return_results; - } + mdb_txn_abort( txn ); + rs->sr_err = LDAP_X_NO_OPERATION; + txn = NULL; + goto return_results; } else { - - MDB_LOG_PRINTF( mdb->bi_dbenv, ltid, "slapd Cache delete %s(%d)", - e->e_nname.bv_val, e->e_id ); - - rc = mdb_cache_delete( mdb, e, ltid, &lock ); - switch( rc ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } - - rs->sr_err = TXN_COMMIT( ltid, 0 ); + rs->sr_err = mdb_txn_commit( txn ); + txn = NULL; } - ltid = NULL; - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); - opinfo.boi_oe.oe_key = NULL; - - MDB_LOG_PRINTF( mdb->bi_dbenv, NULL, "slapd Committed delete %s(%d)", - e->e_nname.bv_val, e->e_id ); + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next ); + opinfo.moi_oe.oe_key = NULL; if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_delete) ": txn_%s failed: %s (%d)\n", op->o_noop ? "abort (no-op)" : "commit", - db_strerror(rs->sr_err), rs->sr_err ); + mdb_strerror(rs->sr_err), rs->sr_err ); rs->sr_err = LDAP_OTHER; rs->sr_text = "commit failed"; @@ -546,7 +417,7 @@ retry: /* transaction retry */ Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_delete) ": deleted%s id=%08lx dn=\"%s\"\n", op->o_noop ? " (no-op)" : "", - eid, op->o_req_dn.bv_val ); + e->e_id, op->o_req_dn.bv_val ); rs->sr_err = LDAP_SUCCESS; rs->sr_text = NULL; if( num_ctrls ) rs->sr_ctrls = ctrls; @@ -556,25 +427,20 @@ return_results: op->o_delete_glue_parent = 1; } - if ( p ) - mdb_unlocked_cache_return_entry_r(&mdb->bi_cache, p); + if ( p != NULL ) { + mdb_entry_return( p ); + } /* free entry */ if( e != NULL ) { - if ( rs->sr_err == LDAP_SUCCESS ) { - /* Free the EntryInfo and the Entry */ - mdb_cache_entryinfo_lock( BEI(e) ); - mdb_cache_delete_cleanup( &mdb->bi_cache, BEI(e) ); - } else { - mdb_unlocked_cache_return_entry_w(&mdb->bi_cache, e); - } + mdb_entry_return( e ); } - if( ltid != NULL ) { - TXN_ABORT( ltid ); + if( txn != NULL ) { + mdb_txn_abort( txn ); } - if ( opinfo.boi_oe.oe_key ) { - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + if ( opinfo.moi_oe.oe_key ) { + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next ); } send_ldap_result( op, rs ); @@ -585,9 +451,11 @@ return_results: slap_sl_free( *preread_ctrl, op->o_tmpmemctx ); } +#if 0 if( rs->sr_err == LDAP_SUCCESS && mdb->bi_txn_cp_kbyte ) { TXN_CHECKPOINT( mdb->bi_dbenv, mdb->bi_txn_cp_kbyte, mdb->bi_txn_cp_min, 0 ); } +#endif return rs->sr_err; } diff --git a/servers/slapd/back-mdb/dn2entry.c b/servers/slapd/back-mdb/dn2entry.c index e2da3dca9a..12a51465c3 100644 --- a/servers/slapd/back-mdb/dn2entry.c +++ b/servers/slapd/back-mdb/dn2entry.c @@ -33,22 +33,30 @@ mdb_dn2entry( MDB_txn *tid, struct berval *dn, Entry **e, - struct berval *matched ) + int matched ) { int rc, rc2; - ID id; + ID id = NOID; + struct berval bvm; Debug(LDAP_DEBUG_TRACE, "mdb_dn2entry(\"%s\")\n", dn->bv_val, 0, 0 ); *e = NULL; - rc = mdb_dn2id( op, tid, dn, &id, matched ); + rc = mdb_dn2id( op, tid, dn, &id, &bvm ); if ( rc ) { - *e = NULL; + if ( matched ) + rc2 = mdb_id2entry( op, tid, id, e ); + } else { rc = mdb_id2entry( op, tid, id, e ); } + if ( *e ) { + (*e)->e_name = bvm; + if ( rc == MDB_SUCCESS ) + ber_dupbv_x( &(*e)->e_nname, dn, op->o_tmpmemctx ); + } return rc; } diff --git a/servers/slapd/back-mdb/dn2id.c b/servers/slapd/back-mdb/dn2id.c index 2e0ae7f5d1..2ea6cdbd8b 100644 --- a/servers/slapd/back-mdb/dn2id.c +++ b/servers/slapd/back-mdb/dn2id.c @@ -269,6 +269,7 @@ mdb_dn2id( int rc = 0, nrlen; diskNode *d; char *ptr; + char dn[SLAP_LDAPDN_MAXLEN]; unsigned char dlen[2]; ID pid, nid; struct berval tmp; @@ -283,6 +284,12 @@ mdb_dn2id( tmp = *in; + if ( matched ) { + matched->bv_val = dn + sizeof(dn) - 1; + matched->bv_len = 0; + *matched->bv_val-- = '\0'; + } + 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; @@ -304,25 +311,34 @@ mdb_dn2id( *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_NOTFOUND ) { - if ( matched ) { - int len; - matched->bv_val = tmp.bv_val + tmp.bv_len + 1; - len = in->bv_len - ( matched->bv_val - in->bv_val ); - if ( len <= 0 ) { - BER_BVZERO( matched ); - } else { - matched->bv_len = len; - } + if ( matched && matched->bv_len ) { + ptr = op->o_tmpalloc( matched->bv_len+1, op->o_tmpmemctx ); + strcpy( ptr, matched->bv_val ); + matched->bv_val = ptr; } } - 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)); + + /* grab the non-normalized RDN */ + if ( matched ) { + int rlen; + d = data.mv_data; + rlen = data.mv_size - sizeof(diskNode) - tmp.bv_len; + matched->bv_len += rlen; + matched->bv_val -= rlen + 1; + ptr = lutil_strcopy( matched->bv_val, d->rdn + tmp.bv_len ); + if ( pid ) { + *ptr = ','; + matched->bv_len++; + } + } if ( tmp.bv_val > in->bv_val ) { for (ptr = tmp.bv_val - 2; ptr > in->bv_val && !DN_SEPARATOR(*ptr); ptr--) /* empty */; diff --git a/servers/slapd/back-mdb/error.c b/servers/slapd/back-mdb/error.c deleted file mode 100644 index 14a06726de..0000000000 --- a/servers/slapd/back-mdb/error.c +++ /dev/null @@ -1,62 +0,0 @@ -/* error.c - MDB errcall routine */ -/* $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 "slap.h" -#include "back-mdb.h" - -#if DB_VERSION_FULL < 0x04030000 -void mdb_errcall( const char *pfx, char * msg ) -#else -void mdb_errcall( const DB_ENV *env, const char *pfx, const char * msg ) -#endif -{ -#ifdef HAVE_EBCDIC - if ( msg[0] > 0x7f ) - __etoa( msg ); -#endif - Debug( LDAP_DEBUG_ANY, "mdb(%s): %s\n", pfx, msg, 0 ); -} - -#if DB_VERSION_FULL >= 0x04030000 -void mdb_msgcall( const DB_ENV *env, const char *msg ) -{ -#ifdef HAVE_EBCDIC - if ( msg[0] > 0x7f ) - __etoa( msg ); -#endif - Debug( LDAP_DEBUG_TRACE, "mdb: %s\n", msg, 0, 0 ); -} -#endif - -#ifdef HAVE_EBCDIC - -#undef db_strerror - -/* Not re-entrant! */ -char *ebcdic_dberror( int rc ) -{ - static char msg[1024]; - - strcpy( msg, db_strerror( rc ) ); - __etoa( msg ); - return msg; -} -#endif diff --git a/servers/slapd/back-mdb/id2entry.c b/servers/slapd/back-mdb/id2entry.c index 2b2e377fe7..2fbfd70854 100644 --- a/servers/slapd/back-mdb/id2entry.c +++ b/servers/slapd/back-mdb/id2entry.c @@ -146,26 +146,6 @@ int mdb_entry_return( Entry *e ) { - /* Our entries are allocated in two blocks; the data comes from - * the db itself and the Entry structure and associated pointers - * are allocated in entry_decode. The db data pointer is saved - * in e_bv. - */ - if ( e->e_bv.bv_val ) { - /* See if the DNs were changed by modrdn */ - if( e->e_nname.bv_val < e->e_bv.bv_val || e->e_nname.bv_val > - e->e_bv.bv_val + e->e_bv.bv_len ) { - ch_free(e->e_name.bv_val); - ch_free(e->e_nname.bv_val); - } - e->e_name.bv_val = NULL; - e->e_nname.bv_val = NULL; - /* In tool mode the e_bv buffer is realloc'd, leave it alone */ - if( !(slapMode & SLAP_TOOL_MODE) ) { - free( e->e_bv.bv_val ); - } - BER_BVZERO( &e->e_bv ); - } entry_free( e ); return 0; } diff --git a/servers/slapd/back-mdb/index.c b/servers/slapd/back-mdb/index.c index 7a9453bc71..79977c7f39 100644 --- a/servers/slapd/back-mdb/index.c +++ b/servers/slapd/back-mdb/index.c @@ -76,14 +76,14 @@ int mdb_index_param( Backend *be, AttributeDescription *desc, int ftype, - DB **dbp, + MDB_dbi *dbip, slap_mask_t *maskp, struct berval *prefixp ) { AttrInfo *ai; int rc; slap_mask_t mask, type = 0; - DB *db; + MDB_dbi dbi; ai = mdb_index_mask( be, desc, prefixp ); @@ -112,7 +112,7 @@ int mdb_index_param( } mask = ai->ai_indexmask; - rc = mdb_db_cache( be, prefixp, &db ); + rc = mdb_db_cache( be, prefixp, &dbi ); if( rc != LDAP_SUCCESS ) { return rc; @@ -164,14 +164,14 @@ int mdb_index_param( return LDAP_INAPPROPRIATE_MATCHING; done: - *dbp = db; + *dbip = dbi; *maskp = mask; return LDAP_SUCCESS; } static int indexer( Operation *op, - DB_TXN *txn, + MDB_txn *txn, AttributeDescription *ad, struct berval *atname, BerVarray vals, @@ -180,12 +180,12 @@ static int indexer( slap_mask_t mask ) { int rc, i; - DB *db; + MDB_dbi dbi; struct berval *keys; assert( mask != 0 ); - rc = mdb_db_cache( op->o_bd, atname, &db ); + rc = mdb_db_cache( op->o_bd, atname, &dbi ); if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, @@ -195,7 +195,7 @@ static int indexer( } if( IS_SLAP_INDEX( mask, SLAP_INDEX_PRESENT ) ) { - rc = mdb_key_change( op->o_bd, db, txn, &presence_key, id, opid ); + rc = mdb_key_change( op->o_bd, txn, dbi, &presence_key, id, opid ); if( rc ) { goto done; } @@ -211,7 +211,7 @@ static int indexer( if( rc == LDAP_SUCCESS && keys != NULL ) { for( i=0; keys[i].bv_val != NULL; i++ ) { - rc = mdb_key_change( op->o_bd, db, txn, &keys[i], id, opid ); + rc = mdb_key_change( op->o_bd, txn, dbi, &keys[i], id, opid ); if( rc ) { ber_bvarray_free_x( keys, op->o_tmpmemctx ); goto done; @@ -232,7 +232,7 @@ static int indexer( if( rc == LDAP_SUCCESS && keys != NULL ) { for( i=0; keys[i].bv_val != NULL; i++ ) { - rc = mdb_key_change( op->o_bd, db, txn, &keys[i], id, opid ); + rc = mdb_key_change( op->o_bd, txn, dbi, &keys[i], id, opid ); if( rc ) { ber_bvarray_free_x( keys, op->o_tmpmemctx ); goto done; @@ -254,7 +254,7 @@ static int indexer( if( rc == LDAP_SUCCESS && keys != NULL ) { for( i=0; keys[i].bv_val != NULL; i++ ) { - rc = mdb_key_change( op->o_bd, db, txn, &keys[i], id, opid ); + rc = mdb_key_change( op->o_bd, txn, dbi, &keys[i], id, opid ); if( rc ) { ber_bvarray_free_x( keys, op->o_tmpmemctx ); goto done; @@ -270,8 +270,6 @@ done: switch( rc ) { /* The callers all know how to deal with these results */ case 0: - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: break; /* Anything else is bad news */ default: @@ -282,7 +280,7 @@ done: static int index_at_values( Operation *op, - DB_TXN *txn, + MDB_txn *txn, AttributeDescription *ad, AttributeType *type, struct berval *tags, @@ -371,7 +369,7 @@ static int index_at_values( int mdb_index_values( Operation *op, - DB_TXN *txn, + MDB_txn *txn, AttributeDescription *desc, BerVarray vals, ID id, @@ -411,7 +409,7 @@ mdb_index_recset( if( type->sat_ad ) { slot = mdb_attr_slot( mdb, type->sat_ad, NULL ); if ( slot >= 0 ) { - ir[slot].ai = mdb->bi_attrs[slot]; + ir[slot].ai = mdb->mi_attrs[slot]; al = ch_malloc( sizeof( AttrList )); al->attr = a; al->next = ir[slot].attrs; @@ -425,7 +423,7 @@ mdb_index_recset( if( desc ) { slot = mdb_attr_slot( mdb, desc, NULL ); if ( slot >= 0 ) { - ir[slot].ai = mdb->bi_attrs[slot]; + ir[slot].ai = mdb->mi_attrs[slot]; al = ch_malloc( sizeof( AttrList )); al->attr = a; al->next = ir[slot].attrs; @@ -452,7 +450,7 @@ int mdb_index_recrun( if ( id == 0 ) return 0; - for (i=base; ibi_nattrs; i+=slap_tool_thread_max) { + for (i=base; imi_nattrs; i+=slap_tool_thread_max) { ir = ir0 + i; if ( !ir->ai ) continue; while (( al = ir->attrs )) { @@ -471,7 +469,7 @@ int mdb_index_recrun( int mdb_index_entry( Operation *op, - DB_TXN *txn, + MDB_txn *txn, int opid, Entry *e ) { diff --git a/servers/slapd/back-mdb/key.c b/servers/slapd/back-mdb/key.c index 62377b5c91..e33392008c 100644 --- a/servers/slapd/back-mdb/key.c +++ b/servers/slapd/back-mdb/key.c @@ -29,25 +29,23 @@ int mdb_key_read( Backend *be, - DB *db, - DB_TXN *txn, + MDB_txn *txn, + MDB_dbi dbi, struct berval *k, ID *ids, - DBC **saved_cursor, + MDB_cursor **saved_cursor, int get_flag ) { int rc; - DBT key; + MDB_val key; Debug( LDAP_DEBUG_TRACE, "=> key_read\n", 0, 0, 0 ); - DBTzero( &key ); - bv2DBT(k,&key); - key.ulen = key.size; - key.flags = DB_DBT_USERMEM; + key.mv_size = k->bv_len; + key.mv_data = k->bv_val; - rc = mdb_idl_fetch_key( be, db, txn, &key, ids, saved_cursor, get_flag ); + rc = mdb_idl_fetch_key( be, txn, dbi, &key, ids, saved_cursor, get_flag ); if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, "<= mdb_index_read: failed (%d)\n", @@ -64,32 +62,30 @@ mdb_key_read( int mdb_key_change( Backend *be, - DB *db, - DB_TXN *txn, + MDB_txn *txn, + MDB_dbi dbi, struct berval *k, ID id, int op ) { int rc; - DBT key; + MDB_val key; Debug( LDAP_DEBUG_TRACE, "=> key_change(%s,%lx)\n", op == SLAP_INDEX_ADD_OP ? "ADD":"DELETE", (long) id, 0 ); - DBTzero( &key ); - bv2DBT(k,&key); - key.ulen = key.size; - key.flags = DB_DBT_USERMEM; + key.mv_size = k->bv_len; + key.mv_data = k->bv_val; if (op == SLAP_INDEX_ADD_OP) { /* Add values */ - rc = mdb_idl_insert_key( be, db, txn, &key, id ); - if ( rc == DB_KEYEXIST ) rc = 0; + rc = mdb_idl_insert_key( be, txn, dbi, &key, id ); + if ( rc == MDB_KEYEXIST ) rc = 0; } else { /* Delete values */ - rc = mdb_idl_delete_key( be, db, txn, &key, id ); - if ( rc == DB_NOTFOUND ) rc = 0; + rc = mdb_idl_delete_key( be, txn, dbi, &key, id ); + if ( rc == MDB_NOTFOUND ) rc = 0; } Debug( LDAP_DEBUG_TRACE, "<= key_change %d\n", rc, 0, 0 ); diff --git a/servers/slapd/back-mdb/libmdb b/servers/slapd/back-mdb/libmdb index 1baf6b1f31..f2c57f6240 160000 --- a/servers/slapd/back-mdb/libmdb +++ b/servers/slapd/back-mdb/libmdb @@ -1 +1 @@ -Subproject commit 1baf6b1f3179d5717b13d2ac7d2452aa80f04771 +Subproject commit f2c57f62403ffcbe9fb8605e6e97d86f7aedb1a7 diff --git a/servers/slapd/back-mdb/modify.c b/servers/slapd/back-mdb/modify.c index 128077ed2c..a4d4f518b6 100644 --- a/servers/slapd/back-mdb/modify.c +++ b/servers/slapd/back-mdb/modify.c @@ -67,7 +67,7 @@ mdb_modify_idxflags( int mdb_modify_internal( Operation *op, - DB_TXN *tid, + MDB_txn *tid, Modifications *modlist, Entry *e, const char **text, @@ -398,25 +398,18 @@ mdb_modify( Operation *op, SlapReply *rs ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; Entry *e = NULL; - EntryInfo *ei = NULL; int manageDSAit = get_manageDSAit( op ); char textbuf[SLAP_TEXT_BUFLEN]; size_t textlen = sizeof textbuf; - DB_TXN *ltid = NULL, *lt2; + MDB_txn *txn = NULL; struct mdb_op_info opinfo = {{{ 0 }}}; Entry dummy = {0}; - DB_LOCK lock; - - int num_retries = 0; - LDAPControl **preread_ctrl = NULL; LDAPControl **postread_ctrl = NULL; LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS]; int num_ctrls = 0; - int rc; - #ifdef LDAP_X_TXN int settle = 0; #endif @@ -472,68 +465,33 @@ txnReturn: slap_mods_opattrs( op, &op->orm_modlist, 1 ); } - if( 0 ) { -retry: /* transaction retry */ - if ( dummy.e_attrs ) { - attrs_free( dummy.e_attrs ); - dummy.e_attrs = NULL; - } - if( e != NULL ) { - mdb_unlocked_cache_return_entry_w(&mdb->bi_cache, e); - e = NULL; - } - Debug(LDAP_DEBUG_TRACE, - LDAP_XSTRING(mdb_modify) ": retrying...\n", 0, 0, 0); - - rs->sr_err = TXN_ABORT( ltid ); - ltid = NULL; - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); - opinfo.boi_oe.oe_key = NULL; - op->o_do_not_cache = opinfo.boi_acl_cache; - if( rs->sr_err != 0 ) { - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; - } - if ( op->o_abandon ) { - rs->sr_err = SLAPD_ABANDON; - goto return_results; - } - mdb_trans_backoff( ++num_retries ); - } - /* begin transaction */ - rs->sr_err = TXN_BEGIN( mdb->bi_dbenv, NULL, <id, - mdb->bi_db_opflags ); + rs->sr_err = mdb_txn_begin( mdb->mi_dbenv, 0, &txn ); rs->sr_text = NULL; if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modify) ": txn_begin failed: " - "%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 ); + "%s (%d)\n", mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error"; goto return_results; } - opinfo.boi_oe.oe_key = mdb; - opinfo.boi_txn = ltid; - opinfo.boi_err = 0; - opinfo.boi_acl_cache = op->o_do_not_cache; - LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.boi_oe, oe_next ); + opinfo.moi_oe.oe_key = mdb; + opinfo.moi_txn = txn; + opinfo.moi_err = 0; + opinfo.moi_acl_cache = op->o_do_not_cache; + LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.moi_oe, oe_next ); /* get entry or ancestor */ - rs->sr_err = mdb_dn2entry( op, ltid, &op->o_req_ndn, &ei, 1, - &lock ); + rs->sr_err = mdb_dn2entry( op, txn, &op->o_req_ndn, &e, 1 ); if ( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modify) ": dn2entry failed (%d)\n", rs->sr_err, 0, 0 ); switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - case DB_NOTFOUND: + case MDB_NOTFOUND: break; case LDAP_BUSY: rs->sr_text = "ldap server busy"; @@ -545,11 +503,9 @@ retry: /* transaction retry */ } } - e = ei->bei_e; - /* acquire and lock entry */ /* FIXME: dn2entry() should return non-glue entry */ - if (( rs->sr_err == DB_NOTFOUND ) || + if (( rs->sr_err == MDB_NOTFOUND ) || ( !manageDSAit && e && is_entry_glue( e ))) { if ( e != NULL ) { @@ -557,7 +513,7 @@ retry: /* transaction retry */ rs->sr_ref = is_entry_referral( e ) ? get_entry_referrals( op, e ) : NULL; - mdb_unlocked_cache_return_entry_r (&mdb->bi_cache, e); + mdb_entry_return( e ); e = NULL; } else { @@ -565,16 +521,9 @@ retry: /* transaction retry */ &op->o_req_dn, LDAP_SCOPE_DEFAULT ); } + rs->sr_flags = REP_MATCHED_MUSTBEFREED | REP_REF_MUSTBEFREED; rs->sr_err = LDAP_REFERRAL; send_ldap_result( op, rs ); - - if ( rs->sr_ref != default_referral ) { - ber_bvarray_free( rs->sr_ref ); - } - free( (char *)rs->sr_matched ); - rs->sr_ref = NULL; - rs->sr_matched = NULL; - goto done; } @@ -588,10 +537,8 @@ retry: /* transaction retry */ rs->sr_err = LDAP_REFERRAL; rs->sr_matched = e->e_name.bv_val; + rs->sr_flags = REP_REF_MUSTBEFREED; send_ldap_result( op, rs ); - - ber_bvarray_free( rs->sr_ref ); - rs->sr_ref = NULL; rs->sr_matched = NULL; goto done; } @@ -622,60 +569,33 @@ retry: /* transaction retry */ } } - /* nested transaction */ - rs->sr_err = TXN_BEGIN( mdb->bi_dbenv, ltid, <2, mdb->bi_db_opflags ); - rs->sr_text = NULL; - if( rs->sr_err != 0 ) { - Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(mdb_modify) ": txn_begin(2) failed: " "%s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; - } /* Modify the entry */ dummy = *e; - rs->sr_err = mdb_modify_internal( op, lt2, op->orm_modlist, + rs->sr_err = mdb_modify_internal( op, txn, op->orm_modlist, &dummy, &rs->sr_text, textbuf, textlen ); if( rs->sr_err != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modify) ": modify failed (%d)\n", rs->sr_err, 0, 0 ); - if ( (rs->sr_err == LDAP_INSUFFICIENT_ACCESS) && opinfo.boi_err ) { - rs->sr_err = opinfo.boi_err; + if ( (rs->sr_err == LDAP_INSUFFICIENT_ACCESS) && opinfo.moi_err ) { + rs->sr_err = opinfo.moi_err; } /* Only free attrs if they were dup'd. */ if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL; - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } goto return_results; } /* change the entry itself */ - rs->sr_err = mdb_id2entry_update( op->o_bd, lt2, &dummy ); + rs->sr_err = mdb_id2entry_update( op, txn, &dummy ); if ( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modify) ": id2entry update failed " "(%d)\n", rs->sr_err, 0, 0 ); - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } rs->sr_text = "entry update failed"; goto return_results; } - if ( TXN_COMMIT( lt2, 0 ) != 0 ) { - rs->sr_err = LDAP_OTHER; - rs->sr_text = "txn_commit(2) failed"; - goto return_results; - } - if( op->o_postread ) { if( postread_ctrl == NULL ) { postread_ctrl = &ctrls[num_ctrls++]; @@ -696,37 +616,26 @@ retry: /* transaction retry */ } if( op->o_noop ) { - if ( ( rs->sr_err = TXN_ABORT( ltid ) ) != 0 ) { - rs->sr_text = "txn_abort (no-op) failed"; - } else { - rs->sr_err = LDAP_X_NO_OPERATION; - ltid = NULL; - /* Only free attrs if they were dup'd. */ - if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL; - goto return_results; - } + mdb_txn_abort( txn ); + rs->sr_err = LDAP_X_NO_OPERATION; + txn = NULL; + /* Only free attrs if they were dup'd. */ + if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL; + goto return_results; } else { - /* may have changed in mdb_modify_internal() */ - e->e_ocflags = dummy.e_ocflags; - rc = mdb_cache_modify( mdb, e, dummy.e_attrs, ltid, &lock ); - switch( rc ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } dummy.e_attrs = NULL; - rs->sr_err = TXN_COMMIT( ltid, 0 ); + rs->sr_err = mdb_txn_commit( txn ); } - ltid = NULL; - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); - opinfo.boi_oe.oe_key = NULL; + txn = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next ); + opinfo.moi_oe.oe_key = NULL; if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modify) ": txn_%s failed: %s (%d)\n", op->o_noop ? "abort (no-op)" : "commit", - db_strerror(rs->sr_err), rs->sr_err ); + mdb_strerror(rs->sr_err), rs->sr_err ); rs->sr_err = LDAP_OTHER; rs->sr_text = "commit failed"; @@ -748,23 +657,25 @@ return_results: } send_ldap_result( op, rs ); +#if 0 if( rs->sr_err == LDAP_SUCCESS && mdb->bi_txn_cp_kbyte ) { TXN_CHECKPOINT( mdb->bi_dbenv, mdb->bi_txn_cp_kbyte, mdb->bi_txn_cp_min, 0 ); } +#endif done: slap_graduate_commit_csn( op ); - if( ltid != NULL ) { - TXN_ABORT( ltid ); + if( txn != NULL ) { + mdb_txn_abort( txn ); } - if ( opinfo.boi_oe.oe_key ) { - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + if ( opinfo.moi_oe.oe_key ) { + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next ); } if( e != NULL ) { - mdb_unlocked_cache_return_entry_w (&mdb->bi_cache, e); + mdb_entry_return( e ); } if( preread_ctrl != NULL && (*preread_ctrl) != NULL ) { diff --git a/servers/slapd/back-mdb/modrdn.c b/servers/slapd/back-mdb/modrdn.c index 01f236c9f9..8aa4097d86 100644 --- a/servers/slapd/back-mdb/modrdn.c +++ b/servers/slapd/back-mdb/modrdn.c @@ -31,11 +31,10 @@ mdb_modrdn( Operation *op, SlapReply *rs ) struct berval new_dn = {0, NULL}, new_ndn = {0, NULL}; Entry *e = NULL; Entry *p = NULL; - EntryInfo *ei = NULL, *eip = NULL, *nei = NULL, *neip = NULL; /* LDAP v2 supporting correct attribute handling. */ char textbuf[SLAP_TEXT_BUFLEN]; size_t textlen = sizeof textbuf; - DB_TXN *ltid = NULL, *lt2; + MDB_txn *txn = NULL; struct mdb_op_info opinfo = {{{ 0 }}}; Entry dummy = {0}; @@ -46,17 +45,12 @@ mdb_modrdn( Operation *op, SlapReply *rs ) int manageDSAit = get_manageDSAit( op ); - DB_LOCK lock, plock, nplock; - - int num_retries = 0; - + ID nid; LDAPControl **preread_ctrl = NULL; LDAPControl **postread_ctrl = NULL; LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS]; int num_ctrls = 0; - int rc; - int parent_is_glue = 0; int parent_is_leaf = 0; @@ -110,76 +104,95 @@ txnReturn: slap_mods_opattrs( op, &op->orr_modlist, 1 ); - if( 0 ) { -retry: /* transaction retry */ - if ( dummy.e_attrs ) { - attrs_free( dummy.e_attrs ); - dummy.e_attrs = NULL; - } - if (e != NULL) { - mdb_unlocked_cache_return_entry_w(&mdb->bi_cache, e); - e = NULL; - } - if (p != NULL) { - mdb_unlocked_cache_return_entry_r(&mdb->bi_cache, p); - p = NULL; - } - if (np != NULL) { - mdb_unlocked_cache_return_entry_r(&mdb->bi_cache, np); - np = NULL; - } - Debug( LDAP_DEBUG_TRACE, "==>" LDAP_XSTRING(mdb_modrdn) - ": retrying...\n", 0, 0, 0 ); - - rs->sr_err = TXN_ABORT( ltid ); - ltid = NULL; - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); - opinfo.boi_oe.oe_key = NULL; - op->o_do_not_cache = opinfo.boi_acl_cache; - if( rs->sr_err != 0 ) { - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; - } - if ( op->o_abandon ) { - rs->sr_err = SLAPD_ABANDON; - goto return_results; - } - parent_is_glue = 0; - parent_is_leaf = 0; - mdb_trans_backoff( ++num_retries ); - } - /* begin transaction */ - rs->sr_err = TXN_BEGIN( mdb->bi_dbenv, NULL, <id, - mdb->bi_db_opflags ); + rs->sr_err = mdb_txn_begin( mdb->mi_dbenv, 0, &txn ); rs->sr_text = NULL; if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modrdn) ": txn_begin failed: " - "%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 ); + "%s (%d)\n", mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error"; goto return_results; } - opinfo.boi_oe.oe_key = mdb; - opinfo.boi_txn = ltid; - opinfo.boi_err = 0; - opinfo.boi_acl_cache = op->o_do_not_cache; - LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.boi_oe, oe_next ); + opinfo.moi_oe.oe_key = mdb; + opinfo.moi_txn = txn; + opinfo.moi_err = 0; + opinfo.moi_acl_cache = op->o_do_not_cache; + LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.moi_oe, oe_next ); - /* get entry */ - rs->sr_err = mdb_dn2entry( op, ltid, &op->o_req_ndn, &ei, 1, - &lock ); + if ( be_issuffix( op->o_bd, &e->e_nname ) ) { +#ifdef MDB_MULTIPLE_SUFFIXES + /* Allow renaming one suffix entry to another */ + p_ndn = slap_empty_bv; +#else + /* There can only be one suffix entry */ + rs->sr_err = LDAP_NAMING_VIOLATION; + rs->sr_text = "cannot rename suffix entry"; + goto return_results; +#endif + } else { + dnParent( &e->e_nname, &p_ndn ); + } + np_ndn = &p_ndn; + /* Make sure parent entry exist and we can write its + * children. + */ + rs->sr_err = mdb_dn2entry( op, txn, &p_ndn, &p, 0 ); + switch( rs->sr_err ) { + case MDB_NOTFOUND: + Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modrdn) + ": parent does not exist\n", 0, 0, 0); + rs->sr_err = LDAP_OTHER; + rs->sr_text = "entry's parent does not exist"; + goto return_results; + case 0: + break; + case LDAP_BUSY: + rs->sr_text = "ldap server busy"; + goto return_results; + default: + rs->sr_err = LDAP_OTHER; + rs->sr_text = "internal error"; + goto return_results; + } + + /* check parent for "children" acl */ + rs->sr_err = access_allowed( op, p, + children, NULL, + op->oq_modrdn.rs_newSup == NULL ? + ACL_WRITE : ACL_WDEL, + NULL ); + if ( ! rs->sr_err ) { + rs->sr_err = LDAP_INSUFFICIENT_ACCESS; + Debug( LDAP_DEBUG_TRACE, "no access to parent\n", 0, + 0, 0 ); + rs->sr_text = "no write access to parent's children"; + goto return_results; + } + + Debug( LDAP_DEBUG_TRACE, + LDAP_XSTRING(mdb_modrdn) ": wr to children " + "of entry %s OK\n", p_ndn.bv_val, 0, 0 ); + + if ( p_ndn.bv_val == slap_empty_bv.bv_val ) { + p_dn = slap_empty_bv; + } else { + dnParent( &e->e_name, &p_dn ); + } + + Debug( LDAP_DEBUG_TRACE, + LDAP_XSTRING(mdb_modrdn) ": parent dn=%s\n", + p_dn.bv_val, 0, 0 ); + + /* get entry */ + rs->sr_err = mdb_dn2entry( op, txn, &op->o_req_ndn, &e, 0 ); switch( rs->sr_err ) { case 0: - case DB_NOTFOUND: + case MDB_NOTFOUND: break; - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; case LDAP_BUSY: rs->sr_text = "ldap server busy"; goto return_results; @@ -189,9 +202,8 @@ retry: /* transaction retry */ goto return_results; } - e = ei->bei_e; /* FIXME: dn2entry() should return non-glue entry */ - if (( rs->sr_err == DB_NOTFOUND ) || + if (( rs->sr_err == MDB_NOTFOUND ) || ( !manageDSAit && e && is_entry_glue( e ))) { if( e != NULL ) { @@ -199,7 +211,7 @@ retry: /* transaction retry */ rs->sr_ref = is_entry_referral( e ) ? get_entry_referrals( op, e ) : NULL; - mdb_unlocked_cache_return_entry_r( &mdb->bi_cache, e); + mdb_entry_return( e ); e = NULL; } else { @@ -228,12 +240,6 @@ retry: /* transaction retry */ /* check write on old entry */ rs->sr_err = access_allowed( op, e, entry, NULL, ACL_WRITE, NULL ); if ( ! rs->sr_err ) { - switch( opinfo.boi_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } - Debug( LDAP_DEBUG_TRACE, "no access to entry\n", 0, 0, 0 ); rs->sr_text = "no write access to old entry"; @@ -241,36 +247,8 @@ retry: /* transaction retry */ goto return_results; } -#ifndef MDB_HIER - rs->sr_err = mdb_cache_children( op, ltid, e ); - if ( rs->sr_err != DB_NOTFOUND ) { - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - case 0: - Debug(LDAP_DEBUG_ARGS, - "<=- " LDAP_XSTRING(mdb_modrdn) - ": non-leaf %s\n", - op->o_req_dn.bv_val, 0, 0); - rs->sr_err = LDAP_NOT_ALLOWED_ON_NONLEAF; - rs->sr_text = "subtree rename not supported"; - break; - default: - Debug(LDAP_DEBUG_ARGS, - "<=- " LDAP_XSTRING(mdb_modrdn) - ": has_children failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - } - goto return_results; - } - ei->bei_state |= CACHE_ENTRY_NO_KIDS; -#endif - if (!manageDSAit && is_entry_referral( e ) ) { - /* parent is a referral, don't allow add */ + /* entry is a referral, don't allow rename */ rs->sr_ref = get_entry_referrals( op, e ); Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modrdn) @@ -286,98 +264,10 @@ retry: /* transaction retry */ goto done; } - if ( be_issuffix( op->o_bd, &e->e_nname ) ) { -#ifdef MDB_MULTIPLE_SUFFIXES - /* Allow renaming one suffix entry to another */ - p_ndn = slap_empty_bv; -#else - /* There can only be one suffix entry */ - rs->sr_err = LDAP_NAMING_VIOLATION; - rs->sr_text = "cannot rename suffix entry"; - goto return_results; -#endif - } else { - dnParent( &e->e_nname, &p_ndn ); - } - np_ndn = &p_ndn; - eip = ei->bei_parent; - if ( eip && eip->bei_id ) { - /* Make sure parent entry exist and we can write its - * children. - */ - rs->sr_err = mdb_cache_find_id( op, ltid, - eip->bei_id, &eip, 0, &plock ); - - switch( rs->sr_err ) { - case 0: - case DB_NOTFOUND: - break; - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - case LDAP_BUSY: - rs->sr_text = "ldap server busy"; - goto return_results; - default: - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; - } - - p = eip->bei_e; - if( p == NULL) { - Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modrdn) - ": parent does not exist\n", 0, 0, 0); - rs->sr_err = LDAP_OTHER; - rs->sr_text = "old entry's parent does not exist"; - goto return_results; - } - } else { - p = (Entry *)&slap_entry_root; - } - - /* check parent for "children" acl */ - rs->sr_err = access_allowed( op, p, - children, NULL, - op->oq_modrdn.rs_newSup == NULL ? - ACL_WRITE : ACL_WDEL, - NULL ); - - if ( !p_ndn.bv_len ) - p = NULL; - - if ( ! rs->sr_err ) { - switch( opinfo.boi_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } - - rs->sr_err = LDAP_INSUFFICIENT_ACCESS; - Debug( LDAP_DEBUG_TRACE, "no access to parent\n", 0, - 0, 0 ); - rs->sr_text = "no write access to old parent's children"; - goto return_results; - } - - Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(mdb_modrdn) ": wr to children " - "of entry %s OK\n", p_ndn.bv_val, 0, 0 ); - - if ( p_ndn.bv_val == slap_empty_bv.bv_val ) { - p_dn = slap_empty_bv; - } else { - dnParent( &e->e_name, &p_dn ); - } - - Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(mdb_modrdn) ": parent dn=%s\n", - p_dn.bv_val, 0, 0 ); - new_parent_dn = &p_dn; /* New Parent unless newSuperior given */ if ( op->oq_modrdn.rs_newSup != NULL ) { - Debug( LDAP_DEBUG_TRACE, + Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modrdn) ": new parent \"%s\" requested...\n", op->oq_modrdn.rs_newSup->bv_val, 0, 0 ); @@ -414,26 +304,12 @@ retry: /* transaction retry */ } /* Get Entry with dn=newSuperior. Does newSuperior exist? */ - rs->sr_err = mdb_dn2entry( op, ltid, np_ndn, - &neip, 0, &nplock ); + rs->sr_err = mdb_dn2entry( op, txn, np_ndn, &np, 0 ); switch( rs->sr_err ) { - case 0: np = neip->bei_e; - case DB_NOTFOUND: + case 0: break; - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - case LDAP_BUSY: - rs->sr_text = "ldap server busy"; - goto return_results; - default: - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; - } - - if( np == NULL) { + case MDB_NOTFOUND: Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modrdn) ": newSup(ndn=%s) not here!\n", @@ -441,24 +317,20 @@ retry: /* transaction retry */ rs->sr_text = "new superior not found"; rs->sr_err = LDAP_NO_SUCH_OBJECT; goto return_results; + case LDAP_BUSY: + rs->sr_text = "ldap server busy"; + goto return_results; + default: + rs->sr_err = LDAP_OTHER; + rs->sr_text = "internal error"; + goto return_results; } - Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(mdb_modrdn) - ": wr to new parent OK np=%p, id=%ld\n", - (void *) np, (long) np->e_id, 0 ); - /* check newSuperior for "children" acl */ rs->sr_err = access_allowed( op, np, children, NULL, ACL_WADD, NULL ); if( ! rs->sr_err ) { - switch( opinfo.boi_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } - Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modrdn) ": no wr to newSup children\n", @@ -468,6 +340,11 @@ retry: /* transaction retry */ goto return_results; } + Debug( LDAP_DEBUG_TRACE, + LDAP_XSTRING(mdb_modrdn) + ": wr to new parent OK np=%p, id=%ld\n", + (void *) np, (long) np->e_id, 0 ); + if ( is_entry_alias( np ) ) { /* parent is an alias, don't allow add */ Debug( LDAP_DEBUG_TRACE, @@ -489,6 +366,7 @@ retry: /* transaction retry */ rs->sr_err = LDAP_OTHER; goto return_results; } + new_parent_dn = &np->e_name; } else { np_dn = NULL; @@ -505,15 +383,9 @@ retry: /* transaction retry */ np = NULL; if ( ! rs->sr_err ) { - switch( opinfo.boi_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } - rs->sr_err = LDAP_INSUFFICIENT_ACCESS; - Debug( LDAP_DEBUG_TRACE, - "no access to new superior\n", + Debug( LDAP_DEBUG_TRACE, + "no access to new superior\n", 0, 0, 0 ); rs->sr_text = "no write access to new superior's children"; @@ -532,7 +404,7 @@ retry: /* transaction retry */ /* Build target dn and make sure target entry doesn't exist already. */ if (!new_dn.bv_val) { - build_new_dn( &new_dn, new_parent_dn, &op->oq_modrdn.rs_newrdn, NULL ); + build_new_dn( &new_dn, new_parent_dn, &op->oq_modrdn.rs_newrdn, NULL ); } if (!new_ndn.bv_val) { @@ -547,18 +419,13 @@ retry: /* transaction retry */ new_ndn.bv_val, 0, 0 ); /* Shortcut the search */ - nei = neip ? neip : eip; - rs->sr_err = mdb_cache_find_ndn ( op, ltid, &new_ndn, &nei ); - if ( nei ) mdb_cache_entryinfo_unlock( nei ); + rs->sr_err = mdb_dn2id ( op, txn, &new_ndn, &nid, NULL ); switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - case DB_NOTFOUND: + case MDB_NOTFOUND: break; case 0: /* Allow rename to same DN */ - if ( nei == ei ) + if ( nid == e->e_id ) break; rs->sr_err = LDAP_ALREADY_EXISTS; goto return_results; @@ -578,7 +445,7 @@ retry: /* transaction retry */ if( slap_read_controls( op, rs, e, &slap_pre_read_bv, preread_ctrl ) ) { - Debug( LDAP_DEBUG_TRACE, + Debug( LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_modrdn) ": pre-read failed!\n", 0, 0, 0 ); if ( op->o_preread & SLAP_CONTROL_CRITICAL ) { @@ -586,34 +453,16 @@ retry: /* transaction retry */ * operation if control fails? */ goto return_results; } - } - } - - /* nested transaction */ - rs->sr_err = TXN_BEGIN( mdb->bi_dbenv, ltid, <2, mdb->bi_db_opflags ); - rs->sr_text = NULL; - if( rs->sr_err != 0 ) { - Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(mdb_modrdn) - ": txn_begin(2) failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; + } } /* delete old DN */ - rs->sr_err = mdb_dn2id_delete( op, lt2, eip, e ); + rs->sr_err = mdb_dn2id_delete( op, txn, p->e_id, e ); if ( rs->sr_err != 0 ) { Debug(LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_modrdn) ": dn2id del failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } + mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "DN index delete fail"; goto return_results; @@ -626,17 +475,12 @@ retry: /* transaction retry */ dummy.e_attrs = NULL; /* add new DN */ - rs->sr_err = mdb_dn2id_add( op, lt2, neip ? neip : eip, &dummy ); + rs->sr_err = mdb_dn2id_add( op, txn, np ? np->e_id : p->e_id, &dummy ); if ( rs->sr_err != 0 ) { Debug(LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_modrdn) ": dn2id add failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } + mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "DN index add failed"; goto return_results; @@ -645,37 +489,27 @@ retry: /* transaction retry */ dummy.e_attrs = e->e_attrs; /* modify entry */ - rs->sr_err = mdb_modify_internal( op, lt2, op->orr_modlist, &dummy, + rs->sr_err = mdb_modify_internal( op, txn, op->orr_modlist, &dummy, &rs->sr_text, textbuf, textlen ); if( rs->sr_err != LDAP_SUCCESS ) { Debug(LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_modrdn) ": modify failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); - if ( ( rs->sr_err == LDAP_INSUFFICIENT_ACCESS ) && opinfo.boi_err ) { - rs->sr_err = opinfo.boi_err; + mdb_strerror(rs->sr_err), rs->sr_err, 0 ); + if ( ( rs->sr_err == LDAP_INSUFFICIENT_ACCESS ) && opinfo.moi_err ) { + rs->sr_err = opinfo.moi_err; } if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL; - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } goto return_results; } /* id2entry index */ - rs->sr_err = mdb_id2entry_update( op->o_bd, lt2, &dummy ); + rs->sr_err = mdb_id2entry_update( op, txn, &dummy ); if ( rs->sr_err != 0 ) { Debug(LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_modrdn) ": id2entry failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); - switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } + mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "entry update failed"; goto return_results; @@ -683,35 +517,26 @@ retry: /* transaction retry */ if ( p_ndn.bv_len != 0 ) { parent_is_glue = is_entry_glue(p); - rs->sr_err = mdb_cache_children( op, lt2, p ); - if ( rs->sr_err != DB_NOTFOUND ) { + rs->sr_err = mdb_dn2id_children( op, txn, p ); + if ( rs->sr_err != MDB_NOTFOUND ) { switch( rs->sr_err ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; case 0: break; default: Debug(LDAP_DEBUG_ARGS, "<=- " LDAP_XSTRING(mdb_modrdn) ": has_children failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + mdb_strerror(rs->sr_err), rs->sr_err, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error"; goto return_results; } parent_is_leaf = 1; } - mdb_unlocked_cache_return_entry_r(&mdb->bi_cache, p); + mdb_entry_return( p ); p = NULL; } - if ( TXN_COMMIT( lt2, 0 ) != 0 ) { - rs->sr_err = LDAP_OTHER; - rs->sr_text = "txn_commit(2) failed"; - goto return_results; - } - if( op->o_postread ) { if( postread_ctrl == NULL ) { postread_ctrl = &ctrls[num_ctrls++]; @@ -720,7 +545,7 @@ retry: /* transaction retry */ if( slap_read_controls( op, rs, &dummy, &slap_post_read_bv, postread_ctrl ) ) { - Debug( LDAP_DEBUG_TRACE, + Debug( LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_modrdn) ": post-read failed!\n", 0, 0, 0 ); if ( op->o_postread & SLAP_CONTROL_CRITICAL ) { @@ -728,47 +553,37 @@ retry: /* transaction retry */ * operation if control fails? */ goto return_results; } - } + } } if( op->o_noop ) { - if(( rs->sr_err=TXN_ABORT( ltid )) != 0 ) { - rs->sr_text = "txn_abort (no-op) failed"; - } else { - rs->sr_err = LDAP_X_NO_OPERATION; - ltid = NULL; - /* Only free attrs if they were dup'd. */ - if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL; - goto return_results; - } + mdb_txn_abort( txn ); + rs->sr_err = LDAP_X_NO_OPERATION; + txn = NULL; + /* Only free attrs if they were dup'd. */ + if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL; + goto return_results; } else { - rc = mdb_cache_modrdn( mdb, e, &op->orr_nnewrdn, &dummy, neip, - ltid, &lock ); - switch( rc ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - } dummy.e_attrs = NULL; new_dn.bv_val = NULL; new_ndn.bv_val = NULL; - if(( rs->sr_err=TXN_COMMIT( ltid, 0 )) != 0 ) { + if(( rs->sr_err=mdb_txn_commit( txn )) != 0 ) { rs->sr_text = "txn_commit failed"; } else { rs->sr_err = LDAP_SUCCESS; } } - - ltid = NULL; - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); - opinfo.boi_oe.oe_key = NULL; - + + txn = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next ); + opinfo.moi_oe.oe_key = NULL; + if( rs->sr_err != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_modrdn) ": %s : %s (%d)\n", - rs->sr_text, db_strerror(rs->sr_err), rs->sr_err ); + rs->sr_text, mdb_strerror(rs->sr_err), rs->sr_err ); rs->sr_err = LDAP_OTHER; goto return_results; @@ -788,11 +603,13 @@ return_results: } send_ldap_result( op, rs ); +#if 0 if( rs->sr_err == LDAP_SUCCESS && mdb->bi_txn_cp_kbyte ) { TXN_CHECKPOINT( mdb->bi_dbenv, mdb->bi_txn_cp_kbyte, mdb->bi_txn_cp_min, 0 ); } - +#endif + if ( rs->sr_err == LDAP_SUCCESS && parent_is_glue && parent_is_leaf ) { op->o_delete_glue_parent = 1; } @@ -805,25 +622,25 @@ done: /* LDAP v3 Support */ if( np != NULL ) { - /* free new parent and reader lock */ - mdb_unlocked_cache_return_entry_r(&mdb->bi_cache, np); + /* free new parent */ + mdb_entry_return( np ); } if( p != NULL ) { - /* free parent and reader lock */ - mdb_unlocked_cache_return_entry_r(&mdb->bi_cache, p); + /* free parent */ + mdb_entry_return( p ); } /* free entry */ if( e != NULL ) { - mdb_unlocked_cache_return_entry_w( &mdb->bi_cache, e); + mdb_entry_return( e ); } - if( ltid != NULL ) { - TXN_ABORT( ltid ); + if( txn != NULL ) { + mdb_txn_abort( txn ); } - if ( opinfo.boi_oe.oe_key ) { - LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + if ( opinfo.moi_oe.oe_key ) { + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next ); } if( preread_ctrl != NULL && (*preread_ctrl) != NULL ) { diff --git a/servers/slapd/back-mdb/operational.c b/servers/slapd/back-mdb/operational.c index 8985959d2a..f6d24890d2 100644 --- a/servers/slapd/back-mdb/operational.c +++ b/servers/slapd/back-mdb/operational.c @@ -37,64 +37,35 @@ mdb_hasSubordinates( struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; struct mdb_op_info *opinfo; OpExtra *oex; - DB_TXN *rtxn; + MDB_txn *rtxn; int rc; - int release = 0; assert( e != NULL ); - /* NOTE: this should never happen, but it actually happens - * when using back-relay; until we find a better way to - * preserve entry's private information while rewriting it, - * let's disable the hasSubordinate feature for back-relay. - */ - if ( BEI( e ) == NULL ) { - Entry *ee = NULL; - rc = be_entry_get_rw( op, &e->e_nname, NULL, NULL, 0, &ee ); - if ( rc != LDAP_SUCCESS || ee == NULL ) { - rc = LDAP_OTHER; - goto done; - } - e = ee; - release = 1; - if ( BEI( ee ) == NULL ) { - rc = LDAP_OTHER; - goto done; - } - } - /* Check for a txn in a parent op, otherwise use reader txn */ LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) { if ( oex->oe_key == mdb ) break; } opinfo = (struct mdb_op_info *) oex; - if ( opinfo && opinfo->boi_txn ) { - rtxn = opinfo->boi_txn; + if ( opinfo && opinfo->moi_txn ) { + rtxn = opinfo->moi_txn; } else { - rc = mdb_reader_get(op, mdb->bi_dbenv, &rtxn); + rc = mdb_reader_get(op, mdb->mi_dbenv, &rtxn); if ( rc ) { rc = LDAP_OTHER; goto done; } } -retry: - /* FIXME: we can no longer assume the entry's e_private - * field is correctly populated; so we need to reacquire - * it with reader lock */ - rc = mdb_cache_children( op, rtxn, e ); + rc = mdb_dn2id_children( op, rtxn, e ); switch( rc ) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - case 0: *hasSubordinates = LDAP_COMPARE_TRUE; break; - case DB_NOTFOUND: + case MDB_NOTFOUND: *hasSubordinates = LDAP_COMPARE_FALSE; rc = LDAP_SUCCESS; break; @@ -103,12 +74,11 @@ retry: Debug(LDAP_DEBUG_ARGS, "<=- " LDAP_XSTRING(mdb_hasSubordinates) ": has_children failed: %s (%d)\n", - db_strerror(rc), rc, 0 ); + mdb_strerror(rc), rc, 0 ); rc = LDAP_OTHER; } done:; - if ( release && e != NULL ) be_entry_release_r( op, e ); return rc; } diff --git a/servers/slapd/back-mdb/proto-mdb.h b/servers/slapd/back-mdb/proto-mdb.h index 2942ff3bdd..120ef08d5d 100644 --- a/servers/slapd/back-mdb/proto-mdb.h +++ b/servers/slapd/back-mdb/proto-mdb.h @@ -64,7 +64,7 @@ mdb_db_cache( */ int mdb_dn2entry LDAP_P(( Operation *op, MDB_txn *tid, - struct berval *dn, Entry **e, struct berval *matched )); + struct berval *dn, Entry **e, int matched )); /* * dn2id.c diff --git a/servers/slapd/back-mdb/referral.c b/servers/slapd/back-mdb/referral.c index 242fe3ab79..41ea285f91 100644 --- a/servers/slapd/back-mdb/referral.c +++ b/servers/slapd/back-mdb/referral.c @@ -25,11 +25,9 @@ mdb_referrals( Operation *op, SlapReply *rs ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; Entry *e = NULL; - EntryInfo *ei; int rc = LDAP_SUCCESS; - DB_TXN *rtxn; - DB_LOCK lock; + MDB_txn *rtxn; if( op->o_tag == LDAP_REQ_SEARCH ) { /* let search take care of itself */ @@ -41,7 +39,7 @@ mdb_referrals( Operation *op, SlapReply *rs ) return rc; } - rc = mdb_reader_get(op, mdb->bi_dbenv, &rtxn); + rc = mdb_reader_get(op, mdb->mi_dbenv, &rtxn); switch(rc) { case 0: break; @@ -49,37 +47,26 @@ mdb_referrals( Operation *op, SlapReply *rs ) return LDAP_OTHER; } -dn2entry_retry: /* get entry */ - rc = mdb_dn2entry( op, rtxn, &op->o_req_ndn, &ei, 1, &lock ); - - /* mdb_dn2entry() may legally leave ei == NULL - * if rc != 0 and rc != DB_NOTFOUND - */ - if ( ei ) { - e = ei->bei_e; - } + rc = mdb_dn2entry( op, rtxn, &op->o_req_ndn, &e, 1 ); switch(rc) { - case DB_NOTFOUND: + case MDB_NOTFOUND: case 0: break; case LDAP_BUSY: rs->sr_text = "ldap server busy"; return LDAP_BUSY; - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto dn2entry_retry; default: Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_referrals) ": dn2entry failed: %s (%d)\n", - db_strerror(rc), rc, 0 ); + mdb_strerror(rc), rc, 0 ); rs->sr_text = "internal error"; return LDAP_OTHER; } - if ( rc == DB_NOTFOUND ) { + if ( rc == MDB_NOTFOUND ) { rc = LDAP_SUCCESS; rs->sr_matched = NULL; if ( e != NULL ) { @@ -100,7 +87,7 @@ dn2entry_retry: } } - mdb_cache_return_entry_r (mdb, e, &lock); + mdb_entry_return( e ); e = NULL; } @@ -147,6 +134,6 @@ dn2entry_retry: ber_bvarray_free( refs ); } - mdb_cache_return_entry_r(mdb, e, &lock); + mdb_entry_return( e ); return rc; } -- 2.39.2