Skip to content

Commit a0c20a2

Browse files
committed
Instead of system table just allow operation for hbase meta only
There are some other system tables such as acl or namespace which are shared with active cluster hence allowing operation with them in readonly cluster will make system inconsistent.
1 parent 84e8cb1 commit a0c20a2

File tree

2 files changed

+302
-30
lines changed

2 files changed

+302
-30
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ReadOnlyController.java

Lines changed: 47 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ private void internalReadOnlyGuard() throws IOException {
105105
}
106106
}
107107

108-
private boolean isOperationOnNonMetaTable(final ObserverContext<? extends RegionCoprocessorEnvironment> c){
108+
private boolean
109+
isOperationOnNonMetaTable(final ObserverContext<? extends RegionCoprocessorEnvironment> c) {
109110
return !c.getEnvironment().getRegionInfo().getTable().equals(TableName.META_TABLE_NAME);
110111
}
111112

@@ -134,25 +135,29 @@ public Optional<RegionObserver> getRegionObserver() {
134135
}
135136

136137
@Override
137-
public void preFlush(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
138-
FlushLifeCycleTracker tracker) throws IOException {
139-
if(isOperationOnNonMetaTable(c)){
138+
public void preFlushScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
139+
Store store, ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
140+
if (isOperationOnNonMetaTable(c)) {
140141
internalReadOnlyGuard();
141142
}
142-
RegionObserver.super.preFlush(c, tracker);
143+
RegionObserver.super.preFlushScannerOpen(c, store, options, tracker);
143144
}
144145

145146
@Override
146-
public void preFlushScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
147-
Store store, ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
148-
internalReadOnlyGuard();
149-
RegionObserver.super.preFlushScannerOpen(c, store, options, tracker);
147+
public void preFlush(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
148+
FlushLifeCycleTracker tracker) throws IOException {
149+
if (isOperationOnNonMetaTable(c)) {
150+
internalReadOnlyGuard();
151+
}
152+
RegionObserver.super.preFlush(c, tracker);
150153
}
151154

152155
@Override
153156
public InternalScanner preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
154157
Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
155-
internalReadOnlyGuard();
158+
if (isOperationOnNonMetaTable(c)) {
159+
internalReadOnlyGuard();
160+
}
156161
return RegionObserver.super.preFlush(c, store, scanner, tracker);
157162
}
158163

@@ -183,30 +188,36 @@ public InternalScanner preMemStoreCompactionCompact(
183188
public void preCompactSelection(ObserverContext<? extends RegionCoprocessorEnvironment> c,
184189
Store store, List<? extends StoreFile> candidates, CompactionLifeCycleTracker tracker)
185190
throws IOException {
186-
internalReadOnlyGuard();
191+
if (isOperationOnNonMetaTable(c)) {
192+
internalReadOnlyGuard();
193+
}
187194
RegionObserver.super.preCompactSelection(c, store, candidates, tracker);
188195
}
189196

190197
@Override
191198
public void preCompactScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
192199
Store store, ScanType scanType, ScanOptions options, CompactionLifeCycleTracker tracker,
193200
CompactionRequest request) throws IOException {
194-
internalReadOnlyGuard();
201+
if (isOperationOnNonMetaTable(c)) {
202+
internalReadOnlyGuard();
203+
}
195204
RegionObserver.super.preCompactScannerOpen(c, store, scanType, options, tracker, request);
196205
}
197206

198207
@Override
199208
public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
200209
Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
201210
CompactionRequest request) throws IOException {
202-
internalReadOnlyGuard();
211+
if (isOperationOnNonMetaTable(c)) {
212+
internalReadOnlyGuard();
213+
}
203214
return RegionObserver.super.preCompact(c, store, scanner, scanType, tracker, request);
204215
}
205216

