]> git.sur5r.net Git - openldap/commitdiff
in op_response, rearrange contextCSN update checks
authorHoward Chu <hyc@openldap.org>
Sat, 21 Nov 2009 11:43:01 +0000 (11:43 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 21 Nov 2009 11:43:01 +0000 (11:43 +0000)
servers/slapd/overlays/syncprov.c

index 541a9f3c70b9ccdfb831cd37c8ddbabd8512c4df..2ac8803262120141eef7686cf7e9da30ec908e4c 100644 (file)
@@ -1671,7 +1671,49 @@ syncprov_op_response( Operation *op, SlapReply *rs )
                maxcsn.bv_len = sizeof(cbuf);
                ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );
 
-               if ( op->o_dont_replicate && op->o_tag == LDAP_REQ_MODIFY &&
+               if ( BER_BVISEMPTY( &maxcsn ) && SLAP_GLUE_SUBORDINATE( op->o_bd )) {
+                       /* syncrepl queues the CSN values in the db where
+                        * it is configured , not where the changes are made.
+                        * So look for a value in the glue db if we didn't
+                        * find any in this db.
+                        */
+                       BackendDB *be = op->o_bd;
+                       op->o_bd = select_backend( &be->be_nsuffix[0], 1);
+                       maxcsn.bv_val = cbuf;
+                       maxcsn.bv_len = sizeof(cbuf);
+                       slap_get_commit_csn( op, &maxcsn, &foundit );
+                       op->o_bd = be;
+               }
+               if ( !BER_BVISEMPTY( &maxcsn ) ) {
+                       int i, sid;
+#ifdef CHECK_CSN
+                       Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
+                       assert( !syn->ssyn_validate( syn, &maxcsn ));
+#endif
+                       sid = slap_parse_csn_sid( &maxcsn );
+                       for ( i=0; i<si->si_numcsns; i++ ) {
+                               if ( sid == si->si_sids[i] ) {
+                                       if ( ber_bvcmp( &maxcsn, &si->si_ctxcsn[i] ) > 0 ) {
+                                               ber_bvreplace( &si->si_ctxcsn[i], &maxcsn );
+                                               csn_changed = 1;
+                                       }
+                                       break;
+                               }
+                       }
+                       /* It's a new SID for us */
+                       if ( i == si->si_numcsns ) {
+                               value_add_one( &si->si_ctxcsn, &maxcsn );
+                               csn_changed = 1;
+                               si->si_numcsns++;
+                               si->si_sids = ch_realloc( si->si_sids, si->si_numcsns *
+                                       sizeof(int));
+                               si->si_sids[i] = sid;
+                       }
+               }
+
+               /* Don't do any processing for consumer contextCSN updates */
+               if ( op->o_dont_replicate ) {
+                       if ( op->o_tag == LDAP_REQ_MODIFY &&
                                op->orm_modlist->sml_op == LDAP_MOD_REPLACE &&
                                op->orm_modlist->sml_desc == slap_schema.si_ad_contextCSN ) {
                        /* Catch contextCSN updates from syncrepl. We have to look at
@@ -1683,7 +1725,6 @@ syncprov_op_response( Operation *op, SlapReply *rs )
 
                        for ( i=0; i<mod->sml_numvals; i++ ) {
                                sid = slap_parse_csn_sid( &mod->sml_values[i] );
-
                                for ( j=0; j<si->si_numcsns; j++ ) {
                                        if ( sid == si->si_sids[j] ) {
                                                if ( ber_bvcmp( &mod->sml_values[i], &si->si_ctxcsn[j] ) > 0 ) {
@@ -1718,59 +1759,9 @@ syncprov_op_response( Operation *op, SlapReply *rs )
                                        }
                                }
                        }
-                       goto leave;
-               }
-
-               slap_get_commit_csn( op, &maxcsn, &foundit );
-               if ( BER_BVISEMPTY( &maxcsn ) && SLAP_GLUE_SUBORDINATE( op->o_bd )) {
-                       /* syncrepl queues the CSN values in the db where
-                        * it is configured , not where the changes are made.
-                        * So look for a value in the glue db if we didn't
-                        * find any in this db.
-                        */
-                       BackendDB *be = op->o_bd;
-                       op->o_bd = select_backend( &be->be_nsuffix[0], 1);
-                       maxcsn.bv_val = cbuf;
-                       maxcsn.bv_len = sizeof(cbuf);
-                       slap_get_commit_csn( op, &maxcsn, &foundit );
-                       op->o_bd = be;
-               }
-               if ( !BER_BVISEMPTY( &maxcsn ) ) {
-                       int i, sid;
-#ifdef CHECK_CSN
-                       Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
-                       assert( !syn->ssyn_validate( syn, &maxcsn ));
-#endif
-                       sid = slap_parse_csn_sid( &maxcsn );
-                       for ( i=0; i<si->si_numcsns; i++ ) {
-                               if ( sid == si->si_sids[i] ) {
-                                       if ( ber_bvcmp( &maxcsn, &si->si_ctxcsn[i] ) > 0 ) {
-                                               ber_bvreplace( &si->si_ctxcsn[i], &maxcsn );
-                                               csn_changed = 1;
-                                       }
-                                       break;
-                               }
-                       }
-                       /* It's a new SID for us */
-                       if ( i == si->si_numcsns ) {
-                               value_add_one( &si->si_ctxcsn, &maxcsn );
-                               csn_changed = 1;
-                               si->si_numcsns++;
-                               si->si_sids = ch_realloc( si->si_sids, si->si_numcsns *
-                                       sizeof(int));
-                               si->si_sids[i] = sid;
-                       }
-#if 0
-               } else if ( !foundit ) {
-                       /* internal ops that aren't meant to be replicated */
-                       ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
-                       return SLAP_CB_CONTINUE;
-#endif
-               }
-
-               /* Don't do any processing for consumer contextCSN updates */
-               if ( op->o_dont_replicate ) {
+                       } else {
                        ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
+                       }
                        goto leave;
                }