X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fdelete.c;h=ef4c584d203a33a5c14c5ae2769e07a09a777acd;hb=bc478dee4630a37e5a222b14f36d5d6106a4867b;hp=6a38c76fb529d9966070a448964377ff66b788e3;hpb=fda3d6260e25f1d0b9c035b0d520b2c9d0f22e49;p=openldap diff --git a/servers/slapd/back-bdb/delete.c b/servers/slapd/back-bdb/delete.c index 6a38c76fb5..ef4c584d20 100644 --- a/servers/slapd/back-bdb/delete.c +++ b/servers/slapd/back-bdb/delete.c @@ -20,7 +20,6 @@ #include #include "back-bdb.h" -#include "external.h" int bdb_delete( Operation *op, SlapReply *rs ) @@ -36,6 +35,7 @@ bdb_delete( Operation *op, SlapReply *rs ) AttributeDescription *entry = slap_schema.si_ad_entry; DB_TXN *ltid = NULL, *lt2; struct bdb_op_info opinfo; + ID eid; u_int32_t locker = 0; DB_LOCK lock, plock; @@ -55,11 +55,16 @@ bdb_delete( Operation *op, SlapReply *rs ) int parent_is_glue = 0; int parent_is_leaf = 0; + struct berval ctxcsn_ndn = BER_BVNULL; + ctrls[num_ctrls] = 0; - Debug( LDAP_DEBUG_ARGS, "==> bdb_delete: %s\n", + Debug( LDAP_DEBUG_ARGS, "==> " LDAP_XSTRING(bdb_delete) ": %s\n", op->o_req_dn.bv_val, 0, 0 ); + build_new_dn( &ctxcsn_ndn, &op->o_bd->be_nsuffix[0], + (struct berval *)&slap_ldapsync_cn_bv, op->o_tmpmemctx ); + if( 0 ) { retry: /* transaction retry */ if( e != NULL ) { @@ -70,7 +75,8 @@ retry: /* transaction retry */ bdb_unlocked_cache_return_entry_r(&bdb->bi_cache, p); p = NULL; } - Debug( LDAP_DEBUG_TRACE, "==> bdb_delete: retrying...\n", + Debug( LDAP_DEBUG_TRACE, + "==> " LDAP_XSTRING(bdb_delete) ": retrying...\n", 0, 0, 0 ); rs->sr_err = TXN_ABORT( ltid ); ltid = NULL; @@ -93,8 +99,8 @@ retry: /* transaction retry */ rs->sr_text = NULL; if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, - "bdb_delete: txn_begin failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + LDAP_XSTRING(bdb_delete) ": txn_begin 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; @@ -145,7 +151,7 @@ retry: /* transaction retry */ BerVarray deref = NULL; Debug( LDAP_DEBUG_ARGS, - "<=- bdb_delete: no such object %s\n", + "<=- " LDAP_XSTRING(bdb_delete) ": no such object %s\n", op->o_req_dn.bv_val, 0, 0); if ( matched != NULL ) { @@ -165,7 +171,7 @@ retry: /* transaction retry */ ber_bvarray_add( &deref, &tmpbv ); } } else { - deref = SLAPD_GLOBAL(default_referral); + deref = default_referral; } rs->sr_ref = referral_rewrite( deref, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); @@ -174,10 +180,10 @@ retry: /* transaction retry */ rs->sr_err = LDAP_REFERRAL; send_ldap_result( op, rs ); - if ( rs->sr_ref != SLAPD_GLOBAL(default_referral) ) { + if ( rs->sr_ref != default_referral ) { ber_bvarray_free( rs->sr_ref ); } - if ( deref != SLAPD_GLOBAL(default_referral) ) { + if ( deref != default_referral ) { ber_bvarray_free( deref ); } free( (char *)rs->sr_matched ); @@ -206,8 +212,8 @@ retry: /* transaction retry */ if ( pdn.bv_len != 0 ) { if( p == NULL || !bvmatch( &pdn, &p->e_nname )) { Debug( LDAP_DEBUG_TRACE, - "<=- bdb_delete: parent does not exist\n", - 0, 0, 0); + "<=- " LDAP_XSTRING(bdb_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; @@ -225,8 +231,8 @@ retry: /* transaction retry */ } Debug( LDAP_DEBUG_TRACE, - "<=- bdb_delete: no write access to parent\n", - 0, 0, 0 ); + "<=- " LDAP_XSTRING(bdb_delete) ": no write " + "access to parent\n", 0, 0, 0 ); rs->sr_err = LDAP_INSUFFICIENT_ACCESS; rs->sr_text = "no write access to parent"; goto return_results; @@ -253,8 +259,9 @@ retry: /* transaction retry */ } Debug( LDAP_DEBUG_TRACE, - "<=- bdb_delete: no access " - "to parent\n", 0, 0, 0 ); + "<=- " LDAP_XSTRING(bdb_delete) + ": no access to parent\n", + 0, 0, 0 ); rs->sr_err = LDAP_INSUFFICIENT_ACCESS; rs->sr_text = "no write access to parent"; goto return_results; @@ -262,8 +269,8 @@ retry: /* transaction retry */ } else { Debug( LDAP_DEBUG_TRACE, - "<=- bdb_delete: no parent " - "and not root\n", 0, 0, 0); + "<=- " LDAP_XSTRING(bdb_delete) + ": no parent and not root\n", 0, 0, 0 ); rs->sr_err = LDAP_INSUFFICIENT_ACCESS; goto return_results; } @@ -288,8 +295,8 @@ retry: /* transaction retry */ } Debug( LDAP_DEBUG_TRACE, - "<=- bdb_delete: no write access to entry\n", - 0, 0, 0 ); + "<=- " LDAP_XSTRING(bdb_delete) ": no write access " + "to entry\n", 0, 0, 0 ); rs->sr_err = LDAP_INSUFFICIENT_ACCESS; rs->sr_text = "no write access to entry"; goto return_results; @@ -300,7 +307,8 @@ retry: /* transaction retry */ rs->sr_ref = get_entry_referrals( op, e ); Debug( LDAP_DEBUG_TRACE, - "bdb_delete: entry is referral\n", 0, 0, 0 ); + LDAP_XSTRING(bdb_delete) ": entry is referral\n", + 0, 0, 0 ); rs->sr_err = LDAP_REFERRAL; rs->sr_matched = e->e_name.bv_val; @@ -324,7 +332,8 @@ retry: /* transaction retry */ &slap_pre_read_bv, preread_ctrl ) ) { Debug( LDAP_DEBUG_TRACE, - "<=- bdb_delete: pre-read failed!\n", 0, 0, 0 ); + "<=- " LDAP_XSTRING(bdb_delete) ": pre-read " + "failed!\n", 0, 0, 0 ); goto return_results; } } @@ -335,8 +344,8 @@ retry: /* transaction retry */ rs->sr_text = NULL; if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, - "bdb_delete: txn_begin(2) failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + LDAP_XSTRING(bdb_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; @@ -351,14 +360,16 @@ retry: /* transaction retry */ goto retry; case 0: Debug(LDAP_DEBUG_ARGS, - "<=- bdb_delete: non-leaf %s\n", + "<=- " LDAP_XSTRING(bdb_delete) + ": non-leaf %s\n", op->o_req_dn.bv_val, 0, 0); rs->sr_err = LDAP_NOT_ALLOWED_ON_NONLEAF; rs->sr_text = "subtree delete not supported"; break; default: Debug(LDAP_DEBUG_ARGS, - "<=- bdb_delete: has_children failed: %s (%d)\n", + "<=- " LDAP_XSTRING(bdb_delete) + ": 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"; @@ -366,12 +377,26 @@ retry: /* transaction retry */ goto return_results; } + ldap_pvt_thread_rdwr_wlock( &bdb->bi_pslist_rwlock ); + LDAP_LIST_FOREACH( ps_list, &bdb->bi_psearch_list, o_ps_link ) { + rc = bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_PREDELETE ); + if ( rc == LDAP_BUSY && op->o_ps_send_wait ) { + ldap_pvt_thread_rdwr_wunlock( &bdb->bi_pslist_rwlock ); + goto retry; + } else if ( rc ) { + Debug( LDAP_DEBUG_TRACE, + LDAP_XSTRING(bdb_delete) ": persistent search " + "failed (%d,%d)\n", rc, rs->sr_err, 0 ); + } + } + ldap_pvt_thread_rdwr_wunlock( &bdb->bi_pslist_rwlock ); + /* delete from dn2id */ rs->sr_err = bdb_dn2id_delete( op, lt2, eip, e ); if ( rs->sr_err != 0 ) { Debug(LDAP_DEBUG_TRACE, - "<=- bdb_delete: dn2id failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + "<=- " LDAP_XSTRING(bdb_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: @@ -386,8 +411,8 @@ retry: /* transaction retry */ rs->sr_err = bdb_id2entry_delete( op->o_bd, lt2, e ); if ( rs->sr_err != 0 ) { Debug(LDAP_DEBUG_TRACE, - "<=- bdb_delete: id2entry failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + "<=- " LDAP_XSTRING(bdb_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: @@ -402,8 +427,8 @@ retry: /* transaction retry */ rs->sr_err = bdb_index_entry_del( op, lt2, e ); if ( rs->sr_err != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, - "<=- bdb_delete: index failed: %s (%d)\n", - db_strerror(rs->sr_err), rs->sr_err, 0 ); + "<=- " LDAP_XSTRING(bdb_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: @@ -426,7 +451,8 @@ retry: /* transaction retry */ break; default: Debug(LDAP_DEBUG_ARGS, - "<=- bdb_delete: has_children failed: %s (%d)\n", + "<=- " LDAP_XSTRING(bdb_delete) + ": 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"; @@ -444,6 +470,8 @@ retry: /* transaction retry */ goto return_results; } + eid = e->e_id; + #if 0 /* Do we want to reclaim deleted IDs? */ ldap_pvt_thread_mutex_lock( &bdb->bi_lastid_mutex ); if ( e->e_id == bdb->bi_lastid ) { @@ -452,7 +480,9 @@ retry: /* transaction retry */ ldap_pvt_thread_mutex_unlock( &bdb->bi_lastid_mutex ); #endif - if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) { + if ( !dn_match( &ctxcsn_ndn, &op->o_req_ndn ) && + !be_issuffix( op->o_bd, &op->o_req_ndn ) && + LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) { rc = bdb_csn_commit( op, rs, ltid, ei, &suffix_ei, &ctxcsn_e, &ctxcsn_added, locker ); switch ( rc ) { @@ -505,7 +535,9 @@ retry: /* transaction retry */ rc = bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_DELETE ); if ( rc ) { Debug( LDAP_DEBUG_TRACE, - "bdb_delete: persistent search failed (%d,%d)\n", + LDAP_XSTRING(bdb_delete) + ": persistent search failed " + "(%d,%d)\n", rc, rs->sr_err, 0 ); } } @@ -519,7 +551,7 @@ retry: /* transaction retry */ if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, - "bdb_delete: txn_%s failed: %s (%d)\n", + LDAP_XSTRING(bdb_delete) ": txn_%s failed: %s (%d)\n", op->o_noop ? "abort (no-op)" : "commit", db_strerror(rs->sr_err), rs->sr_err ); rs->sr_err = LDAP_OTHER; @@ -529,9 +561,9 @@ retry: /* transaction retry */ } Debug( LDAP_DEBUG_TRACE, - "bdb_delete: deleted%s id=%08lx dn=\"%s\"\n", + LDAP_XSTRING(bdb_delete) ": deleted%s id=%08lx dn=\"%s\"\n", op->o_noop ? " (no-op)" : "", - e->e_id, e->e_dn ); + eid, op->o_req_dn.bv_val ); rs->sr_err = LDAP_SUCCESS; rs->sr_text = NULL; if( num_ctrls ) rs->sr_ctrls = ctrls; @@ -557,7 +589,7 @@ done: if( e != NULL ) { if ( rs->sr_err == LDAP_SUCCESS ) { /* Free the EntryInfo and the Entry */ - bdb_cache_delete_cleanup( &bdb->bi_cache, e ); + bdb_cache_delete_cleanup( &bdb->bi_cache, BEI(e) ); } else { bdb_unlocked_cache_return_entry_w(&bdb->bi_cache, e); } @@ -568,9 +600,11 @@ done: op->o_private = NULL; } + slap_sl_free( ctxcsn_ndn.bv_val, op->o_tmpmemctx ); + if( preread_ctrl != NULL ) { - slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, &op->o_tmpmemctx ); - slap_sl_free( *preread_ctrl, &op->o_tmpmemctx ); + slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx ); + slap_sl_free( *preread_ctrl, op->o_tmpmemctx ); } return rs->sr_err; }