You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by al...@apache.org on 2016/04/26 16:11:09 UTC
svn commit: r1741032 - in /jackrabbit/oak/trunk/oak-lucene/src:
main/java/org/apache/jackrabbit/oak/plugins/index/lucene/
test/java/org/apache/jackrabbit/oak/plugins/index/lucene/
Author: alexparvulescu
Date: Tue Apr 26 14:11:09 2016
New Revision: 1741032
URL: http://svn.apache.org/viewvc?rev=1741032&view=rev
Log:
OAK-4099 Lucene index appear to be corrupted with compaction enabled
Added:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java (with props)
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java?rev=1741032&r1=1741031&r2=1741032&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java Tue Apr 26 14:11:09 2016
@@ -61,6 +61,8 @@ class IndexTracker {
private volatile Map<String, IndexNode> indices = emptyMap();
+ private volatile boolean refresh;
+
IndexTracker() {
this(null);
}
@@ -83,6 +85,17 @@ class IndexTracker {
}
synchronized void update(final NodeState root) {
+ if (refresh) {
+ this.root = root;
+ close();
+ refresh = false;
+ log.info("Refreshed the opened indexes");
+ } else {
+ diffAndUpdate(root);
+ }
+ }
+
+ private synchronized void diffAndUpdate(final NodeState root) {
Map<String, IndexNode> original = indices;
final Map<String, IndexNode> updates = newHashMap();
@@ -129,6 +142,10 @@ class IndexTracker {
}
}
+ void refresh() {
+ refresh = true;
+ }
+
IndexNode acquireIndexNode(String path) {
IndexNode index = indices.get(path);
if (index != null && index.acquire()) {
@@ -177,5 +194,4 @@ class IndexTracker {
return null;
}
-
}
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java?rev=1741032&r1=1741031&r2=1741032&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java Tue Apr 26 14:11:09 2016
@@ -35,7 +35,6 @@ import javax.management.NotCompliantMBea
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
-import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
@@ -56,6 +55,7 @@ import org.apache.jackrabbit.oak.spi.com
import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
import org.apache.jackrabbit.oak.spi.commit.BackgroundObserverMBean;
import org.apache.jackrabbit.oak.spi.commit.Observer;
+import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
@@ -70,6 +70,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Collections.emptyMap;
import static org.apache.commons.io.FileUtils.ONE_MB;
import static org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerMBean;
@@ -242,6 +243,7 @@ public class LuceneIndexProviderService
new LuceneIndexMBeanImpl(indexProvider.getTracker()),
LuceneIndexMBean.TYPE,
"Lucene Index statistics"));
+ registerGCMonitor(whiteboard, indexProvider.getTracker());
}
@Deactivate
@@ -488,6 +490,17 @@ public class LuceneIndexProviderService
}
}
+ private void registerGCMonitor(Whiteboard whiteboard,
+ final IndexTracker tracker) {
+ GCMonitor gcMonitor = new GCMonitor.Empty() {
+ @Override
+ public void compacted(long[] segmentCounts, long[] recordCounts,
+ long[] compactionMapWeights) {
+ tracker.refresh();
+ }
+ };
+ oakRegs.add(whiteboard.register(GCMonitor.class, gcMonitor, emptyMap()));
+ }
protected void bindNodeAggregator(NodeAggregator aggregator) {
this.nodeAggregator = aggregator;
Added: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java?rev=1741032&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java (added)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java Tue Apr 26 14:11:09 2016
@@ -0,0 +1,72 @@
+/*
+ * 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.apache.jackrabbit.oak.plugins.index.lucene;
+
+import com.google.common.collect.ImmutableSet;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EditorHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.junit.Test;
+
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper.newLucenePropertyIndexDefinition;
+import static org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent.INITIAL_CONTENT;
+import static org.junit.Assert.assertEquals;
+
+public class IndexTrackerTest {
+ private static final EditorHook HOOK = new EditorHook(
+ new IndexUpdateProvider(
+ new LuceneIndexEditorProvider()));
+
+ private NodeState root = INITIAL_CONTENT;
+
+ private NodeBuilder builder = root.builder();
+
+ private IndexTracker tracker = new IndexTracker();
+
+ @Test
+ public void update() throws Exception{
+ NodeBuilder index = builder.child(INDEX_DEFINITIONS_NAME);
+ newLucenePropertyIndexDefinition(index, "lucene", ImmutableSet.of("foo"), null);
+
+ NodeState before = builder.getNodeState();
+ builder.setProperty("foo", "bar");
+ NodeState after = builder.getNodeState();
+
+ NodeState indexed = HOOK.processCommit(before, after, CommitInfo.EMPTY);
+
+ assertEquals(0, tracker.getIndexNodePaths().size());
+
+ tracker.update(indexed);
+ IndexNode indexNode = tracker.acquireIndexNode("/oak:index/lucene");
+ indexNode.release();
+ assertEquals(1, tracker.getIndexNodePaths().size());
+
+ tracker.refresh();
+ assertEquals(1, tracker.getIndexNodePaths().size());
+
+ tracker.update(indexed);
+ //Post refresh size should be 0 as all are closed
+ assertEquals(0, tracker.getIndexNodePaths().size());
+ }
+
+}
\ No newline at end of file
Propchange: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain