From: Quanah Gibson-Mount Date: Mon, 9 Mar 2009 20:32:30 +0000 (+0000) Subject: ITS#6001 X-Git-Tag: OPENLDAP_REL_ENG_2_4_16~42 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;ds=sidebyside;h=7af8173378f29d76c0fec9d0cf911faf1b6baa7f;p=openldap ITS#6001 --- diff --git a/CHANGES b/CHANGES index 61828b3df2..4942a4a704 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,7 @@ OpenLDAP 2.4.16 Engineering Fixed libldap peer cert double free (ITS#5849) Fixed libldap referral chasing (ITS#5980) Fixed slapd backglue with empty DBs (ITS#5986) + Fixed slapd ctxcsn race condition (ITS#6001) Fixed slapd syncrepl newCookie sync messages (ITS#5972) Fixed slapd syncrepl multiple CSN propagation (ITS#5973) Fixed slapd-bdb/hdb cachesize handling (ITS#5860) diff --git a/servers/slapd/ctxcsn.c b/servers/slapd/ctxcsn.c index 873721600f..95d7ba6ed1 100644 --- a/servers/slapd/ctxcsn.c +++ b/servers/slapd/ctxcsn.c @@ -40,6 +40,7 @@ slap_get_commit_csn( { struct slap_csn_entry *csne, *committed_csne = NULL; BackendDB *be = op->o_bd->bd_self; + int sid = -1; if ( maxcsn ) { assert( maxcsn->bv_val != NULL ); @@ -51,6 +52,10 @@ slap_get_commit_csn( ldap_pvt_thread_mutex_lock( &be->be_pcl_mutex ); + if ( !BER_BVISEMPTY( &op->o_csn )) { + sid = slap_parse_csn_sid( &op->o_csn ); + } + LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) { if ( csne->ce_opid == op->o_opid && csne->ce_connid == op->o_connid ) { csne->ce_state = SLAP_CSN_COMMIT; @@ -60,8 +65,10 @@ slap_get_commit_csn( } LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) { - if ( csne->ce_state == SLAP_CSN_COMMIT ) committed_csne = csne; - if ( csne->ce_state == SLAP_CSN_PENDING ) break; + if ( sid != -1 && sid == csne->ce_sid ) { + if ( csne->ce_state == SLAP_CSN_COMMIT ) committed_csne = csne; + if ( csne->ce_state == SLAP_CSN_PENDING ) break; + } } if ( maxcsn ) { @@ -185,6 +192,7 @@ slap_queue_csn( ber_dupbv( &pending->ce_csn, csn ); ber_bvreplace_x( &op->o_csn, &pending->ce_csn, op->o_tmpmemctx ); + pending->ce_sid = slap_parse_csn_sid( csn ); pending->ce_connid = op->o_connid; pending->ce_opid = op->o_opid; pending->ce_state = SLAP_CSN_PENDING; diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index be010c2212..a47d1bb54b 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -2371,6 +2371,7 @@ typedef struct PagedResultsState { struct slap_csn_entry { struct berval ce_csn; + int ce_sid; unsigned long ce_opid; unsigned long ce_connid; #define SLAP_CSN_PENDING 1