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
29
30
31
32 public class UnbalanceRegionsAction extends Action {
33 private double fractionOfRegions;
34 private double fractionOfServers;
35
36
37
38
39
40
41
42 public UnbalanceRegionsAction(double fractionOfRegions, double fractionOfServers) {
43 this.fractionOfRegions = fractionOfRegions;
44 this.fractionOfServers = fractionOfServers;
45 }
46
47 @Override
48 public void perform() throws Exception {
49 LOG.info("Unbalancing regions");
50 ClusterStatus status = this.cluster.getClusterStatus();
51 List<ServerName> victimServers = new LinkedList<ServerName>(status.getServers());
52 int targetServerCount = (int)Math.ceil(fractionOfServers * victimServers.size());
53 List<ServerName> targetServers = new ArrayList<ServerName>(targetServerCount);
54 for (int i = 0; i < targetServerCount; ++i) {
55 int victimIx = RandomUtils.nextInt(victimServers.size());
56 targetServers.add(victimServers.remove(victimIx));
57 }
58 unbalanceRegions(status, victimServers, targetServers, fractionOfRegions);
59 }
60 }