[exo-jcr-commits] exo-jcr SVN: r1008 - in jcr/branches/1.12.0-JBC/component/core/src: main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache and 2 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Dec 11 10:14:53 EST 2009


Author: nzamosenchuk
Date: 2009-12-11 10:14:51 -0500 (Fri, 11 Dec 2009)
New Revision: 1008

Modified:
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/DefaultChangesFilter.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexChangesFilter.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
   jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java
Log:
EXOJCR-291: Re-viewed and re-worked setIoMode() control flow. Now QueryHandler is initialized after IO mode is determined. Also Merger is started only when RW assigned and safely stopped when becomes RO. Added Index lists re-reading on getIndexReader(). This is temporary dirty solution till list of indexes is not stored in cache.

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -21,6 +21,7 @@
 
 import javax.jcr.RepositoryException;
 
+import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
 import org.exoplatform.services.jcr.datamodel.NodeData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,6 +42,8 @@
     */
    private QueryHandlerContext context;
 
+   protected boolean initialized = false;
+
    /**
     * The {@link OnWorkspaceInconsistency} handler. Defaults to 'fail'.
     */
@@ -58,16 +61,31 @@
    private String idleTime;
 
    /**
-    * Initializes this query handler by setting all properties in this class
-    * with appropriate parameter values.
-    *
-    * @param context the context for this query handler.
-    * @throws RepositoryException 
+    * Indexer io mode
     */
-   public final void init(QueryHandlerContext context) throws IOException, RepositoryException
+   protected IndexerIoMode ioMode = IndexerIoMode.READ_ONLY;
+
+   public boolean isInitialized()
    {
+      return initialized;
+   }
+
+   /**
+    * @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#setContext(org.exoplatform.services.jcr.impl.core.query.QueryHandlerContext)
+    */
+   public void setContext(QueryHandlerContext context)
+   {
       this.context = context;
+   }
+
+   /**
+    * Initializes QueryHandler with given IoMode (RW/RO)
+    */
+   public void init() throws IOException, RepositoryException, RepositoryConfigurationException
+   {
+      // TODO Auto-generated method stub
       doInit();
+      initialized = true;
    }
 
    /**

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/DefaultChangesFilter.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/DefaultChangesFilter.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/DefaultChangesFilter.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -19,6 +19,7 @@
 package org.exoplatform.services.jcr.impl.core.query;
 
 import org.exoplatform.services.jcr.config.QueryHandlerEntry;
+import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 
@@ -43,14 +44,26 @@
     * @param parentIndexingTree
     * @param handler
     * @param parentHandler
+    * @throws IOException 
+    * @throws RepositoryConfigurationException 
+    * @throws RepositoryException 
     */
    public DefaultChangesFilter(SearchManager searchManager, SearchManager parentSearchManager,
       QueryHandlerEntry config, IndexingTree indexingTree, IndexingTree parentIndexingTree, QueryHandler handler,
-      QueryHandler parentHandler)
+      QueryHandler parentHandler) throws IOException, RepositoryConfigurationException, RepositoryException
    {
       super(searchManager, parentSearchManager, config, indexingTree, parentIndexingTree, handler, parentHandler);
       handler.setIndexerIoMode(IndexerIoMode.READ_WRITE);
       parentHandler.setIndexerIoMode(IndexerIoMode.READ_WRITE);
+
+      if (!parentHandler.isInitialized())
+      {
+         parentHandler.init();
+      }
+      if (!handler.isInitialized())
+      {
+         handler.init();
+      }
    }
 
    /**

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -41,7 +41,7 @@
 
    /**
     * Returns the query handler context that passed in {@link
-    * #init(QueryHandlerContext)}.
+    * #setContext(QueryHandlerContext)}.
     *
     * @return the query handler context.
     */
@@ -81,9 +81,31 @@
     */
    void close();
 
-   void init(QueryHandlerContext context) throws IOException, RepositoryException, RepositoryConfigurationException;
+   /**
+    * Sets QueryHandlerContext
+    * @param context
+    */
+   void setContext(QueryHandlerContext context);
 
    /**
+    * 
+    * initializes QueryHandler
+    * 
+    * @param ioMode
+    * @throws IOException
+    * @throws RepositoryException
+    * @throws RepositoryConfigurationException
+    */
+   void init() throws IOException, RepositoryException, RepositoryConfigurationException;
+
+   /**
+    * Checks whether QueryHandler is initialized or not
+    * 
+    * @return
+    */
+   boolean isInitialized();
+
+   /**
     * Creates a new query by specifying the query statement itself and the
     * language in which the query is stated.  If the query statement is
     * syntactically invalid, given the language specified, an
@@ -110,7 +132,7 @@
     */
    void logErrorChanges(Set<String> removed, Set<String> added) throws IOException;
 
