You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2019/11/15 11:08:10 UTC
[hbase] branch branch-2 updated: HBASE-23294
ReplicationBarrierCleaner should delete all the barriers for a removed
region which does not belong to any serial replication peer (#827)
This is an automated email from the ASF dual-hosted git repository.
zhangduo 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 e69431a HBASE-23294 ReplicationBarrierCleaner should delete all the barriers for a removed region which does not belong to any serial replication peer (#827)
e69431a is described below
commit e69431ae8cfdd7f6f0cb009b3f6904f1d3e59cba
Author: Duo Zhang <zh...@apache.org>
AuthorDate: Fri Nov 15 18:59:51 2019 +0800
HBASE-23294 ReplicationBarrierCleaner should delete all the barriers for a removed region which does not belong to any serial replication peer (#827)
Signed-off-by: stack <st...@apache.org>
---
.../master/cleaner/ReplicationBarrierCleaner.java | 21 ++++++++++++++------
.../cleaner/TestReplicationBarrierCleaner.java | 23 ++++++++++++++++++++++
2 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/ReplicationBarrierCleaner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/ReplicationBarrierCleaner.java
index ed631de..ff1da0b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/ReplicationBarrierCleaner.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/ReplicationBarrierCleaner.java
@@ -99,13 +99,22 @@ public class ReplicationBarrierCleaner extends ScheduledChore {
peerIds = peerManager.getSerialPeerIdsBelongsTo(tableName);
}
if (peerIds.isEmpty()) {
- // no serial replication, only keep the newest barrier
- Cell cell = result.getColumnLatestCell(HConstants.REPLICATION_BARRIER_FAMILY,
- HConstants.SEQNUM_QUALIFIER);
- metaTable.delete(new Delete(regionName).addFamily(HConstants.REPLICATION_BARRIER_FAMILY,
- cell.getTimestamp() - 1));
+ // no serial replication
+ // check if the region has already been removed, i.e, no catalog family
+ if (metaTable.exists(new Get(regionName).addFamily(HConstants.CATALOG_FAMILY))) {
+ // exists, then only keep the newest barrier
+ Cell cell = result.getColumnLatestCell(HConstants.REPLICATION_BARRIER_FAMILY,
+ HConstants.SEQNUM_QUALIFIER);
+ metaTable.delete(new Delete(regionName).addFamily(HConstants.REPLICATION_BARRIER_FAMILY,
+ cell.getTimestamp() - 1));
+ deletedBarriers += barriers.length - 1;
+ } else {
+ // not exists, delete all the barriers
+ metaTable
+ .delete(new Delete(regionName).addFamily(HConstants.REPLICATION_BARRIER_FAMILY));
+ deletedBarriers += barriers.length;
+ }
cleanedRows++;
- deletedBarriers += barriers.length - 1;
continue;
}
String encodedRegionName = RegionInfo.encodeRegionName(regionName);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestReplicationBarrierCleaner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestReplicationBarrierCleaner.java
index 6e0d648..52973e4 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestReplicationBarrierCleaner.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestReplicationBarrierCleaner.java
@@ -181,17 +181,21 @@ public class TestReplicationBarrierCleaner {
RegionInfo region11 =
RegionInfoBuilder.newBuilder(tableName1).setEndKey(Bytes.toBytes(1)).build();
addBarrier(region11, 10, 20, 30, 40, 50, 60);
+ fillCatalogFamily(region11);
RegionInfo region12 =
RegionInfoBuilder.newBuilder(tableName1).setStartKey(Bytes.toBytes(1)).build();
addBarrier(region12, 20, 30, 40, 50, 60, 70);
+ fillCatalogFamily(region12);
TableName tableName2 = TableName.valueOf(name.getMethodName() + "_2");
RegionInfo region21 =
RegionInfoBuilder.newBuilder(tableName2).setEndKey(Bytes.toBytes(1)).build();
addBarrier(region21, 100, 200, 300, 400);
+ fillCatalogFamily(region21);
RegionInfo region22 =
RegionInfoBuilder.newBuilder(tableName2).setStartKey(Bytes.toBytes(1)).build();
addBarrier(region22, 200, 300, 400, 500, 600);
+ fillCatalogFamily(region22);
@SuppressWarnings("unchecked")
ReplicationPeerManager peerManager =
@@ -285,6 +289,25 @@ public class TestReplicationBarrierCleaner {
Arrays.asList(region.getEncodedName()));
}
+ @Test
+ public void testDeleteRowForDeletedRegionNoPeers() throws IOException {
+ TableName tableName = TableName.valueOf(name.getMethodName());
+ RegionInfo region = RegionInfoBuilder.newBuilder(tableName).build();
+ addBarrier(region, 40, 50, 60);
+
+ ReplicationPeerManager peerManager = mock(ReplicationPeerManager.class);
+ ReplicationBarrierCleaner cleaner = create(peerManager);
+ cleaner.chore();
+
+ verify(peerManager, times(1)).getSerialPeerIdsBelongsTo(tableName);
+ // There are no peers, and no catalog family for this region either, so we should remove the
+ // barriers. And since there is no catalog family, after we delete the barrier family, the whole
+ // row is deleted.
+ try (Table table = UTIL.getConnection().getTable(TableName.META_TABLE_NAME)) {
+ assertFalse(table.exists(new Get(region.getRegionName())));
+ }
+ }
+
private static class WarnOnlyStoppable implements Stoppable {
@Override
public void stop(String why) {