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.ArrayList;
22 import java.util.LinkedList;
23 import java.util.List;
24
25 import org.apache.commons.lang.math.RandomUtils;
26 import org.apache.hadoop.hbase.ClusterStatus;
27 import org.apache.hadoop.hbase.ServerName;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31
32
33
34 public class UnbalanceRegionsAction extends Action {
35 private static final Logger LOG =
36 LoggerFactory.getLogger(UnbalanceRegionsAction.class);
37 private double fractionOfRegions;
38 private double fractionOfServers;
39
40
41
42
43
44
45
46 public UnbalanceRegionsAction(double fractionOfRegions, double fractionOfServers) {
47 this.fractionOfRegions = fractionOfRegions;
48 this.fractionOfServers = fractionOfServers;
49 }
50
51 @Override protected Logger getLogger() {
52 return LOG;
53 }
54
55 @Override
56 public void perform() throws Exception {
57 getLogger().info("Unbalancing regions");
58 ClusterStatus status = this.cluster.getClusterStatus();
59 List<ServerName> victimServers = new LinkedList<ServerName>(status.getServers());
60 int targetServerCount = (int)Math.ceil(fractionOfServers * victimServers.size());
61 List<ServerName> targetServers = new ArrayList<ServerName>(targetServerCount);
62 for (int i = 0; i < targetServerCount; ++i) {
63 int victimIx = RandomUtils.nextInt(victimServers.size());
64 targetServers.add(victimServers.remove(victimIx));
65 }
66 unbalanceRegions(status, victimServers, targetServers, fractionOfRegions);
67 }
68 }