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

mrossign
19.59.2008 a3dad177f76ca95ba2a01ba58e53fb3441ebe0ac
opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -634,8 +634,9 @@
  public ConfigChangeResult applyConfigurationChange(
      ReplicationServerCfg configuration)
  {
    // Changing those properties don't need specific code.
    // They will be applied for next connections.
    // Some of those properties change don't need specific code.
    // They will be applied for next connections. Some others have immediate
    // effect
    disconnectRemovedReplicationServers(configuration.getReplicationServer());
@@ -724,6 +725,18 @@
      }
    }
    // Changed the group id ?
    byte newGroupId = (byte)configuration.getGroupId();
    if (newGroupId != groupId)
    {
      groupId = newGroupId;
      // Have a new group id: Disconnect every servers.
      for (ReplicationServerDomain replicationServerDomain : baseDNs.values())
      {
        replicationServerDomain.stopAllServers();
      }
    }
    if ((configuration.getReplicationDBDirectory() != null) &&
        (!dbDirname.equals(configuration.getReplicationDBDirectory())))
    {
@@ -1127,7 +1140,7 @@
    for (ReplicationServerDomain replicationServerDomain: baseDNs.values())
    {
      replicationServerDomain.stopServers(serversToDisconnect);
      replicationServerDomain.stopReplicationServers(serversToDisconnect);
    }
  }
}
opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
@@ -886,12 +886,12 @@
  }
  /**
   * Stop operations with a list of servers.
   * Stop operations with a list of replication servers.
   *
   * @param replServers the replication servers for which
   * we want to stop operations
   */
  public void stopServers(Collection<String> replServers)
  public void stopReplicationServers(Collection<String> replServers)
  {
    for (ServerHandler handler : replicationServers.values())
    {
@@ -901,6 +901,24 @@
  }
  /**
   * Stop operations with all servers this domain is connected with (RS and DS).
   */
  public void stopAllServers()
  {
    // Close session with other replication servers
    for (ServerHandler serverHandler : replicationServers.values())
    {
      stopServer(serverHandler);
    }
    // Close session with other LDAP servers
    for (ServerHandler serverHandler : directoryServers.values())
    {
      stopServer(serverHandler);
    }
  }
  /**
   * Checks that a DS is not connected with same id.
   *
   * @param handler the DS we want to check
@@ -1478,17 +1496,7 @@
    // Terminate the assured timer
    assuredTimeoutTimer.cancel();
    // Close session with other changelogs
    for (ServerHandler serverHandler : replicationServers.values())
    {
      stopServer(serverHandler);
    }
    // Close session with other LDAP servers
    for (ServerHandler serverHandler : directoryServers.values())
    {
      stopServer(serverHandler);
    }
    stopAllServers();
    // Shutdown the dbHandlers
    synchronized (sourceDbHandlers)
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/GroupIdHandshakeTest.java
@@ -461,6 +461,10 @@
   * (not their group id)
   * - Restart RS2 and RS3, DS1 should reconnect to RS2 (with GID=2, his GID)
   * and DS2 should connect to RS3 (with GID=3, his GID)
   * - Change group id of DS1 and DS2 to 1 : they should reconnect to RS1
   * - Change group id of RS3 to 1
   * - Change group id of RS1 to 3: DS1 and DS2 should reconnect to RS3
   * - Change group id of DS1 and DS2 to 3 : they should reconnect to RS1
   * @throws Exception If a problem occurred
   */
  @Test (groups = "slow")
@@ -540,9 +544,62 @@
      checkConnection(30, DS2_ID, RS3_ID,
        "Restart RS2 and RS3, DS2 should reconnect to RS3 (with GID=3, his GID)");
    // TODO: when dynamic change of configuration for group id is done. One could
    // add here change of DS1 and DS2 GID to 1 and check they both come back
    // to rs1.
      //
      // ENTERING CHANGE CONFIG TEST PART
      //
      /**
       * Change group id of DS1 and DS2 to 1 and see them reconnect to RS1
       */
      SortedSet<String> replServers = createRSListForTestCase(testCase);
      DN baseDn = DN.decode(TEST_ROOT_DN_STRING);
      DomainFakeCfg domainConfWithNewGid =  new DomainFakeCfg(baseDn, DS1_ID, replServers, 1);
      rd1.applyConfigurationChange(domainConfWithNewGid);
      domainConfWithNewGid = new DomainFakeCfg(baseDn, DS2_ID, replServers, 1);
      rd2.applyConfigurationChange(domainConfWithNewGid);
      checkConnection(30, DS1_ID, RS1_ID,
        "Change GID of DS1 to 1, it should reconnect to RS1 with GID=1");
      checkConnection(30, DS2_ID, RS1_ID,
        "Change GID of DS2 to 1, it should reconnect to RS1 with GID=1");
      /**
       * Change group id of RS3 to 1
       */
      SortedSet<String> otherReplServers = new TreeSet<String>();
      otherReplServers.add("localhost:" + rs1Port);
      otherReplServers.add("localhost:" + rs2Port);
      String dir = "groupIdHandshakeTest" + RS3_ID + testCase + "Db";
      ReplServerFakeConfiguration rsConfWithNewGid =
        new ReplServerFakeConfiguration(rs3Port, dir, 0, RS3_ID, 0, 100,
        otherReplServers, 1, 1000, 5000);
      rs3.applyConfigurationChange(rsConfWithNewGid);
      /**
       * Change group id of RS1 to 3: DS1 and DS2 should reconnect to RS3
       */
      otherReplServers = new TreeSet<String>();
      otherReplServers.add("localhost:" + rs2Port);
      otherReplServers.add("localhost:" + rs3Port);
      dir = "groupIdHandshakeTest" + RS1_ID + testCase + "Db";
      rsConfWithNewGid = new ReplServerFakeConfiguration(rs1Port, dir, 0, RS1_ID,
        0, 100, otherReplServers, 3, 1000, 5000);
      rs1.applyConfigurationChange(rsConfWithNewGid);
      checkConnection(30, DS1_ID, RS3_ID,
        "Change GID of RS3 to 1 and RS1 to 3, DS1 should reconnect to RS3 with GID=1");
      checkConnection(30, DS2_ID, RS3_ID,
        "Change GID of RS3 to 1 and RS1 to 3, DS2 should reconnect to RS3 with GID=1");
      /**
       * Change group id of DS1 and DS2 to 3 : they should reconnect to RS1
       */
      domainConfWithNewGid = new DomainFakeCfg(baseDn, DS1_ID, replServers, 3);
      rd1.applyConfigurationChange(domainConfWithNewGid);
      domainConfWithNewGid = new DomainFakeCfg(baseDn, DS2_ID, replServers, 3);
      rd2.applyConfigurationChange(domainConfWithNewGid);
      checkConnection(30, DS1_ID, RS1_ID,
        "Change GID of DS1 to 3, it should reconnect to RS1 with GID=3");
      checkConnection(30, DS2_ID, RS1_ID,
        "Change GID of DS2 to 3, it should reconnect to RS1 with GID=3");
    } finally
    {