This is an automated email from the ASF dual-hosted git repository.

andor pushed a commit to branch HBASE-29081
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/HBASE-29081 by this push:
     new b536a339350 HBASE-29779: Call super coprocessor instead of returning 
for system table (#7555)
b536a339350 is described below

commit b536a339350be3620636e0ff8184e1736c1292ad
Author: Anuj Sharma <[email protected]>
AuthorDate: Fri Jan 9 22:45:25 2026 +0530

    HBASE-29779: Call super coprocessor instead of returning for system table 
(#7555)
    
    * HBASE-29779: Call super coprocessor instead of returning for system tables
    
    * 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.
    
    * Invert the methods name and add negation to caller
    
    * Instead of static variable comparison use the API from TableName class
    
    This is done do avoid any conflicts after the changes in
    HBASE-29691: Change TableName.META_TABLE_NAME from being a global static
---
 .../hbase/security/access/ReadOnlyController.java  |  95 ++++----
 .../TestReadOnlyControllerRegionObserver.java      | 258 ++++++++++++++++++++-
 2 files changed, 311 insertions(+), 42 deletions(-)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ReadOnlyController.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ReadOnlyController.java
index 3ec772798be..163d4267fae 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ReadOnlyController.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ReadOnlyController.java
@@ -106,6 +106,10 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
     }
   }
 
+  private boolean isOnMeta(final ObserverContext<? extends 
RegionCoprocessorEnvironment> c) {
+    return 
TableName.isMetaTableName(c.getEnvironment().getRegionInfo().getTable());
+  }
+
   @Override
   public void start(CoprocessorEnvironment env) throws IOException {
     if (env instanceof MasterCoprocessorEnvironment) {
@@ -130,24 +134,30 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
     return Optional.of(this);
   }
 
-  @Override
-  public void preFlush(final ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
-    FlushLifeCycleTracker tracker) throws IOException {
-    internalReadOnlyGuard();
-    RegionObserver.super.preFlush(c, tracker);
-  }
-
   @Override
   public void preFlushScannerOpen(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     Store store, ScanOptions options, FlushLifeCycleTracker tracker) throws 
IOException {
-    internalReadOnlyGuard();
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
     RegionObserver.super.preFlushScannerOpen(c, store, options, tracker);
   }
 
+  @Override
+  public void preFlush(final ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
+    FlushLifeCycleTracker tracker) throws IOException {
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
+    RegionObserver.super.preFlush(c, tracker);
+  }
+
   @Override
   public InternalScanner preFlush(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) 
throws IOException {
-    internalReadOnlyGuard();
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
     return RegionObserver.super.preFlush(c, store, scanner, tracker);
   }
 
@@ -178,7 +188,9 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   public void preCompactSelection(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     Store store, List<? extends StoreFile> candidates, 
CompactionLifeCycleTracker tracker)
     throws IOException {
-    internalReadOnlyGuard();
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
     RegionObserver.super.preCompactSelection(c, store, candidates, tracker);
   }
 
@@ -186,7 +198,9 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   public void preCompactScannerOpen(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     Store store, ScanType scanType, ScanOptions options, 
CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
-    internalReadOnlyGuard();
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
     RegionObserver.super.preCompactScannerOpen(c, store, scanType, options, 
tracker, request);
   }
 
@@ -194,60 +208,54 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   public InternalScanner preCompact(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     Store store, InternalScanner scanner, ScanType scanType, 
CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
-    internalReadOnlyGuard();
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
     return RegionObserver.super.preCompact(c, store, scanner, scanType, 
tracker, request);
   }
 
   @Override
   public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> 
c, Put put,
     WALEdit edit, Durability durability) throws IOException {
-    TableName tableName = c.getEnvironment().getRegionInfo().getTable();
-    if (tableName.isSystemTable()) {
-      return;
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
     }
-    internalReadOnlyGuard();
     RegionObserver.super.prePut(c, put, edit, durability);
   }
 
   @Override
   public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> 
