From 761ba8a31ca6ea11cd1965ab66c3bea4bcd5a01a Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Wed, 06 Jan 2016 14:35:15 +0000
Subject: [PATCH] OPENDJ-2580 File-based changelog growing and filling up the disk when using modrate

---
 opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java                          |   11 +++++
 opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangelogDB.java             |    4 +-
 opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/MultimasterReplication.java                     |   30 +++++++++++++--
 opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java |   30 ++++++++++++--
 4 files changed, 63 insertions(+), 12 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/MultimasterReplication.java b/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/MultimasterReplication.java
index 9642cf3..2de69e0 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/MultimasterReplication.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/MultimasterReplication.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS
+ *      Portions Copyright 2011-2016 ForgeRock AS
  */
 package org.opends.server.replication.plugin;
 
@@ -866,6 +866,31 @@
    */
   public static boolean isECLEnabledDomain(DN baseDN)
   {
+    waitForStartup();
+    // if state is STOPPING, then we need to return from this method
+    final LDAPReplicationDomain domain = domains.get(baseDN);
+    return domain != null && domain.isECLEnabled();
+  }
+
+  /**
+   * Returns whether the external change-log contains data from at least a domain.
+   * @return whether the external change-log contains data from at least a domain
+   */
+  public static boolean isECLEnabled()
+  {
+    waitForStartup();
+    for (LDAPReplicationDomain domain : domains.values())
+    {
+      if (domain.isECLEnabled())
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private static void waitForStartup()
+  {
     if (State.STARTING.equals(state.get()))
     {
       synchronized (state)
@@ -883,9 +908,6 @@
         }
       }
     }
-    // if state is STOPPING, then we need to return from this method
-    final LDAPReplicationDomain domain = domains.get(baseDN);
-    return domain != null && domain.isECLEnabled();
   }
 
   /**
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java b/opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java
index 58b34db..9d4f162 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/replication/server/ReplicationServer.java
@@ -79,7 +79,7 @@
  * servers It is responsible for creating the replication server
  * replicationServerDomain and managing it
  */
-public final class ReplicationServer
+public class ReplicationServer
   implements ConfigurationChangeListener<ReplicationServerCfg>
 {
   private String serverURL;
@@ -1338,6 +1338,15 @@
     return config.isComputeChangeNumber();
   }
 
+  /**
+   * Returns whether the external change-log contains data from at least a domain.
+   * @return whether the external change-log contains data from at least a domain
+   */
+  public boolean isECLEnabled()
+  {
+    return MultimasterReplication.isECLEnabled();
+  }
+
   /** {@inheritDoc} */
   @Override
   public String toString()
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangelogDB.java b/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangelogDB.java
index 1cb539f..3c4f843 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangelogDB.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangelogDB.java
@@ -904,7 +904,7 @@
           final CSN purgeCSN = new CSN(purgeTimestamp, 0, 0);
           final CSN oldestNotPurgedCSN;
 
-          if (!replicationServer.isChangeNumberEnabled())
+          if (!replicationServer.isChangeNumberEnabled() || !replicationServer.isECLEnabled())
           {
             oldestNotPurgedCSN = purgeCSN;
           }
@@ -1005,7 +1005,7 @@
     {
       final long nextPurgeTime = notPurgedCSN.getTime();
       final long currentPurgeTime = TimeThread.getTime() - purgeDelayInMillis;
-      if (currentPurgeTime <= nextPurgeTime)
+      if (currentPurgeTime < nextPurgeTime)
       {
         // sleep till the next CSN to purge,
         return nextPurgeTime - currentPurgeTime;
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java b/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java
index 2f8a9c8..73bfced 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java
@@ -21,7 +21,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2014-2015 ForgeRock AS
+ *      Copyright 2014-2016 ForgeRock AS
  */
 package org.opends.server.replication.server.changelog.file;
 
@@ -29,6 +29,7 @@
 import static org.opends.server.replication.server.changelog.file.FileReplicaDBTest.*;
 import static org.testng.Assert.*;
 
+import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.replication.ReplicationTestCase;
@@ -78,7 +79,7 @@
     ReplicationServer replicationServer = null;
     try
     {
-      replicationServer = newReplicationServer();
+      replicationServer = newReplicationServer(false);
       final ChangelogDB changelogDB = replicationServer.getChangelogDB();
       changelogDB.setPurgeDelay(0);
       final FileChangeNumberIndexDB cnIndexDB = getCNIndexDB(replicationServer);
@@ -120,7 +121,7 @@
     ReplicationServer replicationServer = null;
     try
     {
-      replicationServer = newReplicationServer();
+      replicationServer = newReplicationServer(false);
       final ChangelogDB changelogDB = replicationServer.getChangelogDB();
       changelogDB.setPurgeDelay(0);
       final FileChangeNumberIndexDB cnIndexDB = getCNIndexDB(replicationServer);
@@ -150,7 +151,7 @@
     ReplicationServer replicationServer = null;
     try
     {
-      replicationServer = newReplicationServer();
+      replicationServer = newReplicationServer(true);
       final ChangelogDB changelogDB = replicationServer.getChangelogDB();
       changelogDB.setPurgeDelay(0); // disable purging
 
@@ -234,12 +235,31 @@
     assertEquals(oldest.getCSN(), newest.getCSN());
   }
 
-  private ReplicationServer newReplicationServer() throws Exception
+  private class FakeRS extends ReplicationServer
+  {
+    FakeRS(ReplServerFakeConfiguration cfg) throws ConfigException
+    {
+      super(cfg);
+    }
+
+    @Override
+    public boolean isECLEnabled()
+    {
+      return true;
+    }
+  }
+
+  private ReplicationServer newReplicationServer(boolean mock) throws Exception
   {
     TestCaseUtils.startServer();
     final int port = TestCaseUtils.findFreePort();
     final ReplServerFakeConfiguration cfg = new ReplServerFakeConfiguration(port, null, 0, 2, 0, 100, null);
     cfg.setComputeChangeNumber(true);
+    if (mock)
+    {
+      FakeRS mockRS = new FakeRS(cfg);
+      return mockRS;
+    }
     return new ReplicationServer(cfg);
   }
 

--
Gitblit v1.10.0