]> git.sur5r.net Git - openldap/commitdiff
ITS#6001 SID of queued CSN must match the one in the op
authorRein Tollevik <rein@openldap.org>
Thu, 5 Mar 2009 20:43:53 +0000 (20:43 +0000)
committerRein Tollevik <rein@openldap.org>
Thu, 5 Mar 2009 20:43:53 +0000 (20:43 +0000)
servers/slapd/ctxcsn.c
servers/slapd/slap.h

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