From: Howard Chu Date: Fri, 18 Jan 2002 13:34:50 +0000 (+0000) Subject: Added ldap_pvt_thread_yield() after txn_abort X-Git-Tag: LDBM_PRE_GIANT_RWLOCK~76 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=5ab0d4af841ea810d49125ac85bcb46300a655af;p=openldap Added ldap_pvt_thread_yield() after txn_abort --- diff --git a/servers/slapd/back-bdb/add.c b/servers/slapd/back-bdb/add.c index c3b4c198c7..ba3ebc0e4e 100644 --- a/servers/slapd/back-bdb/add.c +++ b/servers/slapd/back-bdb/add.c @@ -31,6 +31,10 @@ bdb_add( DB_TXN *ltid = NULL; struct bdb_op_info opinfo; int subentry; +#if 0 + u_int32_t lockid; + DB_LOCK lock; +#endif Debug(LDAP_DEBUG_ARGS, "==> bdb_add: %s\n", e->e_dn, 0, 0); @@ -69,6 +73,7 @@ retry: rc = txn_abort( ltid ); text = "internal error"; goto return_results; } + ldap_pvt_thread_yield(); } /* begin transaction */ @@ -84,6 +89,9 @@ retry: rc = txn_abort( ltid ); text = "internal error"; goto return_results; } +#if 0 + lockid = TXN_ID( ltid ); +#endif } opinfo.boi_bdb = be; @@ -100,7 +108,7 @@ retry: rc = txn_abort( ltid ); pdn.bv_len = 0; pdn.bv_val = ""; } else { - rc = dnParent( e->e_nname.bv_val, &pdn.bv_val ); + rc = dnParent( e->e_nname.bv_val, (const char **)&pdn.bv_val ); if ( rc != LDAP_SUCCESS ) { text = "internal error"; goto return_results; @@ -111,6 +119,16 @@ retry: rc = txn_abort( ltid ); if( pdn.bv_len != 0 ) { Entry *matched = NULL; +#if 0 + if ( ltid ) { + DBT obj; + obj.data = pdn.bv_val-1; + obj.size = pdn.bv_len+1; + rc = LOCK_GET( bdb->bi_dbenv, lockid, 0, &obj, + DB_LOCK_WRITE, &lock); + } +#endif + /* get parent */ rc = bdb_dn2entry( be, ltid, &pdn, &p, &matched, 0 ); @@ -251,6 +269,15 @@ retry: rc = txn_abort( ltid ); text = "no parent, cannot add subentry"; goto return_results;; } +#if 0 + if ( ltid ) { + DBT obj; + obj.data = ","; + obj.size = 1; + rc = LOCK_GET( bdb->bi_dbenv, lockid, 0, &obj, + DB_LOCK_WRITE, &lock); + } +#endif } /* dn2id index */ diff --git a/servers/slapd/back-bdb/delete.c b/servers/slapd/back-bdb/delete.c index 894fe8ad9d..36be9b186a 100644 --- a/servers/slapd/back-bdb/delete.c +++ b/servers/slapd/back-bdb/delete.c @@ -24,7 +24,7 @@ bdb_delete( { struct bdb_info *bdb = (struct bdb_info *) be->be_private; Entry *matched; - char *pdn = NULL; + struct berval pdn = {0, NULL}; Entry *e, *p = NULL; int rc; const char *text; @@ -32,6 +32,10 @@ bdb_delete( AttributeDescription *children = slap_schema.si_ad_children; DB_TXN *ltid = NULL; struct bdb_op_info opinfo; +#if 0 + u_int32_t lockid; + DB_LOCK lock; +#endif Debug( LDAP_DEBUG_ARGS, "==> bdb_delete: %s\n", dn->bv_val, 0, 0 ); @@ -48,6 +52,7 @@ retry: /* transaction retry */ text = "internal error"; goto return_results; } + ldap_pvt_thread_yield(); } if( bdb->bi_txn ) { @@ -63,6 +68,9 @@ retry: /* transaction retry */ text = "internal error"; goto return_results; } +#if 0 + lockid = TXN_ID( ltid ); +#endif } opinfo.boi_bdb = be; @@ -70,70 +78,29 @@ retry: /* transaction retry */ opinfo.boi_err = 0; op->o_private = &opinfo; - /* get entry for read/modify/write */ - rc = bdb_dn2entry( be, ltid, ndn, &e, &matched, DB_RMW ); - - switch( rc ) { - case 0: - case DB_NOTFOUND: - break; - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - default: - rc = LDAP_OTHER; - text = "internal error"; - goto return_results; - } - - if ( e == NULL ) { - char *matched_dn = NULL; - BerVarray refs; - - Debug( LDAP_DEBUG_ARGS, - "<=- bdb_delete: no such object %s\n", - dn->bv_val, 0, 0); - - if ( matched != NULL ) { - matched_dn = ch_strdup( matched->e_dn ); - refs = is_entry_referral( matched ) - ? get_entry_referrals( be, conn, op, matched ) - : NULL; - bdb_entry_return( be, matched ); - matched = NULL; - - } else { - refs = referral_rewrite( default_referral, - NULL, dn, LDAP_SCOPE_DEFAULT ); - } - - send_ldap_result( conn, op, LDAP_REFERRAL, - matched_dn, NULL, refs, NULL ); - - ber_bvarray_free( refs ); - free( matched_dn ); - - rc = -1; - goto done; - } - - if ( be_issuffix( be, ndn->bv_val ) ) { - pdn = NULL; - } else { - rc = dnParent( ndn->bv_val, &pdn ); + if ( !be_issuffix( be, ndn->bv_val ) ) { + rc = dnParent( ndn->bv_val, &pdn.bv_val ); if ( rc != LDAP_SUCCESS ) { text = "internal error"; goto return_results; } + if (pdn.bv_val && pdn.bv_val[0]) { + pdn.bv_len = ndn->bv_len - (pdn.bv_val - ndn->bv_val); + } } - if( pdn != NULL && *pdn != '\0' ) { - struct berval pbv; - - pbv.bv_len = ndn->bv_len - (pdn - ndn->bv_val); - pbv.bv_val = pdn; + if( pdn.bv_len != 0 ) { +#if 0 + if ( ltid ) { + DBT obj; + obj.data = pdn.bv_val-1; + obj.size = pdn.bv_len+1; + rc = LOCK_GET( bdb->bi_dbenv, lockid, 0, &obj, + DB_LOCK_WRITE, &lock); + } +#endif /* get parent */ - rc = bdb_dn2entry( be, ltid, &pbv, &p, NULL, 0 ); + rc = bdb_dn2entry( be, ltid, &pdn, &p, NULL, 0 ); switch( rc ) { case 0: @@ -199,6 +166,62 @@ retry: /* transaction retry */ goto return_results; } } +#if 0 + if ( ltid ) { + DBT obj; + obj.data = ","; + obj.size = 1; + rc = LOCK_GET( bdb->bi_dbenv, lockid, 0, &obj, + DB_LOCK_WRITE, &lock); + } +#endif + } + + /* get entry for read/modify/write */ + rc = bdb_dn2entry( be, ltid, ndn, &e, &matched, DB_RMW ); + + switch( rc ) { + case 0: + case DB_NOTFOUND: + break; + case DB_LOCK_DEADLOCK: + case DB_LOCK_NOTGRANTED: + goto retry; + default: + rc = LDAP_OTHER; + text = "internal error"; + goto return_results; + } + + if ( e == NULL ) { + char *matched_dn = NULL; + BerVarray refs; + + Debug( LDAP_DEBUG_ARGS, + "<=- bdb_delete: no such object %s\n", + dn->bv_val, 0, 0); + + if ( matched != NULL ) { + matched_dn = ch_strdup( matched->e_dn ); + refs = is_entry_referral( matched ) + ? get_entry_referrals( be, conn, op, matched ) + : NULL; + bdb_entry_return( be, matched ); + matched = NULL; + + } else { + refs = referral_rewrite( default_referral, + NULL, dn, LDAP_SCOPE_DEFAULT ); + } + + send_ldap_result( conn, op, LDAP_REFERRAL, + matched_dn, NULL, refs, NULL ); + + ber_bvarray_free( refs ); + free( matched_dn ); + + rc = -1; + goto done; } if ( !manageDSAit && is_entry_referral( e ) ) { @@ -244,7 +267,7 @@ retry: /* transaction retry */ } /* delete from dn2id */ - rc = bdb_dn2id_delete( be, ltid, pdn, e ); + rc = bdb_dn2id_delete( be, ltid, pdn.bv_val, e ); if ( rc != 0 ) { switch( rc ) { case DB_LOCK_DEADLOCK: @@ -260,9 +283,9 @@ retry: /* transaction retry */ goto return_results; } - /* delete indices for old attributes */ - rc = bdb_index_entry_del( be, ltid, e, e->e_attrs ); - if ( rc != LDAP_SUCCESS ) { + /* delete from id2entry */ + rc = bdb_id2entry_delete( be, ltid, e->e_id ); + if ( rc != 0 ) { switch( rc ) { case DB_LOCK_DEADLOCK: case DB_LOCK_NOTGRANTED: @@ -270,15 +293,16 @@ retry: /* transaction retry */ default: rc = LDAP_OTHER; } - Debug( LDAP_DEBUG_ANY, "entry index delete failed!\n", - 0, 0, 0 ); - text = "entry index delete failed"; + Debug(LDAP_DEBUG_ARGS, + "<=- bdb_delete: id2entry failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); + text = "entry delete failed"; goto return_results; } - /* delete from id2entry */ - rc = bdb_id2entry_delete( be, ltid, e->e_id ); - if ( rc != 0 ) { + /* delete indices for old attributes */ + rc = bdb_index_entry_del( be, ltid, e, e->e_attrs ); + if ( rc != LDAP_SUCCESS ) { switch( rc ) { case DB_LOCK_DEADLOCK: case DB_LOCK_NOTGRANTED: @@ -286,14 +310,12 @@ retry: /* transaction retry */ default: rc = LDAP_OTHER; } - Debug(LDAP_DEBUG_ARGS, - "<=- bdb_delete: id2entry failed: %s (%d)\n", - db_strerror(rc), rc, 0 ); - text = "entry delete failed"; + Debug( LDAP_DEBUG_ANY, "entry index delete failed!\n", + 0, 0, 0 ); + text = "entry index delete failed"; goto return_results; } - #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 ) { diff --git a/servers/slapd/back-bdb/modify.c b/servers/slapd/back-bdb/modify.c index 452aff29ec..69929a3a99 100644 --- a/servers/slapd/back-bdb/modify.c +++ b/servers/slapd/back-bdb/modify.c @@ -212,6 +212,7 @@ retry: /* transaction retry */ text = "internal error"; goto return_results; } + ldap_pvt_thread_yield(); } if( bdb->bi_txn ) { diff --git a/servers/slapd/back-bdb/modrdn.c b/servers/slapd/back-bdb/modrdn.c index 2169b4a542..d1398ab308 100644 --- a/servers/slapd/back-bdb/modrdn.c +++ b/servers/slapd/back-bdb/modrdn.c @@ -79,6 +79,7 @@ retry: /* transaction retry */ text = "internal error"; goto return_results; } + ldap_pvt_thread_yield(); } if( bdb->bi_txn ) { diff --git a/servers/slapd/back-bdb/passwd.c b/servers/slapd/back-bdb/passwd.c index abfe85fb5a..3858ac29cb 100644 --- a/servers/slapd/back-bdb/passwd.c +++ b/servers/slapd/back-bdb/passwd.c @@ -95,6 +95,7 @@ retry: /* transaction retry */ *text = "internal error"; goto done; } + ldap_pvt_thread_yield(); } if( bdb->bi_txn ) {