From 77131174b396433451592ca82362a3534ce74c80 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 16 Dec 2014 14:49:33 +0000
Subject: [PATCH] OPENDJ-1602 (CR-5566) New pluggable storage based backend

---
 opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java |  117 +++++++++++++++++++++++++++++-----------------------------
 1 files changed, 59 insertions(+), 58 deletions(-)

diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java b/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
index 849475b..2183b19 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
@@ -29,7 +29,6 @@
 
 import java.io.Closeable;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizableMessageBuilder;
@@ -38,7 +37,6 @@
 import org.forgerock.opendj.ldap.Assertion;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DecodeException;
-import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.schema.MatchingRule;
 import org.forgerock.opendj.ldap.spi.IndexQueryFactory;
 import org.forgerock.opendj.ldap.spi.IndexingOptions;
@@ -48,6 +46,8 @@
 import org.opends.server.admin.std.server.LocalDBIndexCfg;
 import org.opends.server.backends.pluggable.BackendImpl.StorageRuntimeException;
 import org.opends.server.backends.pluggable.BackendImpl.TreeName;
+import org.opends.server.backends.pluggable.BackendImpl.WriteOperation;
+import org.opends.server.backends.pluggable.BackendImpl.WriteableStorage;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.monitors.DatabaseEnvironmentMonitor;
 import org.opends.server.types.*;
@@ -133,42 +133,42 @@
    * @param entryContainer The entryContainer of this attribute index.
    * @throws ConfigException if a configuration related error occurs.
    */
-  public AttributeIndex(LocalDBIndexCfg indexConfig, EntryContainer entryContainer) throws ConfigException
+  public AttributeIndex(LocalDBIndexCfg indexConfig, EntryContainer entryContainer, WriteableStorage txn) throws ConfigException
   {
     this.entryContainer = entryContainer;
     this.indexConfig = indexConfig;
 
-    buildPresenceIndex();
-    buildIndexes(IndexType.EQUALITY);
-    buildIndexes(IndexType.SUBSTRING);
-    buildIndexes(IndexType.ORDERING);
-    buildIndexes(IndexType.APPROXIMATE);
-    buildExtensibleIndexes();
+    buildPresenceIndex(txn);
+    buildIndexes(txn, IndexType.EQUALITY);
+    buildIndexes(txn, IndexType.SUBSTRING);
+    buildIndexes(txn, IndexType.ORDERING);
+    buildIndexes(txn, IndexType.APPROXIMATE);
+    buildExtensibleIndexes(txn);
 
     final JEIndexConfig config = new JEIndexConfig(indexConfig.getSubstringLength());
     indexQueryFactory = new IndexQueryFactoryImpl(nameToIndexes, config);
     extensibleIndexesMapping = computeExtensibleIndexesMapping();
   }
 
-  private void buildPresenceIndex()
+  private void buildPresenceIndex(WriteableStorage txn)
   {
     final IndexType indexType = IndexType.PRESENCE;
     if (indexConfig.getIndexType().contains(indexType))
     {
       String indexID = indexType.toString();
-      nameToIndexes.put(indexID, newPresenceIndex(indexConfig));
+      nameToIndexes.put(indexID, newPresenceIndex(txn, indexConfig));
     }
   }
 
-  private Index newPresenceIndex(LocalDBIndexCfg cfg)
+  private Index newPresenceIndex(WriteableStorage txn, LocalDBIndexCfg cfg)
   {
     final AttributeType attrType = cfg.getAttribute();
     final TreeName indexName = getIndexName(attrType, IndexType.PRESENCE.toString());
     final PresenceIndexer indexer = new PresenceIndexer(attrType);
-    return entryContainer.newIndexForAttribute(indexName, indexer, cfg.getIndexEntryLimit());
+    return entryContainer.newIndexForAttribute(txn, indexName, indexer, cfg.getIndexEntryLimit());
   }
 
-  private void buildExtensibleIndexes() throws ConfigException
+  private void buildExtensibleIndexes(WriteableStorage txn) throws ConfigException
   {
     final IndexType indexType = IndexType.EXTENSIBLE;
     if (indexConfig.getIndexType().contains(indexType))
@@ -198,14 +198,14 @@
           if (!nameToIndexes.containsKey(indexId))
           {
             // There is no index available for this index id. Create a new index
-            nameToIndexes.put(indexId, newAttributeIndex(indexConfig, indexer));
+            nameToIndexes.put(indexId, newAttributeIndex(txn, indexConfig, indexer));
           }
         }
       }
     }
   }
 
