From 9452e6e93128f70a3ca7102c695281d2ea786b9a Mon Sep 17 00:00:00 2001
From: gbellato <gbellato@localhost>
Date: Tue, 31 Mar 2009 15:50:00 +0000
Subject: [PATCH] fix for 3908 : Problems with ChangeNumber generators
---
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberGeneratorTest.java | 22 +++++++++++++++++++++-
opends/src/server/org/opends/server/replication/common/ChangeNumberGenerator.java | 10 ++++++++--
opends/src/server/org/opends/server/replication/service/ReplicationDomain.java | 1 -
3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/common/ChangeNumberGenerator.java b/opends/src/server/org/opends/server/replication/common/ChangeNumberGenerator.java
index 163d266..2f02591 100644
--- a/opends/src/server/org/opends/server/replication/common/ChangeNumberGenerator.java
+++ b/opends/src/server/org/opends/server/replication/common/ChangeNumberGenerator.java
@@ -82,6 +82,8 @@
public ChangeNumber newChangeNumber()
{
long curTime = TimeThread.getTime();
+ int mySeqnum;
+ long myTime;
synchronized(this)
{
@@ -90,13 +92,17 @@
lastTime = curTime;
}
- if (seqnum++ == 0)
+ if (++seqnum <= 0)
{
+ seqnum = 0;
lastTime++;
}
+ mySeqnum = seqnum;
+ myTime = lastTime;
}
- return new ChangeNumber(lastTime, seqnum, serverId);
+ return new ChangeNumber(myTime, mySeqnum, serverId);
+
}
/**
diff --git a/opends/src/server/org/opends/server/replication/service/ReplicationDomain.java b/opends/src/server/org/opends/server/replication/service/ReplicationDomain.java
index 01bb2de..2455dba 100644
--- a/opends/src/server/org/opends/server/replication/service/ReplicationDomain.java
+++ b/opends/src/server/org/opends/server/replication/service/ReplicationDomain.java
@@ -818,7 +818,6 @@
}
else if (msg instanceof UpdateMsg)
{
- generator.adjust(((UpdateMsg) msg).getChangeNumber());
update = (UpdateMsg) msg;
generator.adjust(update.getChangeNumber());
}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberGeneratorTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberGeneratorTest.java
index eb55740..aab9a66 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberGeneratorTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberGeneratorTest.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2008 Sun Microsystems, Inc.
+ * Copyright 2009 Sun Microsystems, Inc.
*/
package org.opends.server.replication.common;
@@ -57,6 +57,7 @@
"ChangeNumberGenerator generated an earlier ChangeNumber "
+ " after calling the adjust method.");
}
+
@Test
public void adjustSameMilliTest()
{
@@ -75,4 +76,23 @@
"ChangeNumberGenerator generated an earlier ChangeNumber "
+ " after calling the adjust method.");
}
+
+ /**
+ * Test the correct behavior of the ChangeNumberGenerator when
+ * the seqnum is rolling over its limit
+ */
+ @Test
+ public void adjustRollingSeqnum()
+ {
+ ServerState state = new ServerState();
+ ChangeNumber cn1 = new ChangeNumber(TimeThread.getTime(), Integer.MAX_VALUE, (short) 5);
+ state.update(cn1);
+
+ ChangeNumberGenerator generator = new ChangeNumberGenerator((short)5, state);
+
+ ChangeNumber cn2 = generator.newChangeNumber();
+
+ assertTrue(cn2.getSeqnum() == 0);
+ assertTrue(cn2.getTime()>cn1.getTime());
+ }
}
--
Gitblit v1.10.0