[Date Prev][Date Next] [Chronological] [Thread] [Top]

(ITS#6717) patch for syncprov unnecessary presentation issue



The following patch against servers/slapd/overlays/syncprov.c
version 1.320 appears to fix the issue detailed in ITS#6717,
and does not appear to break any of the basic sync functionality.

--- syncprov.c.1.320	2010-12-15 19:55:32.000000000 +0000
+++ syncprov.c	2010-12-15 22:13:48.000000000 +0000
@@ -2409,7 +2409,7 @@
 	sync_control *srs;
 	BerVarray ctxcsn;
 	int i, *sids, numcsns;
-	struct berval mincsn;
+	struct berval mincsn, maxcsn;
 	int dirty = 0;
 
 	if ( !(op->o_sync_mode & SLAP_SYNC_REFRESH) ) return SLAP_CB_CONTINUE;
@@ -2524,12 +2524,25 @@
 			i++;
 		}
 
-		/* Find the smallest CSN */
-		mincsn = srs->sr_state.ctxcsn[0];
-		for ( i=1; i<srs->sr_state.numcsns; i++ ) {
-			if ( ber_bvcmp( &mincsn, &srs->sr_state.ctxcsn[i] ) > 0 )
-				mincsn = srs->sr_state.ctxcsn[i];
+		/* Find the smallest CSN which differs between cookie
+		 * and contextCSN.
+		 */
+		mincsn.bv_len = 0;
+		maxcsn.bv_len = 0;
+		for ( i=0; i<srs->sr_state.numcsns; i++) {
+			for (j=0; j<numcsns; j++) {
+				if ( srs->sr_state.sids[i] != sids[j] ) continue;
+				if (BER_BVISNULL(&maxcsn) || ber_bvcmp( &maxcsn, &srs->sr_state.ctxcsn[i] ) < 0 ) {
+					maxcsn = srs->sr_state.ctxcsn[i];
+				}
+				if (ber_bvcmp( &srs->sr_state.ctxcsn[i], &ctxcsn[j] ) < 0) {
+					if (BER_BVISNULL(&mincsn) || ber_bvcmp( &mincsn, &srs->sr_state.ctxcsn[i] ) > 0 ) {
+						mincsn = srs->sr_state.ctxcsn[i];
+					}
+				}
+			}
 		}
+		if (BER_BVISNULL(&mincsn)) mincsn = maxcsn;
 
 		/* If nothing has changed, shortcut it */
 		if ( srs->sr_state.numcsns == numcsns ) {