From 8a731954affbb2627b289e5807c3f7324180c641 Mon Sep 17 00:00:00 2001 From: Mikhail Antonov Date: Wed, 23 Mar 2016 17:24:16 -0700 Subject: [PATCH] HBASE-15524 Fix NPE in client-side metrics --- .../java/org/apache/hadoop/hbase/client/AsyncProcess.java | 12 +++++++++--- .../org/apache/hadoop/hbase/client/MetricsConnection.java | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) 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 9a67990..5e8a2bf 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 @@ -1175,9 +1175,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, - ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server); + 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 action : e.getValue()) { Retry retry = manageError( 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 b6efdb9..dc56246 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 @@ -61,6 +61,7 @@ public class MetricsConnection { 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. */ @@ -455,7 +456,8 @@ public class MetricsConnection { } public void incrCacheDroppingExceptions(Object exception) { - getMetric(CACHE_BASE + exception.getClass().getSimpleName(), + getMetric(CACHE_BASE + + (exception == null? UNKNOWN_EXCEPTION : exception.getClass().getSimpleName()), cacheDroppingExceptions, counterFactory).inc(); } } -- 2.8.0-rc2