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

Jean-Noel Rouvignac
02.08.2013 3b742c9f76118dfd717af0fa9a219e530c9f3fa3
ServerState.java:
Renamed the lastCnSeenPerServerId to serverIdToChangeNumber + changed the javadocs after a comment by Ludo.
1 files modified
161 ■■■■ changed files
opends/src/server/org/opends/server/replication/common/ServerState.java 161 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/common/ServerState.java
@@ -37,20 +37,17 @@
import org.opends.server.types.ByteString;
/**
 * ServerState class.
 * This object is used to store the last update seen on this server
 * from each server.
 * It is exchanged with the replication servers at connection establishment
 * time.
 * This class is used to associate serverIds with ChangeNumbers.
 * <p>
 * For example, it is exchanged with the replication servers at connection
 * establishment time to communicate
 * "which ChangeNumbers last seen by a serverId"
 */
public class ServerState implements Iterable<Integer>
{
  /**
   * Contains what the current server knows about the last ChangeNumber seen for
   * each serverId.
   */
  private final Map<Integer, ChangeNumber> lastCnSeenPerServerId;
  /** Associates a serverId with a ChangeNumber. */
  private final Map<Integer, ChangeNumber> serverIdToChangeNumber;
  /**
   * Whether the state has been saved to persistent storage. It starts at true,
   * and moves to false when an update is made to the current object.
@@ -62,7 +59,7 @@
   */
  public ServerState()
  {
    lastCnSeenPerServerId = new HashMap<Integer, ChangeNumber>();
    serverIdToChangeNumber = new HashMap<Integer, ChangeNumber>();
  }
  /**
@@ -72,9 +69,9 @@
   */
  public void clear()
  {
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      lastCnSeenPerServerId.clear();
      serverIdToChangeNumber.clear();
    }
  }
