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.Collection;
22 import java.util.Collections;
23 import java.util.List;
24
25 import org.apache.commons.lang.math.RandomUtils;
26 import org.apache.hadoop.hbase.HRegionInfo;
27 import org.apache.hadoop.hbase.ServerName;
28 import org.apache.hadoop.hbase.TableName;
29 import org.apache.hadoop.hbase.chaos.factories.MonkeyConstants;
30 import org.apache.hadoop.hbase.client.Admin;
31 import org.apache.hadoop.hbase.util.Bytes;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35
36
37
38 public class MoveRegionsOfTableAction extends Action {
39 private static final Logger LOG =
40 LoggerFactory.getLogger(MoveRegionsOfTableAction.class);
41 private final long sleepTime;
42 private final TableName tableName;
43 private final long maxTime;
44
45 public MoveRegionsOfTableAction(TableName tableName) {
46 this(-1, MonkeyConstants.DEFAULT_MOVE_REGIONS_MAX_TIME, tableName);
47 }
48
49 @Override protected Logger getLogger() {
50 return LOG;
51 }
52
53 public MoveRegionsOfTableAction(long sleepTime, long maxSleepTime, TableName tableName) {
54 this.sleepTime = sleepTime;
55 this.tableName = tableName;
56 this.maxTime = maxSleepTime;
57 }
58
59 @Override
60 public void perform() throws Exception {
61 if (sleepTime > 0) {
62 Thread.sleep(sleepTime);
63 }
64
65 Admin admin = this.context.getHBaseIntegrationTestingUtility().getHBaseAdmin();
66 Collection<ServerName> serversList = admin.getClusterStatus().getServers();
67 ServerName[] servers = serversList.toArray(new ServerName[serversList.size()]);
68
69 getLogger().info("Performing action: Move regions of table " + tableName);
70 List<HRegionInfo> regions = admin.getTableRegions(tableName);
71 if (regions == null || regions.isEmpty()) {
72 getLogger().info("Table " + tableName + " doesn't have regions to move");
73 return;
74 }
75
76 Collections.shuffle(regions);
77
78 long start = System.currentTimeMillis();
79 for (HRegionInfo regionInfo:regions) {
80
81
82 if (context.isStopping()) {
83 return;
84 }
85
86 try {
87 String destServerName =
88 servers[RandomUtils.nextInt(servers.length)].getServerName();
89 getLogger().debug("Moving " + regionInfo.getRegionNameAsString() + " to " + destServerName);
90 admin.move(regionInfo.getEncodedNameAsBytes(), Bytes.toBytes(destServerName));
91 } catch (Exception ex) {
92 getLogger().warn("Move failed, might be caused by other chaos: " + ex.getMessage());
93 }
94 if (sleepTime > 0) {
95 Thread.sleep(sleepTime);
96 }
97
98
99
100 if (System.currentTimeMillis() - start > maxTime) {
101 break;
102 }
103 }
104 }
105 }