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