-  private void buildIndexes(IndexType indexType) throws ConfigException
+  private void buildIndexes(WriteableStorage txn, IndexType indexType) throws ConfigException
   {
     if (indexConfig.getIndexType().contains(indexType))
     {
@@ -219,7 +219,7 @@
 
       for (org.forgerock.opendj.ldap.spi.Indexer indexer : rule.getIndexers())
       {
-        nameToIndexes.put(indexID, newAttributeIndex(indexConfig, indexer));
+        nameToIndexes.put(indexID, newAttributeIndex(txn, indexConfig, indexer));
       }
     }
   }
@@ -241,12 +241,13 @@
     }
   }
 
-  private Index newAttributeIndex(LocalDBIndexCfg indexConfig, org.forgerock.opendj.ldap.spi.Indexer indexer)
+  private Index newAttributeIndex(WriteableStorage txn, LocalDBIndexCfg indexConfig,
+      org.forgerock.opendj.ldap.spi.Indexer indexer)
   {
     final AttributeType attrType = indexConfig.getAttribute();
     final TreeName indexName = getIndexName(attrType, indexer.getIndexID());
     final AttributeIndexer attrIndexer = new AttributeIndexer(attrType, indexer);
-    return entryContainer.newIndexForAttribute(indexName, attrIndexer, indexConfig.getIndexEntryLimit());
+    return entryContainer.newIndexForAttribute(txn, indexName, attrIndexer, indexConfig.getIndexEntryLimit());
   }
 
   private TreeName getIndexName(AttributeType attrType, String indexID)
@@ -260,11 +261,11 @@
    * @throws StorageRuntimeException if a JE database error occurs while
    * opening the index.
    */
-  public void open() throws StorageRuntimeException
+  public void open(WriteableStorage txn) throws StorageRuntimeException
   {
     for (Index index : nameToIndexes.values())
     {
-      index.open();
+      index.open(txn);
     }
     indexConfig.addChangeListener(this);
   }
@@ -635,35 +636,37 @@
 
   /** {@inheritDoc} */
   @Override
-  public synchronized ConfigChangeResult applyConfigurationChange(LocalDBIndexCfg cfg)
+  public synchronized ConfigChangeResult applyConfigurationChange(final LocalDBIndexCfg cfg)
   {
-    // this method is not perf sensitive, using an AtomicBoolean will not hurt
-    AtomicBoolean adminActionRequired = new AtomicBoolean(false);
-    ArrayList<LocalizableMessage> messages = new ArrayList<LocalizableMessage>();
+    final ConfigChangeResult ccr = new ConfigChangeResult();
     try
     {
-      applyChangeToPresenceIndex(cfg, adminActionRequired, messages);
-      applyChangeToIndex(IndexType.EQUALITY, cfg, adminActionRequired, messages);
-      applyChangeToIndex(IndexType.SUBSTRING, cfg, adminActionRequired, messages);
-      applyChangeToIndex(IndexType.ORDERING, cfg, adminActionRequired, messages);
-      applyChangeToIndex(IndexType.APPROXIMATE, cfg, adminActionRequired, messages);
-      applyChangeToExtensibleIndexes(cfg, adminActionRequired, messages);
+      entryContainer.getStorage().write(new WriteOperation()
+      {
+        @Override
+        public void run(WriteableStorage txn) throws Exception
+        {
+          applyChangeToPresenceIndex(txn, cfg, ccr);
+          applyChangeToIndex(txn, IndexType.EQUALITY, cfg, ccr);
+          applyChangeToIndex(txn, IndexType.SUBSTRING, cfg, ccr);
+          applyChangeToIndex(txn, IndexType.ORDERING, cfg, ccr);
+          applyChangeToIndex(txn, IndexType.APPROXIMATE, cfg, ccr);
+          applyChangeToExtensibleIndexes(txn, cfg, ccr);
+        }
+      });
 
       extensibleIndexesMapping = computeExtensibleIndexesMapping();
       indexConfig = cfg;
-
-      return new ConfigChangeResult(ResultCode.SUCCESS, adminActionRequired.get(), messages);
     }
     catch(Exception e)
     {
-      messages.add(LocalizableMessage.raw(StaticUtils.stackTraceToSingleLineString(e)));
-      return new ConfigChangeResult(
-          DirectoryServer.getServerErrorResultCode(), adminActionRequired.get(), messages);
+      ccr.setResultCode(DirectoryServer.getServerErrorResultCode());
+      ccr.addMessage(LocalizableMessage.raw(StaticUtils.stackTraceToSingleLineString(e)));
     }
+    return ccr;
   }
 
