[
https://issues.apache.org/jira/browse/HBASE-24250?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17099419#comment-17099419
]
Huaxiang Sun commented on HBASE-24250:
--------------------------------------
Hi [~niuyulin], I added a unitest case and applied your patch. It still failed.
The reason is that two procedures are being executed at the same time.
{code:java}
index 86971431dc..a50006a5f4 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMetaFixer.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMetaFixer.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.function.BooleanSupplier;
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
@@ -31,6 +32,10 @@ import org.apache.hadoop.hbase.MetaTableAccessor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.RegionInfoBuilder;
+import org.apache.hadoop.hbase.client.Result;
+import
org.apache.hadoop.hbase.master.assignment.GCMultipleMergedRegionsProcedure;
+import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
+import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
import org.apache.hadoop.hbase.testclassification.LargeTests;
import org.apache.hadoop.hbase.testclassification.MasterTests;
import org.apache.hadoop.hbase.util.Threads;
@@ -164,15 +169,34 @@ public class TestMetaFixer {
assertEquals(1, MetaFixer.calculateMerges(10,
report.getOverlaps()).size());
MetaFixer fixer = new MetaFixer(services);
fixer.fixOverlaps(report);
+ CatalogJanitor cj = services.getCatalogJanitor();
await(10, () -> {
try {
- services.getCatalogJanitor().scan();
- final CatalogJanitor.Report postReport =
services.getCatalogJanitor().getLastReport();
- return postReport.isEmpty();
+ if (cj.scan() > 0) {
+ Map<RegionInfo, Result> mergedRegions =
cj.getLastReport().mergedRegions;
+ for (Map.Entry<RegionInfo, Result> e : mergedRegions.entrySet()) {
+ List<RegionInfo> parents =
MetaTableAccessor.getMergeRegions(e.getValue().rawCells());
+ if (parents != null) {
+ ProcedureExecutor<MasterProcedureEnv> pe =
services.getMasterProcedureExecutor();
+ pe.submitProcedure(new
GCMultipleMergedRegionsProcedure(pe.getEnvironment(),
+ e.getKey(), parents));
+ }
+ }
+ return true;
+ }
+ return false;
} catch (Exception e) {
throw new RuntimeException(e);
}
});
+
+ await(10, () -> {
+ return
services.getMasterProcedureExecutor().getActiveProcIds().isEmpty();
+ });
+
+ services.getCatalogJanitor().scan();
+ final CatalogJanitor.Report postReport =
services.getCatalogJanitor().getLastReport();
+ assertTrue(postReport.isEmpty());
}
/**
iMac-Pro:hbase hsun$ {code}
> CatalogJanitor resubmits GCMultipleMergedRegionsProcedure for the same region
> -----------------------------------------------------------------------------
>
> Key: HBASE-24250
> URL: https://issues.apache.org/jira/browse/HBASE-24250
> Project: HBase
> Issue Type: Bug
> Components: master
> Affects Versions: 2.2.4
> Environment: hdfs 3.1.3 with erasure coding
> hbase 2.2.4
> Reporter: Andrey Elenskiy
> Assignee: niuyulin
> Priority: Major
>
> If a lot of regions were merged (due to change of region sizes, for example),
> there can be a long backlog of procedures to clean up the merged regions. If
> going through this backlog is slower than the CatalogJanitor's scan interval,
> it will end resubmitting GCMultipleMergedRegionsProcedure for the same
> regions over and over again.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)