-   void setIndexerIoMode(IndexerIoMode ioMode);
+   void setIndexerIoMode(IndexerIoMode ioMode) throws IOException;
 
    /**
     * @return the name of the query class to use.

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -768,7 +768,7 @@
          handler = (QueryHandler)constuctor.newInstance(config, cfm);
          QueryHandler parentHandler = (this.parentSearchManager != null) ? parentSearchManager.getHandler() : null;
          QueryHandlerContext context = createQueryHandlerContext(parentHandler);
-         handler.init(context);
+         handler.setContext(context);
 
          if (parentSearchManager != null)
          {
@@ -803,10 +803,6 @@
       {
          throw new RepositoryException(e.getMessage(), e);
       }
-      catch (IOException e)
-      {
-         throw new RepositoryException(e.getMessage(), e);
-      }
    }
 
    /**

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -80,6 +80,7 @@
             log.info("Received list wrapper, start indexing...");
          }
          ChangesFilterListsWrapper wrapper = (ChangesFilterListsWrapper)val;
+         log.info("Loader=" + this + " changes=" + wrapper.dump());
          updateIndex(wrapper.getAddedNodes(), wrapper.getRemovedNodes(), wrapper.getParentAddedNodes(), wrapper
             .getParentRemovedNodes());
       }
@@ -154,13 +155,20 @@
     */
    public void setMode(IndexerIoMode ioMode)
    {
-      if (handler != null)
+      try
       {
-         handler.setIndexerIoMode(ioMode);
+         if (handler != null)
+         {
+            handler.setIndexerIoMode(ioMode);
+         }
+         if (parentHandler != null)
+         {
+            parentHandler.setIndexerIoMode(ioMode);
+         }
       }
-      if (parentHandler != null)
+      catch (IOException e)
       {
-         parentHandler.setIndexerIoMode(ioMode);
+         log.error("Unable to set indexer mode to " + ioMode, e);
       }
    }
 

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -43,20 +43,6 @@
 {
    private final Log log = ExoLogger.getLogger(this.getClass().getName());
 
-   @CacheListener
-   public class InitialStateListener
-   {
-      /**
-       * Cache started, check whether the node is the coordinator and set indexer mode.
-       */
-      @CacheStarted
-      public void cacheStarted(Event e)
-      {
-         // set whether this cluster node is writable or not
-         setIndexerMode(cache.getRPCManager().isCoordinator());
-      }
-   }
-
    /**
     * @see org.jboss.cache.loader.SingletonStoreCacheLoader#activeStatusChanged(boolean)
     */
@@ -69,17 +55,7 @@
       super.activeStatusChanged(newActiveState);
    }
 
-   /**
-    * @see org.jboss.cache.loader.SingletonStoreCacheLoader#create()
-    */
    @Override
-   public void create() throws Exception
-   {
-      super.create();
-      cache.addCacheListener(new InitialStateListener());
-   }
-
-   @Override
    protected Callable<?> createPushStateTask()
    {
       return new Callable()
@@ -138,6 +114,7 @@
          // if newActiveState is true IndexerCacheLoader is coordinator with write enabled;
          ((IndexerCacheLoader)getCacheLoader()).setMode(writeEnabled ? IndexerIoMode.READ_WRITE
             : IndexerIoMode.READ_ONLY);
+         log.info("Set indexer io mode to:" + (writeEnabled ? IndexerIoMode.READ_WRITE : IndexerIoMode.READ_ONLY));
       }
    }
 }

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexChangesFilter.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexChangesFilter.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexChangesFilter.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -22,6 +22,7 @@
 import org.exoplatform.services.jcr.config.QueryHandlerParams;
 import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
 import org.exoplatform.services.jcr.impl.core.query.IndexerChangesFilter;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
 import org.exoplatform.services.jcr.impl.core.query.IndexingTree;
 import org.exoplatform.services.jcr.impl.core.query.QueryHandler;
 import org.exoplatform.services.jcr.impl.core.query.SearchManager;
@@ -30,15 +31,19 @@
 import org.exoplatform.services.log.Log;
 import org.jboss.cache.Cache;
 import org.jboss.cache.CacheFactory;
