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

do-not-reply at jboss.org do-not-reply at jboss.org
Tue Jan 12 15:19:29 EST 2010


Author: nfilotto
Date: 2010-01-12 15:19:27 -0500 (Tue, 12 Jan 2010)
New Revision: 1367

Added:
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerIoModeHandler.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerIoModeListener.java
Modified:
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/DefaultChangesFilter.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexInfos.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexChangesFilter.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexUpdateMonitor.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DefaultIndexUpdateMonitor.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexInfos.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexUpdateMonitor.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/lab/cluster/prepare/TestIndexUpdateMonitor.java
Log:
EXOJCR-383: Rework the way to manage the IndexerIoMode

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/AbstractQueryHandler.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -65,9 +65,9 @@
    private String idleTime;
 
    /**
-    * Indexer io mode
+    * The handler of the Indexer io mode
     */
-   protected IndexerIoMode ioMode = IndexerIoMode.READ_ONLY;
+   protected IndexerIoModeHandler modeHandler;
 
    /**
     * {@link IndexInfos} instance that is passed to {@link MultiIndex}
@@ -82,6 +82,13 @@
    }
 
    /**
+    * @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#setIndexerIoModeHandler(org.exoplatform.services.jcr.impl.core.query.IndexerIoModeHandler)
+    */
+   public void setIndexerIoModeHandler(IndexerIoModeHandler modeHandler) throws IOException
+   {
+      this.modeHandler = modeHandler;
+   }   
+   /**
     * @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#setContext(org.exoplatform.services.jcr.impl.core.query.QueryHandlerContext)
     */
    public void setContext(QueryHandlerContext context)

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/DefaultChangesFilter.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/DefaultChangesFilter.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/DefaultChangesFilter.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -53,8 +53,9 @@
       QueryHandler parentHandler) throws IOException, RepositoryConfigurationException, RepositoryException
    {
       super(searchManager, parentSearchManager, config, indexingTree, parentIndexingTree, handler, parentHandler);
-      handler.setIndexerIoMode(IndexerIoMode.READ_WRITE);
-      parentHandler.setIndexerIoMode(IndexerIoMode.READ_WRITE);
+      IndexerIoModeHandler modeHandler = new IndexerIoModeHandler(IndexerIoMode.READ_WRITE);
+      handler.setIndexerIoModeHandler(modeHandler);
+      parentHandler.setIndexerIoModeHandler(modeHandler);
 
       if (!parentHandler.isInitialized())
       {

Added: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerIoModeHandler.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerIoModeHandler.java	                        (rev 0)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerIoModeHandler.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.exoplatform.services.jcr.impl.core.query;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * This class is used to manage the livecycle of the corresponding {@link IndexerIoMode}  
+ * @author <a href="mailto:nicolas.filotto at exoplatform.com">Nicolas Filotto</a>
+ * @version $Id$
+ *
+ */
+public class IndexerIoModeHandler
+{
+
+   /**
+    * The current mode
+    */
+   private volatile IndexerIoMode mode;
+   
+   /**
+    * The list of all the listeners
+    */
+   private final List<IndexerIoModeListener> listeners;
+
+   /**
+    * Initialize the mode
+    * @param mode the initial value of the mode
+    */
+   public IndexerIoModeHandler(IndexerIoMode mode)
+   {
+      this.mode = mode;
+      this.listeners = new CopyOnWriteArrayList<IndexerIoModeListener>();
+   }
+
+   /**
+    * @return the current mode of the indexer
+    */
+   public IndexerIoMode getMode()
+   {
+      return mode;
+   }
+
+   /**
+    * Changes the current mode of the indexer. If the value has changes all the listeners
+    * will be notified
+    */
+   public void setMode(IndexerIoMode mode)
+   {
+      if (this.mode != mode)
+      {
+         this.mode = mode;
+         for (IndexerIoModeListener listener : listeners)
+         {
+            listener.onChangeMode(mode);
+         }
+      }
+   }
+   
+   /**
+    * Add a new IndexerIoModeListener to the list of listeners
+    * @param listener the listener to add
+    */
+   public void addIndexerIoModeListener(IndexerIoModeListener listener)
+   {
+      listeners.add(listener);
+   }
+}

Added: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerIoModeListener.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerIoModeListener.java	                        (rev 0)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerIoModeListener.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.exoplatform.services.jcr.impl.core.query;
+
+/**
+ * This interface describes a IndexerIoModeListener, any time the IndexerIoMode changes
+ * the listeners are notified and the method onChangeMode is called
+ * @author <a href="mailto:nicolas.filotto at exoplatform.com">Nicolas Filotto</a>
+ * @version $Id$
+ *
+ */
+public interface IndexerIoModeListener
+{
+   /**
+    * The method that we call when the mode has changes
+    * @param mode the new mode of the indexer
+    */
+   void onChangeMode(IndexerIoMode mode);
+}

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandler.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -21,7 +21,6 @@
 import org.exoplatform.services.jcr.datamodel.NodeData;
 import org.exoplatform.services.jcr.impl.core.SessionDataManager;
 import org.exoplatform.services.jcr.impl.core.SessionImpl;
-import org.exoplatform.services.jcr.impl.core.query.lucene.DefaultIndexUpdateMonitor;
 import org.exoplatform.services.jcr.impl.core.query.lucene.IndexInfos;
 import org.exoplatform.services.jcr.impl.core.query.lucene.IndexUpdateMonitor;
 import org.exoplatform.services.jcr.impl.core.query.lucene.MultiIndex;
@@ -136,7 +135,7 @@
     */
    void logErrorChanges(Set<String> removed, Set<String> added) throws IOException;
 
-   void setIndexerIoMode(IndexerIoMode ioMode) throws IOException;
+   void setIndexerIoModeHandler(IndexerIoModeHandler handler) throws IOException;
 
    /**
     * @return the name of the query class to use.
@@ -154,29 +153,29 @@
     * @return the lucene Hits object.
     * @throws IOException if an error occurs while searching the index.
     */
-   public QueryHits executeQuery(Query query) throws IOException;
+   QueryHits executeQuery(Query query) throws IOException;
 
    /**
     * Sets {@link IndexInfos} instance into QueryHandler, which is later passed to {@link MultiIndex}.
     * 
     * @param indexInfos
     */
-   public void setIndexInfos(IndexInfos indexInfos);
+   void setIndexInfos(IndexInfos indexInfos);
    
    /**
     * Returns {@link IndexInfos} instance that was set into QueryHandler.
     * @return
     */
-   public IndexInfos getIndexInfos();
+   IndexInfos getIndexInfos();
 
    /**
     * @return the indexUpdateMonitor
     */
-   public IndexUpdateMonitor getIndexUpdateMonitor();
+   IndexUpdateMonitor getIndexUpdateMonitor();
 
    /**
     * @param indexUpdateMonitor the indexUpdateMonitor to set
     */
-   public void setIndexUpdateMonitor(IndexUpdateMonitor indexUpdateMonitor);
+   void setIndexUpdateMonitor(IndexUpdateMonitor indexUpdateMonitor);
 
 }

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -18,11 +18,13 @@
 
 import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
 import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeHandler;
 import org.exoplatform.services.jcr.impl.core.query.QueryHandler;
 import org.exoplatform.services.jcr.impl.core.query.SearchManager;
 import org.exoplatform.services.jcr.impl.storage.jbosscache.AbstractWriteOnlyCacheLoader;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
+import org.jboss.cache.CacheStatus;
 import org.jboss.cache.Fqn;
 import org.jboss.cache.Modification;
 
@@ -49,6 +51,8 @@
    private QueryHandler handler;
 
    private QueryHandler parentHandler;
+   
+   private volatile IndexerIoModeHandler modeHandler;
 
    /**
     * @see org.jboss.cache.loader.AbstractCacheLoader#commit(java.lang.Object)
@@ -134,25 +138,37 @@
     * 
     * @param ioMode
     */
-   public void setMode(IndexerIoMode ioMode)
+   void setMode(IndexerIoMode ioMode)
    {
-      try
+      if (modeHandler != null)
       {
-         if (handler != null)
+         modeHandler.setMode(ioMode);         
+      }
+   }
+
+   /**
+    * Set the mode handler
+    * @param modeHandler
+    */
+   IndexerIoModeHandler getModeHandler()
+   {
+      if (modeHandler == null)
+      {
+         if (cache.getCacheStatus() != CacheStatus.STARTED)
          {
-            handler.setIndexerIoMode(ioMode);
+            throw new IllegalStateException("The cache should be started first");
          }
-         if (parentHandler != null)
+         synchronized (this)
          {
-            parentHandler.setIndexerIoMode(ioMode);
+            if (modeHandler == null)
+            {
+               this.modeHandler = new IndexerIoModeHandler(cache.getRPCManager().isCoordinator() ? IndexerIoMode.READ_WRITE : IndexerIoMode.READ_ONLY);               
+            }
          }
       }
-      catch (IOException e)
-      {
-         log.error("Unable to set indexer mode to " + ioMode, e);
-      }
+      return modeHandler;
    }
-
+   
    /**
     * Flushes lists of added/removed nodes to SearchManagers, starting indexing.
     * 

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexInfos.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexInfos.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexInfos.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -19,6 +19,8 @@
 package org.exoplatform.services.jcr.impl.core.query.jbosscache;
 
 import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeHandler;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeListener;
 import org.exoplatform.services.jcr.impl.core.query.lucene.IndexInfos;
 import org.exoplatform.services.jcr.impl.core.query.lucene.MultiIndex;
 import org.exoplatform.services.log.ExoLogger;
@@ -49,7 +51,7 @@
  *
  */
 @CacheListener
-public class JBossCacheIndexInfos extends IndexInfos
+public class JBossCacheIndexInfos extends IndexInfos implements IndexerIoModeListener
 {
 
    private final Log log = ExoLogger.getLogger(this.getClass().getName());
@@ -68,9 +70,9 @@
    private boolean system;
 
    /**
-    * {@link IndexerIoMode} is used to define current mode.
+    * Used to retrieve the current mode
     */
-   private IndexerIoMode ioMode = IndexerIoMode.READ_WRITE;
+   private final IndexerIoModeHandler modeHandler;
 
    /**
     * This FQN points to cache node, where list of indexes for this {@link IndexInfos} instance is stored.
@@ -80,27 +82,28 @@
    /**
     * @param cache instance of JbossCache that is used to deliver index names
     */
-   public JBossCacheIndexInfos(Cache<Serializable, Object> cache, boolean system, IndexerIoMode ioMode)
+   public JBossCacheIndexInfos(Cache<Serializable, Object> cache, boolean system, IndexerIoModeHandler modeHandler)
    {
-      this(DEFALUT_NAME, cache, system, ioMode);
+      this(DEFALUT_NAME, cache, system, modeHandler);
    }
 
    /**
     * @param fileName where index names are stored.
     * @param cache instance of JbossCache that is used to deliver index names
     */
-   public JBossCacheIndexInfos(String fileName, Cache<Serializable, Object> cache, boolean system, IndexerIoMode ioMode)
+   public JBossCacheIndexInfos(String fileName, Cache<Serializable, Object> cache, boolean system, IndexerIoModeHandler modeHandler)
    {
       super(fileName);
       this.cache = cache;
-      this.ioMode = ioMode;
+      this.modeHandler = modeHandler;
+      modeHandler.addIndexerIoModeListener(this);
       // store parsed FQN to avoid it's parsing each time cache event is generated
       namesFqn = Fqn.fromString(system ? SYSINDEX_NAMES : INDEX_NAMES);
       Node<Serializable, Object> cacheRoot = cache.getRoot();
 
       // prepare cache structures
       cacheRoot.addChild(namesFqn).setResident(true);
-      if (ioMode == IndexerIoMode.READ_ONLY)
+      if (modeHandler.getMode() == IndexerIoMode.READ_ONLY)
       {
          // Currently READ_ONLY is set, so new lists should be fired to multiIndex.
          cache.addCacheListener(this);
@@ -108,29 +111,31 @@
    }
 
    /**
-    * @see org.exoplatform.services.jcr.impl.core.query.lucene.IndexInfos#setIoMode(org.exoplatform.services.jcr.impl.core.query.IndexerIoMode)
+    * 
+    * @param mode
     */
-   @Override
-   public void setIoMode(IndexerIoMode ioMode) throws IOException
+   public void onChangeMode(IndexerIoMode mode)
    {
-      if (this.ioMode != ioMode)
+      if (mode == IndexerIoMode.READ_WRITE)
       {
-         log.info("New IoMode:" + ioMode);
-         super.setIoMode(ioMode);
-         if (ioMode == IndexerIoMode.READ_WRITE)
+         // Now is read-write. Index list is actual and shouldn't be refreshed.
+         // Remove listener to avoid asserting if ioMode is RO on each cache event 
+         cache.removeCacheListener(this);
+         // re-read from FS current actual list.
+         try
          {
-            // Now is read-write. Index list is actual and shouldn't be refreshed.
-            // Remove listener to avoid asserting if ioMode is RO on each cache event 
-            cache.removeCacheListener(this);
-            // re-read from FS current actual list.
             super.read();
          }
-         else
+         catch (IOException e)
          {
-            // Currently READ_ONLY is set, so new lists should be fired to multiIndex.
-            cache.addCacheListener(this);
+            log.error("Cannot read the list of indexe names", e);
          }
       }
+      else
+      {
+         // Currently READ_ONLY is set, so new lists should be fired to multiIndex.
+         cache.addCacheListener(this);
+      }
    }
 
    /**
@@ -140,7 +145,7 @@
    public void write() throws IOException
    {
       // if READ_WRITE and is dirty, then flush. 
-      if (isDirty() && ioMode == IndexerIoMode.READ_WRITE)
+      if (isDirty() && modeHandler.getMode() == IndexerIoMode.READ_WRITE)
       {
          // write to FS
          super.write();

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexChangesFilter.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexChangesFilter.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexChangesFilter.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -23,6 +23,7 @@
 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.IndexerIoModeHandler;
 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;
@@ -112,22 +113,22 @@
       // 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;
+      IndexerIoModeHandler modeHandler = indexerCacheLoader.getModeHandler();
+      handler.setIndexerIoModeHandler(modeHandler);
+      parentHandler.setIndexerIoModeHandler(modeHandler);
 
-      handler.setIndexerIoMode(ioMode);
-      parentHandler.setIndexerIoMode(ioMode);
-
       if (!parentHandler.isInitialized())
       {
          // TODO: uncomment it, when JbossCacheIndexInfos is finished.
-         parentHandler.setIndexInfos(new JBossCacheIndexInfos(cache, true, ioMode));
-         parentHandler.setIndexUpdateMonitor(new JbossCacheIndexUpdateMonitor(cache, ioMode));
+         parentHandler.setIndexInfos(new JBossCacheIndexInfos(cache, true, modeHandler));
+         parentHandler.setIndexUpdateMonitor(new JbossCacheIndexUpdateMonitor(cache, modeHandler));
          parentHandler.init();
       }
       if (!handler.isInitialized())
       {
          // TODO: uncomment it, when JbossCacheIndexInfos is finished.
-         handler.setIndexInfos(new JBossCacheIndexInfos(cache, false, ioMode));
-         handler.setIndexUpdateMonitor(new JbossCacheIndexUpdateMonitor(cache, ioMode));
+         handler.setIndexInfos(new JBossCacheIndexInfos(cache, false, modeHandler));
+         handler.setIndexUpdateMonitor(new JbossCacheIndexUpdateMonitor(cache, modeHandler));
          handler.init();
       }
 

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexUpdateMonitor.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexUpdateMonitor.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JbossCacheIndexUpdateMonitor.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -19,6 +19,7 @@
 package org.exoplatform.services.jcr.impl.core.query.jbosscache;
 
 import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeHandler;
 import org.exoplatform.services.jcr.impl.core.query.lucene.IndexUpdateMonitor;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
@@ -29,7 +30,6 @@
 import org.jboss.cache.lock.LockManager;
 import org.jboss.cache.lock.LockType;
 
-import java.io.IOException;
 import java.io.Serializable;
 
 /**
@@ -50,22 +50,22 @@
 
    private final static String PARAMETER_NAME = "index-update-in-progress";
 
-   public IndexerIoMode ioMode;
+   public final IndexerIoModeHandler modeHandler;
 
    /**
     * @param cache instance of JbossCache that is used to deliver index names
     */
-   public JbossCacheIndexUpdateMonitor(Cache<Serializable, Object> cache, IndexerIoMode ioMode)
+   public JbossCacheIndexUpdateMonitor(Cache<Serializable, Object> cache, IndexerIoModeHandler modeHandler)
    {
       this.cache = cache;
-      this.ioMode = ioMode;
+      this.modeHandler = modeHandler;
       Node<Serializable, Object> cacheRoot = cache.getRoot();
 
       // prepare cache structures
 
       cacheRoot.addChild(PARAMETER_ROOT).setResident(true);
 
-      if (IndexerIoMode.READ_WRITE == ioMode)
+      if (IndexerIoMode.READ_WRITE == modeHandler.getMode())
       {
          setUpdateInProgress(false);
       }
@@ -116,21 +116,11 @@
    }
 
    /**
-    * Sets {@link IndexerIoMode} to indexInfos;
-    * @param ioMode
-    * @throws IOException 
-    */
-   public void setIoMode(IndexerIoMode ioMode) throws IOException
-   {
-      this.ioMode = ioMode;
-   }
-
-   /**
     * @see org.exoplatform.services.jcr.impl.core.query.lucene.IndexUpdateMonitor#setUpdateInProgress(boolean)
     */
    public void setUpdateInProgress(boolean updateInProgress)
    {
-      if (IndexerIoMode.READ_ONLY == ioMode)
+      if (IndexerIoMode.READ_ONLY == modeHandler.getMode())
       {
          throw new IllegalStateException("Unable to set updateInProgress value in IndexerIoMode.READ_ONLY mode");
       }

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DefaultIndexUpdateMonitor.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DefaultIndexUpdateMonitor.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DefaultIndexUpdateMonitor.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -18,10 +18,8 @@
  */
 package org.exoplatform.services.jcr.impl.core.query.lucene;
 
-import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
 import org.jboss.cache.lock.LockType;
 
-import java.io.IOException;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -33,8 +31,6 @@
 {
    private AtomicBoolean updateInProgress;
 
-   private IndexerIoMode ioMode;
-
    /**
     * @param semaphore
     */
@@ -64,14 +60,6 @@
    }
 
    /**
-    * @see org.exoplatform.services.jcr.impl.core.query.lucene.IndexUpdateMonitor#setIoMode(org.exoplatform.services.jcr.impl.core.query.IndexerIoMode)
-    */
-   public void setIoMode(IndexerIoMode ioMode) throws IOException
-   {
-      this.ioMode = ioMode;
-   }
-
-   /**
     * @see org.exoplatform.services.jcr.impl.core.query.lucene.IndexUpdateMonitor#unlock(java.lang.String)
     */
    public void unlock(String name)

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexInfos.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexInfos.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexInfos.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -17,7 +17,6 @@
 package org.exoplatform.services.jcr.impl.core.query.lucene;
 
 import org.apache.lucene.store.Directory;
-import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
 import org.exoplatform.services.jcr.impl.core.query.lucene.directory.IndexInputStream;
 import org.exoplatform.services.jcr.impl.core.query.lucene.directory.IndexOutputStream;
 
@@ -273,16 +272,6 @@
    }
 
    /**
-    * Sets {@link IndexerIoMode} to indexInfos;
-    * @param ioMode
-    * @throws IOException 
-    */
-   public void setIoMode(IndexerIoMode ioMode) throws IOException
-   {
-      // do nothing
-   }
-
-   /**
     * Sets new names, clearing existing. It is thought to be used when list of indexes can
     * be externally changed.
     * 

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexUpdateMonitor.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexUpdateMonitor.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexUpdateMonitor.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -18,11 +18,8 @@
  */
 package org.exoplatform.services.jcr.impl.core.query.lucene;
 
-import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
 import org.jboss.cache.lock.LockType;
 
-import java.io.IOException;
-
 /**
  * @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 $
@@ -41,13 +38,6 @@
    void setUpdateInProgress(boolean updateInProgress);
 
    /**
-    * Sets {@link IndexerIoMode} to indexInfos;
-    * @param ioMode
-    * @throws IOException 
-    */
-   public void setIoMode(IndexerIoMode ioMode) throws IOException;
-
-   /**
     *  Returns true if the node is locked (either for reading or writing) by anyone, and false otherwise.
     * @param name
     * @return

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -25,6 +25,8 @@
 import org.exoplatform.services.jcr.datamodel.NodeData;
 import org.exoplatform.services.jcr.impl.Constants;
 import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeHandler;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeListener;
 import org.exoplatform.services.jcr.impl.core.query.IndexingTree;
 import org.exoplatform.services.jcr.impl.core.query.lucene.directory.DirectoryManager;
 import org.slf4j.Logger;
@@ -75,7 +77,7 @@
  * thread and reader threads is done using {@link #updateMonitor} and
  * {@link #updateInProgress}.
  */
-public class MultiIndex
+public class MultiIndex implements IndexerIoModeListener
 {
 
    /**
@@ -212,12 +214,12 @@
    private final IndexFormatVersion version;
 
    /**
-    * Indexer io mode
+    * The handler of the Indexer io mode
     */
-   private IndexerIoMode ioMode = IndexerIoMode.READ_ONLY;
+   private final IndexerIoModeHandler modeHandler;
 
    /**
-    * Creates a new MultiIndex in READ ONLY MODE! setIndexerIoMode(READ_WRITE) later.
+    * Creates a new MultiIndex.
     * 
     * @param handler
     *            the search handler
@@ -227,10 +229,10 @@
     * @throws IOException
     *             if an error occurs
     */
-   MultiIndex(SearchIndex handler, IndexingTree indexingTree, IndexerIoMode ioMode, IndexInfos indexInfos,
+   MultiIndex(SearchIndex handler, IndexingTree indexingTree, IndexerIoModeHandler modeHandler, IndexInfos indexInfos,
       IndexUpdateMonitor indexUpdateMonitor) throws IOException
    {
-      this.ioMode = ioMode;
+      this.modeHandler = modeHandler;
       this.indexUpdateMonitor = indexUpdateMonitor;
       this.directoryManager = handler.getDirectoryManager();
       this.indexDir = directoryManager.getDirectory(".");
@@ -243,6 +245,7 @@
       this.indexNames.setDirectory(indexDir);
       this.indexNames.read();
 
+      modeHandler.addIndexerIoModeListener(this);
       // as of 1.5 deletable file is not used anymore
       removeDeletable();
 
@@ -297,7 +300,7 @@
          reader.release();
       }
       indexingQueue.initialize(this);
-      if (ioMode == IndexerIoMode.READ_WRITE)
+      if (modeHandler.getMode() == IndexerIoMode.READ_WRITE)
       {
          setReadWrite();
       }
@@ -626,7 +629,7 @@
          }
       }
 
-      if (ioMode == IndexerIoMode.READ_ONLY)
+      if (modeHandler.getMode() == IndexerIoMode.READ_ONLY)
       {
          throw new UnsupportedOperationException("Can't create index in READ_ONLY mode.");
       }
@@ -2347,20 +2350,14 @@
    }
 
    /**
-    * Set indexer io mode.
-    * @param ioMode
-    * @throws IOException 
+    * @see org.exoplatform.services.jcr.impl.core.query.IndexerIoModeListener#onChangeMode(org.exoplatform.services.jcr.impl.core.query.IndexerIoMode)
     */
-   public void setIndexerIoMode(IndexerIoMode ioMode) throws IOException
+   public void onChangeMode(IndexerIoMode mode)
    {
-      log.info("Indexer io mode=" + ioMode);
-      //do some thing if changed
-      if (!this.ioMode.equals(ioMode))
+      log.info("Indexer io mode=" + mode);
+      try
       {
-         this.ioMode = ioMode;
-         indexNames.setIoMode(ioMode);
-         indexUpdateMonitor.setIoMode(ioMode);
-         switch (ioMode)
+         switch (mode)
          {
             case READ_ONLY :
                setReadOny();
@@ -2370,7 +2367,10 @@
                break;
          }
       }
-
+      catch (IOException e)
+      {
+         log.error("An error occurs while changing of mode " + mode, e);
+      }
    }
 
    /**
@@ -2392,6 +2392,14 @@
     */
    protected void setReadWrite() throws IOException
    {
+      // Release all the current threads
+      synchronized (updateMonitor)
+      {
+         indexUpdateMonitor.setUpdateInProgress(false);
+         updateMonitor.notifyAll();
+         releaseMultiReader();
+      }
+      
       this.redoLog = new RedoLog(indexDir);
       redoLogApplied = redoLog.hasEntries();
 

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -515,9 +515,9 @@
       indexingConfig = createIndexingConfiguration(nsMappings);
       analyzer.setIndexingConfig(indexingConfig);
 
-      index = new MultiIndex(this, context.getIndexingTree(), ioMode, getIndexInfos(), getIndexUpdateMonitor());
+      index = new MultiIndex(this, context.getIndexingTree(), modeHandler, getIndexInfos(), getIndexUpdateMonitor());
       // if RW mode, create initial index and start check
-      if (ioMode == IndexerIoMode.READ_WRITE)
+      if (modeHandler.getMode() == IndexerIoMode.READ_WRITE)
       {
          if (index.numDocs() == 0 && context.isCreateInitialIndex())
          {
@@ -2641,31 +2641,4 @@
 
       return new LuceneQueryHits(reader, searcher, query);
    }
-
-   /**
-    * @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) throws IOException
-   {
-      log.info("Indexer io mode=" + ioMode);
-      //do some thing if changed
-      if (!this.ioMode.equals(ioMode))
-      {
-         this.ioMode = ioMode;
-         if (index != null)
-         {
-            switch (ioMode)
-            {
-               case READ_ONLY :
-                  index.setIndexerIoMode(ioMode);
-                  break;
-               case READ_WRITE :
-                  index.setIndexerIoMode(ioMode);
-                  break;
-            }
-         }
-      }
-
-   }
 }

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/SlowQueryHandler.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -22,7 +22,6 @@
 import org.exoplatform.services.jcr.impl.core.SessionImpl;
 import org.exoplatform.services.jcr.impl.core.query.AbstractQueryHandler;
 import org.exoplatform.services.jcr.impl.core.query.ExecutableQuery;
-import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
 import org.exoplatform.services.jcr.impl.core.query.QueryHandlerContext;
 import org.exoplatform.services.jcr.impl.core.query.lucene.QueryHits;
 
@@ -93,14 +92,4 @@
       // TODO Auto-generated method stub
       return null;
    }
-
-   /**
-    * @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#setIndexerIoMode(org.exoplatform.services.jcr.impl.core.query.IndexerIoMode)
-    */
-   public void setIndexerIoMode(IndexerIoMode ioMode) throws IOException
-   {
-      // TODO Auto-generated method stub
-
-   }
-
 }

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/lab/cluster/prepare/TestIndexUpdateMonitor.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/lab/cluster/prepare/TestIndexUpdateMonitor.java	2010-01-12 15:04:02 UTC (rev 1366)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/lab/cluster/prepare/TestIndexUpdateMonitor.java	2010-01-12 20:19:27 UTC (rev 1367)
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 
 import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeHandler;
 import org.exoplatform.services.jcr.impl.core.query.jbosscache.JbossCacheIndexUpdateMonitor;
 import org.exoplatform.services.jcr.impl.core.query.lucene.IndexUpdateMonitor;
 import org.exoplatform.services.log.ExoLogger;
@@ -62,7 +63,7 @@
       super.setUp();
       cache = createCache();
       TransactionManager tm = ((CacheSPI<Serializable, Object>)cache).getTransactionManager();
-      indexUpdateMonitor = new JbossCacheIndexUpdateMonitor(cache, IndexerIoMode.READ_WRITE);
+      indexUpdateMonitor = new JbossCacheIndexUpdateMonitor(cache, new IndexerIoModeHandler(IndexerIoMode.READ_WRITE));
    }
 
    /**



More information about the exo-jcr-commits mailing list