瀏覽代碼

Fix for #155591: treat an ruv with no min_csn as pristine

David Boreham 20 年之前
父節點
當前提交
c574a5401c

+ 21 - 0
ldap/servers/plugins/replication/repl5_ruv.c

@@ -1857,6 +1857,27 @@ PRBool ruv_has_csns(const RUV *ruv)
         return retval;
 }
 
+PRBool ruv_has_both_csns(const RUV *ruv)
+{
+        PRBool retval = PR_TRUE;
+        CSN *mincsn = NULL;
+        CSN *maxcsn = NULL;
+
+        ruv_get_min_csn(ruv, &mincsn);
+        ruv_get_max_csn(ruv, &maxcsn);
+        if (mincsn) {
+                csn_free(&mincsn);
+                csn_free(&maxcsn);
+        } else if (maxcsn) {
+                csn_free(&maxcsn);
+                retval = PR_FALSE; /* it has a maxcsn but no mincsn */
+        } else {
+                retval = PR_FALSE; /* both min and max are false */
+        }
+
+        return retval;
+}
+
 /* Check if the first ruv is newer than the second one */
 PRBool
 ruv_is_newer (Object *sruvobj, Object *cruvobj)

+ 1 - 0
ldap/servers/plugins/replication/repl5_ruv.h

@@ -112,6 +112,7 @@ int ruv_local_contains_supplier(RUV *ruv, ReplicaId rid);
 /* returns true if the ruv has any csns, false otherwise - used for testing
    whether or not an RUV is empty */
 PRBool ruv_has_csns(const RUV *ruv);
+PRBool ruv_has_both_csns(const RUV *ruv);
 PRBool ruv_is_newer (Object *sruv, Object *cruv);
 void ruv_force_csn_update (RUV *ruv, CSN *csn);
 #ifdef __cplusplus

+ 8 - 1
ldap/servers/plugins/replication/windows_inc_protocol.c

@@ -1632,7 +1632,14 @@ windows_examine_update_vector(Private_Repl_Protocol *prp, RUV *remote_ruv)
 		}
 		else
 		{
-			return_value = EXAMINE_RUV_OK;
+			/* Check for the case where part of the RUV remote is missing */
+			if (ruv_has_both_csns(remote_ruv))
+			{
+				return_value = EXAMINE_RUV_OK;
+			} else 
+			{
+				return_value = EXAMINE_RUV_PRISTINE_REPLICA;
+			}
 		}
 		slapi_ch_free((void**)&remote_gen);
 		slapi_ch_free((void**)&local_gen);