]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/syncprov.c
Fix typo in prev commit
[openldap] / servers / slapd / overlays / syncprov.c
index 01015172e71d5b6a4dc4cd40720b362ca00fa36f..ddb060d88831df6335f18e6584edcabaedffbaee 100644 (file)
@@ -775,7 +775,7 @@ syncprov_sendresp( Operation *op, opcookie *opc, syncops *so,
 
        SlapReply rs = { REP_SEARCH };
        LDAPControl *ctrls[2];
-       struct berval cookie, csns[2];
+       struct berval cookie = BER_BVNULL, csns[2];
        Entry e_uuid = {0};
        Attribute a_uuid = {0};
 
@@ -783,18 +783,22 @@ syncprov_sendresp( Operation *op, opcookie *opc, syncops *so,
                return SLAPD_ABANDON;
 
        ctrls[1] = NULL;
-       csns[0] = opc->sctxcsn;
-       BER_BVZERO( &csns[1] );
-       slap_compose_sync_cookie( op, &cookie, csns, so->s_rid, slap_serverID ? slap_serverID : -1 );
+       if ( !BER_BVISNULL( &opc->sctxcsn )) {
+               csns[0] = opc->sctxcsn;
+               BER_BVZERO( &csns[1] );
+               slap_compose_sync_cookie( op, &cookie, csns, so->s_rid, slap_serverID ? slap_serverID : -1 );
+       }
 
 #ifdef LDAP_DEBUG
-       if ( so->s_sid > 0 ) {
-               Debug( LDAP_DEBUG_SYNC, "syncprov_sendresp: to=%03x, cookie=%s\n",
-                       so->s_sid, cookie.bv_val, 0 );
-       } else {
-               Debug( LDAP_DEBUG_SYNC, "syncprov_sendresp: cookie=%s\n",
-                       cookie.bv_val, 0, 0 );
-       }
+       if ( !BER_BVISNULL( &cookie )) {
+               if ( so->s_sid > 0 ) {
+                       Debug( LDAP_DEBUG_SYNC, "syncprov_sendresp: to=%03x, cookie=%s\n",
+                               so->s_sid, cookie.bv_val , 0 );
+               } else {
+                       Debug( LDAP_DEBUG_SYNC, "syncprov_sendresp: cookie=%s\n",
+                               cookie.bv_val, 0, 0 );
+               }
+       }               
 #endif
 
        e_uuid.e_attrs = &a_uuid;
@@ -802,7 +806,9 @@ syncprov_sendresp( Operation *op, opcookie *opc, syncops *so,
        a_uuid.a_nvals = &opc->suuid;
        rs.sr_err = syncprov_state_ctrl( op, &rs, &e_uuid,
                mode, ctrls, 0, 1, &cookie );
-       op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
+       if ( !BER_BVISNULL( &cookie )) {
+               op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
+       }
 
        rs.sr_ctrls = ctrls;
        op->o_bd->bd_info = (BackendInfo *)on->on_info;
@@ -1246,8 +1252,10 @@ syncprov_matchops( Operation *op, opcookie *opc, int saveit )
                        oh = *op->o_hdr;
                        oh.oh_conn = ss->s_op->o_conn;
                        oh.oh_connid = ss->s_op->o_connid;
+                       op2.o_bd = op->o_bd->bd_self;
                        op2.o_hdr = &oh;
                        op2.o_extra = op->o_extra;
+                       op2.o_callback = NULL;
                        rc = test_filter( &op2, e, ss->s_op->ors_filter );
                }
 
@@ -1644,7 +1652,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
@@ -1749,17 +1757,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;
+                                       }
                                }
                        }
                }
@@ -2197,9 +2211,10 @@ syncprov_search_response( Operation *op, SlapReply *rs )
                                LDAP_SYNC_ADD, rs->sr_ctrls, 0, 0, NULL );
                }
        } else if ( rs->sr_type == REP_RESULT && rs->sr_err == LDAP_SUCCESS ) {
-               struct berval cookie;
+               struct berval cookie = BER_BVNULL;
 
-               if ( ss->ss_flags & SS_CHANGED ) {
+               if ( ( ss->ss_flags & SS_CHANGED ) &&
+                       ss->ss_ctxcsn && !BER_BVISNULL( &ss->ss_ctxcsn[0] )) {
                        slap_compose_sync_cookie( op, &cookie, ss->ss_ctxcsn,
                                srs->sr_state.rid, slap_serverID ? slap_serverID : -1 );
 
@@ -2223,7 +2238,7 @@ syncprov_search_response( Operation *op, SlapReply *rs )
                                LDAP_TAG_SYNC_REFRESH_PRESENT : LDAP_TAG_SYNC_REFRESH_DELETE,
                                ( ss->ss_flags & SS_CHANGED ) ? &cookie : NULL,
                                1, NULL, 0 );
-                       if ( ss->ss_flags & SS_CHANGED )
+                       if ( !BER_BVISNULL( &cookie ))
                                op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
 
                        /* Detach this Op from frontend control */