]> git.sur5r.net Git - openldap/commitdiff
More for ITS#5988
authorQuanah Gibson-Mount <quanah@openldap.org>
Tue, 17 Mar 2009 17:36:59 +0000 (17:36 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Tue, 17 Mar 2009 17:36:59 +0000 (17:36 +0000)
servers/slapd/overlays/syncprov.c

index 2fb23d3c3cdb2337570503525751575163908da2..f1af8c9e5890207aa7bbf1d759bb7dc252b97196 100644 (file)
@@ -1644,7 +1644,7 @@ 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 &&
+               if ( op->o_dont_replicate && 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
@@ -1733,10 +1733,12 @@ syncprov_op_response( Operation *op, SlapReply *rs )
                                        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 */
@@ -1747,17 +1749,23 @@ syncprov_op_response( Operation *op, SlapReply *rs )
 
                si->si_numops++;
                if ( si->si_chkops || si->si_chktime ) {
-                       if ( si->si_chkops && si->si_numops >= si->si_chkops ) {
-                               do_check = 1;
-                               si->si_numops = 0;
-                       }
-                       if ( si->si_chktime &&
-                               (op->o_time - si->si_chklast >= si->si_chktime )) {
-                               if ( si->si_chklast ) {
+                       /* Never checkpoint adding the context entry,
+                        * it will deadlock
+                        */
+                       if ( op->o_tag != LDAP_REQ_ADD ||
+                               !dn_match( &op->o_req_ndn, &op->o_bd->be_nsuffix[0] )) {
+                               if ( si->si_chkops && si->si_numops >= si->si_chkops ) {
                                        do_check = 1;
-                                       si->si_chklast = op->o_time;
-                               } else {
-                                       si->si_chklast = 1;
+                                       si->si_numops = 0;
+                               }
+                               if ( si->si_chktime &&
+                                       (op->o_time - si->si_chklast >= si->si_chktime )) {
+                                       if ( si->si_chklast ) {
+                                               do_check = 1;
+                                               si->si_chklast = op->o_time;
+                                       } else {
+                                               si->si_chklast = 1;
+                                       }
                                }
                        }
                }