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.hadoop.hbase.HBaseTestingUtility;
24 import org.apache.hadoop.hbase.HRegionInfo;
25 import org.apache.hadoop.hbase.chaos.monkies.PolicyBasedChaosMonkey;
26 import org.apache.hadoop.hbase.client.HBaseAdmin;
27 import org.apache.hadoop.hbase.util.Bytes;
28
29
30
31
32 public class MoveRandomRegionOfTableAction extends Action {
33 private final long sleepTime;
34 private final byte[] tableNameBytes;
35 private final String tableName;
36
37 public MoveRandomRegionOfTableAction(String tableName) {
38 this(-1, tableName);
39 }
40
41 public MoveRandomRegionOfTableAction(long sleepTime, String tableName) {
42 this.sleepTime = sleepTime;
43 this.tableNameBytes = Bytes.toBytes(tableName);
44 this.tableName = tableName;
45 }
46
47 @Override
48 public void perform() throws Exception {
49 if (sleepTime > 0) {
50 Thread.sleep(sleepTime);
51 }
52
53 HBaseTestingUtility util = context.getHBaseIntegrationTestingUtility();
54 HBaseAdmin admin = util.getHBaseAdmin();
55
56 LOG.info("Performing action: Move random region of table " + tableName);
57 List<HRegionInfo> regions = admin.getTableRegions(tableNameBytes);
58 if (regions == null || regions.isEmpty()) {
59 LOG.info("Table " + tableName + " doesn't have regions to move");
60 return;
61 }
62
63 HRegionInfo region = PolicyBasedChaosMonkey.selectRandomItem(
64 regions.toArray(new HRegionInfo[regions.size()]));
65 LOG.debug("Unassigning region " + region.getRegionNameAsString());
66 admin.unassign(region.getRegionName(), false);
67 if (sleepTime > 0) {
68 Thread.sleep(sleepTime);
69 }
70 }
71 }