Author: chetanm
Date: Fri Nov 18 12:25:37 2016
New Revision: 1770373

URL: http://svn.apache.org/viewvc?rev=1770373&view=rev
Log:
OAK-4836 - Avoid excessive logging in case of corrupt index or mis-configured 
index defnition

Distinguish between corruption in persisted index which is detected upon index 
update and those which are seen when index is read for query

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTracker.java
    
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/LuceneIndexMBean.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTrackerTest.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTracker.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTracker.java?rev=1770373&r1=1770372&r2=1770373&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTracker.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTracker.java
 Fri Nov 18 12:25:37 2016
@@ -38,7 +38,8 @@ class BadIndexTracker {
     private static final long DEFAULT_RECHECK_INTERVAL = 
TimeUnit.MINUTES.toMillis(15);
 
     private final Logger log = LoggerFactory.getLogger(getClass());
-    private final Map<String, BadIndexInfo> badIndexes = 
Maps.newConcurrentMap();
+    private final Map<String, BadIndexInfo> badIndexesForRead = 
Maps.newConcurrentMap();
+    private final Map<String, BadIndexInfo> badPersistedIndexes = 
Maps.newConcurrentMap();
     private final long recheckIntervalMillis;
     private Ticker ticker = Ticker.systemTicker();
     private int indexerCycleCount;
@@ -61,17 +62,41 @@ class BadIndexTracker {
     }
 
     public void markGoodIndex(String indexPath) {
-        BadIndexInfo info = badIndexes.remove(indexPath);
+        BadIndexInfo info = badIndexesForRead.remove(indexPath);
+        badPersistedIndexes.remove(indexPath);
         if (info != null) {
             log.info("Index [{}] which was not working {} is found to be 
healthy again",
                     indexPath, info.getStats());
         }
     }
 
-    public void markBadIndex(String path, Throwable e) {
-        BadIndexInfo badIndex = badIndexes.get(path);
+    /**
+     * Invoked to mark a persisted index as bad i.e. where exception is thrown 
when index is reopened
+     * after update
+     *
+     * @param path index path
+     * @param e exception
+     */
+    public void markBadPersistedIndex(String path, Throwable e) {
+        BadIndexInfo badIndex = badPersistedIndexes.get(path);
         if (badIndex == null) {
-            badIndexes.put(path, new BadIndexInfo(path, e));
+            badPersistedIndexes.put(path, new BadIndexInfo(path, e, true));
+            log.error("Could not open the Lucene index at [{}]", path, e);
+        } else {
+            badIndex.failedAccess(e);
+            log.error("Could not open the Lucene index at [{}] . {}",
+                    path, badIndex.getStats(), e);
+        }
+    }
+
+    /**
+     * Invoked to mark a local index as bad i.e. where exception was thrown 
when index was
+     * opened for query. It can h
+     */
+    public void markBadIndexForRead(String path, Throwable e) {
+        BadIndexInfo badIndex = badIndexesForRead.get(path);
+        if (badIndex == null) {
+            badIndexesForRead.put(path, new BadIndexInfo(path, e, false));
             log.error("Could not access the Lucene index at [{}]", path, e);
         } else {
             badIndex.failedAccess(e);
@@ -81,7 +106,7 @@ class BadIndexTracker {
     }
 
     public boolean isIgnoredBadIndex(String path) {
-        BadIndexInfo badIdx = badIndexes.get(path);
+        BadIndexInfo badIdx = badIndexesForRead.get(path);
         if (badIdx == null) {
             return false;
         }
@@ -89,34 +114,49 @@ class BadIndexTracker {
     }
 
     public Set<String> getIndexPaths() {
-        return badIndexes.keySet();
+        return badIndexesForRead.keySet();
     }
 
-    public long getRecheckIntervalMillis() {
-        return recheckIntervalMillis;
+    BadIndexInfo getInfo(String indexPath){
+        return badIndexesForRead.get(indexPath);
     }
 
-    BadIndexInfo getInfo(String indexPath){
-        return badIndexes.get(indexPath);
+    Set<String> getBadPersistedIndexPaths() {
+        return badPersistedIndexes.keySet();
+    }
+
+    BadIndexInfo getPersistedIndexInfo(String indexPath){
+        return badPersistedIndexes.get(indexPath);
+    }
+
+    public long getRecheckIntervalMillis() {
+        return recheckIntervalMillis;
     }
 
     void setTicker(Ticker ticker) {
         this.ticker = ticker;
     }
 
+    public boolean hasBadIndexes(){
+        return !(badIndexesForRead.isEmpty() && badPersistedIndexes.isEmpty());
+    }
+
     class BadIndexInfo {
         final String path;
         final int lastIndexerCycleCount = indexerCycleCount;
         private final long createdTime = 
TimeUnit.NANOSECONDS.toMillis(ticker.read());
+        private final boolean persistedIndex;
         private final Stopwatch created = Stopwatch.createStarted(ticker);
         private final Stopwatch watch = Stopwatch.createStarted(ticker);
         private String exception;
         private int accessCount;
         private int failedAccessCount;
 
-        public BadIndexInfo(String path, Throwable e) {
+
+        public BadIndexInfo(String path, Throwable e, boolean persistedIndex) {
             this.path = path;
             this.exception = Throwables.getStackTraceAsString(e);
+            this.persistedIndex = persistedIndex;
         }
 
         public boolean tryAgain() {
@@ -154,6 +194,10 @@ class BadIndexTracker {
             return createdTime;
         }
 
+        public boolean isPersistedIndex() {
+            return persistedIndex;
+        }
+
         private int getCycleCount() {
             return indexerCycleCount - lastIndexerCycleCount;
         }

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=1770373&r1=1770372&r2=1770373&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
 Fri Nov 18 12:25:37 2016
@@ -133,7 +133,7 @@ public class IndexTracker {
                         PERF_LOGGER.end(start, -1, "[{}] Index found to be 
updated. Reopening the IndexNode", path);
                         updates.put(path, index); // index can be null
                     } catch (IOException e) {
-                        log.error("Failed to open Lucene index at " + path, e);
+                        badIndexTracker.markBadPersistedIndex(path, e);
                     }
                 }
             }, Iterables.toArray(PathUtils.elements(path), String.class)));
@@ -234,7 +234,7 @@ public class IndexTracker {
                 log.warn("Cannot open Lucene Index at path {} as the index is 
not of type {}", path, TYPE_LUCENE);
             }
         } catch (Throwable e) {
-            badIndexTracker.markBadIndex(path, e);
+            badIndexTracker.markBadIndexForRead(path, e);
         }
 
         return null;

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java?rev=1770373&r1=1770372&r2=1770373&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java
 Fri Nov 18 12:25:37 2016
@@ -33,6 +33,8 @@ public interface LuceneIndexMBean {
 
     TabularData getBadIndexStats();
 
+    TabularData getBadPersistedIndexStats();
+
     boolean isFailing();
 
     @Description("Determines the set of index paths upto given maxLevel. This 
can be used to determine the value for" +

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java?rev=1770373&r1=1770372&r2=1770373&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java
 Fri Nov 18 12:25:37 2016
@@ -125,8 +125,29 @@ public class LuceneIndexMBeanImpl extend
     }
 
     @Override
+    public TabularData getBadPersistedIndexStats() {
+        TabularDataSupport tds;
+        try {
+            TabularType tt = new 
TabularType(LuceneIndexMBeanImpl.class.getName(),
+                    "Lucene Bad Persisted Index Stats", BadIndexStats.TYPE, 
new String[]{"path"});
+            tds = new TabularDataSupport(tt);
+            Set<String> indexes = 
indexTracker.getBadIndexTracker().getBadPersistedIndexPaths();
+            for (String path : indexes) {
+                BadIndexInfo info = 
indexTracker.getBadIndexTracker().getPersistedIndexInfo(path);
+                if (info != null){
+                    BadIndexStats stats = new BadIndexStats(info);
+                    tds.put(stats.toCompositeData());
+                }
+            }
+        } catch (OpenDataException e) {
+            throw new IllegalStateException(e);
+        }
+        return tds;
+    }
+
+    @Override
     public boolean isFailing() {
-        return !indexTracker.getBadIndexTracker().getIndexPaths().isEmpty();
+        return indexTracker.getBadIndexTracker().hasBadIndexes();
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTrackerTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTrackerTest.java?rev=1770373&r1=1770372&r2=1770373&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTrackerTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/BadIndexTrackerTest.java
 Fri Nov 18 12:25:37 2016
@@ -34,7 +34,7 @@ public class BadIndexTrackerTest {
 
     @Test
     public void basics() throws Exception{
-        tracker.markBadIndex("foo", new Exception());
+        tracker.markBadIndexForRead("foo", new Exception());
         assertThat(tracker.getIndexPaths(), hasItem("foo"));
 
         assertTrue(tracker.isIgnoredBadIndex("foo"));
@@ -45,7 +45,7 @@ public class BadIndexTrackerTest {
 
     @Test
     public void updatedIndexesMakesGood() throws Exception{
-        tracker.markBadIndex("foo", new Exception());
+        tracker.markBadIndexForRead("foo", new Exception());
         assertTrue(tracker.isIgnoredBadIndex("foo"));
 
         tracker.markGoodIndexes(Collections.singleton("foo"));
@@ -56,7 +56,7 @@ public class BadIndexTrackerTest {
     public void recheckDelay() throws Exception{
         tracker = new BadIndexTracker(100);
         tracker.setTicker(ticker);
-        tracker.markBadIndex("foo", new Exception());
+        tracker.markBadIndexForRead("foo", new Exception());
         ticker.addTime(50, TimeUnit.MILLISECONDS);
 
         assertTrue(tracker.isIgnoredBadIndex("foo"));

Modified: 
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=1770373&r1=1770372&r2=1770373&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java
 Fri Nov 18 12:25:37 2016
@@ -39,6 +39,7 @@ import static org.apache.jackrabbit.oak.
 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;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -102,6 +103,15 @@ public class IndexTrackerTest {
         builder = indexed.builder();
         indexed = corruptIndex("/oak:index/foo");
 
+        tracker.update(indexed);
+        indexNode = tracker.acquireIndexNode("/oak:index/foo");
+        //Even if the persisted index is corrupted the index should be 
accessible
+        //as update would have failed so old copy would be used
+        assertNotNull(indexNode);
+        
assertFalse(tracker.getBadIndexTracker().getBadPersistedIndexPaths().isEmpty());
+
+
+
         //3. Recreate the tracker as we cannot push corrupt index in existing 
tracker
         //As diffAndUpdate would fail and existing IndexNode would not be 
changed
         tracker = new IndexTracker();


Reply via email to