HBASE-15524 Fix NPE in client-side metrics
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/db3ba652 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/db3ba652 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/db3ba652 Branch: refs/heads/hbase-12439 Commit: db3ba652f88083b0b1c57b4857f11fce7ae5b131 Parents: fd5c093 Author: Mikhail Antonov <anto...@apache.org> Authored: Wed Mar 23 21:23:54 2016 -0700 Committer: Mikhail Antonov <anto...@apache.org> Committed: Wed Mar 23 21:23:54 2016 -0700 ---------------------------------------------------------------------- .../hadoop/hbase/client/AsyncProcess.java | 26 +++++++++++++++++--- .../hadoop/hbase/client/MetricsConnection.java | 4 ++- 2 files changed, 25 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/db3ba652/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java index cb45cf7..142e2a0 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncProcess.java @@ -1190,9 +1190,15 @@ class AsyncProcess { byte[] row = e.getValue().iterator().next().getAction().getRow(); // Do not use the exception for updating cache because it might be coming from // any of the regions in the MultiAction. - if (tableName != null) { - connection.updateCachedLocations(tableName, regionName, row, + try { + if (tableName != null) { + connection.updateCachedLocations(tableName, regionName, row, ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server); + } + } catch (Throwable ex) { + // That should never happen, but if it did, we want to make sure + // we still process errors + LOG.error("Couldn't update cached region locations: " + ex); } for (Action<Row> action : e.getValue()) { Retry retry = manageError( @@ -1317,8 +1323,14 @@ class AsyncProcess { // Register corresponding failures once per server/once per region. if (!regionFailureRegistered) { regionFailureRegistered = true; - connection.updateCachedLocations( + try { + connection.updateCachedLocations( tableName, regionName, row.getRow(), result, server); + } catch (Throwable ex) { + // That should never happen, but if it did, we want to make sure + // we still process errors + LOG.error("Couldn't update cached region locations: " + ex); + } } if (failureCount == 0) { errorsByServer.reportServerError(server); @@ -1372,8 +1384,14 @@ class AsyncProcess { // for every possible exception that comes through, however. connection.clearCaches(server); } else { - connection.updateCachedLocations( + try { + connection.updateCachedLocations( tableName, region, actions.get(0).getAction().getRow(), throwable, server); + } catch (Throwable ex) { + // That should never happen, but if it did, we want to make sure + // we still process errors + LOG.error("Couldn't update cached region locations: " + ex); + } } failureCount += actions.size(); http://git-wip-us.apache.org/repos/asf/hbase/blob/db3ba652/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetricsConnection.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetricsConnection.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetricsConnection.java index 4467417..53a3326 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetricsConnection.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetricsConnection.java @@ -63,6 +63,7 @@ public class MetricsConnection implements StatisticTrackable { private static final String MEMLOAD_BASE = "memstoreLoad_"; private static final String HEAP_BASE = "heapOccupancy_"; private static final String CACHE_BASE = "cacheDroppingExceptions_"; + private static final String UNKNOWN_EXCEPTION = "UnknownException"; private static final String CLIENT_SVC = ClientService.getDescriptor().getName(); /** A container class for collecting details about the RPC call as it percolates. */ @@ -464,7 +465,8 @@ public class MetricsConnection implements StatisticTrackable { } public void incrCacheDroppingExceptions(Object exception) { - getMetric(CACHE_BASE + exception.getClass().getSimpleName(), + getMetric(CACHE_BASE + + (exception == null? UNKNOWN_EXCEPTION : exception.getClass().getSimpleName()), cacheDroppingExceptions, counterFactory).inc(); } }