+import org.jboss.cache.CacheSPI;
 import org.jboss.cache.DefaultCacheFactory;
 import org.jboss.cache.config.CacheLoaderConfig;
 import org.jboss.cache.config.CacheLoaderConfig.IndividualCacheLoaderConfig;
 import org.jboss.cache.config.CacheLoaderConfig.IndividualCacheLoaderConfig.SingletonStoreConfig;
 
+import java.io.IOException;
 import java.io.Serializable;
 import java.util.Properties;
 import java.util.Set;
 
+import javax.jcr.RepositoryException;
+
 /**
  * @author <a href="mailto:Sergey.Kabashnyuk at exoplatform.org">Sergey Kabashnyuk</a>
  * @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z ksm $
@@ -71,7 +76,7 @@
     */
    public JbossCacheIndexChangesFilter(SearchManager searchManager, SearchManager parentSearchManager,
       QueryHandlerEntry config, IndexingTree indexingTree, IndexingTree parentIndexingTree, QueryHandler handler,
-      QueryHandler parentHandler) throws RepositoryConfigurationException
+      QueryHandler parentHandler) throws IOException, RepositoryException, RepositoryConfigurationException
    {
       super(searchManager, parentSearchManager, config, indexingTree, parentIndexingTree, handler, parentHandler);
       String jbcConfig = config.getParameterValue(QueryHandlerParams.PARAM_CHANGES_FILTER_CONFIG_PATH);
@@ -112,6 +117,22 @@
       this.cache.getConfiguration().setCacheLoaderConfig(cacheLoaderConfig);
       this.cache.create();
       this.cache.start();
+      // start will invoke cache listener which will notify handler that mode is changed
+      IndexerIoMode ioMode =
+         ((CacheSPI)cache).getRPCManager().isCoordinator() ? IndexerIoMode.READ_WRITE : IndexerIoMode.READ_ONLY;
+
+      handler.setIndexerIoMode(ioMode);
+      parentHandler.setIndexerIoMode(ioMode);
+
+      if (!parentHandler.isInitialized())
+      {
+         parentHandler.init();
+      }
+      if (!handler.isInitialized())
+      {
+         handler.init();
+      }
+
    }
 
    /**

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -85,7 +85,7 @@
    /**
     * Names of active persistent index directories.
     */
-   private final IndexInfos indexNames = new IndexInfos("indexes");
+   private IndexInfos indexNames = new IndexInfos("indexes");
 
    /**
     * Names of index directories that can be deleted.
@@ -176,7 +176,7 @@
    /**
     * The RedoLog of this <code>MultiIndex</code>.
     */
-   private final RedoLog redoLog;
+   private RedoLog redoLog = null;
 
    /**
     * The indexing queue with pending text extraction jobs.
@@ -211,10 +211,10 @@
    /**
     * Indexer io mode
     */
-   private IndexerIoMode ioMode;
+   private IndexerIoMode ioMode = IndexerIoMode.READ_ONLY;
 
    /**
-    * Creates a new MultiIndex.
+    * Creates a new MultiIndex in READ ONLY MODE! setIndexerIoMode(READ_WRITE) later.
     * 
     * @param handler
     *            the search handler
@@ -231,7 +231,6 @@
       this.indexDir = directoryManager.getDirectory(".");
       this.handler = handler;
       this.cache = new DocNumberCache(handler.getCacheSize());
-      this.redoLog = new RedoLog(indexDir);
       this.indexingTree = indexingTree;
       this.nsMappings = handler.getNamespaceMappings();
       this.flushTask = null;
@@ -292,47 +291,11 @@
       {
          reader.release();
       }
-
       indexingQueue.initialize(this);
-
       if (ioMode == IndexerIoMode.READ_WRITE)
       {
-         redoLogApplied = redoLog.hasEntries();
-
-         // run recovery
-         Recovery.run(this, redoLog);
-
-         // enqueue unused segments for deletion
-         enqueueUnusedSegments();
-         attemptDelete();
-
-         // now that we are ready, start index merger
-         merger.start();
-
-         if (redoLogApplied)
-         {
-            // wait for the index merge to finish pending jobs
-            try
-            {
-               merger.waitUntilIdle();
-            }
-            catch (InterruptedException e)
-            {
-               // move on
-            }
-            flush();
-         }
-
-         if (indexNames.size() > 0)
-         {
-            scheduleFlushTask();
-         }
+         setReadWrite();
       }
-      else
-      {
-         redoLogApplied = false;
-      }
-
    }
 
    /**
@@ -653,6 +616,11 @@
          }
       }
 
+      if (ioMode == IndexerIoMode.READ_ONLY)
+      {
+         throw new UnsupportedOperationException("Can't create index in READ_ONLY mode.");
+      }
+
       // otherwise open / create it
       if (indexName == null)
       {
@@ -833,6 +801,13 @@
    {
       synchronized (updateMonitor)
       {
+
+         // TODO: re-implement in less aggressive way 
+         if (ioMode == IndexerIoMode.READ_ONLY)
+         {
+            // this is temporary and extensive solution to re-read list of indexes.
+            refreshIndexesList();
+         }
          if (multiReader != null)
          {
             multiReader.acquire();
@@ -1130,13 +1105,19 @@
       }
    }
 
+   /**
+    * Cancel flush task and add new one
+    */
    private void scheduleFlushTask()
    {
-      lastFlushTime = System.currentTimeMillis();
+      // cancel task
       if (flushTask != null)
       {
          flushTask.cancel();
       }
+      // clear canceled tasks
+      FLUSH_TIMER.purge();
+      // new flush task, cause canceled can't be re-used
       flushTask = new TimerTask()
       {
          public void run()
@@ -1148,6 +1129,7 @@
          }
       };
       FLUSH_TIMER.schedule(flushTask, 0, 1000);