206217
@Override
207218
public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
208219
WALEdit edit, Durability durability) throws IOException {
209-
if(isOperationOnNonMetaTable(c)){
220+
if (isOperationOnNonMetaTable(c)) {
210221
internalReadOnlyGuard();
211222
}
212223
RegionObserver.super.prePut(c, put, edit, durability);
@@ -215,7 +226,7 @@ public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Pu
215226
@Override
216227
public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
217228
WALEdit edit) throws IOException {
218-
if(isOperationOnNonMetaTable(c)){
229+
if (isOperationOnNonMetaTable(c)) {
219230
internalReadOnlyGuard();
220231
}
221232
RegionObserver.super.prePut(c, put, edit);
@@ -224,7 +235,7 @@ public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Pu
224235
@Override
225236
public void preDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c, Delete delete,
226237
WALEdit edit, Durability durability) throws IOException {
227-
if(isOperationOnNonMetaTable(c)){
238+
if (isOperationOnNonMetaTable(c)) {
228239
internalReadOnlyGuard();
229240
}
230241
RegionObserver.super.preDelete(c, delete, edit, durability);
@@ -233,7 +244,7 @@ public void preDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c,
233244
@Override
234245
public void preDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c, Delete delete,
235246
WALEdit edit) throws IOException {
236-
if(isOperationOnNonMetaTable(c)){
247+
if (isOperationOnNonMetaTable(c)) {
237248
internalReadOnlyGuard();
238249
}
239250
RegionObserver.super.preDelete(c, delete, edit);
@@ -242,7 +253,7 @@ public void preDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c,
242253
@Override
243254
public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
244255
MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
245-
if(isOperationOnNonMetaTable(c)){
256+
if (isOperationOnNonMetaTable(c)) {
246257
internalReadOnlyGuard();
247258
}
248259
RegionObserver.super.preBatchMutate(c, miniBatchOp);
@@ -252,15 +263,19 @@ public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironmen
252263
public boolean preCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> c,
253264
byte[] row, byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
254265
Put put, boolean result) throws IOException {
255-
internalReadOnlyGuard();
266+
if (isOperationOnNonMetaTable(c)) {
267+
internalReadOnlyGuard();
268+
}
256269
return RegionObserver.super.preCheckAndPut(c, row, family, qualifier, op, comparator, put,
257270
result);
258271
}
259272

260273
@Override
261274
public boolean preCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> c,
262275
byte[] row, Filter filter, Put put, boolean result) throws IOException {
263-
internalReadOnlyGuard();
276+
if (isOperationOnNonMetaTable(c)) {
277+
internalReadOnlyGuard();
278+
}
264279
return RegionObserver.super.preCheckAndPut(c, row, filter, put, result);
265280
}
266281

@@ -269,7 +284,9 @@ public boolean preCheckAndPutAfterRowLock(
269284
ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, byte[] family,
270285
byte[] qualifier, CompareOperator op, ByteArrayComparable comparator, Put put, boolean result)
271286
throws IOException {
272-
internalReadOnlyGuard();
287+
if (isOperationOnNonMetaTable(c)) {
288+
internalReadOnlyGuard();
289+
}
273290
return RegionObserver.super.preCheckAndPutAfterRowLock(c, row, family, qualifier, op,
274291
comparator, put, result);
275292
}
@@ -278,15 +295,17 @@ public boolean preCheckAndPutAfterRowLock(
278295
public boolean preCheckAndPutAfterRowLock(
279296
ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, Filter filter, Put put,
280297
boolean result) throws IOException {
281-
internalReadOnlyGuard();
298+
if (isOperationOnNonMetaTable(c)) {
299+
internalReadOnlyGuard();
300+
}
282301
return RegionObserver.super.preCheckAndPutAfterRowLock(c, row, filter, put, result);
283302
}
284303

285304
@Override
286305
public boolean preCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c,
287306
byte[] row, byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
288307
Delete delete, boolean result) throws IOException {
289-
if(isOperationOnNonMetaTable(c)){
308+
if (isOperationOnNonMetaTable(c)) {
290309
internalReadOnlyGuard();
291310
}
292311
return RegionObserver.super.preCheckAndDelete(c, row, family, qualifier, op, comparator, delete,
@@ -296,7 +315,7 @@ public boolean preCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvi
296315
@Override
297316
public boolean preCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c,
298317
byte[] row, Filter filter, Delete delete, boolean result) throws IOException {
299-
if(isOperationOnNonMetaTable(c)){
318+
if (isOperationOnNonMetaTable(c)) {
300319
internalReadOnlyGuard();
301320
}
302321
return RegionObserver.super.preCheckAndDelete(c, row, filter, delete, result);
@@ -307,7 +326,7 @@ public boolean preCheckAndDeleteAfterRowLock(
307326
ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, byte[] family,
308327
byte[] qualifier, CompareOperator op, ByteArrayComparable comparator, Delete delete,
309328
boolean result) throws IOException {
310-
if(isOperationOnNonMetaTable(c)){
329+
if (isOperationOnNonMetaTable(c)) {
311330
internalReadOnlyGuard();
312331
}
313332
return RegionObserver.super.preCheckAndDeleteAfterRowLock(c, row, family, qualifier, op,
@@ -318,7 +337,7 @@ public boolean preCheckAndDeleteAfterRowLock(
318337
public boolean preCheckAndDeleteAfterRowLock(
319338
ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, Filter filter,
320339
Delete delete, boolean result) throws IOException {
321-
if(isOperationOnNonMetaTable(c)){
340+
if (isOperationOnNonMetaTable(c)) {
322341
internalReadOnlyGuard();
323342
}
324343
return RegionObserver.super.preCheckAndDeleteAfterRowLock(c, row, filter, delete, result);
@@ -406,7 +425,8 @@ public void preCommitStoreFile(ObserverContext<? extends RegionCoprocessorEnviro
406425
@Override
407426
public void preWALAppend(ObserverContext<? extends RegionCoprocessorEnvironment> ctx, WALKey key,
408427
WALEdit edit) throws IOException {
409-
if (!key.getTableName().isSystemTable()) {
428+
// Only allow this operation for meta table
429+
if (!key.getTableName().equals(TableName.META_TABLE_NAME)) {
410430
internalReadOnlyGuard();
411431
}
412432
RegionObserver.super.preWALAppend(ctx, key, edit);

0 commit comments

Comments
 (0)