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.io.IOException;
22 import java.util.Random;
23
24 import org.apache.hadoop.hbase.HColumnDescriptor;
25 import org.apache.hadoop.hbase.HTableDescriptor;
26 import org.apache.hadoop.hbase.client.HBaseAdmin;
27 import org.apache.hadoop.hbase.io.compress.Compression.Algorithm;
28 import org.apache.hadoop.hbase.util.Bytes;
29 import org.apache.hadoop.io.compress.Compressor;
30
31
32
33
34 public class ChangeCompressionAction extends Action {
35 private final byte[] tableName;
36 private final String tableNameString;
37
38 private HBaseAdmin admin;
39 private Random random;
40
41 public ChangeCompressionAction(String tableName) {
42 tableNameString = tableName;
43 this.tableName = Bytes.toBytes(tableName);
44 this.random = new Random();
45 }
46
47 @Override
48 public void init(ActionContext context) throws IOException {
49 super.init(context);
50 this.admin = context.getHBaseIntegrationTestingUtility().getHBaseAdmin();
51 }
52
53 @Override
54 public void perform() throws Exception {
55 HTableDescriptor tableDescriptor = admin.getTableDescriptor(tableName);
56 HColumnDescriptor[] columnDescriptors = tableDescriptor.getColumnFamilies();
57
58 if (columnDescriptors == null || columnDescriptors.length == 0) {
59 return;
60 }
61
62
63
64 Algorithm[] possibleAlgos = Algorithm.values();
65
66
67
68
69
70
71
72 Algorithm algo;
73 do {
74 algo = possibleAlgos[random.nextInt(possibleAlgos.length)];
75
76 try {
77 Compressor c = algo.getCompressor();
78
79
80 algo.returnCompressor(c);
81 break;
82 } catch (Throwable t) {
83 LOG.info("Performing action: Changing compression algorithms to " + algo +
84 " is not supported, pick another one");
85 }
86 } while (true);
87
88 LOG.debug("Performing action: Changing compression algorithms on "
89 + tableNameString + " to " + algo);
90 for (HColumnDescriptor descriptor : columnDescriptors) {
91 if (random.nextBoolean()) {
92 descriptor.setCompactionCompressionType(algo);
93 } else {
94 descriptor.setCompressionType(algo);
95 }
96 }
97
98 admin.modifyTable(tableName, tableDescriptor);
99 }
100 }