You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zg...@apache.org on 2019/10/15 03:52:25 UTC

[hbase] branch branch-2 updated: HBASE-23155 May NPE when concurrent AsyncNonMetaRegionLocator#updateCachedLocationOnError (#718)

This is an automated email from the ASF dual-hosted git repository.

zghao pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new 18ff188  HBASE-23155 May NPE when concurrent AsyncNonMetaRegionLocator#updateCachedLocationOnError (#718)
18ff188 is described below

commit 18ff188d9d469b6d716cc27b8232cf5c82b53c63
Author: Guanghao Zhang <zg...@apache.org>
AuthorDate: Tue Oct 15 11:16:43 2019 +0800

    HBASE-23155 May NPE when concurrent AsyncNonMetaRegionLocator#updateCachedLocationOnError (#718)
---
 .../apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java  |  3 +++
 .../hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java     | 10 ++++++++++
 2 files changed, 13 insertions(+)

diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java
index c8adc79..0e10297 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java
@@ -570,6 +570,9 @@ class AsyncNonMetaRegionLocator {
     byte[] startKey = loc.getRegion().getStartKey();
     for (;;) {
       RegionLocations oldLocs = tableCache.cache.get(startKey);
+      if (oldLocs == null) {
+        return;
+      }
       HRegionLocation oldLoc = oldLocs.getRegionLocation(loc.getRegion().getReplicaId());
       if (!canUpdateOnError(loc, oldLoc)) {
         return;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java
index 042e067..6bc024a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java
@@ -399,4 +399,14 @@ public class TestAsyncNonMetaRegionLocator {
     assertArrayEquals(loc.getRegion().getStartKey(), EMPTY_START_ROW);
     assertArrayEquals(loc.getRegion().getEndKey(), EMPTY_END_ROW);
   }
+
+  @Test
+  public void testConcurrentUpdateCachedLocationOnError() throws Exception {
+    createSingleRegionTable();
+    HRegionLocation loc =
+        getDefaultRegionLocation(TABLE_NAME, EMPTY_START_ROW, RegionLocateType.CURRENT, false)
+            .get();
+    IntStream.range(0, 100).parallel()
+        .forEach(i -> LOCATOR.updateCachedLocationOnError(loc, new NotServingRegionException()));
+  }
 }