c, Put put,
     WALEdit edit) throws IOException {
-    TableName tableName = c.getEnvironment().getRegionInfo().getTable();
-    if (tableName.isSystemTable()) {
-      return;
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
     }
-    internalReadOnlyGuard();
     RegionObserver.super.prePut(c, put, edit);
   }
 
   @Override
   public void preDelete(ObserverContext<? extends 
RegionCoprocessorEnvironment> c, Delete delete,
     WALEdit edit, Durability durability) throws IOException {
-    if (c.getEnvironment().getRegionInfo().getTable().isSystemTable()) {
-      return;
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
     }
-    internalReadOnlyGuard();
     RegionObserver.super.preDelete(c, delete, edit, durability);
   }
 
   @Override
   public void preDelete(ObserverContext<? extends 
RegionCoprocessorEnvironment> c, Delete delete,
     WALEdit edit) throws IOException {
-    if (c.getEnvironment().getRegionInfo().getTable().isSystemTable()) {
-      return;
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
     }
-    internalReadOnlyGuard();
     RegionObserver.super.preDelete(c, delete, edit);
   }
 
   @Override
   public void preBatchMutate(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
-    TableName tableName = c.getEnvironment().getRegionInfo().getTable();
-    if (tableName.isSystemTable()) {
-      return;
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
     }
-    internalReadOnlyGuard();
     RegionObserver.super.preBatchMutate(c, miniBatchOp);
   }
 
@@ -255,7 +263,9 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   public boolean preCheckAndPut(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     byte[] row, byte[] family, byte[] qualifier, CompareOperator op, 
ByteArrayComparable comparator,
     Put put, boolean result) throws IOException {
-    internalReadOnlyGuard();
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
     return RegionObserver.super.preCheckAndPut(c, row, family, qualifier, op, 
comparator, put,
       result);
   }
@@ -263,7 +273,9 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   @Override
   public boolean preCheckAndPut(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     byte[] row, Filter filter, Put put, boolean result) throws IOException {
-    internalReadOnlyGuard();
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
     return RegionObserver.super.preCheckAndPut(c, row, filter, put, result);
   }
 
@@ -272,7 +284,9 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
     ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, 
byte[] family,
     byte[] qualifier, CompareOperator op, ByteArrayComparable comparator, Put 
put, boolean result)
     throws IOException {
-    internalReadOnlyGuard();
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
     return RegionObserver.super.preCheckAndPutAfterRowLock(c, row, family, 
qualifier, op,
       comparator, put, result);
   }
@@ -281,7 +295,9 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   public boolean preCheckAndPutAfterRowLock(
     ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, 
Filter filter, Put put,
     boolean result) throws IOException {
-    internalReadOnlyGuard();
+    if (!isOnMeta(c)) {
+      internalReadOnlyGuard();
+    }
     return RegionObserver.super.preCheckAndPutAfterRowLock(c, row, filter, 
put, result);
   }
 
