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

gbellato
31.50.2009 9452e6e93128f70a3ca7102c695281d2ea786b9a
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
opends/src/server/org/opends/server/replication/common/ChangeNumberGenerator.java 10 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/service/ReplicationDomain.java 1 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/common/ChangeNumberGeneratorTest.java 22 ●●●●● patch | view | raw | blame | history
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);
  }
  /**
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());
        }
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());
  }
}