]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/syncrepl.c
Fixed last commit. gcc was complaining about defined behavior.
[openldap] / servers / slapd / syncrepl.c
index 5fb60ce9116335d74da68200991523756ee4d4a9..1b1db2f7373b4d4e7e4f5c36a4227106bd9ed106 100644 (file)
@@ -823,7 +823,7 @@ do_syncrep2(
 
        slap_dup_sync_cookie( &syncCookie_req, &si->si_syncCookie );
 
-       if ( abs(si->si_type) == LDAP_SYNC_REFRESH_AND_PERSIST ) {
+       if ( abs(si->si_type) == LDAP_SYNC_REFRESH_AND_PERSIST && si->si_refreshDone ) {
                tout_p = &tout;
        } else {
                tout_p = NULL;
@@ -1241,6 +1241,9 @@ do_syncrep2(
                                                si->si_refreshDone = 1;
                                        }
                                        ber_scanf( ber, /*"{"*/ "}" );
+                                       if ( abs(si->si_type) == LDAP_SYNC_REFRESH_AND_PERSIST &&
+                                               si->si_refreshDone )
+                                               tout_p = &tout;
                                        break;
                                case LDAP_TAG_SYNC_ID_SET:
                                        Debug( LDAP_DEBUG_SYNC,
@@ -1845,6 +1848,9 @@ static Modifications *mods_dup( Operation *op, Modifications *modlist, int match
                        } else {
                                mod->sml_nvalues = NULL;
                        }
+               } else {
+                       mod->sml_values = NULL;
+                       mod->sml_nvalues = NULL;
                }
                if ( match < 0 && modlist->sml_op == LDAP_MOD_REPLACE )
                        mod->sml_op = LDAP_MOD_ADD;
@@ -2071,8 +2077,12 @@ syncrepl_op_modify( Operation *op, SlapReply *rs )
                Modifications *ml;
                int size, rc;
                SlapReply rs1 = {0};
-               resolve_ctxt rx = { si, newlist };
-               slap_callback cb = { NULL, syncrepl_resolve_cb, NULL, &rx };
+               resolve_ctxt rx;
+               slap_callback cb = { NULL, syncrepl_resolve_cb, NULL, NULL };
+
+               rx.rx_si = si;
+               rx.rx_mods = newlist;
+               cb.sc_private = &rx;
 
                op2.o_tag = LDAP_REQ_SEARCH;
                op2.ors_scope = LDAP_SCOPE_SUBTREE;
@@ -2807,9 +2817,7 @@ syncrepl_entry(
                                /* FIXME: op->o_csn is assumed to be
                                 * on the thread's slab; this needs
                                 * to be cleared ASAP.
-                                * What happens if already present?
                                 */
-                               assert( BER_BVISNULL( &op->o_csn ) );
                                op->o_csn = a->a_vals[0];
                                freecsn = 0;
                        }
@@ -2838,8 +2846,24 @@ retry_add:;
 
                        case LDAP_REFERRAL:
                        /* we assume that LDAP_NO_SUCH_OBJECT is returned 
-                        * only if the suffix entry is not present */
+                        * only if the suffix entry is not present.
+                        * This should not happen during Persist phase.
+                        */
                        case LDAP_NO_SUCH_OBJECT:
+                               if ( abs(si->si_type) == LDAP_SYNC_REFRESH_AND_PERSIST &&
+                                       si->si_refreshDone ) {
+                                       /* Something's wrong, start over */
+                                       ber_bvarray_free( si->si_syncCookie.ctxcsn );
+                                       si->si_syncCookie.ctxcsn = NULL;
+                                       ldap_pvt_thread_mutex_lock( &si->si_cookieState->cs_mutex );
+                                       ber_bvarray_free( si->si_cookieState->cs_vals );
+                                       ch_free( si->si_cookieState->cs_sids );
+                                       si->si_cookieState->cs_vals = NULL;
+                                       si->si_cookieState->cs_sids = 0;
+                                       si->si_cookieState->cs_num = 0;
+                                       ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_mutex );
+                                       return LDAP_NO_SUCH_OBJECT;
+                               }
                                rc = syncrepl_add_glue( op, entry );
                                entry = NULL;
                                break;
@@ -3087,7 +3111,7 @@ retry_modrdn:;
 
                        /* NOTE: noSuchObject should result because the new superior
                         * has not been added yet (ITS#6472) */
-                       if ( rc == LDAP_NO_SUCH_OBJECT && !BER_BVISNULL( op->orr_nnewSup )) {
+                       if ( rc == LDAP_NO_SUCH_OBJECT && op->orr_nnewSup != NULL ) {
                                Operation op2 = *op;
                                rc = syncrepl_add_glue_ancestors( &op2, entry );
                                if ( rc == LDAP_SUCCESS ) {
@@ -3150,6 +3174,9 @@ retry_modrdn:;
                        op->o_req_ndn = dni.ndn;
                        op->o_tag = LDAP_REQ_DELETE;
                        op->o_bd = si->si_wbe;
+                       if ( !syncCSN ) {
+                               slap_queue_csn( op, si->si_syncCookie.ctxcsn );
+                       }
                        rc = op->o_bd->be_delete( op, &rs_delete );
                        Debug( LDAP_DEBUG_SYNC,
                                        "syncrepl_entry: %s be_delete %s (%d)\n", 
@@ -3488,8 +3515,8 @@ syncrepl_add_glue_ancestors(
        }
        
        if ( !BER_BVISEMPTY( &ptr ) ) {
-               dn.bv_len -= ptr.bv_len + 1;
-               dn.bv_val += ptr.bv_len + 1;
+               dn.bv_len -= ptr.bv_len + ( suffrdns != 0 );
+               dn.bv_val += ptr.bv_len + ( suffrdns != 0 );
        }
 
        /* the normalizedDNs are always the same length, no counting