@@ -289,7 +305,7 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   public boolean preCheckAndDelete(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     byte[] row, byte[] family, byte[] qualifier, CompareOperator op, 
ByteArrayComparable comparator,
     Delete delete, boolean result) throws IOException {
-    if (!c.getEnvironment().getRegionInfo().getTable().isSystemTable()) {
+    if (!isOnMeta(c)) {
       internalReadOnlyGuard();
     }
     return RegionObserver.super.preCheckAndDelete(c, row, family, qualifier, 
op, comparator, delete,
@@ -299,7 +315,7 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   @Override
   public boolean preCheckAndDelete(ObserverContext<? extends 
RegionCoprocessorEnvironment> c,
     byte[] row, Filter filter, Delete delete, boolean result) throws 
IOException {
-    if (!c.getEnvironment().getRegionInfo().getTable().isSystemTable()) {
+    if (!isOnMeta(c)) {
       internalReadOnlyGuard();
     }
     return RegionObserver.super.preCheckAndDelete(c, row, filter, delete, 
result);
@@ -310,7 +326,7 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
     ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, 
byte[] family,
     byte[] qualifier, CompareOperator op, ByteArrayComparable comparator, 
Delete delete,
     boolean result) throws IOException {
-    if (!c.getEnvironment().getRegionInfo().getTable().isSystemTable()) {
+    if (!isOnMeta(c)) {
       internalReadOnlyGuard();
     }
     return RegionObserver.super.preCheckAndDeleteAfterRowLock(c, row, family, 
qualifier, op,
@@ -321,7 +337,7 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   public boolean preCheckAndDeleteAfterRowLock(
     ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, 
Filter filter,
     Delete delete, boolean result) throws IOException {
-    if (!c.getEnvironment().getRegionInfo().getTable().isSystemTable()) {
+    if (!isOnMeta(c)) {
       internalReadOnlyGuard();
     }
     return RegionObserver.super.preCheckAndDeleteAfterRowLock(c, row, filter, 
delete, result);
@@ -409,7 +425,8 @@ public class ReadOnlyController implements 
MasterCoprocessor, RegionCoprocessor,
   @Override
   public void preWALAppend(ObserverContext<? extends 
RegionCoprocessorEnvironment> ctx, WALKey key,
     WALEdit edit) throws IOException {
-    if (!key.getTableName().isSystemTable()) {
+    // Only allow this operation for meta table
+    if (!TableName.isMetaTableName(key.getTableName())) {
       internalReadOnlyGuard();
     }
     RegionObserver.super.preWALAppend(ctx, key, edit);
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestReadOnlyControllerRegionObserver.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestReadOnlyControllerRegionObserver.java
index 12fe32c0d23..cc9fa6f1a15 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestReadOnlyControllerRegionObserver.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestReadOnlyControllerRegionObserver.java
@@ -177,6 +177,10 @@ public class TestReadOnlyControllerRegionObserver {
 
   }
 
+  private void mockOperationForMetaTable() {
+    when(regionInfo.getTable()).thenReturn(TableName.META_TABLE_NAME);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreFlushV1ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -188,6 +192,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preFlush(c, flushLifeCycleTracker);
   }
 
+  @Test
+  public void testPreFlushV1ReadOnlyMetaNoException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preFlush(c, flushLifeCycleTracker);
+  }
+
+  @Test
+  public void testPreFlushV1MetaNoException() throws IOException {
+    readOnlyController.preFlush(c, flushLifeCycleTracker);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreFlushV2ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -199,6 +215,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preFlush(c, store, scanner, flushLifeCycleTracker);
   }
 
+  @Test
+  public void testPreFlushV2ReadOnlyMetaNoException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preFlush(c, store, scanner, flushLifeCycleTracker);
+  }
+
+  @Test
+  public void testPreFlushV2MetaNoException() throws IOException {
+    readOnlyController.preFlush(c, store, scanner, flushLifeCycleTracker);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreFlushScannerOpenReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -210,6 +238,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preFlushScannerOpen(c, store, options, 
flushLifeCycleTracker);
   }
 
+  @Test
+  public void testPreFlushScannerOpenReadOnlyMetaNoException() throws 
IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preFlushScannerOpen(c, store, options, 
flushLifeCycleTracker);
+  }
+
+  @Test
+  public void testPreFlushScannerOpenMetaNoException() throws IOException {
+    readOnlyController.preFlushScannerOpen(c, store, options, 
flushLifeCycleTracker);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreMemStoreCompactionReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -254,6 +294,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preCompactSelection(c, store, candidates, 
compactionLifeCycleTracker);
   }
 
+  @Test
+  public void testPreCompactSelectionReadOnlyMetaNoException() throws 
IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCompactSelection(c, store, candidates, 
compactionLifeCycleTracker);
+  }
+
+  @Test
+  public void testPreCompactSelectionMetaNoException() throws IOException {
+    readOnlyController.preCompactSelection(c, store, candidates, 
compactionLifeCycleTracker);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCompactScannerOpenReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -267,6 +319,20 @@ public class TestReadOnlyControllerRegionObserver {
       compactionLifeCycleTracker, compactionRequest);
   }
 
+  @Test
+  public void testPreCompactScannerOpenReadOnlyMetaNoException() throws 
IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCompactScannerOpen(c, store, scanType, options,
+      compactionLifeCycleTracker, compactionRequest);
+  }
+
+  @Test
+  public void testPreCompactScannerOpenMetaNoException() throws IOException {
+    readOnlyController.preCompactScannerOpen(c, store, scanType, options,
+      compactionLifeCycleTracker, compactionRequest);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCompactReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -280,6 +346,20 @@ public class TestReadOnlyControllerRegionObserver {
       compactionRequest);
   }
 
+  @Test
+  public void testPreCompactReadOnlyMetaNoException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCompact(c, store, scanner, scanType, 
compactionLifeCycleTracker,
+      compactionRequest);
+  }
+
+  @Test
+  public void testPreCompactMetaNoException() throws IOException {
+    readOnlyController.preCompact(c, store, scanner, scanType, 
compactionLifeCycleTracker,
+      compactionRequest);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPrePutV1ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -291,6 +371,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.prePut(c, put, edit);
   }
 
+  @Test
+  public void testPrePutV1ReadOnlyMetaNoException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.prePut(c, put, edit);
+  }
+
+  @Test
+  public void testPrePutV1MetaNoException() throws IOException {
+    readOnlyController.prePut(c, put, edit);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPrePutV2ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -302,6 +394,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.prePut(c, put, edit, durability);
   }
 
+  @Test
+  public void testPrePutV2ReadOnlyMetaNoException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.prePut(c, put, edit, durability);
+  }
+
+  @Test
+  public void testPrePutV2MetaNoException() throws IOException {
+    readOnlyController.prePut(c, put, edit, durability);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreDeleteV1ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -313,6 +417,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preDelete(c, delete, edit);
   }
 
+  @Test
+  public void testPreDeleteV1ReadOnlyMetaNoException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preDelete(c, delete, edit);
+  }
+
+  @Test
+  public void testPreDeleteV1MetaNoException() throws IOException {
+    readOnlyController.preDelete(c, delete, edit);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreDeleteV2ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -324,11 +440,41 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preDelete(c, delete, edit, durability);
   }
 
+  @Test
+  public void testPreDeleteV2ReadOnlyMetaNoException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preDelete(c, delete, edit, durability);
+  }
+
+  @Test
+  public void testPreDeleteV2MetaNoException() throws IOException {
+    readOnlyController.preDelete(c, delete, edit, durability);
+  }
+
+  @Test(expected = DoNotRetryIOException.class)
+  public void testPreBatchMutateReadOnlyException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    readOnlyController.preBatchMutate(c, miniBatchOp);
+  }
+
   @Test
   public void testPreBatchMutateNoException() throws IOException {
     readOnlyController.preBatchMutate(c, miniBatchOp);
   }
 
