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 org.apache.commons.lang.math.RandomUtils;
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
29
30
31 public class CompactTableAction extends Action {
32 private static final Logger LOG = LoggerFactory.getLogger(CompactTableAction.class);
33
34 private final TableName tableName;
35 private final int majorRatio;
36 private final long sleepTime;
37
38 public CompactTableAction(TableName tableName, float majorRatio) {
39 this(-1, tableName, majorRatio);
40 }
41
42 public CompactTableAction(
43 int sleepTime, TableName tableName, float majorRatio) {
44 this.tableName = tableName;
45 this.majorRatio = (int) (100 * majorRatio);
46 this.sleepTime = sleepTime;
47 }
48
49 @Override protected Logger getLogger() {
50 return LOG;
51 }
52
53 @Override
54 public void perform() throws Exception {
55 HBaseTestingUtility util = context.getHBaseIntegrationTestingUtility();
56 Admin admin = util.getHBaseAdmin();
57 boolean major = RandomUtils.nextInt(100) < majorRatio;
58
59 getLogger().info("Performing action: Compact table " + tableName + ", major=" + major);
60 try {
61 if (major) {
62 admin.majorCompact(tableName);
63 } else {
64 admin.compact(tableName);
65 }
66 } catch (Exception ex) {
67 getLogger().warn("Compaction failed, might be caused by other chaos: " + ex.getMessage());
68 }
69 if (sleepTime > 0) {
70 Thread.sleep(sleepTime);
71 }
72 }
73 }