1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.chaos.actions;
20
21 import java.util.List;
22
23 import org.apache.commons.lang.math.RandomUtils;
24 import org.apache.hadoop.hbase.HBaseTestingUtility;
25 import org.apache.hadoop.hbase.HRegionInfo;
26 import org.apache.hadoop.hbase.TableName;
27 import org.apache.hadoop.hbase.client.Admin;
28
29
30
31
32 public class MergeRandomAdjacentRegionsOfTableAction extends Action {
33 private final TableName tableName;
34 private final long sleepTime;
35
36 public MergeRandomAdjacentRegionsOfTableAction(TableName tableName) {
37 this(-1, tableName);
38 }
39
40 public MergeRandomAdjacentRegionsOfTableAction(int sleepTime, TableName tableName) {
41 this.tableName = tableName;
42 this.sleepTime = sleepTime;
43 }
44
45 @Override
46 public void perform() throws Exception {
47 HBaseTestingUtility util = context.getHBaseIntegrationTestingUtility();
48 Admin admin = util.getHBaseAdmin();
49
50 LOG.info("Performing action: Merge random adjacent regions of table " + tableName);
51 List<HRegionInfo> regions = admin.getTableRegions(tableName);
52 if (regions == null || regions.size() < 2) {
53 LOG.info("Table " + tableName + " doesn't have enough regions to merge");
54 return;
55 }
56
57 int i = RandomUtils.nextInt(regions.size() - 1);
58 HRegionInfo a = regions.get(i++);
59 HRegionInfo b = regions.get(i);
60 LOG.debug("Merging " + a.getRegionNameAsString() + " and " + b.getRegionNameAsString());
61
62
63 if (context.isStopping()) {
64 return;
65 }
66
67 try {
68 admin.mergeRegions(a.getEncodedNameAsBytes(), b.getEncodedNameAsBytes(), false);
69 } catch (Exception ex) {
70 LOG.warn("Merge failed, might be caused by other chaos: " + ex.getMessage());
71 }
72 if (sleepTime > 0) {
73 Thread.sleep(sleepTime);
74 }
75 }
76 }