You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by al...@apache.org on 2011/12/15 14:43:45 UTC
svn commit: r1214749 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core:
RepositoryImpl.java SearchManager.java query/QueryHandlerContext.java
query/lucene/MultiIndex.java query/lucene/SearchIndex.java
Author: alexparvulescu
Date: Thu Dec 15 13:43:45 2011
New Revision: 1214749
URL: http://svn.apache.org/viewvc?rev=1214749&view=rev
Log:
JCR-3162 Index update overhead on cluster slave due to JCR-905
- rollback
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?rev=1214749&r1=1214748&r2=1214749&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java Thu Dec 15 13:43:45 2011
@@ -605,7 +605,7 @@ public class RepositoryImpl extends Abst
if (systemSearchMgr == null) {
if (repConfig.isSearchEnabled()) {
systemSearchMgr = new SearchManager(
- null, context,
+ context,
repConfig,
getWorkspaceInfo(wspName).itemStateMgr,
context.getInternalVersionManager().getPersistenceManager(),
@@ -1853,7 +1853,6 @@ public class RepositoryImpl extends Abst
// search manager is lazily instantiated in order to avoid
// 'chicken & egg' bootstrap problems
searchMgr = new SearchManager(
- getName(),
context,
config,
itemStateMgr, persistMgr,
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java?rev=1214749&r1=1214748&r2=1214749&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java Thu Dec 15 13:43:45 2011
@@ -111,21 +111,20 @@ public class SearchManager implements Sy
/**
* Creates a new <code>SearchManager</code>.
*
- * @param workspace the workspace name
- * @param repositoryContext the repository context
- * @param qhf the query handler factory
- * @param itemMgr the shared item state manager.
- * @param pm the underlying persistence manager.
- * @param rootNodeId the id of the root node.
- * @param parentMgr the parent search manager or <code>null</code> if
- * there is no parent search manager.
- * @param excludedNodeId id of the node that should be excluded from
- * indexing. Any descendant of that node will also be
- * excluded from indexing.
+ * @param config the search configuration.
+ * @param nsReg the namespace registry.
+ * @param ntReg the node type registry.
+ * @param itemMgr the shared item state manager.
+ * @param pm the underlying persistence manager.
+ * @param rootNodeId the id of the root node.
+ * @param parentMgr the parent search manager or <code>null</code> if
+ * there is no parent search manager.
+ * @param excludedNodeId id of the node that should be excluded from
+ * indexing. Any descendant of that node will also be
+ * excluded from indexing.
* @throws RepositoryException if the search manager cannot be initialized
*/
public SearchManager(
- String workspace,
RepositoryContext repositoryContext,
QueryHandlerFactory qhf,
SharedItemStateManager itemMgr,
@@ -168,9 +167,10 @@ public class SearchManager implements Sy
}
// initialize query handler
- this.handler = qhf.getQueryHandler(new QueryHandlerContext(workspace,
- repositoryContext, itemMgr, pm, rootNodeId, parentHandler,
- excludedNodeId));
+ this.handler = qhf.getQueryHandler(new QueryHandlerContext(
+ repositoryContext,
+ itemMgr, pm, rootNodeId,
+ parentHandler, excludedNodeId));
}
/**
@@ -332,6 +332,10 @@ public class SearchManager implements Sy
long type = e.getType();
if (type == Event.NODE_ADDED) {
addedNodes.put(e.getChildId(), e);
+ // quick'n dirty fix for JCR-905
+ if (e.isExternal()) {
+ removedNodes.add(e.getChildId());
+ }
if (e.isShareableChildNode()) {
// simply re-index shareable nodes
removedNodes.add(e.getChildId());
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java?rev=1214749&r1=1214748&r2=1214749&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java Thu Dec 15 13:43:45 2011
@@ -22,7 +22,6 @@ import org.apache.jackrabbit.core.Cachin
import org.apache.jackrabbit.core.HierarchyManager;
import org.apache.jackrabbit.core.NamespaceRegistryImpl;
import org.apache.jackrabbit.core.RepositoryContext;
-import org.apache.jackrabbit.core.cluster.ClusterNode;
import org.apache.jackrabbit.core.id.NodeId;
import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
import org.apache.jackrabbit.core.persistence.PersistenceManager;
@@ -37,11 +36,6 @@ import org.apache.jackrabbit.core.state.
public class QueryHandlerContext {
/**
- * The workspace
- */
- private final String workspace;
-
- /**
* Repository context.
*/
private final RepositoryContext repositoryContext;
@@ -84,26 +78,22 @@ public class QueryHandlerContext {
/**
* Creates a new context instance.
*
- * @param workspace the workspace name.
- * @param repositoryContext the repository context.
- * @param stateMgr provides persistent item states.
- * @param pm the underlying persistence manager.
- * @param rootId the id of the root node.
- * @param parentHandler the parent query handler or <code>null</code> it
- * there is no parent handler.
- * @param excludedNodeId id of the node that should be excluded from
- * indexing. Any descendant of that node is also
- * excluded from indexing.
+ * @param stateMgr provides persistent item states.
+ * @param pm the underlying persistence manager.
+ * @param rootId the id of the root node.
+ * @param parentHandler the parent query handler or <code>null</code> it
+ * there is no parent handler.
+ * @param excludedNodeId id of the node that should be excluded from
+ * indexing. Any descendant of that node is also
+ * excluded from indexing.
*/
public QueryHandlerContext(
- String workspace,
RepositoryContext repositoryContext,
SharedItemStateManager stateMgr,
PersistenceManager pm,
NodeId rootId,
QueryHandler parentHandler,
NodeId excludedNodeId) {
- this.workspace = workspace;
this.repositoryContext = repositoryContext;
this.stateMgr = stateMgr;
this.hmgr = new CachingHierarchyManager(rootId, stateMgr);
@@ -211,17 +201,4 @@ public class QueryHandlerContext {
return repositoryContext.getExecutor();
}
- /**
- * Returns the cluster node instance of this repository, or
- * <code>null</code> if clustering is not enabled.
- *
- * @return cluster node
- */
- public ClusterNode getClusterNode() {
- return repositoryContext.getClusterNode();
- }
-
- public String getWorkspace() {
- return workspace;
- }
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java?rev=1214749&r1=1214748&r2=1214749&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java Thu Dec 15 13:43:45 2011
@@ -266,13 +266,14 @@ public class MultiIndex {
merger.setMergeFactor(handler.getMergeFactor());
merger.setMinMergeDocs(handler.getMinMergeDocs());
+ IndexingQueueStore store = new IndexingQueueStore(indexDir);
+
// initialize indexing queue
- this.indexingQueue = new IndexingQueue(new IndexingQueueStore(indexDir));
+ this.indexingQueue = new IndexingQueue(store);
// open persistent indexes
- Iterator<IndexInfo> iterator = indexNames.iterator();
- while (iterator.hasNext()) {
- IndexInfo info = iterator.next();
+ for (Iterator<?> it = indexNames.iterator(); it.hasNext(); ) {
+ IndexInfo info = (IndexInfo) it.next();
String name = info.getName();
// only open if it still exists
// it is possible that indexNames still contains a name for
@@ -385,11 +386,10 @@ public class MultiIndex {
executeAndLog(new Start(Action.INTERNAL_TRANSACTION));
NodeState rootState = (NodeState) stateMgr.getItemState(rootId);
count = createIndex(rootState, rootPath, stateMgr, count);
- checkIndexingQueue(true);
executeAndLog(new Commit(getTransactionId()));
log.debug("Created initial index for {} nodes", count);
releaseMultiReader();
- safeFlush();
+ scheduleFlushTask();
} catch (Exception e) {
String msg = "Error indexing workspace";
IOException ex = new IOException(msg);
@@ -397,7 +397,6 @@ public class MultiIndex {
throw ex;
} finally {
reindexing = false;
- scheduleFlushTask();
}
} else {
throw new IllegalStateException("Index already present");
@@ -1168,8 +1167,7 @@ public class MultiIndex {
private void commitVolatileIndex() throws IOException {
// check if volatile index contains documents at all
- int volatileIndexDocuments = volatileIndex.getNumDocuments();
- if (volatileIndexDocuments > 0) {
+ if (volatileIndex.getNumDocuments() > 0) {
long time = System.currentTimeMillis();
// create index
@@ -1187,7 +1185,7 @@ public class MultiIndex {
resetVolatileIndex();
time = System.currentTimeMillis() - time;
- log.debug("Committed in-memory index containing {} documents in {}ms.", volatileIndexDocuments, time);
+ log.debug("Committed in-memory index in " + time + "ms.");
}
}
@@ -1300,7 +1298,7 @@ public class MultiIndex {
}
}
}
-
+
void safeFlush() throws IOException{
synchronized (updateMonitor) {
updateInProgress = true;
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java?rev=1214749&r1=1214748&r2=1214749&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java Thu Dec 15 13:43:45 2011
@@ -41,25 +41,11 @@ import javax.xml.parsers.ParserConfigura
import org.apache.jackrabbit.core.HierarchyManager;
import org.apache.jackrabbit.core.SessionImpl;
-import org.apache.jackrabbit.core.cluster.ChangeLogRecord;
-import org.apache.jackrabbit.core.cluster.ClusterNode;
-import org.apache.jackrabbit.core.cluster.ClusterRecord;
-import org.apache.jackrabbit.core.cluster.ClusterRecordDeserializer;
-import org.apache.jackrabbit.core.cluster.ClusterRecordProcessor;
-import org.apache.jackrabbit.core.cluster.LockRecord;
-import org.apache.jackrabbit.core.cluster.NamespaceRecord;
-import org.apache.jackrabbit.core.cluster.NodeTypeRecord;
-import org.apache.jackrabbit.core.cluster.PrivilegeRecord;
-import org.apache.jackrabbit.core.cluster.WorkspaceRecord;
import org.apache.jackrabbit.core.fs.FileSystem;
import org.apache.jackrabbit.core.fs.FileSystemException;
import org.apache.jackrabbit.core.fs.FileSystemResource;
import org.apache.jackrabbit.core.fs.local.LocalFileSystem;
import org.apache.jackrabbit.core.id.NodeId;
-import org.apache.jackrabbit.core.journal.Journal;
-import org.apache.jackrabbit.core.journal.JournalException;
-import org.apache.jackrabbit.core.journal.Record;
-import org.apache.jackrabbit.core.journal.RecordIterator;
import org.apache.jackrabbit.core.query.AbstractQueryHandler;
import org.apache.jackrabbit.core.query.ExecutableQuery;
import org.apache.jackrabbit.core.query.QueryHandler;
@@ -68,7 +54,6 @@ import org.apache.jackrabbit.core.query.
import org.apache.jackrabbit.core.query.lucene.directory.FSDirectoryManager;
import org.apache.jackrabbit.core.query.lucene.hits.AbstractHitCollector;
import org.apache.jackrabbit.core.session.SessionContext;
-import org.apache.jackrabbit.core.state.ItemState;
import org.apache.jackrabbit.core.state.ItemStateException;
import org.apache.jackrabbit.core.state.ItemStateManager;
import org.apache.jackrabbit.core.state.NoSuchItemStateException;
@@ -562,7 +547,6 @@ public class SearchIndex extends Abstrac
}
index.createInitialIndex(context.getItemStateManager(),
context.getRootId(), rootPath);
- checkPendingJournalChanges(context);
}
if (consistencyCheckEnabled
&& (index.getRedoLogApplied() || forceConsistencyCheck)) {
@@ -2493,46 +2477,6 @@ public class SearchIndex extends Abstrac
this.redoLogFactoryClass = className;
}
- /**
- * In the case of an initial index build operation, this checks if there are
- * some new nodes pending in the journal and tries to preemptively delete
- * them, to keep the index consistent.
- *
- * See JCR-3162
- *
- * @param context
- * @throws IOException
- */
- private void checkPendingJournalChanges(QueryHandlerContext context) {
- ClusterNode cn = context.getClusterNode();
- if (cn == null) {
- return;
- }
-
- List<NodeId> addedIds = new ArrayList<NodeId>();
- long rev = cn.getRevision();
-
- List<ChangeLogRecord> changes = getChangeLogRecords(rev, context.getWorkspace());
- Iterator<ChangeLogRecord> iterator = changes.iterator();
- while (iterator.hasNext()) {
- ChangeLogRecord record = iterator.next();
- for (ItemState state : record.getChanges().addedStates()) {
- if (!state.isNode()) {
- continue;
- }
- addedIds.add((NodeId) state.getId());
- }
- }
- if (!addedIds.isEmpty()) {
- Collection<NodeState> empty = Collections.emptyList();
- try {
- updateNodes(addedIds.iterator(), empty.iterator());
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- }
- }
-
//----------------------------< internal >----------------------------------
/**
@@ -2546,79 +2490,4 @@ public class SearchIndex extends Abstrac
throw new IOException("query handler closed and cannot be used anymore.");
}
}
-
- /**
- * Polls the underlying journal for events of the type ChangeLogRecord that
- * happened after a given revision, on a given workspace.
- *
- * @param revision
- * starting revision
- * @param workspace
- * the workspace name
- * @return
- */
- private List<ChangeLogRecord> getChangeLogRecords(long revision,
- final String workspace) {
- log.debug(
- "Get changes from the Journal for revision {} and workspace {}.",
- revision, workspace);
- ClusterNode cn = getContext().getClusterNode();
- if (cn == null) {
- return Collections.emptyList();
- }
- Journal journal = cn.getJournal();
- final List<ChangeLogRecord> events = new ArrayList<ChangeLogRecord>();
- ClusterRecordDeserializer deserializer = new ClusterRecordDeserializer();
- RecordIterator records = null;
- try {
- records = journal.getRecords(revision);
- while (records.hasNext()) {
- Record record = records.nextRecord();
- if (!record.getProducerId().equals(cn.getId())) {
- continue;
- }
- ClusterRecord r = null;
- try {
- r = deserializer.deserialize(record);
- } catch (JournalException e) {
- log.error(
- "Unable to read revision '" + record.getRevision()
- + "'.", e);
- }
- if (r == null) {
- continue;
- }
- r.process(new ClusterRecordProcessor() {
- public void process(ChangeLogRecord record) {
- String eventW = record.getWorkspace();
- if (eventW != null ? eventW.equals(workspace) : workspace == null) {
- events.add(record);
- }
- }
-
- public void process(LockRecord record) {
- }
-
- public void process(NamespaceRecord record) {
- }
-
- public void process(NodeTypeRecord record) {
- }
-
- public void process(PrivilegeRecord record) {
- }
-
- public void process(WorkspaceRecord record) {
- }
- });
- }
- } catch (JournalException e1) {
- log.error(e1.getMessage(), e1);
- } finally {
- if (records != null) {
- records.close();
- }
- }
- return events;
- }
}