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 import java.util.Set;
24
25 import org.apache.hadoop.hbase.HColumnDescriptor;
26 import org.apache.hadoop.hbase.HTableDescriptor;
27 import org.apache.hadoop.hbase.client.HBaseAdmin;
28 import org.apache.hadoop.hbase.util.Bytes;
29
30
31
32
33 public class RemoveColumnAction extends Action {
34 private final byte[] tableName;
35 private final Set<String> protectedColumns;
36 private final String tableNameString;
37 private HBaseAdmin admin;
38 private Random random;
39
40 public RemoveColumnAction(String tableName, Set<String> protectedColumns) {
41 tableNameString = tableName;
42 this.tableName = Bytes.toBytes(tableName);
43 this.protectedColumns = protectedColumns;
44 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.length <= 1) {
59 return;
60 }
61
62 int index = random.nextInt(columnDescriptors.length);
63 while(protectedColumns != null &&
64 protectedColumns.contains(columnDescriptors[index].getNameAsString())) {
65 index = random.nextInt(columnDescriptors.length);
66 }
67 LOG.debug("Performing action: Removing " + columnDescriptors[index].getName() + " from "
68 + tableNameString);
69 tableDescriptor.removeFamily(columnDescriptors[index].getName());
70
71 admin.modifyTable(tableName, tableDescriptor);
72 }
73 }