|
23 | 23 | import java.io.IOException;
|
24 | 24 | import java.util.Collections;
|
25 | 25 | import java.util.List;
|
| 26 | +import java.util.Map; |
26 | 27 | import java.util.function.BooleanSupplier;
|
27 | 28 | import org.apache.hadoop.hbase.HBaseClassTestRule;
|
28 | 29 | import org.apache.hadoop.hbase.HBaseTestingUtility;
|
|
31 | 32 | import org.apache.hadoop.hbase.TableName;
|
32 | 33 | import org.apache.hadoop.hbase.client.RegionInfo;
|
33 | 34 | import org.apache.hadoop.hbase.client.RegionInfoBuilder;
|
| 35 | +import org.apache.hadoop.hbase.client.Result; |
34 | 36 | import org.apache.hadoop.hbase.client.Table;
|
35 | 37 | import org.apache.hadoop.hbase.master.assignment.GCRegionProcedure;
|
| 38 | +import org.apache.hadoop.hbase.master.assignment.GCMultipleMergedRegionsProcedure; |
| 39 | +import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv; |
| 40 | +import org.apache.hadoop.hbase.procedure2.ProcedureExecutor; |
36 | 41 | import org.apache.hadoop.hbase.testclassification.LargeTests;
|
37 | 42 | import org.apache.hadoop.hbase.testclassification.MasterTests;
|
38 | 43 | import org.apache.hadoop.hbase.util.Threads;
|
@@ -168,18 +173,44 @@ public void testOverlap() throws Exception {
|
168 | 173 | assertEquals(1, MetaFixer.calculateMerges(10, report.getOverlaps()).size());
|
169 | 174 | MetaFixer fixer = new MetaFixer(services);
|
170 | 175 | fixer.fixOverlaps(report);
|
| 176 | + |
| 177 | + CatalogJanitor cj = services.getCatalogJanitor(); |
171 | 178 | await(10, () -> {
|
172 | 179 | try {
|
173 |
| - services.getCatalogJanitor().scan(); |
174 |
| - final CatalogJanitor.Report postReport = services.getCatalogJanitor().getLastReport(); |
175 |
| - return postReport.isEmpty(); |
| 180 | + if (cj.scan() > 0) { |
| 181 | + // It submits GC once, then it will immediately kick off another GC to test if |
| 182 | + // GCMultipleMergedRegionsProcedure is idempotent. If it is not, it will create |
| 183 | + // a hole. |
| 184 | + Map<RegionInfo, Result> mergedRegions = cj.getLastReport().mergedRegions; |
| 185 | + for (Map.Entry<RegionInfo, Result> e : mergedRegions.entrySet()) { |
| 186 | + List<RegionInfo> parents = MetaTableAccessor.getMergeRegions(e.getValue().rawCells()); |
| 187 | + if (parents != null) { |
| 188 | + ProcedureExecutor<MasterProcedureEnv> pe = services.getMasterProcedureExecutor(); |
| 189 | + pe.submitProcedure(new GCMultipleMergedRegionsProcedure(pe.getEnvironment(), |
| 190 | + e.getKey(), parents)); |
| 191 | + } |
| 192 | + } |
| 193 | + return true; |
| 194 | + } |
| 195 | + return false; |
176 | 196 | } catch (Exception e) {
|
177 | 197 | throw new RuntimeException(e);
|
178 | 198 | }
|
179 | 199 | });
|
180 | 200 |
|
| 201 | + // Wait until all GCs settled down |
| 202 | + await(10, () -> { |
| 203 | + return services.getMasterProcedureExecutor().getActiveProcIds().isEmpty(); |
| 204 | + }); |
| 205 | + |
| 206 | + // No orphan regions on FS |
181 | 207 | hbckChore.chore();
|
182 | 208 | assertEquals(0, hbckChore.getOrphanRegionsOnFS().size());
|
| 209 | + |
| 210 | + // No holes reported. |
| 211 | + cj.scan(); |
| 212 | + final CatalogJanitor.Report postReport = cj.getLastReport(); |
| 213 | + assertTrue(postReport.isEmpty()); |
183 | 214 | }
|
184 | 215 |
|
185 | 216 | /**
|
|
0 commit comments