From 4cee71bfa980931c4c74f29f8cea8e53b3b96480 Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Tue, 02 Oct 2007 09:08:20 +0000
Subject: [PATCH] Fix for #2356 - Unexpected generation ID error when replication enabled over empty suffix
---
opendj-sdk/opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java | 32 ++++++++++++----
opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java | 66 +++++++++++++++++++++++++++++----
2 files changed, 82 insertions(+), 16 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java b/opendj-sdk/opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
index 3f3649e..7327666 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
@@ -179,7 +179,9 @@
private int maxSendQueue = 0;
private int maxReceiveDelay = 0;
private int maxSendDelay = 0;
+
private long generationId = -1;
+ private boolean generationIdSavedStatus = false;
private long rejectedGenerationId = -1;
private boolean requestedResetSinceLastStart = false;
@@ -1049,6 +1051,11 @@
waitingAckMsgs.put(curChangeNumber, msg);
}
}
+
+ if (generationIdSavedStatus != true)
+ {
+ this.saveGenerationId(generationId);
+ }
}
else if (!op.isSynchronizationOperation())
{
@@ -2344,15 +2351,23 @@
op.run();
ResultCode result = op.getResultCode();
- if ((result != ResultCode.SUCCESS) && (result != ResultCode.NO_SUCH_OBJECT))
+ if (result != ResultCode.SUCCESS)
{
- // The case where the backend is empty (NO_SUCH_OBJECT)
- // is not an error case.
- Message message = ERR_UPDATING_GENERATION_ID.get(
- op.getResultCode().getResultCodeName() + " " +
- op.getErrorMessage(),
- baseDN.toString());
- logError(message);
+ generationIdSavedStatus = false;
+ if (result != ResultCode.NO_SUCH_OBJECT)
+ {
+ // The case where the backend is empty (NO_SUCH_OBJECT)
+ // is not an error case.
+ Message message = ERR_UPDATING_GENERATION_ID.get(
+ op.getResultCode().getResultCodeName() + " " +
+ op.getErrorMessage(),
+ baseDN.toString());
+ logError(message);
+ }
+ }
+ else
+ {
+ generationIdSavedStatus = true;
}
return result;
}
@@ -2463,6 +2478,7 @@
}
else
{
+ generationIdSavedStatus = true;
if (debugEnabled())
TRACER.debugInfo(
"Generation ID successfully read from domain base DN=" + baseDN +
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java
index 3bbc16c..fe8cffa 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java
@@ -454,7 +454,7 @@
* replication Server ID.
* @param changelogID
*/
- private void connectToReplServer(short changelogID)
+ private void connectServer1ToChangelog(short changelogID)
{
// Connect DS to the replicationServer
try
@@ -464,10 +464,10 @@
String synchroServerLdif =
"dn: cn=" + baseSnStr + ", cn=domains," + synchroServerStringDN + "\n"
+ "objectClass: top\n"
- + "objectClass: ds-cfg-synchronization-provider-config\n"
+ + "objectClass: ds-cfg-replication-domain\n"
+ "cn: " + baseSnStr + "\n"
+ "ds-cfg-base-dn: " + baseDnStr + "\n"
- + "ds-cfg-changelog-server: localhost:"
+ + "ds-cfg-replication-server: localhost:"
+ getChangelogPort(changelogID)+"\n"
+ "ds-cfg-server-id: " + server1ID + "\n"
+ "ds-cfg-receive-status: true\n"
@@ -720,7 +720,7 @@
// Connect DS to RS with no data
// Read generationId - should be not retrievable since no entry
debugInfo(testCase + " Connecting DS1 to replServer1(" + changelog1ID + ")");
- connectToReplServer(changelog1ID);
+ connectServer1ToChangelog(changelog1ID);
Thread.sleep(1000);
debugInfo(testCase + " Expect genId attribute to be not retrievable");
@@ -744,7 +744,7 @@
// Test that generation has been added to the data.
debugInfo(testCase + " add test entries to DS");
this.addTestEntriesToDB(updatedEntries);
- connectToReplServer(changelog1ID);
+ connectServer1ToChangelog(changelog1ID);
// Test that the generationId is written in the DB in the
// root entry on the replica side
@@ -1060,7 +1060,7 @@
Thread.sleep(500);
debugInfo("Connecting DS to replServer1");
- connectToReplServer(changelog1ID);
+ connectServer1ToChangelog(changelog1ID);
Thread.sleep(1500);
debugInfo("Expect genId are set in all replServers.");
@@ -1082,7 +1082,7 @@
this.addTestEntriesToDB(updatedEntries);
debugInfo("Connecting DS to replServer2");
- connectToReplServer(changelog2ID);
+ connectServer1ToChangelog(changelog2ID);
Thread.sleep(1000);
debugInfo("Expect genIds to be set in all servers based on the added entries.");
@@ -1141,7 +1141,7 @@
" Expected entries :" + updatedEntries.length);
debugInfo("Connecting DS to replServer1.");
- connectToReplServer(changelog1ID);
+ connectServer1ToChangelog(changelog1ID);
Thread.sleep(1000);
@@ -1215,4 +1215,54 @@
}
catch (Exception e) {}
}
+
+ /**
+ * Test generationID saving when the root entry does not exist
+ * at the moement when the replication is enabled.
+ * @throws Exception
+ */
+ @Test(enabled=true)
+ public void testServerStop() throws Exception
+ {
+ String testCase = "testServerStop";
+ debugInfo("Starting "+ testCase + " debugEnabled:" + debugEnabled());
+
+ debugInfo(testCase + " Clearing DS1 backend");
+ ReplicationDomain.clearJEBackend(false,
+ "userRoot",
+ baseDn.toNormalizedString());
+
+ try
+ {
+ long genId;
+
+ replServer1 = createReplicationServer(changelog1ID, false, testCase);
+
+ /*
+ * Test : empty replicated backend
+ * Check : nothing is broken - no generationId generated
+ */
+
+ // Connect DS to RS with no data
+ // Read generationId - should be not retrievable since no entry
+ debugInfo(testCase + " Connecting DS1 to replServer1(" + changelog1ID + ")");
+ connectServer1ToChangelog(changelog1ID);
+ Thread.sleep(1000);
+
+ debugInfo(testCase + " Expect genId attribute to be not retrievable");
+ genId = readGenId();
+ assertEquals(genId,-1);
+
+ this.addTestEntriesToDB(updatedEntries);
+
+ debugInfo(testCase + " Expect genId attribute to be retrievable");
+ genId = readGenId();
+ assertEquals(genId, 3211313L);
+ }
+ finally
+ {
+ postTest();
+ debugInfo("Successfully ending " + testCase);
+ }
+ }
}
--
Gitblit v1.10.0