1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.zookeeper;
21
22 import com.google.protobuf.InvalidProtocolBufferException;
23
24 import org.apache.hadoop.classification.InterfaceAudience;
25 import org.apache.hadoop.hbase.TableName;
26 import org.apache.hadoop.hbase.exceptions.DeserializationException;
27 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
28 import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos;
29 import org.apache.zookeeper.KeeperException;
30
31 import java.util.HashSet;
32 import java.util.List;
33 import java.util.Set;
34
35
36
37
38
39
40
41
42 @InterfaceAudience.Private
43 public class ZKTableReadOnly {
44
45 private ZKTableReadOnly() {}
46
47
48
49
50
51
52
53
54
55
56 public static boolean isDisabledTable(final ZooKeeperWatcher zkw,
57 final TableName tableName)
58 throws KeeperException {
59 ZooKeeperProtos.Table.State state = getTableState(zkw, tableName);
60 return isTableState(ZooKeeperProtos.Table.State.DISABLED, state);
61 }
62
63
64
65
66
67
68
69
70
71
72 public static boolean isEnabledTable(final ZooKeeperWatcher zkw,
73 final TableName tableName)
74 throws KeeperException {
75 return getTableState(zkw, tableName) == ZooKeeperProtos.Table.State.ENABLED;
76 }
77
78
79
80
81
82
83
84
85
86
87
88 public static boolean isDisablingOrDisabledTable(final ZooKeeperWatcher zkw,
89 final TableName tableName)
90 throws KeeperException {
91 ZooKeeperProtos.Table.State state = getTableState(zkw, tableName);
92 return isTableState(ZooKeeperProtos.Table.State.DISABLING, state) ||
93 isTableState(ZooKeeperProtos.Table.State.DISABLED, state);
94 }
95
96
97
98
99
100
101 public static Set<TableName> getDisabledTables(ZooKeeperWatcher zkw)
102 throws KeeperException {
103 Set<TableName> disabledTables = new HashSet<TableName>();
104 List<String> children =
105 ZKUtil.listChildrenNoWatch(zkw, zkw.tableZNode);
106 for (String child: children) {
107 TableName tableName =
108 TableName.valueOf(child);
109 ZooKeeperProtos.Table.State state = getTableState(zkw, tableName);
110 if (state == ZooKeeperProtos.Table.State.DISABLED) disabledTables.add(tableName);
111 }
112 return disabledTables;
113 }
114
115
116
117
118
119
120 public static Set<TableName> getDisabledOrDisablingTables(ZooKeeperWatcher zkw)
121 throws KeeperException {
122 Set<TableName> disabledTables = new HashSet<TableName>();
123 List<String> children =
124 ZKUtil.listChildrenNoWatch(zkw, zkw.tableZNode);
125 for (String child: children) {
126 TableName tableName =
127 TableName.valueOf(child);
128 ZooKeeperProtos.Table.State state = getTableState(zkw, tableName);
129 if (state == ZooKeeperProtos.Table.State.DISABLED ||
130 state == ZooKeeperProtos.Table.State.DISABLING)
131 disabledTables.add(tableName);
132 }
133 return disabledTables;
134 }
135
136 static boolean isTableState(final ZooKeeperProtos.Table.State expectedState,
137 final ZooKeeperProtos.Table.State currentState) {
138 return currentState != null && currentState.equals(expectedState);
139 }
140
141
142
143
144
145
146
147 static ZooKeeperProtos.Table.State getTableState(final ZooKeeperWatcher zkw,
148 final TableName tableName)
149 throws KeeperException {
150 String znode = ZKUtil.joinZNode(zkw.tableZNode, tableName.getNameAsString());
151 byte [] data = ZKUtil.getData(zkw, znode);
152 if (data == null || data.length <= 0) return null;
153 try {
154 ProtobufUtil.expectPBMagicPrefix(data);
155 ZooKeeperProtos.Table.Builder builder = ZooKeeperProtos.Table.newBuilder();
156 int magicLen = ProtobufUtil.lengthOfPBMagic();
157 ZooKeeperProtos.Table t = builder.mergeFrom(data, magicLen, data.length - magicLen).build();
158 return t.getState();
159 } catch (InvalidProtocolBufferException e) {
160 KeeperException ke = new KeeperException.DataInconsistencyException();
161 ke.initCause(e);
162 throw ke;
163 } catch (DeserializationException e) {
164 throw ZKUtil.convert(e);
165 }
166 }
167 }