You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2017/07/26 00:09:22 UTC

hbase git commit: HBASE-18247 Hbck to fix the case that replica region shows as key in the meta table

Repository: hbase
Updated Branches:
  refs/heads/branch-1 c7e1d67df -> 9427d6c73


HBASE-18247 Hbck to fix the case that replica region shows as key in the meta table

Change-Id: I2169290ec5a97a63747bc93ee37f36729c3ac916


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/9427d6c7
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/9427d6c7
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/9427d6c7

Branch: refs/heads/branch-1
Commit: 9427d6c73cffbd52fe6a057a126ef4e589e9db1e
Parents: c7e1d67
Author: huaxiang sun <hs...@cloudera.com>
Authored: Tue Jul 25 17:08:04 2017 -0700
Committer: Apekshit Sharma <ap...@apache.org>
Committed: Tue Jul 25 17:08:53 2017 -0700

----------------------------------------------------------------------
 .../apache/hadoop/hbase/MetaTableAccessor.java  | 10 +++++--
 .../apache/hadoop/hbase/util/TestHBaseFsck.java | 30 ++++++++++++++++++++
 2 files changed, 37 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/9427d6c7/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
index 9d32923..739291a 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
@@ -751,7 +751,7 @@ public class MetaTableAccessor {
     List<HRegionLocation> locations = new ArrayList<HRegionLocation>(1);
     NavigableMap<byte[],NavigableMap<byte[],byte[]>> familyMap = r.getNoVersionMap();
 
-    locations.add(getRegionLocation(r, regionInfo, 0));
+    locations.add(getRegionLocation(r, regionInfo, regionInfo.getReplicaId()));
 
     NavigableMap<byte[], byte[]> infoMap = familyMap.get(getFamily());
     if (infoMap == null) return new RegionLocations(locations);
@@ -1461,10 +1461,14 @@ public class MetaTableAccessor {
 
     // region replicas are kept in the primary region's row
     Put put = new Put(getMetaKeyForRegion(regionInfo), time);
-    addRegionInfo(put, regionInfo);
+    HRegionInfo defaultRegionInfo = regionInfo;
+    if (regionInfo.getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) {
+      defaultRegionInfo = new HRegionInfo(regionInfo, HRegionInfo.DEFAULT_REPLICA_ID);
+    }
+    addRegionInfo(put, defaultRegionInfo);
     addLocation(put, sn, openSeqNum, time, regionInfo.getReplicaId());
     putToMetaTable(connection, put);
-    LOG.info("Updated row " + regionInfo.getRegionNameAsString() +
+    LOG.info("Updated row " + defaultRegionInfo.getRegionNameAsString() +
       " with server=" + sn);
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/9427d6c7/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java
index 75f59f6..c0102de 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java
@@ -879,6 +879,36 @@ public class TestHBaseFsck {
     }
   }
 
+  /*
+   * This creates a table with region_replica > 1 and verifies hbck can fix replica region showing
+   * up as key in meta table.
+   */
+  @Test
+  public void testHbckReplicaRegionAsKeyInMeta() throws Exception {
+    TableName table = TableName.valueOf("testHbckReplicaRegionAsKeyInMeta");
+    try {
+      setupTableWithRegionReplica(table, 2);
+      TEST_UTIL.getHBaseAdmin().flush(table.getName());
+
+      HTable meta = new HTable(conf, TableName.META_TABLE_NAME);
+      HRegionInfo hri = new HRegionInfo(table, SPLITS[0], SPLITS[2], false, 1500328224175L, 1);
+      Put put = MetaTableAccessor.makePutFromRegionInfo(hri);
+      meta.put(put);
+
+      assertErrors(doFsck(conf, false),
+          new HBaseFsck.ErrorReporter.ERROR_CODE[] {
+              HBaseFsck.ErrorReporter.ERROR_CODE.EMPTY_META_CELL });
+
+      // fix the problem
+      doFsck(conf, true);
+
+      // run hbck again to make sure we don't see any errors
+      assertNoErrors(doFsck(conf, false));
+    } finally {
+      cleanupTable(table);
+    }
+  }
+
   @Test
   public void testHbckWithFewerReplica() throws Exception {
     TableName table =