From e8f074bf0a983cd40b87a94dd3f971a0011e45ef Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 19 Jun 2015 13:09:10 +0000
Subject: [PATCH] OPENDJ-2154 (CR-7325) search on cn=monitor changenumber index database times out

---
 opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDB.java |   90 ++++++++++++++++++++++++++++-----------------
 1 files changed, 56 insertions(+), 34 deletions(-)

diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDB.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDB.java
index aa5543b..bd5aaf9 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDB.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDB.java
@@ -21,10 +21,12 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2014 ForgeRock AS
+ *      Copyright 2014-2015 ForgeRock AS
  */
 package org.opends.server.replication.server.changelog.file;
 
+import static org.opends.messages.ReplicationMessages.*;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -39,10 +41,14 @@
 import org.opends.server.api.MonitorProvider;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.replication.common.CSN;
-import org.opends.server.replication.server.changelog.api.*;
-import org.opends.server.types.*;
-
-import static org.opends.messages.ReplicationMessages.*;
+import org.opends.server.replication.server.changelog.api.ChangeNumberIndexDB;
+import org.opends.server.replication.server.changelog.api.ChangeNumberIndexRecord;
+import org.opends.server.replication.server.changelog.api.ChangelogException;
+import org.opends.server.replication.server.changelog.api.DBCursor;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.Attributes;
+import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 
 /**
  * Implementation of a ChangeNumberIndexDB with a log.
@@ -52,14 +58,27 @@
  */
 class FileChangeNumberIndexDB implements ChangeNumberIndexDB
 {
+  /** The type of the required change number. */
+  private static enum ChangeNumberType
+  {
+    FIRST("first-draft-changenumber"), LAST("last-draft-changenumber");
+
+    private final String attrName;
+
+    private ChangeNumberType(String attrName)
+    {
+      this.attrName = attrName;
+    }
+
+    private String getAttributeName()
+    {
+      return this.attrName;
+    }
+  }
+
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
-
   private static final int NO_KEY = 0;
-
-  /** The parser of records stored in this ChangeNumberIndexDB. */
-  static final RecordParser<Long, ChangeNumberIndexRecord> RECORD_PARSER = new ChangeNumberIndexDBParser();
-
-  static final Record.Mapper<ChangeNumberIndexRecord, CSN> MAPPER_TO_CSN =
+  private static final Record.Mapper<ChangeNumberIndexRecord, CSN> MAPPER_TO_CSN =
       new Record.Mapper<ChangeNumberIndexRecord, CSN>()
       {
         @Override
@@ -68,6 +87,8 @@
           return value.getCSN();
         }
       };
+  /** The parser of records stored in this ChangeNumberIndexDB. */
+  static final RecordParser<Long, ChangeNumberIndexRecord> RECORD_PARSER = new ChangeNumberIndexDBParser();
 
   /** The log in which records are persisted. */
   private final Log<Long, ChangeNumberIndexRecord> log;
@@ -251,43 +272,33 @@
     return null;
   }
 
-  /**
-   * Implements the Monitoring capabilities of the FileChangeNumberIndexDB.
-   */
+  /** Implements the Monitoring capabilities of the FileChangeNumberIndexDB. */
   private class DbMonitorProvider extends MonitorProvider<MonitorProviderCfg>
   {
-    /** {@inheritDoc} */
     @Override
     public List<Attribute> getMonitorData()
     {
+      long firstCN = readChangeNumber(ChangeNumberType.FIRST);
+      long lastCN = readChangeNumber(ChangeNumberType.LAST);
+      long numberOfChanges = lastCN == NO_KEY ? 0 : lastCN - firstCN + 1;
+
       final List<Attribute> attributes = new ArrayList<Attribute>();
-      attributes.add(createChangeNumberAttribute(true));
-      attributes.add(createChangeNumberAttribute(false));
-      long numberOfChanges = 0;
-      try
-      {
-         numberOfChanges = count();
-      }
-      catch (ChangelogException e)
-      {
-        logger.traceException(e);
-      }
+      attributes.add(toAttribute(ChangeNumberType.FIRST, firstCN));
+      attributes.add(toAttribute(ChangeNumberType.LAST, lastCN));
       attributes.add(Attributes.create("count", Long.toString(numberOfChanges)));
       return attributes;
     }
 
-    private Attribute createChangeNumberAttribute(final boolean isFirst)
+    private Attribute toAttribute(final ChangeNumberType cnType, long changeNumber)
     {
-      final String attributeName = isFirst ? "first-draft-changenumber" : "last-draft-changenumber";
-      final String changeNumber = String.valueOf(readChangeNumber(isFirst));
-      return Attributes.create(attributeName, changeNumber);
+      return Attributes.create(cnType.getAttributeName(), String.valueOf(changeNumber));
     }
 
-    private long readChangeNumber(final boolean isFirst)
+    private long readChangeNumber(final ChangeNumberType type)
     {
       try
       {
-        return getChangeNumber(isFirst ? readFirstRecord() : readLastRecord());
+        return getChangeNumber(readChangeNumber0(type));
       }
       catch (ChangelogException e)
       {
@@ -296,14 +307,25 @@
       }
     }
 
-    /** {@inheritDoc} */
+    private ChangeNumberIndexRecord readChangeNumber0(final ChangeNumberType type) throws ChangelogException
+    {
+      if (ChangeNumberType.FIRST.equals(type))
+      {
+        return readFirstRecord();
+      }
+      else if (ChangeNumberType.LAST.equals(type))
+      {
+        return readLastRecord();
+      }
+      throw new IllegalArgumentException("Not implemented for ChangeNumber: " + type);
+    }
+
     @Override
     public String getMonitorInstanceName()
     {
       return "ChangeNumber Index Database";
     }
 
-    /** {@inheritDoc} */
     @Override
     public void initializeMonitorProvider(MonitorProviderCfg configuration)
                             throws ConfigException, InitializationException

--
Gitblit v1.10.0