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);
+ }
+ }
+ }
}