From 5d69068439029faf106228362bc7bb7b0abf3138 Mon Sep 17 00:00:00 2001 From: Elliott Clark Date: Tue, 25 Nov 2014 11:34:20 -0800 Subject: [PATCH] HBASE-12576 Add metrics for rolling the HLog if there are too few DN's in the write pipeline --- .../hbase/regionserver/wal/MetricsWALSource.java | 9 +++++++++ .../hbase/regionserver/wal/MetricsWALSourceImpl.java | 19 ++++++++++++++++++- .../apache/hadoop/hbase/regionserver/LogRoller.java | 2 +- .../apache/hadoop/hbase/regionserver/wal/FSHLog.java | 10 ++++++++-- .../hbase/regionserver/wal/WALActionsListener.java | 4 ++-- .../apache/hadoop/hbase/wal/DisabledWALProvider.java | 2 +- 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/wal/MetricsWALSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/wal/MetricsWALSource.java index ba0df80..f8c746f 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/wal/MetricsWALSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/wal/MetricsWALSource.java @@ -57,6 +57,11 @@ public interface MetricsWALSource extends BaseSource { String SLOW_APPEND_COUNT_DESC = "Number of appends that were slow."; String SYNC_TIME = "syncTime"; String SYNC_TIME_DESC = "The time it took to sync the WAL to HDFS."; + String ROLL_REQUESTED = "rollRequest"; + String ROLL_REQUESTED_DESC = "How many times a log roll has been requested total"; + String LOW_REPLICA_ROLL_REQUESTED = "lowReplicaRollRequest"; + String LOW_REPLICA_ROLL_REQUESTED_DESC = + "How many times a log roll was requested due to too few DN's in the write pipeline."; /** * Add the append size. @@ -83,4 +88,8 @@ public interface MetricsWALSource extends BaseSource { */ void incrementSyncTime(long time); + void incrementLogRollRequested(); + + void incrementLowReplicationLogRoll(); + } diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/wal/MetricsWALSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/wal/MetricsWALSourceImpl.java index d602d2f..36c3571 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/wal/MetricsWALSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/wal/MetricsWALSourceImpl.java @@ -38,6 +38,8 @@ public class MetricsWALSourceImpl extends BaseSourceImpl implements MetricsWALSo private final MetricHistogram syncTimeHisto; private final MutableCounterLong appendCount; private final MutableCounterLong slowAppendCount; + private final MutableCounterLong logRollRequested; + private final MutableCounterLong lowReplicationLogRollRequested; public MetricsWALSourceImpl() { this(METRICS_NAME, METRICS_DESCRIPTION, METRICS_CONTEXT, METRICS_JMX_CONTEXT); @@ -53,8 +55,13 @@ public class MetricsWALSourceImpl extends BaseSourceImpl implements MetricsWALSo appendTimeHisto = this.getMetricsRegistry().newHistogram(APPEND_TIME, APPEND_TIME_DESC); appendSizeHisto = this.getMetricsRegistry().newHistogram(APPEND_SIZE, APPEND_SIZE_DESC); appendCount = this.getMetricsRegistry().newCounter(APPEND_COUNT, APPEND_COUNT_DESC, 0l); - slowAppendCount = this.getMetricsRegistry().newCounter(SLOW_APPEND_COUNT, SLOW_APPEND_COUNT_DESC, 0l); + slowAppendCount = + this.getMetricsRegistry().newCounter(SLOW_APPEND_COUNT, SLOW_APPEND_COUNT_DESC, 0l); syncTimeHisto = this.getMetricsRegistry().newHistogram(SYNC_TIME, SYNC_TIME_DESC); + logRollRequested = + this.getMetricsRegistry().newCounter(ROLL_REQUESTED, ROLL_REQUESTED_DESC, 0L); + lowReplicationLogRollRequested = this.getMetricsRegistry() + .newCounter(LOW_REPLICA_ROLL_REQUESTED, LOW_REPLICA_ROLL_REQUESTED_DESC, 0L); } @Override @@ -81,4 +88,14 @@ public class MetricsWALSourceImpl extends BaseSourceImpl implements MetricsWALSo public void incrementSyncTime(long time) { syncTimeHisto.add(time); } + + @Override + public void incrementLogRollRequested() { + logRollRequested.incr(); + } + + @Override + public void incrementLowReplicationLogRoll() { + lowReplicationLogRollRequested.incr(); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java index 12c7c56..6f5dfa4 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/LogRoller.java @@ -63,7 +63,7 @@ class LogRoller extends HasThread { if (null == walNeedsRoll.putIfAbsent(wal, Boolean.FALSE)) { wal.registerWALActionsListener(new WALActionsListener.Base() { @Override - public void logRollRequested() { + public void logRollRequested(boolean lowReplicas) { walNeedsRoll.put(wal, Boolean.TRUE); // TODO logs will contend with each other here, replace with e.g. DelayedQueue synchronized(rollLog) { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSHLog.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSHLog.java index 02cf41e..5b62d02 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSHLog.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSHLog.java @@ -1345,7 +1345,9 @@ public class FSHLog implements WAL { rollWriterLock.unlock(); } try { - if (lowReplication || writer != null && writer.getLength() > logrollsize) requestLogRoll(); + if (lowReplication || writer != null && writer.getLength() > logrollsize) { + requestLogRoll(lowReplication); + } } catch (IOException e) { LOG.warn("Writer.getLength() failed; continuing", e); } @@ -1561,9 +1563,13 @@ public class FSHLog implements WAL { // public only until class moves to o.a.h.h.wal public void requestLogRoll() { + requestLogRoll(false); + } + + private void requestLogRoll(boolean tooFewReplicas) { if (!this.listeners.isEmpty()) { for (WALActionsListener i: this.listeners) { - i.logRollRequested(); + i.logRollRequested(tooFewReplicas); } } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.java index 2194ce9..457d859 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.java @@ -67,7 +67,7 @@ public interface WALActionsListener { /** * A request was made that the WAL be rolled. */ - void logRollRequested(); + void logRollRequested(boolean tooFewReplicas); /** * The WAL is about to close. @@ -127,7 +127,7 @@ public interface WALActionsListener { public void postLogArchive(Path oldPath, Path newPath) throws IOException {} @Override - public void logRollRequested() {} + public void logRollRequested(boolean tooFewReplicas) {} @Override public void logCloseRequested() {} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/DisabledWALProvider.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/DisabledWALProvider.java index ac23916..70bfff1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/DisabledWALProvider.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/DisabledWALProvider.java @@ -110,7 +110,7 @@ class DisabledWALProvider implements WALProvider { public byte[][] rollWriter() { if (!listeners.isEmpty()) { for (WALActionsListener listener : listeners) { - listener.logRollRequested(); + listener.logRollRequested(false); } for (WALActionsListener listener : listeners) { try { -- 2.1.1