From d558976f0930874c3b94c320197a39cb3be87a85 Mon Sep 17 00:00:00 2001 From: Ludwig Krispenz Date: Thu, 11 Jan 2018 15:56:21 +0100 Subject: [PATCH] Ticket 49446 - cleanallruv could break replication if startCsn originated from deleted replica Bug: If the startcsn is calculated based on a cleaned rid, it could be missing from the changelog. Fix: In force mode we do not care that the topology gets in sync for the cleaned RID, so we can ignore it in an earlier stage, instead of setting it to precleane only. Reviewed by: ? --- ldap/servers/plugins/replication/repl5_replica_config.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ldap/servers/plugins/replication/repl5_replica_config.c b/ldap/servers/plugins/replication/repl5_replica_config.c index e025f34..005528a 100644 --- a/ldap/servers/plugins/replication/repl5_replica_config.c +++ b/ldap/servers/plugins/replication/repl5_replica_config.c @@ -1688,9 +1688,15 @@ replica_cleanallruv_thread(void *arg) } /* * Presetting the rid prevents duplicate thread creation, but allows the db and changelog to still - * process updates from the rid. set_cleaned_rid() blocks updates, so we don't want to do that... yet. + * process updates from the rid. + * set_cleaned_rid() blocks updates, so we don't want to do that... yet unless we are in force mode. + * If we are forcing a clean independent of state of other servers for this RID we can set_cleaned_rid() */ - preset_cleaned_rid(data->rid); + if (data->force) { + set_cleaned_rid(data->rid); + } else { + preset_cleaned_rid(data->rid); + } rid_text = slapi_ch_smprintf("%d", data->rid); csn_as_string(data->maxcsn, PR_FALSE, csnstr); /* -- 2.9.5