Author: chetanm
Date: Wed Nov 23 06:16:34 2016
New Revision: 1770915

URL: http://svn.apache.org/viewvc?rev=1770915&view=rev
Log:
OAK-4939 - Isolate corrupted index and make async indexer more resilient

Expose failing index details over JMX

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/IndexStatsMBean.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/TrackingCorruptIndexHandler.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/IndexStatsMBean.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/IndexStatsMBean.java?rev=1770915&r1=1770914&r2=1770915&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/IndexStatsMBean.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/IndexStatsMBean.java
 Wed Nov 23 06:16:34 2016
@@ -18,6 +18,7 @@
 package org.apache.jackrabbit.oak.api.jmx;
 
 import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.TabularData;
 
 import aQute.bnd.annotation.ProviderType;
 import org.apache.jackrabbit.oak.commons.jmx.Description;
@@ -209,4 +210,6 @@ public interface IndexStatsMBean {
      */
     String getLatestErrorTime();
 
+    TabularData getFailingIndexStats();
+
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java?rev=1770915&r1=1770914&r2=1770915&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
 Wed Nov 23 06:16:34 2016
@@ -46,6 +46,7 @@ import javax.management.openmbean.Compos
 import javax.management.openmbean.OpenDataException;
 import javax.management.openmbean.OpenType;
 import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
 
 import com.google.common.collect.Lists;
 import org.apache.jackrabbit.api.stats.TimeSeries;
@@ -945,7 +946,7 @@ public class AsyncIndexUpdate implements
         }
 
         public boolean isFailing() {
-            return failing;
+            return failing || corruptIndexHandler.isFailing(name);
         }
 
         @Override
@@ -1201,6 +1202,11 @@ public class AsyncIndexUpdate implements
         public String getLatestErrorTime() {
             return latestErrorTime;
         }
+
+        @Override
+        public TabularData getFailingIndexStats() {
+            return corruptIndexHandler.getFailingIndexStats(name);
+        }
     }
 
     /**

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/TrackingCorruptIndexHandler.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/TrackingCorruptIndexHandler.java?rev=1770915&r1=1770914&r2=1770915&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/TrackingCorruptIndexHandler.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/TrackingCorruptIndexHandler.java
 Wed Nov 23 06:16:34 2016
@@ -25,6 +25,15 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
+
 import com.google.common.base.Throwables;
 import com.google.common.collect.Maps;
 import org.apache.jackrabbit.oak.stats.Clock;
@@ -74,6 +83,9 @@ public class TrackingCorruptIndexHandler
         }
     }
 
+    public boolean isFailing(String asyncName) {
+        return !getFailingIndexData(asyncName).isEmpty();
+    }
 
     //~--------------------------------< CorruptIndexHandler >
 
@@ -158,6 +170,10 @@ public class TrackingCorruptIndexHandler
             return exception;
         }
 
+        public boolean isMarkedAsCorrupt(){
+            return skippedCount > 0;
+        }
+
         public int getSkippedCount() {
             return skippedCount;
         }
@@ -170,4 +186,86 @@ public class TrackingCorruptIndexHandler
             return indexerCycleCount - lastIndexerCycleCount;
         }
     }
+
+    //~-----------------------------------------------------< MBean Support >
+
+    public TabularData getFailingIndexStats(String asyncName) {
+        TabularDataSupport tds;
+        try {
+            TabularType tt = new 
TabularType(TrackingCorruptIndexHandler.class.getName(),
+                    "Failing Index Stats", FailingIndexStats.TYPE, new 
String[]{"path"});
+            tds = new TabularDataSupport(tt);
+            Map<String, CorruptIndexInfo> infos = 
getFailingIndexData(asyncName);
+            for (Map.Entry<String, CorruptIndexInfo> e : infos.entrySet()) {
+                FailingIndexStats stats = new FailingIndexStats(e.getValue());
+                tds.put(stats.toCompositeData());
+            }
+        } catch (OpenDataException e) {
+            throw new IllegalStateException(e);
+        }
+        return tds;
+    }
+
+    private static class FailingIndexStats {
+        static final String[] FIELD_NAMES = new String[]{
+                "path",
+                "stats",
+                "markedCorrupt",
+                "failingSince",
+                "exception"
+        };
+
+        static final String[] FIELD_DESCRIPTIONS = new String[]{
+                "Path",
+                "Failure stats",
+                "Marked as corrupt",
+                "Failure start time",
+                "Exception"
+        };
+
+        @SuppressWarnings("rawtypes")
+        static final OpenType[] FIELD_TYPES = new OpenType[]{
+                SimpleType.STRING,
+                SimpleType.STRING,
+                SimpleType.BOOLEAN,
+                SimpleType.STRING,
+                SimpleType.STRING,
+        };
+
+        static final CompositeType TYPE = createCompositeType();
+
+        static CompositeType createCompositeType() {
+            try {
+                return new CompositeType(
+                        FailingIndexStats.class.getName(),
+                        "Composite data type for Failing Index statistics",
+                        FailingIndexStats.FIELD_NAMES,
+                        FailingIndexStats.FIELD_DESCRIPTIONS,
+                        FailingIndexStats.FIELD_TYPES);
+            } catch (OpenDataException e) {
+                throw new IllegalStateException(e);
+            }
+        }
+
+        private final CorruptIndexInfo info;
+
+        public FailingIndexStats(CorruptIndexInfo info){
+            this.info = info;
+        }
+
+        CompositeDataSupport toCompositeData() {
+            Object[] values = new Object[]{
+                    info.path,
+                    info.getStats(),
+                    info.isMarkedAsCorrupt(),
+                    String.format("%tc", 
info.getCorruptSinceAsCal().getTimeInMillis()),
+                    info.getLastException(),
+            };
+            try {
+                return new CompositeDataSupport(TYPE, FIELD_NAMES, values);
+            } catch (OpenDataException e) {
+                throw new IllegalStateException(e);
+            }
+        }
+    }
 }


Reply via email to