From 29a3ff303799299ce42b57e85b2a2ac575dab474 Mon Sep 17 00:00:00 2001 From: Abhishek Singh Chouhan Date: Mon, 18 Sep 2017 15:02:11 +0530 Subject: [PATCH] HBASE-18796 Admin#isTableAvailable returns incorrect result before daughter regions are opened Signed-off-by: Andrew Purtell --- .../hadoop/hbase/MetaTableAccessor.java | 13 +++++- .../hadoop/hbase/TestMetaTableAccessor.java | 41 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) 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 1b81359d893..47fffa29842 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 @@ -1724,8 +1724,8 @@ public class MetaTableAccessor { Put putA = makePutFromRegionInfo(splitA); Put putB = makePutFromRegionInfo(splitB); - addLocation(putA, sn, 1, -1, splitA.getReplicaId()); //new regions, openSeqNum = 1 is fine. - addLocation(putB, sn, 1, -1, splitB.getReplicaId()); + addSequenceNum(putA, 1, -1, splitA.getReplicaId()); //new regions, openSeqNum = 1 is fine. + addSequenceNum(putB, 1, -1, splitB.getReplicaId()); // Add empty locations for region replicas of daughters so that number of replicas can be // cached whenever the primary region is looked up from meta @@ -2100,6 +2100,15 @@ public class MetaTableAccessor { return p.getClass().getSimpleName() + p.toJSON(); } + public static Put addSequenceNum(final Put p, long openSeqNum, long time, int replicaId) { + if (time <= 0) { + time = EnvironmentEdgeManager.currentTime(); + } + p.addImmutable(HConstants.CATALOG_FAMILY, getSeqNumColumn(replicaId), time, + Bytes.toBytes(openSeqNum)); + return p; + } + /** * Get replication position for a peer in a region. * @param connection connection we're using diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableAccessor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableAccessor.java index 6e9454f1083..a0cd2368e31 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableAccessor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableAccessor.java @@ -699,5 +699,46 @@ public class TestMetaTableAccessor { assertTrue(prevCalls < scheduler.numPriorityCalls); } } + + @Test + public void testEmptyMetaDaughterLocationDuringSplit() throws IOException { + long regionId = System.currentTimeMillis(); + ServerName serverName0 = ServerName.valueOf("foo", 60010, random.nextLong()); + HRegionInfo parent = new HRegionInfo(TableName.valueOf("table_foo"), HConstants.EMPTY_START_ROW, + HConstants.EMPTY_END_ROW, false, regionId, 0); + HRegionInfo splitA = new HRegionInfo(TableName.valueOf("table_foo"), HConstants.EMPTY_START_ROW, + Bytes.toBytes("a"), false, regionId + 1, 0); + HRegionInfo splitB = new HRegionInfo(TableName.valueOf("table_foo"), Bytes.toBytes("a"), + HConstants.EMPTY_END_ROW, false, regionId + 1, 0); + + Table meta = MetaTableAccessor.getMetaHTable(connection); + try { + List regionInfos = Lists.newArrayList(parent); + MetaTableAccessor.addRegionsToMeta(connection, regionInfos, 3); + + MetaTableAccessor.splitRegion(connection, parent, splitA, splitB, serverName0, 3, false); + Get get1 = new Get(splitA.getRegionName()); + Result resultA = meta.get(get1); + Cell serverCellA = resultA.getColumnLatestCell(HConstants.CATALOG_FAMILY, + MetaTableAccessor.getServerColumn(splitA.getReplicaId())); + Cell startCodeCellA = resultA.getColumnLatestCell(HConstants.CATALOG_FAMILY, + MetaTableAccessor.getStartCodeColumn(splitA.getReplicaId())); + assertNull(serverCellA); + assertNull(startCodeCellA); + + Get get2 = new Get(splitA.getRegionName()); + Result resultB = meta.get(get2); + Cell serverCellB = resultB.getColumnLatestCell(HConstants.CATALOG_FAMILY, + MetaTableAccessor.getServerColumn(splitB.getReplicaId())); + Cell startCodeCellB = resultB.getColumnLatestCell(HConstants.CATALOG_FAMILY, + MetaTableAccessor.getStartCodeColumn(splitB.getReplicaId())); + assertNull(serverCellB); + assertNull(startCodeCellB); + } finally { + if (meta != null) { + meta.close(); + } + } + } }