1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.chaos.actions;
19
20 import java.io.IOException;
21 import java.util.concurrent.ThreadLocalRandom;
22 import org.apache.hadoop.hbase.HBaseTestingUtility;
23 import org.apache.hadoop.hbase.TableName;
24 import org.apache.hadoop.hbase.client.Admin;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 public class SplitAllRegionOfTableAction extends Action {
29 private static final Logger LOG =
30 LoggerFactory.getLogger(SplitAllRegionOfTableAction.class);
31 private static final int DEFAULT_MAX_SPLITS = 3;
32 private static final String MAX_SPLIT_KEY = "hbase.chaosmonkey.action.maxFullTableSplits";
33
34 private final TableName tableName;
35 private int maxFullTableSplits = DEFAULT_MAX_SPLITS;
36 private int splits = 0;
37
38 public SplitAllRegionOfTableAction(TableName tableName) {
39 this.tableName = tableName;
40 }
41
42
43 public void init(ActionContext context) throws IOException {
44 super.init(context);
45 this.maxFullTableSplits = getConf().getInt(MAX_SPLIT_KEY, DEFAULT_MAX_SPLITS);
46 }
47
48 @Override protected Logger getLogger() {
49 return LOG;
50 }
51
52 @Override
53 public void perform() throws Exception {
54 HBaseTestingUtility util = context.getHBaseIntegrationTestingUtility();
55 Admin admin = util.getHBaseAdmin();
56
57 if (context.isStopping()) {
58 return;
59 }
60
61
62
63 if (ThreadLocalRandom.current().nextDouble()
64 < (((double) splits) / ((double) maxFullTableSplits)) / ((double) 2)) {
65 splits++;
66 getLogger().info("Performing action: Split all regions of {}", tableName);
67 admin.split(tableName);
68 } else {
69 getLogger().info("Skipping split of all regions.");
70 }
71 }
72 }