diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/Canary.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/Canary.java index 151be42..ef2dd1c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/Canary.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/Canary.java @@ -93,9 +93,11 @@ import org.apache.hadoop.util.ToolRunner; public final class Canary implements Tool { // Sink interface used by the canary to outputs information public interface Sink { + public long getReadFailureCount(); public void publishReadFailure(HRegionInfo region, Exception e); public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e); public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime); + public long getWriteFailureCount(); public void publishWriteFailure(HRegionInfo region, Exception e); public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e); public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime); @@ -110,13 +112,22 @@ public final class Canary implements Tool { // Simple implementation of canary sink that allows to plot on // file or standard output timings or failures. public static class StdOutSink implements Sink { + protected long readFailureCount, writeFailureCount; + + @Override + public long getReadFailureCount() { + return readFailureCount; + } + @Override public void publishReadFailure(HRegionInfo region, Exception e) { + readFailureCount++; LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e); } @Override public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) { + readFailureCount++; LOG.error(String.format("read from region %s column family %s failed", region.getRegionNameAsString(), column.getNameAsString()), e); } @@ -128,12 +139,19 @@ public final class Canary implements Tool { } @Override + public long getWriteFailureCount() { + return writeFailureCount; + } + + @Override public void publishWriteFailure(HRegionInfo region, Exception e) { + writeFailureCount++; LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e); } @Override public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) { + writeFailureCount++; LOG.error(String.format("write to region %s column family %s failed", region.getRegionNameAsString(), column.getNameAsString()), e); } @@ -149,6 +167,7 @@ public final class Canary implements Tool { @Override public void publishReadFailure(String table, String server) { + readFailureCount++; LOG.error(String.format("Read from table:%s on region server:%s", table, server)); } @@ -691,7 +710,7 @@ public final class Canary implements Tool { } public boolean hasError() { - return errorCode != 0; + return errorCode != 0 || sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 0; } @Override @@ -1086,7 +1105,7 @@ public final class Canary implements Tool { } } catch (InterruptedException e) { this.errorCode = ERROR_EXIT_CODE; - LOG.error("Sniff regionserver failed!", e); + LOG.error("Sniff regionserver interrupted!", e); } }