@@ -94,30 +91,24 @@
  {
    try
    {
      lastCnSeenPerServerId = new HashMap<Integer, ChangeNumber>();
      serverIdToChangeNumber = new HashMap<Integer, ChangeNumber>();
      while (endpos > pos)
      {
        /*
         * read the ServerId
         */
        // read the ServerId
        int length = getNextLength(in, pos);
        String serverIdString = new String(in, pos, length, "UTF-8");
        int serverId = Integer.valueOf(serverIdString);
        pos += length +1;
        /*
         * read the ChangeNumber
         */
        // read the ChangeNumber
        length = getNextLength(in, pos);
        String cnString = new String(in, pos, length, "UTF-8");
        ChangeNumber cn = new ChangeNumber(cnString);
        pos += length +1;
        /*
         * Add the serverid
         */
        lastCnSeenPerServerId.put(serverId, cn);
        // Add the serverid
        serverIdToChangeNumber.put(serverId, cn);
      }
    } catch (UnsupportedEncodingException e)
@@ -163,13 +154,13 @@
    saved = false;
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      int id =  changeNumber.getServerId();
      ChangeNumber oldCN = lastCnSeenPerServerId.get(id);
      int serverId = changeNumber.getServerId();
      ChangeNumber oldCN = serverIdToChangeNumber.get(serverId);
      if (oldCN == null || changeNumber.newer(oldCN))
      {
        lastCnSeenPerServerId.put(id, changeNumber);
        serverIdToChangeNumber.put(serverId, changeNumber);
        return true;
      }
      return false;
@@ -192,7 +183,7 @@
    boolean updated = false;
    for (ChangeNumber cn : serverState.lastCnSeenPerServerId.values())
    for (ChangeNumber cn : serverState.serverIdToChangeNumber.values())
    {
      if (update(cn))
      {
@@ -217,11 +208,12 @@
    boolean result = false;
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      clear();
      for (Integer id : serverState) {
        ChangeNumber maxChangeNumber = serverState.getMaxChangeNumber(id);
      for (Integer serverId : serverState)
      {
        ChangeNumber maxChangeNumber = serverState.getMaxChangeNumber(serverId);
        if (update(maxChangeNumber))
        {
          result = true;
@@ -247,11 +239,11 @@
  {
    Set<String> set = new HashSet<String>();
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      for (int key : lastCnSeenPerServerId.keySet())
      for (int key : serverIdToChangeNumber.keySet())
      {
        ChangeNumber change = lastCnSeenPerServerId.get(key);
        ChangeNumber change = serverIdToChangeNumber.get(key);
        Date date = new Date(change.getTime());
        set.add(change + " " + date + " " + change.getTime());
      }
@@ -270,12 +262,12 @@
  {
    ArrayList<ByteString> values = new ArrayList<ByteString>(0);
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      for (int id : lastCnSeenPerServerId.keySet())
      for (int serverId : serverIdToChangeNumber.keySet())
      {
        ByteString value =
            ByteString.valueOf(lastCnSeenPerServerId.get(id).toString());
            ByteString.valueOf(serverIdToChangeNumber.get(serverId).toString());
        values.add(value);
      }
    }
@@ -297,18 +289,18 @@
  public void writeTo(ASN1Writer writer, short protocolVersion)
      throws IOException
  {
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      if (protocolVersion >= ProtocolVersion.REPLICATION_PROTOCOL_V7)
      {
        for (ChangeNumber cn : lastCnSeenPerServerId.values())
        for (ChangeNumber cn : serverIdToChangeNumber.values())
        {
          writer.writeOctetString(cn.toByteString());
        }
      }
      else
      {
        for (ChangeNumber cn : lastCnSeenPerServerId.values())
        for (ChangeNumber cn : serverIdToChangeNumber.values())
        {
          writer.writeOctetString(cn.toString());
        }
@@ -325,15 +317,15 @@
  {
    StringBuilder buffer = new StringBuilder();
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      for (int key : lastCnSeenPerServerId.keySet())
      for (int key : serverIdToChangeNumber.keySet())
      {
        ChangeNumber change = lastCnSeenPerServerId.get(key);
        ChangeNumber change = serverIdToChangeNumber.get(key);
        buffer.append(change.toString());
        buffer.append(" ");
      }
      if (!lastCnSeenPerServerId.isEmpty())
      if (!serverIdToChangeNumber.isEmpty())
        buffer.deleteCharAt(buffer.length() - 1);
    }
@@ -348,7 +340,7 @@
   */
  public ChangeNumber getMaxChangeNumber(int serverId2)
  {
    return lastCnSeenPerServerId.get(serverId2);
    return serverIdToChangeNumber.get(serverId2);
  }
  /**
@@ -359,11 +351,11 @@
  {
    ChangeNumber maxCN = null;
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      for (int id : lastCnSeenPerServerId.keySet())
      for (int serverId : serverIdToChangeNumber.keySet())
      {
        ChangeNumber tmpMax = lastCnSeenPerServerId.get(id);
        ChangeNumber tmpMax = serverIdToChangeNumber.get(serverId);
        if ((maxCN==null) || (tmpMax.newer(maxCN)))
          maxCN = tmpMax;
      }
@@ -392,18 +384,20 @@
   */
  public byte[] getBytes() throws UnsupportedEncodingException
  {
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      int length = 0;
      List<String> idList = new ArrayList<String>(lastCnSeenPerServerId.size());
      for (int id : lastCnSeenPerServerId.keySet())
      List<String> idList =
          new ArrayList<String>(serverIdToChangeNumber.size());
      for (int serverId : serverIdToChangeNumber.keySet())
      {
        String temp = String.valueOf(id);
        String temp = String.valueOf(serverId);
        idList.add(temp);
        length += temp.length() + 1;
      }
      List<String> cnList = new ArrayList<String>(lastCnSeenPerServerId.size());
      for (ChangeNumber cn : lastCnSeenPerServerId.values())
      List<String> cnList =
          new ArrayList<String>(serverIdToChangeNumber.size());
      for (ChangeNumber cn : serverIdToChangeNumber.values())
      {
        String temp = cn.toString();
        cnList.add(temp);
@@ -412,7 +406,7 @@
      byte[] result = new byte[length];
      int pos = 0;
      for (int i = 0; i < lastCnSeenPerServerId.size(); i++)
      for (int i = 0; i < serverIdToChangeNumber.size(); i++)
      {
        String str = idList.get(i);
        pos = addByteArray(str.getBytes("UTF-8"), result, pos);
@@ -429,7 +423,7 @@
  @Override
  public Iterator<Integer> iterator()
  {
    return lastCnSeenPerServerId.keySet().iterator();
    return serverIdToChangeNumber.keySet().iterator();
  }
  /**
@@ -442,10 +436,10 @@
   */
  public boolean cover(ServerState covered)
  {
    for (ChangeNumber coveredChange : covered.lastCnSeenPerServerId.values())
    for (ChangeNumber coveredChange : covered.serverIdToChangeNumber.values())
    {
      ChangeNumber change =
          this.lastCnSeenPerServerId.get(coveredChange.getServerId());
          this.serverIdToChangeNumber.get(coveredChange.getServerId());
      if ((change == null) || (change.older(coveredChange)))
      {
        return false;
@@ -463,7 +457,8 @@
   */
  public boolean cover(ChangeNumber covered)
  {
    ChangeNumber change = this.lastCnSeenPerServerId.get(covered.getServerId());
    ChangeNumber change =
        this.serverIdToChangeNumber.get(covered.getServerId());
    return !((change == null) || (change.older(covered)));
  }
@@ -474,7 +469,7 @@
   */
  public boolean isEmpty()
  {
    return lastCnSeenPerServerId.isEmpty();
    return serverIdToChangeNumber.isEmpty();
  }
  /**
@@ -484,13 +479,13 @@
  public ServerState duplicate()
  {
    ServerState newState = new ServerState();
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      for (Integer key : lastCnSeenPerServerId.keySet())
      for (Integer key : serverIdToChangeNumber.keySet())
      {
        ChangeNumber change = lastCnSeenPerServerId.get(key);
        Integer id =  change.getServerId();
        newState.lastCnSeenPerServerId.put(id, change);
        ChangeNumber change = serverIdToChangeNumber.get(key);
        Integer serverId = change.getServerId();
        newState.serverIdToChangeNumber.put(serverId, change);
      }
    }
    return newState;
@@ -508,16 +503,18 @@
  public static int diffChanges(ServerState ss1, ServerState ss2)
    throws  IllegalArgumentException
  {
     if ( (ss1 == null) || (ss2 == null) )
    if ((ss1 == null) || (ss2 == null))
    {
      throw new IllegalArgumentException("Null server state(s)");
    }
     int diff = 0;
     for (Integer serverId : ss1.lastCnSeenPerServerId.keySet())
     {
       ChangeNumber cn1 = ss1.lastCnSeenPerServerId.get(serverId);
       if (cn1 != null)
       {
         ChangeNumber cn2 = ss2.lastCnSeenPerServerId.get(serverId);
    int diff = 0;
    for (Integer serverId : ss1.serverIdToChangeNumber.keySet())
    {
      ChangeNumber cn1 = ss1.serverIdToChangeNumber.get(serverId);
      if (cn1 != null)
      {
        ChangeNumber cn2 = ss2.serverIdToChangeNumber.get(serverId);
         if (cn2 != null)
         {
           diff += ChangeNumber.diffSeqNum(cn1, cn2);
@@ -527,10 +524,10 @@
           // compared to server holding ss2, add this amount
           diff += cn1.getSeqnum();
         }
       }
     }
      }
    }
     return diff;
    return diff;
  }
  /**
@@ -564,15 +561,15 @@
  public ServerState duplicateOnlyOlderThan(ChangeNumber cn)
  {
    ServerState newState = new ServerState();
    synchronized (lastCnSeenPerServerId)
    synchronized (serverIdToChangeNumber)
    {
      for (Integer key : lastCnSeenPerServerId.keySet())
      for (Integer key : serverIdToChangeNumber.keySet())
      {
        ChangeNumber change = lastCnSeenPerServerId.get(key);
        Integer id =  change.getServerId();
        ChangeNumber change = serverIdToChangeNumber.get(key);
        Integer serverId = change.getServerId();
        if (change.older(cn))
        {
          newState.lastCnSeenPerServerId.put(id, change);
          newState.serverIdToChangeNumber.put(serverId, change);
        }
      }
    }