-  private void applyChangeToExtensibleIndexes(LocalDBIndexCfg cfg,
-      AtomicBoolean adminActionRequired, ArrayList<LocalizableMessage> messages)
+  private void applyChangeToExtensibleIndexes(WriteableStorage txn, LocalDBIndexCfg cfg, ConfigChangeResult ccr)
   {
     final AttributeType attrType = cfg.getAttribute();
     if (!cfg.getIndexType().contains(IndexType.EXTENSIBLE))
@@ -694,8 +697,8 @@
         validIndexIds.add(indexId);
         if (!nameToIndexes.containsKey(indexId))
         {
-          Index index = newAttributeIndex(cfg, indexer);
-          openIndex(index, adminActionRequired, messages);
+          Index index = newAttributeIndex(txn, cfg, indexer);
+          openIndex(txn, index, ccr);
           nameToIndexes.put(indexId, index);
         }
         else
@@ -703,8 +706,8 @@
           Index index = nameToIndexes.get(indexId);
           if (index.setIndexEntryLimit(indexEntryLimit))
           {
-            adminActionRequired.set(true);
-            messages.add(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(index.getName()));
+            ccr.setAdminActionRequired(true);
+            ccr.addMessage(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(index.getName()));
           }
           if (indexConfig.getSubstringLength() != cfg.getSubstringLength())
           {
@@ -770,8 +773,7 @@
     return rules;
   }
 
-  private void applyChangeToIndex(IndexType indexType, LocalDBIndexCfg cfg,
-      AtomicBoolean adminActionRequired, ArrayList<LocalizableMessage> messages)
+  private void applyChangeToIndex(WriteableStorage txn, IndexType indexType, LocalDBIndexCfg cfg, ConfigChangeResult ccr)
   {
     String indexId = indexType.toString();
     Index index = nameToIndexes.get(indexId);
@@ -786,8 +788,8 @@
       final MatchingRule matchingRule = getMatchingRule(indexType, cfg.getAttribute());
       for (org.forgerock.opendj.ldap.spi.Indexer indexer : matchingRule.getIndexers())
       {
-        index = newAttributeIndex(cfg, indexer);
-        openIndex(index, adminActionRequired, messages);
+        index = newAttributeIndex(txn, cfg, indexer);
+        openIndex(txn, index, ccr);
         nameToIndexes.put(indexId, index);
       }
     }
@@ -796,14 +798,13 @@
       // already exists. Just update index entry limit.
       if (index.setIndexEntryLimit(cfg.getIndexEntryLimit()))
       {
-        adminActionRequired.set(true);
-        messages.add(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(index.getName()));
+        ccr.setAdminActionRequired(true);
+        ccr.addMessage(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(index.getName()));
       }
     }
   }
 
-  private void applyChangeToPresenceIndex(LocalDBIndexCfg cfg, AtomicBoolean adminActionRequired,
-      ArrayList<LocalizableMessage> messages)
+  private void applyChangeToPresenceIndex(WriteableStorage txn, LocalDBIndexCfg cfg, ConfigChangeResult ccr)
   {
     final IndexType indexType = IndexType.PRESENCE;
     final String indexID = indexType.toString();
@@ -816,8 +817,8 @@
 
     if (index == null)
     {
-      index = newPresenceIndex(cfg);
-      openIndex(index, adminActionRequired, messages);
+      index = newPresenceIndex(txn, cfg);
+      openIndex(txn, index, ccr);
       nameToIndexes.put(indexID, index);
     }
     else
@@ -825,8 +826,8 @@
       // already exists. Just update index entry limit.
       if (index.setIndexEntryLimit(cfg.getIndexEntryLimit()))
       {
-        adminActionRequired.set(true);
-        messages.add(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(index.getName()));
+        ccr.setAdminActionRequired(true);
+        ccr.addMessage(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(index.getName()));
       }
     }
   }
@@ -848,14 +849,14 @@
     }
   }
 
-  private void openIndex(Index index, AtomicBoolean adminActionRequired, ArrayList<LocalizableMessage> messages)
+  private void openIndex(WriteableStorage txn, Index index, ConfigChangeResult ccr)
   {
-    index.open();
+    index.open(txn);
 
     if (!index.isTrusted())
     {
-      adminActionRequired.set(true);
-      messages.add(NOTE_JEB_INDEX_ADD_REQUIRES_REBUILD.get(index.getName()));
+      ccr.setAdminActionRequired(true);
+      ccr.addMessage(NOTE_JEB_INDEX_ADD_REQUIRES_REBUILD.get(index.getName()));
     }
   }
 

--
Gitblit v1.10.0