]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/syncrepl.c
fix ITS#5959 fix
[openldap] / servers / slapd / syncrepl.c
index b6686958f323176b4b13c40b5c10de8687f1e73e..f10c36b600e72370bfcbf9ce80bfd6d659047fc3 100644 (file)
@@ -1037,6 +1037,17 @@ do_syncrep2(
                                                "LDAP_RES_INTERMEDIATE", 
                                                "NEW_COOKIE" );
                                        ber_scanf( ber, "tm", &tag, &cookie );
+                                       Debug( LDAP_DEBUG_SYNC,
+                                               "do_syncrep2: %s NEW_COOKIE: %s\n",
+                                               si->si_ridtxt,
+                                               cookie.bv_val, 0);
+                                       if ( !BER_BVISNULL( &cookie ) ) {
+                                               ch_free( syncCookie.octet_str.bv_val );
+                                               ber_dupbv( &syncCookie.octet_str, &cookie );
+                                       }
+                                       if (!BER_BVISNULL( &syncCookie.octet_str ) ) {
+                                               slap_parse_sync_cookie( &syncCookie, NULL );
+                                       }
                                        break;
                                case LDAP_TAG_SYNC_REFRESH_DELETE:
                                case LDAP_TAG_SYNC_REFRESH_PRESENT:
@@ -1149,6 +1160,7 @@ do_syncrep2(
 
                                if ( match < 0 ) {
                                        if ( si->si_refreshPresent == 1 &&
+                                               si_tag != LDAP_TAG_SYNC_NEW_COOKIE &&
                                                syncCookie_req.numcsns == syncCookie.numcsns ) {
                                                syncrepl_del_nonpresent( op, si, NULL,
                                                        &syncCookie, m );
@@ -2875,12 +2887,11 @@ syncrepl_updateCookie(
 {
        Backend *be = op->o_bd;
        Modifications mod;
-       struct berval first = BER_BVNULL;
 #ifdef CHECK_CSN
        Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
 #endif
 
-       int rc, i, j;
+       int rc, i, j, csn_changed = 0;
        ber_len_t len;
 
        slap_callback cb = { NULL };
@@ -2922,13 +2933,7 @@ syncrepl_updateCookie(
                        if ( memcmp( syncCookie->ctxcsn[i].bv_val,
                                si->si_cookieState->cs_vals[j].bv_val, len ) > 0 ) {
                                mod.sml_values[j] = syncCookie->ctxcsn[i];
-                               if ( BER_BVISNULL( &first ) ) {
-                                       first = syncCookie->ctxcsn[i];
-
-                               } else if ( memcmp( syncCookie->ctxcsn[i].bv_val, first.bv_val, first.bv_len ) > 0 )
-                               {
-                                       first = syncCookie->ctxcsn[i];
-                               }
+                               csn_changed = 1;
                        }
                        break;
                }
@@ -2938,23 +2943,16 @@ syncrepl_updateCookie(
                                ( mod.sml_numvals+2 )*sizeof(struct berval), op->o_tmpmemctx );
                        mod.sml_values[mod.sml_numvals++] = syncCookie->ctxcsn[i];
                        BER_BVZERO( &mod.sml_values[mod.sml_numvals] );
-                       if ( BER_BVISNULL( &first ) ) {
-                               first = syncCookie->ctxcsn[i];
-                       } else if ( memcmp( syncCookie->ctxcsn[i].bv_val, first.bv_val, first.bv_len ) > 0 )
-                       {
-                               first = syncCookie->ctxcsn[i];
-                       }
+                       csn_changed = 1;
                }
        }
        /* Should never happen, ITS#5065 */
-       if ( BER_BVISNULL( &first )) {
+       if ( !csn_changed ) {
                ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_mutex );
                op->o_tmpfree( mod.sml_values, op->o_tmpmemctx );
                return 0;
        }
        op->o_bd = si->si_wbe;
-       slap_queue_csn( op, &first );
-
        op->o_tag = LDAP_REQ_MODIFY;
 
        cb.sc_response = null_callback;