mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-21 23:29:34 -05:00
ITS#2895 TXN_PREPARE is not needed since we use nested transactions. It
also has a side-effect of releasing all the transaction's existing locks.
This commit is contained in:
parent
93390425df
commit
e6f34fddcd
3 changed files with 57 additions and 80 deletions
|
|
@ -465,52 +465,41 @@ retry: /* transaction retry */
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
char gid[DB_XIDDATASIZE];
|
struct berval nrdn;
|
||||||
|
Entry *e = entry_dup( op->ora_e );
|
||||||
memset( gid, 0, sizeof(gid) );
|
|
||||||
snprintf( gid, sizeof( gid ), "%s-%08lx-%08lx",
|
|
||||||
bdb_uuid.bv_val, (long) op->o_connid, (long) op->o_opid );
|
|
||||||
|
|
||||||
if (( rs->sr_err=TXN_PREPARE( ltid, gid )) != 0 ) {
|
|
||||||
rs->sr_text = "txn_prepare failed";
|
|
||||||
|
|
||||||
|
if (pdn.bv_len) {
|
||||||
|
nrdn.bv_val = e->e_nname.bv_val;
|
||||||
|
nrdn.bv_len = pdn.bv_val - op->ora_e->e_nname.bv_val - 1;
|
||||||
} else {
|
} else {
|
||||||
struct berval nrdn;
|
nrdn = e->e_nname;
|
||||||
Entry *e = entry_dup( op->ora_e );
|
}
|
||||||
|
|
||||||
if (pdn.bv_len) {
|
bdb_cache_add( bdb, ei, e, &nrdn, locker );
|
||||||
nrdn.bv_val = e->e_nname.bv_val;
|
|
||||||
nrdn.bv_len = pdn.bv_val - op->ora_e->e_nname.bv_val - 1;
|
if ( suffix_ei == NULL ) {
|
||||||
} else {
|
suffix_ei = e->e_private;
|
||||||
nrdn = e->e_nname;
|
}
|
||||||
|
|
||||||
|
if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
|
||||||
|
if ( ctxcsn_added ) {
|
||||||
|
bdb_cache_add( bdb, suffix_ei, ctxcsn_e,
|
||||||
|
(struct berval *)&slap_ldapsync_cn_bv, locker );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bdb_cache_add( bdb, ei, e, &nrdn, locker );
|
if ( rs->sr_err == LDAP_SUCCESS && !noop && !op->o_no_psearch ) {
|
||||||
|
ldap_pvt_thread_rdwr_rlock( &bdb->bi_pslist_rwlock );
|
||||||
if ( suffix_ei == NULL ) {
|
LDAP_LIST_FOREACH ( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
|
||||||
suffix_ei = e->e_private;
|
bdb_psearch( op, rs, ps_list, op->oq_add.rs_e, LDAP_PSEARCH_BY_ADD );
|
||||||
}
|
}
|
||||||
|
ldap_pvt_thread_rdwr_runlock( &bdb->bi_pslist_rwlock );
|
||||||
|
}
|
||||||
|
|
||||||
if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
|
if(( rs->sr_err=TXN_COMMIT( ltid, 0 )) != 0 ) {
|
||||||
if ( ctxcsn_added ) {
|
rs->sr_text = "txn_commit failed";
|
||||||
bdb_cache_add( bdb, suffix_ei, ctxcsn_e,
|
} else {
|
||||||
(struct berval *)&slap_ldapsync_cn_bv, locker );
|
rs->sr_err = LDAP_SUCCESS;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( rs->sr_err == LDAP_SUCCESS && !noop && !op->o_no_psearch ) {
|
|
||||||
ldap_pvt_thread_rdwr_rlock( &bdb->bi_pslist_rwlock );
|
|
||||||
LDAP_LIST_FOREACH ( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
|
|
||||||
bdb_psearch( op, rs, ps_list, op->oq_add.rs_e, LDAP_PSEARCH_BY_ADD );
|
|
||||||
}
|
|
||||||
ldap_pvt_thread_rdwr_runlock( &bdb->bi_pslist_rwlock );
|
|
||||||
}
|
|
||||||
|
|
||||||
if(( rs->sr_err=TXN_COMMIT( ltid, 0 )) != 0 ) {
|
|
||||||
rs->sr_text = "txn_commit failed";
|
|
||||||
} else {
|
|
||||||
rs->sr_err = LDAP_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -617,8 +617,6 @@ retry: /* transaction retry */
|
||||||
rs->sr_err = LDAP_SUCCESS;
|
rs->sr_err = LDAP_SUCCESS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
EntryInfo *ctx_ei;
|
|
||||||
|
|
||||||
bdb_cache_modify( e, dummy.e_attrs, bdb->bi_dbenv, locker, &lock );
|
bdb_cache_modify( e, dummy.e_attrs, bdb->bi_dbenv, locker, &lock );
|
||||||
|
|
||||||
if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
|
if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
|
||||||
|
|
|
||||||
|
|
@ -980,48 +980,38 @@ retry: /* transaction retry */
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
char gid[DB_XIDDATASIZE];
|
bdb_cache_modrdn( save, &op->orr_nnewrdn, e, neip,
|
||||||
|
bdb->bi_dbenv, locker, &lock );
|
||||||
|
|
||||||
memset( gid, 0, sizeof(gid) );
|
if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
|
||||||
snprintf( gid, sizeof( gid ), "%s-%08lx-%08lx",
|
if ( ctxcsn_added ) {
|
||||||
bdb_uuid.bv_val, (long) op->o_connid, (long) op->o_opid );
|
bdb_cache_add( bdb, suffix_ei, ctxcsn_e,
|
||||||
|
(struct berval *)&slap_ldapsync_cn_bv, locker );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(( rs->sr_err=TXN_PREPARE( ltid, gid )) != 0 ) {
|
if ( rs->sr_err == LDAP_SUCCESS && !op->o_noop ) {
|
||||||
rs->sr_text = "txn_prepare failed";
|
/* Loop through in-scope entries for each psearch spec */
|
||||||
|
ldap_pvt_thread_rdwr_rlock( &bdb->bi_pslist_rwlock );
|
||||||
|
LDAP_LIST_FOREACH ( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
|
||||||
|
bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_MODIFY );
|
||||||
|
}
|
||||||
|
ldap_pvt_thread_rdwr_runlock( &bdb->bi_pslist_rwlock );
|
||||||
|
pm_list = LDAP_LIST_FIRST(&op->o_pm_list);
|
||||||
|
while ( pm_list != NULL ) {
|
||||||
|
bdb_psearch(op, rs, pm_list->ps_op,
|
||||||
|
e, LDAP_PSEARCH_BY_SCOPEOUT);
|
||||||
|
pm_prev = pm_list;
|
||||||
|
LDAP_LIST_REMOVE ( pm_list, ps_link );
|
||||||
|
pm_list = LDAP_LIST_NEXT ( pm_list, ps_link );
|
||||||
|
ch_free( pm_prev );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(( rs->sr_err=TXN_COMMIT( ltid, 0 )) != 0 ) {
|
||||||
|
rs->sr_text = "txn_commit failed";
|
||||||
} else {
|
} else {
|
||||||
bdb_cache_modrdn( save, &op->orr_nnewrdn, e, neip,
|
rs->sr_err = LDAP_SUCCESS;
|
||||||
bdb->bi_dbenv, locker, &lock );
|
|
||||||
|
|
||||||
if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
|
|
||||||
if ( ctxcsn_added ) {
|
|
||||||
bdb_cache_add( bdb, suffix_ei, ctxcsn_e,
|
|
||||||
(struct berval *)&slap_ldapsync_cn_bv, locker );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( rs->sr_err == LDAP_SUCCESS && !op->o_noop ) {
|
|
||||||
/* Loop through in-scope entries for each psearch spec */
|
|
||||||
ldap_pvt_thread_rdwr_rlock( &bdb->bi_pslist_rwlock );
|
|
||||||
LDAP_LIST_FOREACH ( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
|
|
||||||
bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_MODIFY );
|
|
||||||
}
|
|
||||||
ldap_pvt_thread_rdwr_runlock( &bdb->bi_pslist_rwlock );
|
|
||||||
pm_list = LDAP_LIST_FIRST(&op->o_pm_list);
|
|
||||||
while ( pm_list != NULL ) {
|
|
||||||
bdb_psearch(op, rs, pm_list->ps_op,
|
|
||||||
e, LDAP_PSEARCH_BY_SCOPEOUT);
|
|
||||||
pm_prev = pm_list;
|
|
||||||
LDAP_LIST_REMOVE ( pm_list, ps_link );
|
|
||||||
pm_list = LDAP_LIST_NEXT ( pm_list, ps_link );
|
|
||||||
ch_free( pm_prev );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(( rs->sr_err=TXN_COMMIT( ltid, 0 )) != 0 ) {
|
|
||||||
rs->sr_text = "txn_commit failed";
|
|
||||||
} else {
|
|
||||||
rs->sr_err = LDAP_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue