]> git.sur5r.net Git - openldap/commitdiff
ITS#6001
authorQuanah Gibson-Mount <quanah@openldap.org>
Mon, 9 Mar 2009 20:32:30 +0000 (20:32 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Mon, 9 Mar 2009 20:32:30 +0000 (20:32 +0000)
CHANGES
servers/slapd/ctxcsn.c
servers/slapd/slap.h

diff --git a/CHANGES b/CHANGES
index 61828b3df2964b384e62cf71f97e24595d19efb4..4942a4a7045658aef79440457860f0aad7783d7c 100644 (file)
--- 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)
index 873721600fcf8963f559d9fd8a95a054a0594806..95d7ba6ed1e36dae33b7b8696fa0dfac15ea5f63 100644 (file)
@@ -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;
index be010c2212a8524521b15afff3c89ae4700f8229..a47d1bb54bc1adc1c14eca00a3cc4937c9f652c6 100644 (file)
@@ -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