mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

gbellato
31.50.2009 85b2791ce6eb3571bc9d3dba0ce94d1c25e3db19
fix for 3908 : Problems with ChangeNumber generators

This change fix some problems found by code inspection in the
replication ChangeNumberGenerator.
Those problems are very unlikely because they only happen in
case of very short race condition or rolling seqnum but they are worth
fixing anyway.
3 files modified
33 ■■■■ changed files
opendj-sdk/opends/src/server/org/opends/server/replication/common/ChangeNumberGenerator.java 10 ●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/server/org/opends/server/replication/service/ReplicationDomain.java 1 ●●●● patch | view | raw | blame | history
opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberGeneratorTest.java 22 ●●●●● patch | view | raw | blame | history
opendj-sdk/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);
  }
  /**
opendj-sdk/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());
        }
opendj-sdk/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());
  }
}