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.TableName;
28 import org.apache.hadoop.hbase.client.Admin;
29 import org.apache.hadoop.hbase.util.Bytes;
30
31
32
33
34 public class RemoveColumnAction extends Action {
35 private final TableName tableName;
36 private final Set<String> protectedColumns;
37 private Admin admin;
38 private Random random;
39
40 public RemoveColumnAction(TableName tableName, Set<String> protectedColumns) {
41 this.tableName = tableName;
42 this.protectedColumns = protectedColumns;
43 random = new Random();
44 }
45
46 @Override
47 public void init(ActionContext context) throws IOException {
48 super.init(context);
49 this.admin = context.getHBaseIntegrationTestingUtility().getHBaseAdmin();
50 }
51
52 @Override
53 public void perform() throws Exception {
54 HTableDescriptor tableDescriptor = admin.getTableDescriptor(tableName);
55 HColumnDescriptor[] columnDescriptors = tableDescriptor.getColumnFamilies();
56
57 if (columnDescriptors.length <= (protectedColumns == null ? 1 : protectedColumns.size())) {
58 return;
59 }
60
61 int index = random.nextInt(columnDescriptors.length);
62 while(protectedColumns != null &&
63 protectedColumns.contains(columnDescriptors[index].getNameAsString())) {
64 index = random.nextInt(columnDescriptors.length);
65 }
66 byte[] colDescName = columnDescriptors[index].getName();
67 LOG.debug("Performing action: Removing " + Bytes.toString(colDescName)+ " from "
68 + tableName.getNameAsString());
69 tableDescriptor.removeFamily(colDescName);
70
71
72 if (context.isStopping()) {
73 return;
74 }
75 admin.modifyTable(tableName, tableDescriptor);
76 }
77 }