+  @Test
+  public void testPreBatchMutateReadOnlyMetaNoException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preBatchMutate(c, miniBatchOp);
+  }
+
+  @Test
+  public void testPreBatchMutateMetaNoException() throws IOException {
+    readOnlyController.preBatchMutate(c, miniBatchOp);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCheckAndPutV1ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -340,6 +486,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preCheckAndPut(c, row, family, qualifier, op, 
comparator, put, result);
   }
 
+  @Test
+  public void testPreCheckAndPutV1ReadOnlyMetaNoException() throws IOException 
{
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCheckAndPut(c, row, family, qualifier, op, 
comparator, put, result);
+  }
+
+  @Test
+  public void testPreCheckAndPutV1MetaNoException() throws IOException {
+    readOnlyController.preCheckAndPut(c, row, family, qualifier, op, 
comparator, put, result);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCheckAndPutV2ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -351,6 +509,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preCheckAndPut(c, row, filter, put, result);
   }
 
+  @Test
+  public void testPreCheckAndPutV2ReadOnlyMetaNoException() throws IOException 
{
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCheckAndPut(c, row, filter, put, result);
+  }
+
+  @Test
+  public void testPreCheckAndPutV2MetaNoException() throws IOException {
+    readOnlyController.preCheckAndPut(c, row, filter, put, result);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCheckAndPutAfterRowLockV1ReadOnlyException() throws 
IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -364,6 +534,20 @@ public class TestReadOnlyControllerRegionObserver {
       result);
   }
 
+  @Test
+  public void testPreCheckAndPutAfterRowLockV1ReadOnlyMetaNoException() throws 
IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCheckAndPutAfterRowLock(c, row, family, qualifier, 
op, comparator, put,
+      result);
+  }
+
+  @Test
+  public void testPreCheckAndPutAfterRowLockV1MetaNoException() throws 
IOException {
+    readOnlyController.preCheckAndPutAfterRowLock(c, row, family, qualifier, 
op, comparator, put,
+      result);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCheckAndPutAfterRowLockV2ReadOnlyException() throws 
IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -375,6 +559,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preCheckAndPutAfterRowLock(c, row, filter, put, result);
   }
 