+      lastFlushTime = System.currentTimeMillis();
    }
 
    /**
@@ -2349,8 +2331,9 @@
    /**
     * Set indexer io mode.
     * @param ioMode
+    * @throws IOException 
     */
-   public void setIndexerIoMode(IndexerIoMode ioMode)
+   public void setIndexerIoMode(IndexerIoMode ioMode) throws IOException
    {
       log.info("Indexer io mode=" + ioMode);
       //do some thing if changed
@@ -2360,14 +2343,112 @@
          switch (ioMode)
          {
             case READ_ONLY :
-               // stop timer
-               flushTask.cancel();
+               setReadOny();
                break;
             case READ_WRITE :
-               scheduleFlushTask();
+               setReadWrite();
                break;
          }
       }
 
    }
+
+   /**
+    * Sets mode to READ_ONLY, discarding flush task
+    */
+   protected void setReadOny()
+   {
+      // try to stop merger in safe way
+      merger.dispose();
+      flushTask.cancel();
+      FLUSH_TIMER.purge();
+      this.redoLog = null;
+   }
+
+   /**
+    * Sets mode to READ_WRITE, initiating recovery process
+    * 
+    * @throws IOException
+    */
+   protected void setReadWrite() throws IOException
+   {
+      this.redoLog = new RedoLog(indexDir);
+      redoLogApplied = redoLog.hasEntries();
+
+      // run recovery
+      Recovery.run(this, redoLog);
+
+      // enqueue unused segments for deletion
+      enqueueUnusedSegments();
+      attemptDelete();
+
+      // now that we are ready, start index merger
+      merger.start();
+      if (redoLogApplied)
+      {
+         // wait for the index merge to finish pending jobs
+         try
+         {
+            merger.waitUntilIdle();
+         }
+         catch (InterruptedException e)
+         {
+            // move on
+         }
+         flush();
+      }
+
+      if (indexNames.size() > 0)
+      {
+         scheduleFlushTask();
+      }
+   }
+
+   /**
+    * Temporary solution for indexer in cluster. This method re-reads list of indexes from FS.
+    * @throws IOException 
+    */
+   protected void refreshIndexesList() throws IOException
+   {
+      log.info("Refreshing list of indexes...");
+      // release reader if any
+      releaseMultiReader();
+      // close all indexes
+      for (Object index : indexes)
+      {
+         if (index instanceof AbstractIndex)
+         {
+            ((AbstractIndex)index).close();
+         }
+      }
+      indexes.clear();
+      // re-read all indexes
+      indexNames = new IndexInfos("indexes");
+      if (indexNames.exists(indexDir))
+      {
+         indexNames.read(indexDir);
+      }
+
+      for (int i = 0; i < indexNames.size(); i++)
+      {
+         String name = indexNames.getName(i);
+         // only open if it still exists
+         // it is possible that indexNames still contains a name for
+         // an index that has been deleted, but indexNames has not been
+         // written to disk.
+         if (!directoryManager.hasDirectory(name))
+         {
+            log.debug("index does not exist anymore: " + name);
+            // move on to next index
+            continue;
+         }
+         PersistentIndex index =
+            new PersistentIndex(name, handler.getTextAnalyzer(), handler.getSimilarity(), cache, indexingQueue,
+               directoryManager);
+         index.setMaxFieldLength(handler.getMaxFieldLength());
+         index.setUseCompoundFile(handler.getUseCompoundFile());
+         index.setTermInfosIndexDivisor(handler.getTermInfosIndexDivisor());
+         indexes.add(index);
+      }
+   }
 }

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -416,11 +416,6 @@
    private final ConfigurationManager cfm;
 
    /**
-    * Indexer io mode
-    */
-   private IndexerIoMode ioMode = IndexerIoMode.READ_ONLY;
-
-   /**
     * Working constructor.
     * 
     * @throws RepositoryConfigurationException
@@ -521,41 +516,43 @@
       analyzer.setIndexingConfig(indexingConfig);
 
       index = new MultiIndex(this, context.getIndexingTree(), ioMode);
-      if (index.numDocs() == 0 && context.isCreateInitialIndex())
+      // if RW mode, create initial index and start check
+      if (ioMode == IndexerIoMode.READ_WRITE)
       {
-
-         index.createInitialIndex(context.getItemStateManager());
-      }
-      if (consistencyCheckEnabled && (index.getRedoLogApplied() || forceConsistencyCheck))
-      {
-         log.info("Running consistency check...");
-         try
+         if (index.numDocs() == 0 && context.isCreateInitialIndex())
          {
-            ConsistencyCheck check = ConsistencyCheck.run(index, context.getItemStateManager());
-            if (autoRepair)
+            index.createInitialIndex(context.getItemStateManager());
+         }
+         if (consistencyCheckEnabled && (index.getRedoLogApplied() || forceConsistencyCheck))
+         {
+            log.info("Running consistency check...");
+            try
             {
-               check.repair(true);
-            }
-            else
-            {
-               List<ConsistencyCheckError> errors = check.getErrors();
-               if (errors.size() == 0)
+               ConsistencyCheck check = ConsistencyCheck.run(index, context.getItemStateManager());
+               if (autoRepair)
                {
-                  log.info("No errors detected.");
+                  check.repair(true);
                }
-               for (Iterator<ConsistencyCheckError> it = errors.iterator(); it.hasNext();)
+               else
                {
-                  ConsistencyCheckError err = it.next();
-                  log.info(err.toString());
+                  List<ConsistencyCheckError> errors = check.getErrors();
+                  if (errors.size() == 0)
+                  {
+                     log.info("No errors detected.");
+                  }
+                  for (Iterator<ConsistencyCheckError> it = errors.iterator(); it.hasNext();)
+                  {
+                     ConsistencyCheckError err = it.next();
+                     log.info(err.toString());
+                  }
                }
             }
+            catch (Exception e)
+            {
+               log.warn("Failed to run consistency check on index: " + e);
+            }
          }
-         catch (Exception e)
-         {
-            log.warn("Failed to run consistency check on index: " + e);
-         }
       }
-
       // initialize spell checker
       spellChecker = createSpellChecker();
 
@@ -2646,23 +2643,27 @@
    }
 
    /**
+    * @throws IOException 
     * @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#setIndexerIoMode(org.exoplatform.services.jcr.impl.core.query.IndexerIoMode)
     */
