[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