+  @Test
+  public void testPreCheckAndPutAfterRowLockV2ReadOnlyMetaNoException() throws 
IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCheckAndPutAfterRowLock(c, row, filter, put, result);
+  }
+
+  @Test
+  public void testPreCheckAndPutAfterRowLockV2MetaNoException() throws 
IOException {
+    readOnlyController.preCheckAndPutAfterRowLock(c, row, filter, put, result);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCheckAndDeleteV1ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -386,6 +582,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preCheckAndDelete(c, row, family, qualifier, op, 
comparator, delete, result);
   }
 
+  @Test
+  public void testPreCheckAndDeleteV1ReadOnlyMetaNoException() throws 
IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCheckAndDelete(c, row, family, qualifier, op, 
comparator, delete, result);
+  }
+
+  @Test
+  public void testPreCheckAndDeleteV1MetaNoException() throws IOException {
+    readOnlyController.preCheckAndDelete(c, row, family, qualifier, op, 
comparator, delete, result);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCheckAndDeleteV2ReadOnlyException() throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -397,6 +605,18 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preCheckAndDelete(c, row, filter, delete, result);
   }
 
+  @Test
+  public void testPreCheckAndDeleteV2ReadOnlyMetaNoException() throws 
IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCheckAndDelete(c, row, filter, delete, result);
+  }
+
+  @Test
+  public void testPreCheckAndDeleteV2MetaNoException() throws IOException {
+    readOnlyController.preCheckAndDelete(c, row, filter, delete, result);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCheckAndDeleteAfterRowLockV1ReadOnlyException() throws 
IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -410,6 +630,20 @@ public class TestReadOnlyControllerRegionObserver {
       delete, result);
   }
 
+  @Test
+  public void testPreCheckAndDeleteAfterRowLockV1ReadOnlyMetaNoException() 
throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    mockOperationForMetaTable();
+    readOnlyController.preCheckAndDeleteAfterRowLock(c, row, family, 
qualifier, op, comparator,
+      delete, result);
+  }
+
+  @Test
+  public void testPreCheckAndDeleteAfterRowLockV1MetaNoException() throws 
IOException {
+    readOnlyController.preCheckAndDeleteAfterRowLock(c, row, family, 
qualifier, op, comparator,
+      delete, result);
+  }
+
   @Test(expected = DoNotRetryIOException.class)
   public void testPreCheckAndDeleteAfterRowLockV2ReadOnlyException() throws 
IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
@@ -421,10 +655,16 @@ public class TestReadOnlyControllerRegionObserver {
     readOnlyController.preCheckAndDeleteAfterRowLock(c, row, filter, delete, 
result);
   }
 
-  @Test(expected = DoNotRetryIOException.class)
-  public void testPreBatchMutateReadOnlyException() throws IOException {
+  @Test
+  public void testPreCheckAndDeleteAfterRowLockV2ReadOnlyMetaNoException() 
throws IOException {
     readOnlyController.onConfigurationChange(readOnlyConf);
-    readOnlyController.preBatchMutate(c, miniBatchOp);
+    mockOperationForMetaTable();
+    readOnlyController.preCheckAndDeleteAfterRowLock(c, row, filter, delete, 
result);
+  }
+
+  @Test
+  public void testPreCheckAndDeleteAfterRowLockV2MetaNoException() throws 
IOException {
+    readOnlyController.preCheckAndDeleteAfterRowLock(c, row, filter, delete, 
result);
   }
 
   @Test(expected = DoNotRetryIOException.class)
@@ -558,4 +798,16 @@ public class TestReadOnlyControllerRegionObserver {
   public void testPreWALAppendNoException() throws IOException {
     readOnlyController.preWALAppend(ctx, key, edit);
   }
+
+  @Test
+  public void testPreWALAppendReadOnlyMetaNoException() throws IOException {
+    readOnlyController.onConfigurationChange(readOnlyConf);
+    when(key.getTableName()).thenReturn(TableName.META_TABLE_NAME);
+    readOnlyController.preWALAppend(ctx, key, edit);
+  }
+
+  @Test
+  public void testPreWALAppendMetaNoException() throws IOException {
+    readOnlyController.preWALAppend(ctx, key, edit);
+  }
 }

Reply via email to