-   public void setIndexerIoMode(IndexerIoMode ioMode)
+   public void setIndexerIoMode(IndexerIoMode ioMode) throws IOException
    {
       log.info("Indexer io mode=" + ioMode);
       //do some thing if changed
       if (!this.ioMode.equals(ioMode))
       {
          this.ioMode = ioMode;
-         switch (ioMode)
+         if (index != null)
          {
-            case READ_ONLY :
-               index.setIndexerIoMode(ioMode);
-               break;
-            case READ_WRITE :
-               index.setIndexerIoMode(ioMode);
-               break;
+            switch (ioMode)
+            {
+               case READ_ONLY :
+                  index.setIndexerIoMode(ioMode);
+                  break;
+               case READ_WRITE :
+                  index.setIndexerIoMode(ioMode);
+                  break;
+            }
          }
       }
 

Modified: jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java	2009-12-11 14:44:56 UTC (rev 1007)
+++ jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java	2009-12-11 15:14:51 UTC (rev 1008)
@@ -81,12 +81,6 @@
 
    }
 
-   public void setContext(QueryHandlerContext context) throws IOException
-   {
-      // TODO Auto-generated method stub
-
-   }
-
    /**
     * @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#executeQuery(org.apache.lucene.search.Query)
     */



More information about the exo-jcr-commits mailing list