You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2024/10/10 13:01:53 UTC

(hbase) branch master updated: HBASE-28862 Change the generic type for ObserverContext from 'RegionCoprocessorEnvironment' to '? extends RegionCoprocessorEnvironment' in RegionObserver (#6272)

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

zhangduo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new 402aa92d357 HBASE-28862 Change the generic type for ObserverContext from 'RegionCoprocessorEnvironment' to '? extends RegionCoprocessorEnvironment' in RegionObserver (#6272)
402aa92d357 is described below

commit 402aa92d3579be835a6ed1e7f7f5cc26f1e16113
Author: Duo Zhang <zh...@apache.org>
AuthorDate: Thu Oct 10 21:01:48 2024 +0800

    HBASE-28862 Change the generic type for ObserverContext from 'RegionCoprocessorEnvironment' to '? extends RegionCoprocessorEnvironment' in RegionObserver (#6272)
    
    Signed-off-by: Nick Dimiduk <nd...@apache.org>
---
 .../apache/hadoop/hbase/backup/BackupObserver.java |   4 +-
 .../example/ExampleRegionObserverWithMetrics.java  |  12 +-
 .../coprocessor/example/ScanModifyingObserver.java |   2 +-
 .../example/ValueRewritingObserver.java            |   6 +-
 .../example/WriteHeavyIncrementObserver.java       |  32 +--
 .../example/ZooKeeperScanPolicyObserver.java       |   8 +-
 .../hbase/mapreduce/IntegrationTestBulkLoad.java   |   6 +-
 .../hadoop/hbase/mapreduce/TestImportExport.java   |   2 +-
 .../TestImportTSVWithOperationAttributes.java      |   4 +-
 .../hbase/mapreduce/TestImportTSVWithTTLs.java     |   4 +-
 .../hbase/constraint/ConstraintProcessor.java      |   4 +-
 .../hadoop/hbase/coprocessor/EndpointObserver.java |   4 +-
 .../hadoop/hbase/coprocessor/MetaTableMetrics.java |  13 +-
 .../hadoop/hbase/coprocessor/RegionObserver.java   | 274 +++++++++++----------
 .../regionserver/ReplicationObserver.java          |   2 +-
 .../hbase/security/access/AccessController.java    |  86 ++++---
 .../security/visibility/VisibilityController.java  |  32 +--
 .../hadoop/hbase/tool/WriteSinkCoprocessor.java    |   5 +-
 .../AbstractTestAsyncTableRegionReplicasRead.java  |   6 +-
 .../hadoop/hbase/client/AbstractTestCITimeout.java |  26 +-
 .../hadoop/hbase/client/SleepAtFirstRpcCall.java   |   6 +-
 ...stAsyncNonMetaRegionLocatorConcurrenyLimit.java |   4 +-
 .../hbase/client/TestAsyncRegionLocator.java       |   2 +-
 .../hadoop/hbase/client/TestAsyncTableBatch.java   |   2 +-
 .../hbase/client/TestAsyncTableNoncedRetry.java    |   2 +-
 .../hbase/client/TestAsyncTableScanException.java  |   2 +-
 .../client/TestAsyncTableUseMetaReplicas.java      |   2 +-
 .../TestAvoidCellReferencesIntoShippedBlocks.java  |   4 +-
 .../hbase/client/TestBlockEvictionFromClient.java  |  10 +-
 .../hbase/client/TestClientOperationInterrupt.java |   4 +-
 .../hbase/client/TestConnectionAttributes.java     |   2 +-
 .../hbase/client/TestDropTimeoutRequest.java       |   4 +-
 .../hadoop/hbase/client/TestFromClientSide3.java   |   9 +-
 ...oneSnapshotFromClientCloneLinksAfterDelete.java |   2 +-
 .../hbase/client/TestReplicaWithCluster.java       |  16 +-
 .../hadoop/hbase/client/TestReplicasClient.java    |  10 +-
 .../hadoop/hbase/client/TestRequestAttributes.java |   8 +-
 .../hbase/client/TestResultFromCoprocessor.java    |   4 +-
 .../hbase/client/TestServerBusyException.java      |  16 +-
 .../hbase/client/TestTableOperationException.java  |  28 +--
 .../hbase/coprocessor/SimpleRegionObserver.java    | 219 ++++++++--------
 .../hbase/coprocessor/TestAppendTimeRange.java     |   2 +-
 .../coprocessor/TestCoprocessorInterface.java      |  29 ++-
 .../hbase/coprocessor/TestCoprocessorMetrics.java  |   2 +-
 .../TestIncrementAndAppendWithNullResult.java      |  13 +-
 .../hbase/coprocessor/TestIncrementTimeRange.java  |   2 +-
 ...estNegativeMemStoreSizeWithSlowCoprocessor.java |   4 +-
 .../coprocessor/TestOpenTableInCoprocessor.java    |   8 +-
 .../TestPostIncrementAndAppendBeforeWAL.java       |  12 +-
 .../TestRegionCoprocessorQuotaUsage.java           |   2 +-
 .../coprocessor/TestRegionObserverBypass.java      |   4 +-
 ...ObserverForAddingMutationsFromCoprocessors.java |  10 +-
 .../coprocessor/TestRegionObserverInterface.java   |   8 +-
 .../TestRegionObserverPreFlushAndPreCompact.java   |   8 +-
 .../TestRegionObserverScannerOpenHook.java         |  12 +-
 .../coprocessor/TestRegionObserverStacking.java    |  12 +-
 ...tRegionServerCoprocessorExceptionWithAbort.java |   4 +-
 ...RegionServerCoprocessorExceptionWithRemove.java |   4 +-
 .../master/TestMasterAbortAndRSGotKilled.java      |   4 +-
 .../TestMasterHandlerFullWhenTransitRegion.java    |   3 +-
 .../assignment/TestExceptionInAssignRegion.java    |   2 +-
 .../TestExceptionInUnassignedRegion.java           |   3 +-
 .../assignment/TestSplitTableRegionProcedure.java  |   3 +-
 .../master/procedure/TestProcedurePriority.java    |   6 +-
 .../hbase/namespace/TestNamespaceAuditor.java      |   2 +-
 .../hbase/regionserver/NoOpScanPolicyObserver.java |   8 +-
 .../regionserver/TestBulkLoadReplication.java      |   2 +-
 .../TestCompactionLifeCycleTracker.java            |  15 +-
 .../TestCompactionWithShippingCoprocessor.java     |   4 +-
 .../regionserver/TestFlushLifeCycleTracker.java    |  10 +-
 .../regionserver/TestHRegionServerBulkLoad.java    |   4 +-
 .../hbase/regionserver/TestRegionInterrupt.java    |  14 +-
 .../hbase/regionserver/TestRegionServerAbort.java  |   4 +-
 .../regionserver/TestRegionServerAbortTimeout.java |   4 +-
 .../TestRegionServerReadRequestMetrics.java        |   2 +-
 .../TestRegionServerRejectDuringAbort.java         |   4 +-
 .../regionserver/TestScannerRetriableFailure.java  |   2 +-
 .../regionserver/TestScannerWithCorruptHFile.java  |   2 +-
 .../TestSettingTimeoutOnBlockingPoint.java         |   5 +-
 .../apache/hadoop/hbase/regionserver/TestTags.java |  14 +-
 .../TestRegionReplicationForWriteException.java    |   2 +-
 .../hbase/replication/TestMasterReplication.java   |  10 +-
 .../hbase/replication/TestReplicationWithTags.java |   6 +-
 .../TestReplicationWithWALExtendedAttributes.java  |  10 +-
 .../TestVisibilityLabelsReplication.java           |   6 +-
 .../hbase/util/TestCoprocessorScanPolicy.java      |  16 +-
 .../hbase/thrift/ErrorThrowingGetObserver.java     |   4 +-
 .../thrift2/TestThriftHBaseServiceHandler.java     |   2 +-
 88 files changed, 621 insertions(+), 576 deletions(-)

diff --git a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupObserver.java b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupObserver.java
index 73f97365adb..310e2c6e5c2 100644
--- a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupObserver.java
+++ b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupObserver.java
@@ -52,7 +52,7 @@ public class BackupObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void postBulkLoadHFile(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  public void postBulkLoadHFile(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     List<Pair<byte[], String>> stagingFamilyPaths, Map<byte[], List<Path>> finalPaths)
     throws IOException {
     Configuration cfg = ctx.getEnvironment().getConfiguration();
@@ -82,7 +82,7 @@ public class BackupObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void preCommitStoreFile(final ObserverContext<RegionCoprocessorEnvironment> ctx,
+  public void preCommitStoreFile(final ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     final byte[] family, final List<Pair<Path, Path>> pairs) throws IOException {
     Configuration cfg = ctx.getEnvironment().getConfiguration();
     if (pairs == null || pairs.isEmpty() || !BackupManager.isBackupEnabled(cfg)) {
diff --git a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ExampleRegionObserverWithMetrics.java b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ExampleRegionObserverWithMetrics.java
index 7074164e43e..f7c4b7d85d3 100644
--- a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ExampleRegionObserverWithMetrics.java
+++ b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ExampleRegionObserverWithMetrics.java
@@ -64,14 +64,14 @@ public class ExampleRegionObserverWithMetrics implements RegionCoprocessor {
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
       List<Cell> results) throws IOException {
       // Increment the Counter whenever the coprocessor is called
       preGetCounter.increment();
     }
 
     @Override
-    public void postGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get,
+    public void postGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
       List<Cell> results) throws IOException {
       // do a costly (high latency) operation which we want to measure how long it takes by
       // using a Timer (which is a Meter and a Histogram).
@@ -84,20 +84,20 @@ public class ExampleRegionObserverWithMetrics implements RegionCoprocessor {
     }
 
     @Override
-    public void postFlush(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void postFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       FlushLifeCycleTracker tracker) throws IOException {
       flushCounter.increment();
     }
 
     @Override
-    public void postFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
+    public void postFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store,
       StoreFile resultFile, FlushLifeCycleTracker tracker) throws IOException {
       flushCounter.increment();
     }
 
     @Override
-    public void postCompactSelection(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      List<? extends StoreFile> selected, CompactionLifeCycleTracker tracker,
+    public void postCompactSelection(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, List<? extends StoreFile> selected, CompactionLifeCycleTracker tracker,
       CompactionRequest request) {
       if (selected != null) {
         filesCompactedCounter.increment(selected.size());
diff --git a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ScanModifyingObserver.java b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ScanModifyingObserver.java
index 34a307b7638..5fae3f68977 100644
--- a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ScanModifyingObserver.java
+++ b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ScanModifyingObserver.java
@@ -56,7 +56,7 @@ public class ScanModifyingObserver implements RegionCoprocessor, RegionObserver
   }
 
   @Override
-  public void preScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Scan scan)
+  public void preScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c, Scan scan)
     throws IOException {
     // Add another family:qualifier
     scan.addColumn(FAMILY_TO_ADD, QUALIFIER_TO_ADD);
diff --git a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ValueRewritingObserver.java b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ValueRewritingObserver.java
index a3c4010d69a..d1c586347d6 100644
--- a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ValueRewritingObserver.java
+++ b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ValueRewritingObserver.java
@@ -70,9 +70,9 @@ public class ValueRewritingObserver implements RegionObserver, RegionCoprocessor
   }
 
   @Override
-  public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    final InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
-    CompactionRequest request) {
+  public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, final InternalScanner scanner, ScanType scanType,
+    CompactionLifeCycleTracker tracker, CompactionRequest request) {
     InternalScanner modifyingScanner = new InternalScanner() {
       @Override
       public boolean next(List<? super ExtendedCell> result, ScannerContext scannerContext)
diff --git a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.java b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.java
index fcb976a4c53..3105b088c5e 100644
--- a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.java
+++ b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.java
@@ -75,8 +75,8 @@ public class WriteHeavyIncrementObserver implements RegionCoprocessor, RegionObs
   }
 
   @Override
-  public void preFlushScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
+  public void preFlushScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
     options.readAllVersions();
   }
 
@@ -154,42 +154,42 @@ public class WriteHeavyIncrementObserver implements RegionCoprocessor, RegionObs
   }
 
   @Override
-  public InternalScanner preFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
+  public InternalScanner preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
     return wrap(store.getColumnFamilyDescriptor().getName(), scanner);
   }
 
   @Override
-  public void preCompactScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    ScanType scanType, ScanOptions options, CompactionLifeCycleTracker tracker,
+  public void preCompactScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, ScanType scanType, ScanOptions options, CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
     options.readAllVersions();
   }
 
   @Override
-  public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+  public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
     return wrap(store.getColumnFamilyDescriptor().getName(), scanner);
   }
 
   @Override
   public void preMemStoreCompactionCompactScannerOpen(
-    ObserverContext<RegionCoprocessorEnvironment> c, Store store, ScanOptions options)
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store, ScanOptions options)
     throws IOException {
     options.readAllVersions();
   }
 
   @Override
   public InternalScanner preMemStoreCompactionCompact(
-    ObserverContext<RegionCoprocessorEnvironment> c, Store store, InternalScanner scanner)
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store, InternalScanner scanner)
     throws IOException {
     return wrap(store.getColumnFamilyDescriptor().getName(), scanner);
   }
 
   @Override
-  public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get, List<Cell> result)
-    throws IOException {
+  public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
+    List<Cell> result) throws IOException {
     Scan scan =
       new Scan().withStartRow(get.getRow()).withStopRow(get.getRow(), true).readAllVersions();
     NavigableMap<byte[], NavigableMap<byte[], MutableLong>> sums =
@@ -249,8 +249,8 @@ public class WriteHeavyIncrementObserver implements RegionCoprocessor, RegionObs
   }
 
   @Override
-  public Result preIncrement(ObserverContext<RegionCoprocessorEnvironment> c, Increment increment)
-    throws IOException {
+  public Result preIncrement(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Increment increment) throws IOException {
     byte[] row = increment.getRow();
     Put put = new Put(row);
     long ts = getUniqueTimestamp(row);
@@ -270,8 +270,8 @@ public class WriteHeavyIncrementObserver implements RegionCoprocessor, RegionObs
   }
 
   @Override
-  public void preStoreScannerOpen(ObserverContext<RegionCoprocessorEnvironment> ctx, Store store,
-    ScanOptions options) throws IOException {
+  public void preStoreScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
+    Store store, ScanOptions options) throws IOException {
     options.readAllVersions();
   }
 }
diff --git a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ZooKeeperScanPolicyObserver.java b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ZooKeeperScanPolicyObserver.java
index fa7ccf73736..1fba63d054a 100644
--- a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ZooKeeperScanPolicyObserver.java
+++ b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/ZooKeeperScanPolicyObserver.java
@@ -177,14 +177,14 @@ public class ZooKeeperScanPolicyObserver implements RegionCoprocessor, RegionObs
   }
 
   @Override
-  public void preFlushScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
+  public void preFlushScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
     resetTTL(options);
   }
 
   @Override
-  public void preCompactScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    ScanType scanType, ScanOptions options, CompactionLifeCycleTracker tracker,
+  public void preCompactScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, ScanType scanType, ScanOptions options, CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
     resetTTL(options);
   }
diff --git a/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java b/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java
index 4da9244a6cd..4828bd602f4 100644
--- a/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java
+++ b/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java
@@ -145,7 +145,7 @@ public class IntegrationTestBulkLoad extends IntegrationTestBase {
     }
 
     @Override
-    public void preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preScannerOpen(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Scan scan) throws IOException {
       if (countOfOpen.incrementAndGet() == 2) { // slowdown openScanner randomly
         slowdownCode(e);
@@ -153,7 +153,7 @@ public class IntegrationTestBulkLoad extends IntegrationTestBase {
     }
 
     @Override
-    public boolean preScannerNext(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public boolean preScannerNext(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final InternalScanner s, final List<Result> results, final int limit, final boolean hasMore)
       throws IOException {
       // this will slow down a certain next operation if the conditions are met. The slowness
@@ -165,7 +165,7 @@ public class IntegrationTestBulkLoad extends IntegrationTestBase {
       return true;
     }
 
-    protected void slowdownCode(final ObserverContext<RegionCoprocessorEnvironment> e) {
+    protected void slowdownCode(final ObserverContext<? extends RegionCoprocessorEnvironment> e) {
       if (e.getEnvironment().getRegion().getRegionInfo().getReplicaId() == 0) {
         try {
           if (sleepTime.get() > 0) {
diff --git a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java
index 43b5fcea805..3830a23b7ec 100644
--- a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java
@@ -865,7 +865,7 @@ public class TestImportExport {
     }
 
     @Override
-    public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       if (c.getEnvironment().getRegion().getRegionInfo().getTable().isSystemTable()) {
         return;
diff --git a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java
index a7b977620a1..7b005089732 100644
--- a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java
@@ -256,8 +256,8 @@ public class TestImportTSVWithOperationAttributes implements Configurable {
     }
 
     @Override
-    public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit,
-      Durability durability) throws IOException {
+    public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> e, Put put,
+      WALEdit edit, Durability durability) throws IOException {
       Region region = e.getEnvironment().getRegion();
       if (
         !region.getRegionInfo().isMetaRegion() && !region.getRegionInfo().getTable().isSystemTable()
diff --git a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java
index 0c96324c241..9ac8f35a91d 100644
--- a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java
@@ -168,8 +168,8 @@ public class TestImportTSVWithTTLs implements Configurable {
     }
 
     @Override
-    public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit,
-      Durability durability) throws IOException {
+    public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> e, Put put,
+      WALEdit edit, Durability durability) throws IOException {
       Region region = e.getEnvironment().getRegion();
       if (
         !region.getRegionInfo().isMetaRegion() && !region.getRegionInfo().getTable().isSystemTable()
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/ConstraintProcessor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/ConstraintProcessor.java
index 81ed9592d27..481179d6dc5 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/ConstraintProcessor.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/ConstraintProcessor.java
@@ -87,8 +87,8 @@ public class ConstraintProcessor implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit,
-    Durability durability) throws IOException {
+  public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> e, Put put,
+    WALEdit edit, Durability durability) throws IOException {
     // check the put against the stored constraints
     for (Constraint c : constraints) {
       c.check(put);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/EndpointObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/EndpointObserver.java
index a821593d530..c21b34355f7 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/EndpointObserver.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/EndpointObserver.java
@@ -58,7 +58,7 @@ public interface EndpointObserver {
    * @param methodName the invoked service method
    * @return the possibly modified message
    */
-  default Message preEndpointInvocation(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  default Message preEndpointInvocation(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     Service service, String methodName, Message request) throws IOException {
     return request;
   }
@@ -74,7 +74,7 @@ public interface EndpointObserver {
    * @param responseBuilder Builder for final response to the client, with original response from
    *                        Service's method merged into it.
    */
-  default void postEndpointInvocation(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  default void postEndpointInvocation(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     Service service, String methodName, Message request, Message.Builder responseBuilder)
     throws IOException {
   }
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.java
index 499f8e4e31f..3cac1f319da 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.java
@@ -77,24 +77,25 @@ public class MetaTableMetrics implements RegionCoprocessor {
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
       List<Cell> results) throws IOException {
       registerAndMarkMetrics(e, get);
     }
 
     @Override
-    public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit,
-      Durability durability) throws IOException {
+    public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> e, Put put,
+      WALEdit edit, Durability durability) throws IOException {
       registerAndMarkMetrics(e, put);
     }
 
     @Override
-    public void preDelete(ObserverContext<RegionCoprocessorEnvironment> e, Delete delete,
+    public void preDelete(ObserverContext<? extends RegionCoprocessorEnvironment> e, Delete delete,
       WALEdit edit, Durability durability) {
       registerAndMarkMetrics(e, delete);
     }
 
-    private void registerAndMarkMetrics(ObserverContext<RegionCoprocessorEnvironment> e, Row row) {
+    private void registerAndMarkMetrics(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      Row row) {
       if (!active || !isMetaTableOp(e)) {
         return;
       }
@@ -131,7 +132,7 @@ public class MetaTableMetrics implements RegionCoprocessor {
       return splits.length > 2 ? splits[2] : null;
     }
 
-    private boolean isMetaTableOp(ObserverContext<RegionCoprocessorEnvironment> e) {
+    private boolean isMetaTableOp(ObserverContext<? extends RegionCoprocessorEnvironment> e) {
       return TableName.META_TABLE_NAME.equals(e.getEnvironment().getRegionInfo().getTable());
     }
 
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionObserver.java
index 542888e4aed..65fe524d0a4 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionObserver.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionObserver.java
@@ -98,9 +98,6 @@ import org.apache.yetus.audience.InterfaceStability;
  */
 @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)
 @InterfaceStability.Evolving
-// TODO as method signatures need to break, update to
-// ObserverContext<? extends RegionCoprocessorEnvironment>
-// so we can use additional environment state that isn't exposed to coprocessors.
 public interface RegionObserver {
   /** Mutation type for postMutationBeforeWAL hook */
   enum MutationType {
@@ -112,14 +109,15 @@ public interface RegionObserver {
    * Called before the region is reported as open to the master.
    * @param c the environment provided by the region server
    */
-  default void preOpen(ObserverContext<RegionCoprocessorEnvironment> c) throws IOException {
+  default void preOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c)
+    throws IOException {
   }
 
   /**
    * Called after the region is reported as open to the master.
    * @param c the environment provided by the region server
    */
-  default void postOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
+  default void postOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c) {
   }
 
   /**
@@ -127,7 +125,7 @@ public interface RegionObserver {
    * @param c       the environment provided by the region server
    * @param tracker tracker used to track the life cycle of a flush
    */
-  default void preFlush(final ObserverContext<RegionCoprocessorEnvironment> c,
+  default void preFlush(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     FlushLifeCycleTracker tracker) throws IOException {
   }
 
@@ -138,8 +136,8 @@ public interface RegionObserver {
    * @param store   the store where flush is being requested
    * @param options used to change max versions and TTL for the scanner being opened
    */
-  default void preFlushScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
+  default void preFlushScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
   }
 
   /**
@@ -151,8 +149,8 @@ public interface RegionObserver {
    * @return the scanner to use during flush. Should not be {@code null} unless the implementation
    *         is writing new store files on its own.
    */
-  default InternalScanner preFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
+  default InternalScanner preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
     return scanner;
   }
 
@@ -162,7 +160,7 @@ public interface RegionObserver {
    * @param tracker tracker used to track the life cycle of a flush
    * @throws IOException if an error occurred on the coprocessor
    */
-  default void postFlush(ObserverContext<RegionCoprocessorEnvironment> c,
+  default void postFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     FlushLifeCycleTracker tracker) throws IOException {
   }
 
@@ -173,7 +171,7 @@ public interface RegionObserver {
    * @param resultFile the new store file written out during compaction
    * @param tracker    tracker used to track the life cycle of a flush
    */
-  default void postFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
+  default void postFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store,
     StoreFile resultFile, FlushLifeCycleTracker tracker) throws IOException {
   }
 
@@ -182,8 +180,8 @@ public interface RegionObserver {
    * @param c     the environment provided by the region server
    * @param store the store where in memory compaction is being requested
    */
-  default void preMemStoreCompaction(ObserverContext<RegionCoprocessorEnvironment> c, Store store)
-    throws IOException {
+  default void preMemStoreCompaction(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store) throws IOException {
   }
 
   /**
@@ -196,7 +194,7 @@ public interface RegionObserver {
    * @param options used to change max versions and TTL for the scanner being opened
    */
   default void preMemStoreCompactionCompactScannerOpen(
-    ObserverContext<RegionCoprocessorEnvironment> c, Store store, ScanOptions options)
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store, ScanOptions options)
     throws IOException {
   }
 
@@ -210,7 +208,7 @@ public interface RegionObserver {
    * @return the scanner to use during in memory compaction. Must be non-null.
    */
   default InternalScanner preMemStoreCompactionCompact(
-    ObserverContext<RegionCoprocessorEnvironment> c, Store store, InternalScanner scanner)
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store, InternalScanner scanner)
     throws IOException {
     return scanner;
   }
@@ -220,8 +218,8 @@ public interface RegionObserver {
    * @param c     the environment provided by the region server
    * @param store the store where in memory compaction is being executed
    */
-  default void postMemStoreCompaction(ObserverContext<RegionCoprocessorEnvironment> c, Store store)
-    throws IOException {
+  default void postMemStoreCompaction(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store) throws IOException {
   }
 
   /**
@@ -237,8 +235,9 @@ public interface RegionObserver {
    * @param candidates the store files currently available for compaction
    * @param tracker    tracker used to track the life cycle of a compaction
    */
-  default void preCompactSelection(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    List<? extends StoreFile> candidates, CompactionLifeCycleTracker tracker) throws IOException {
+  default void preCompactSelection(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, List<? extends StoreFile> candidates, CompactionLifeCycleTracker tracker)
+    throws IOException {
   }
 
   /**
@@ -250,8 +249,8 @@ public interface RegionObserver {
    * @param tracker  tracker used to track the life cycle of a compaction
    * @param request  the requested compaction
    */
-  default void postCompactSelection(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    List<? extends StoreFile> selected, CompactionLifeCycleTracker tracker,
+  default void postCompactSelection(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, List<? extends StoreFile> selected, CompactionLifeCycleTracker tracker,
     CompactionRequest request) {
   }
 
@@ -265,8 +264,8 @@ public interface RegionObserver {
    * @param tracker  tracker used to track the life cycle of a compaction
    * @param request  the requested compaction
    */
-  default void preCompactScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    ScanType scanType, ScanOptions options, CompactionLifeCycleTracker tracker,
+  default void preCompactScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, ScanType scanType, ScanOptions options, CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
   }
 
@@ -296,8 +295,8 @@ public interface RegionObserver {
    * @return the scanner to use during compaction. Should not be {@code null} unless the
    *         implementation is writing new store files on its own.
    */
-  default InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+  default InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
     return scanner;
   }
@@ -310,7 +309,7 @@ public interface RegionObserver {
    * @param tracker    used to track the life cycle of a compaction
    * @param request    the requested compaction
    */
-  default void postCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
+  default void postCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store,
     StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request)
     throws IOException {
   }
@@ -320,8 +319,8 @@ public interface RegionObserver {
    * @param c              the environment provided by the region server
    * @param abortRequested true if the region server is aborting
    */
-  default void preClose(ObserverContext<RegionCoprocessorEnvironment> c, boolean abortRequested)
-    throws IOException {
+  default void preClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    boolean abortRequested) throws IOException {
   }
 
   /**
@@ -329,7 +328,8 @@ public interface RegionObserver {
    * @param c              the environment provided by the region server
    * @param abortRequested true if the region server is aborting
    */
-  default void postClose(ObserverContext<RegionCoprocessorEnvironment> c, boolean abortRequested) {
+  default void postClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    boolean abortRequested) {
   }
 
   /**
@@ -342,8 +342,8 @@ public interface RegionObserver {
    * @param result The result to return to the client if default processing is bypassed. Can be
    *               modified. Will not be used if default processing is not bypassed.
    */
-  default void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get, List<Cell> result)
-    throws IOException {
+  default void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
+    List<Cell> result) throws IOException {
   }
 
   /**
@@ -355,7 +355,7 @@ public interface RegionObserver {
    * @param get    the Get request
    * @param result the result to return to the client, modify as necessary
    */
-  default void postGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+  default void postGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
     List<Cell> result) throws IOException {
   }
 
@@ -369,7 +369,7 @@ public interface RegionObserver {
    * @param exists the result returned by the region server
    * @return the value to return to the client if bypassing default processing
    */
-  default boolean preExists(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+  default boolean preExists(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
     boolean exists) throws IOException {
     return exists;
   }
@@ -381,7 +381,7 @@ public interface RegionObserver {
    * @param exists the result returned by the region server
    * @return the result to return to the client
    */
-  default boolean postExists(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+  default boolean postExists(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
     boolean exists) throws IOException {
     return exists;
   }
@@ -402,8 +402,8 @@ public interface RegionObserver {
    *             {@link #prePut(ObserverContext, Put, WALEdit)} instead.
    */
   @Deprecated
-  default void prePut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit,
-    Durability durability) throws IOException {
+  default void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
+    WALEdit edit, Durability durability) throws IOException {
   }
 
   /**
@@ -418,8 +418,8 @@ public interface RegionObserver {
    * @param put  The Put object
    * @param edit The WALEdit object that will be written to the wal
    */
-  default void prePut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit)
-    throws IOException {
+  default void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
+    WALEdit edit) throws IOException {
     prePut(c, put, edit, put.getDurability());
   }
 
@@ -436,8 +436,8 @@ public interface RegionObserver {
    *             {@link #postPut(ObserverContext, Put, WALEdit)} instead.
    */
   @Deprecated
-  default void postPut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit,
-    Durability durability) throws IOException {
+  default void postPut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
+    WALEdit edit, Durability durability) throws IOException {
   }
 
   /**
@@ -449,8 +449,8 @@ public interface RegionObserver {
    * @param put  The Put object
    * @param edit The WALEdit object for the wal
    */
-  default void postPut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit)
-    throws IOException {
+  default void postPut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
+    WALEdit edit) throws IOException {
     postPut(c, put, edit, put.getDurability());
   }
 
@@ -470,7 +470,7 @@ public interface RegionObserver {
    *             {@link #preDelete(ObserverContext, Delete, WALEdit)} instead.
    */
   @Deprecated
-  default void preDelete(ObserverContext<RegionCoprocessorEnvironment> c, Delete delete,
+  default void preDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c, Delete delete,
     WALEdit edit, Durability durability) throws IOException {
   }
 
@@ -486,7 +486,7 @@ public interface RegionObserver {
    * @param delete The Delete object
    * @param edit   The WALEdit object for the wal
    */
-  default void preDelete(ObserverContext<RegionCoprocessorEnvironment> c, Delete delete,
+  default void preDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c, Delete delete,
     WALEdit edit) throws IOException {
     preDelete(c, delete, edit, delete.getDurability());
   }
@@ -507,8 +507,9 @@ public interface RegionObserver {
    *             VisibilityController still needs this, need to change the logic there first.
    */
   @Deprecated
-  default void prePrepareTimeStampForDeleteVersion(ObserverContext<RegionCoprocessorEnvironment> c,
-    Mutation mutation, Cell cell, byte[] byteNow, Get get) throws IOException {
+  default void prePrepareTimeStampForDeleteVersion(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, Mutation mutation, Cell cell,
+    byte[] byteNow, Get get) throws IOException {
   }
 
   /**
@@ -524,7 +525,7 @@ public interface RegionObserver {
    *             {@link #postDelete(ObserverContext, Delete, WALEdit)} instead.
    */
   @Deprecated
-  default void postDelete(ObserverContext<RegionCoprocessorEnvironment> c, Delete delete,
+  default void postDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c, Delete delete,
     WALEdit edit, Durability durability) throws IOException {
   }
 
@@ -537,7 +538,7 @@ public interface RegionObserver {
    * @param delete The Delete object
    * @param edit   The WALEdit object for the wal
    */
-  default void postDelete(ObserverContext<RegionCoprocessorEnvironment> c, Delete delete,
+  default void postDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c, Delete delete,
     WALEdit edit) throws IOException {
     postDelete(c, delete, edit, delete.getDurability());
   }
@@ -555,7 +556,7 @@ public interface RegionObserver {
    * @param c           the environment provided by the region server
    * @param miniBatchOp batch of Mutations getting applied to region.
    */
-  default void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+  default void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
   }
 
@@ -575,7 +576,7 @@ public interface RegionObserver {
    *                    manipulating its state.
    */
   // Coprocessors can do a form of bypass by changing state in miniBatchOp.
-  default void postBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+  default void postBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
   }
 
@@ -584,14 +585,14 @@ public interface RegionObserver {
    * {@link Region#startRegionOperation()}.
    * @param operation The operation is about to be taken on the region
    */
-  default void postStartRegionOperation(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  default void postStartRegionOperation(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     Operation operation) throws IOException {
   }
 
   /**
    * Called after releasing read lock in {@link Region#closeRegionOperation()}.
    */
-  default void postCloseRegionOperation(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  default void postCloseRegionOperation(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     Operation operation) throws IOException {
   }
 
@@ -603,7 +604,8 @@ public interface RegionObserver {
    * need a Cell reference for later use, copy the cell and use that.
    * @param success true if batch operation is successful otherwise false.
    */
-  default void postBatchMutateIndispensably(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  default void postBatchMutateIndispensably(
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     MiniBatchOperationInProgress<Mutation> miniBatchOp, boolean success) throws IOException {
   }
 
@@ -629,9 +631,9 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean preCheckAndPut(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator, Put put,
-    boolean result) throws IOException {
+  default boolean preCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
+    Put put, boolean result) throws IOException {
     return result;
   }
 
@@ -654,8 +656,8 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean preCheckAndPut(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    Filter filter, Put put, boolean result) throws IOException {
+  default boolean preCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, Filter filter, Put put, boolean result) throws IOException {
     return result;
   }
 
@@ -685,9 +687,10 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean preCheckAndPutAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
-    byte[] row, byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
-    Put put, boolean result) throws IOException {
+  default boolean preCheckAndPutAfterRowLock(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, byte[] family,
+    byte[] qualifier, CompareOperator op, ByteArrayComparable comparator, Put put, boolean result)
+    throws IOException {
     return result;
   }
 
@@ -714,8 +717,9 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean preCheckAndPutAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
-    byte[] row, Filter filter, Put put, boolean result) throws IOException {
+  default boolean preCheckAndPutAfterRowLock(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, Filter filter, Put put,
+    boolean result) throws IOException {
     return result;
   }
 
@@ -738,9 +742,9 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean postCheckAndPut(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator, Put put,
-    boolean result) throws IOException {
+  default boolean postCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
+    Put put, boolean result) throws IOException {
     return result;
   }
 
@@ -760,8 +764,8 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean postCheckAndPut(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    Filter filter, Put put, boolean result) throws IOException {
+  default boolean postCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, Filter filter, Put put, boolean result) throws IOException {
     return result;
   }
 
@@ -787,8 +791,8 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean preCheckAndDelete(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
+  default boolean preCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
     Delete delete, boolean result) throws IOException {
     return result;
   }
@@ -812,8 +816,8 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean preCheckAndDelete(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    Filter filter, Delete delete, boolean result) throws IOException {
+  default boolean preCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, Filter filter, Delete delete, boolean result) throws IOException {
     return result;
   }
 
@@ -843,9 +847,10 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean preCheckAndDeleteAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
-    byte[] row, byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
-    Delete delete, boolean result) throws IOException {
+  default boolean preCheckAndDeleteAfterRowLock(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, byte[] family,
+    byte[] qualifier, CompareOperator op, ByteArrayComparable comparator, Delete delete,
+    boolean result) throws IOException {
     return result;
   }
 
@@ -872,8 +877,9 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean preCheckAndDeleteAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
-    byte[] row, Filter filter, Delete delete, boolean result) throws IOException {
+  default boolean preCheckAndDeleteAfterRowLock(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, Filter filter,
+    Delete delete, boolean result) throws IOException {
     return result;
   }
 
@@ -896,8 +902,8 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean postCheckAndDelete(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
+  default boolean postCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator,
     Delete delete, boolean result) throws IOException {
     return result;
   }
@@ -918,8 +924,8 @@ public interface RegionObserver {
    *             instead.
    */
   @Deprecated
-  default boolean postCheckAndDelete(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    Filter filter, Delete delete, boolean result) throws IOException {
+  default boolean postCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, Filter filter, Delete delete, boolean result) throws IOException {
     return result;
   }
 
@@ -937,8 +943,9 @@ public interface RegionObserver {
    * @return the return value to return to client if bypassing default processing
    * @throws IOException if an error occurred on the coprocessor
    */
-  default CheckAndMutateResult preCheckAndMutate(ObserverContext<RegionCoprocessorEnvironment> c,
-    CheckAndMutate checkAndMutate, CheckAndMutateResult result) throws IOException {
+  default CheckAndMutateResult preCheckAndMutate(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, CheckAndMutate checkAndMutate,
+    CheckAndMutateResult result) throws IOException {
     if (checkAndMutate.getAction() instanceof Put) {
       boolean success;
       if (checkAndMutate.hasFilter()) {
@@ -986,7 +993,7 @@ public interface RegionObserver {
    * @throws IOException if an error occurred on the coprocessor
    */
   default CheckAndMutateResult preCheckAndMutateAfterRowLock(
-    ObserverContext<RegionCoprocessorEnvironment> c, CheckAndMutate checkAndMutate,
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, CheckAndMutate checkAndMutate,
     CheckAndMutateResult result) throws IOException {
     if (checkAndMutate.getAction() instanceof Put) {
       boolean success;
@@ -1027,8 +1034,9 @@ public interface RegionObserver {
    * @return the possibly transformed returned value to return to client
    * @throws IOException if an error occurred on the coprocessor
    */
-  default CheckAndMutateResult postCheckAndMutate(ObserverContext<RegionCoprocessorEnvironment> c,
-    CheckAndMutate checkAndMutate, CheckAndMutateResult result) throws IOException {
+  default CheckAndMutateResult postCheckAndMutate(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, CheckAndMutate checkAndMutate,
+    CheckAndMutateResult result) throws IOException {
     if (checkAndMutate.getAction() instanceof Put) {
       boolean success;
       if (checkAndMutate.hasFilter()) {
@@ -1072,7 +1080,7 @@ public interface RegionObserver {
    *             {@link #preAppend(ObserverContext, Append, WALEdit)} instead.
    */
   @Deprecated
-  default Result preAppend(ObserverContext<RegionCoprocessorEnvironment> c, Append append)
+  default Result preAppend(ObserverContext<? extends RegionCoprocessorEnvironment> c, Append append)
     throws IOException {
     return null;
   }
@@ -1090,7 +1098,7 @@ public interface RegionObserver {
    * @param edit   The WALEdit object that will be written to the wal
    * @return result to return to the client if bypassing default processing
    */
-  default Result preAppend(ObserverContext<RegionCoprocessorEnvironment> c, Append append,
+  default Result preAppend(ObserverContext<? extends RegionCoprocessorEnvironment> c, Append append,
     WALEdit edit) throws IOException {
     return preAppend(c, append);
   }
@@ -1114,7 +1122,7 @@ public interface RegionObserver {
    *             {@link #preBatchMutate(ObserverContext, MiniBatchOperationInProgress)} instead.
    */
   @Deprecated
-  default Result preAppendAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
+  default Result preAppendAfterRowLock(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     Append append) throws IOException {
     return null;
   }
@@ -1132,8 +1140,8 @@ public interface RegionObserver {
    *             {@link #postAppend(ObserverContext, Append, Result, WALEdit)} instead.
    */
   @Deprecated
-  default Result postAppend(ObserverContext<RegionCoprocessorEnvironment> c, Append append,
-    Result result) throws IOException {
+  default Result postAppend(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Append append, Result result) throws IOException {
     return result;
   }
 
@@ -1148,8 +1156,8 @@ public interface RegionObserver {
    * @param edit   The WALEdit object for the wal
    * @return the result to return to the client
    */
-  default Result postAppend(ObserverContext<RegionCoprocessorEnvironment> c, Append append,
-    Result result, WALEdit edit) throws IOException {
+  default Result postAppend(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Append append, Result result, WALEdit edit) throws IOException {
     return postAppend(c, append, result);
   }
 
@@ -1168,8 +1176,8 @@ public interface RegionObserver {
    *             {@link #preIncrement(ObserverContext, Increment, WALEdit)} instead.
    */
   @Deprecated
-  default Result preIncrement(ObserverContext<RegionCoprocessorEnvironment> c, Increment increment)
-    throws IOException {
+  default Result preIncrement(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Increment increment) throws IOException {
     return null;
   }
 
@@ -1186,8 +1194,8 @@ public interface RegionObserver {
    * @param edit      The WALEdit object that will be written to the wal
    * @return result to return to the client if bypassing default processing
    */
-  default Result preIncrement(ObserverContext<RegionCoprocessorEnvironment> c, Increment increment,
-    WALEdit edit) throws IOException {
+  default Result preIncrement(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Increment increment, WALEdit edit) throws IOException {
     return preIncrement(c, increment);
   }
 
@@ -1210,7 +1218,7 @@ public interface RegionObserver {
    *             {@link #preBatchMutate(ObserverContext, MiniBatchOperationInProgress)} instead.
    */
   @Deprecated
-  default Result preIncrementAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
+  default Result preIncrementAfterRowLock(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     Increment increment) throws IOException {
     return null;
   }
@@ -1228,8 +1236,8 @@ public interface RegionObserver {
    *             {@link #postIncrement(ObserverContext, Increment, Result, WALEdit)} instead.
    */
   @Deprecated
-  default Result postIncrement(ObserverContext<RegionCoprocessorEnvironment> c, Increment increment,
-    Result result) throws IOException {
+  default Result postIncrement(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Increment increment, Result result) throws IOException {
     return result;
   }
 
@@ -1244,8 +1252,8 @@ public interface RegionObserver {
    * @param edit      The WALEdit object for the wal
    * @return the result to return to the client
    */
-  default Result postIncrement(ObserverContext<RegionCoprocessorEnvironment> c, Increment increment,
-    Result result, WALEdit edit) throws IOException {
+  default Result postIncrement(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Increment increment, Result result, WALEdit edit) throws IOException {
     return postIncrement(c, increment, result);
   }
 
@@ -1257,7 +1265,7 @@ public interface RegionObserver {
    * @param c    the environment provided by the region server
    * @param scan the Scan specification
    */
-  default void preScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Scan scan)
+  default void preScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c, Scan scan)
     throws IOException {
   }
 
@@ -1271,8 +1279,8 @@ public interface RegionObserver {
    * @param s    if not null, the base scanner
    * @return the scanner instance to use
    */
-  default RegionScanner postScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Scan scan,
-    RegionScanner s) throws IOException {
+  default RegionScanner postScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Scan scan, RegionScanner s) throws IOException {
     return s;
   }
 
@@ -1292,8 +1300,8 @@ public interface RegionObserver {
    * @param hasNext the 'has more' indication
    * @return 'has more' indication that should be sent to client
    */
-  default boolean preScannerNext(ObserverContext<RegionCoprocessorEnvironment> c, InternalScanner s,
-    List<Result> result, int limit, boolean hasNext) throws IOException {
+  default boolean preScannerNext(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    InternalScanner s, List<Result> result, int limit, boolean hasNext) throws IOException {
     return hasNext;
   }
 
@@ -1309,7 +1317,7 @@ public interface RegionObserver {
    * @param hasNext the 'has more' indication
    * @return 'has more' indication that should be sent to client
    */
-  default boolean postScannerNext(ObserverContext<RegionCoprocessorEnvironment> c,
+  default boolean postScannerNext(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     InternalScanner s, List<Result> result, int limit, boolean hasNext) throws IOException {
     return hasNext;
   }
@@ -1333,7 +1341,7 @@ public interface RegionObserver {
    * @param hasMore    the 'has more' indication
    * @return whether more rows are available for the scanner or not
    */
-  default boolean postScannerFilterRow(ObserverContext<RegionCoprocessorEnvironment> c,
+  default boolean postScannerFilterRow(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     InternalScanner s, Cell curRowCell, boolean hasMore) throws IOException {
     return hasMore;
   }
@@ -1346,8 +1354,8 @@ public interface RegionObserver {
    * @param c the environment provided by the region server
    * @param s the scanner
    */
-  default void preScannerClose(ObserverContext<RegionCoprocessorEnvironment> c, InternalScanner s)
-    throws IOException {
+  default void preScannerClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    InternalScanner s) throws IOException {
   }
 
   /**
@@ -1355,7 +1363,7 @@ public interface RegionObserver {
    * @param ctx the environment provided by the region server
    * @param s   the scanner
    */
-  default void postScannerClose(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  default void postScannerClose(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     InternalScanner s) throws IOException {
   }
 
@@ -1377,8 +1385,8 @@ public interface RegionObserver {
    * @see #preCompactScannerOpen(ObserverContext, Store, ScanType, ScanOptions,
    *      CompactionLifeCycleTracker, CompactionRequest)
    */
-  default void preStoreScannerOpen(ObserverContext<RegionCoprocessorEnvironment> ctx, Store store,
-    ScanOptions options) throws IOException {
+  default void preStoreScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
+    Store store, ScanOptions options) throws IOException {
   }
 
   /**
@@ -1411,7 +1419,7 @@ public interface RegionObserver {
    * @param familyPaths pairs of { CF, HFile path } submitted for bulk load. Adding or removing from
    *                    this list will add or remove HFiles to be bulk loaded.
    */
-  default void preBulkLoadHFile(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  default void preBulkLoadHFile(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     List<Pair<byte[], String>> familyPaths) throws IOException {
   }
 
@@ -1422,8 +1430,8 @@ public interface RegionObserver {
    * @param pairs  List of pairs of { HFile location in staging dir, HFile path in region dir } Each
    *               pair are for the same hfile.
    */
-  default void preCommitStoreFile(ObserverContext<RegionCoprocessorEnvironment> ctx, byte[] family,
-    List<Pair<Path, Path>> pairs) throws IOException {
+  default void preCommitStoreFile(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
+    byte[] family, List<Pair<Path, Path>> pairs) throws IOException {
   }
 
   /**
@@ -1433,8 +1441,8 @@ public interface RegionObserver {
    * @param srcPath Path to file before the move
    * @param dstPath Path to file after the move
    */
-  default void postCommitStoreFile(ObserverContext<RegionCoprocessorEnvironment> ctx, byte[] family,
-    Path srcPath, Path dstPath) throws IOException {
+  default void postCommitStoreFile(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
+    byte[] family, Path srcPath, Path dstPath) throws IOException {
   }
 
   /**
@@ -1445,7 +1453,7 @@ public interface RegionObserver {
    *                           not null, the bulkLoad was successful. Otherwise the bulk load
    *                           failed. bulkload is done by the time this hook is called.
    */
-  default void postBulkLoadHFile(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  default void postBulkLoadHFile(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     List<Pair<byte[], String>> stagingFamilyPaths, Map<byte[], List<Path>> finalPaths)
     throws IOException {
   }
@@ -1468,9 +1476,10 @@ public interface RegionObserver {
   @Deprecated
   // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.
   // This is fine as the hook is deprecated any way.
-  default StoreFileReader preStoreFileReaderOpen(ObserverContext<RegionCoprocessorEnvironment> ctx,
-    FileSystem fs, Path p, FSDataInputStreamWrapper in, long size, CacheConfig cacheConf,
-    Reference r, StoreFileReader reader) throws IOException {
+  default StoreFileReader preStoreFileReaderOpen(
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, FileSystem fs, Path p,
+    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,
+    StoreFileReader reader) throws IOException {
     return reader;
   }
 
@@ -1489,9 +1498,10 @@ public interface RegionObserver {
   @Deprecated
   // Passing InterfaceAudience.Private args FSDataInputStreamWrapper, CacheConfig and Reference.
   // This is fine as the hook is deprecated any way.
-  default StoreFileReader postStoreFileReaderOpen(ObserverContext<RegionCoprocessorEnvironment> ctx,
-    FileSystem fs, Path p, FSDataInputStreamWrapper in, long size, CacheConfig cacheConf,
-    Reference r, StoreFileReader reader) throws IOException {
+  default StoreFileReader postStoreFileReaderOpen(
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, FileSystem fs, Path p,
+    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,
+    StoreFileReader reader) throws IOException {
     return reader;
   }
 
@@ -1514,7 +1524,7 @@ public interface RegionObserver {
    * @see <a href="https://issues.apache.org/jira/browse/HBASE-21643">HBASE-21643</a>
    */
   @Deprecated
-  default Cell postMutationBeforeWAL(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  default Cell postMutationBeforeWAL(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     MutationType opType, Mutation mutation, Cell oldCell, Cell newCell) throws IOException {
     return newCell;
   }
@@ -1529,7 +1539,7 @@ public interface RegionObserver {
    * @return a list of cell pair, possibly changed.
    */
   default List<Pair<Cell, Cell>> postIncrementBeforeWAL(
-    ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
     List<Pair<Cell, Cell>> cellPairs) throws IOException {
     List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());
     for (Pair<Cell, Cell> pair : cellPairs) {
@@ -1549,7 +1559,7 @@ public interface RegionObserver {
    * @return a list of cell pair, possibly changed.
    */
   default List<Pair<Cell, Cell>> postAppendBeforeWAL(
-    ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
     List<Pair<Cell, Cell>> cellPairs) throws IOException {
     List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());
     for (Pair<Cell, Cell> pair : cellPairs) {
@@ -1572,7 +1582,7 @@ public interface RegionObserver {
    */
   @Deprecated
   default DeleteTracker postInstantiateDeleteTracker(
-    ObserverContext<RegionCoprocessorEnvironment> ctx, DeleteTracker delTracker)
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, DeleteTracker delTracker)
     throws IOException {
     return delTracker;
   }
@@ -1584,7 +1594,7 @@ public interface RegionObserver {
    * @param ctx the environment provided by the region server
    * @param key the WALKey associated with a particular append to a WAL
    */
-  default void preWALAppend(ObserverContext<RegionCoprocessorEnvironment> ctx, WALKey key,
+  default void preWALAppend(ObserverContext<? extends RegionCoprocessorEnvironment> ctx, WALKey key,
     WALEdit edit) throws IOException {
   }
 }
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationObserver.java
index 541021f4d5d..b762fb94e8a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationObserver.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationObserver.java
@@ -52,7 +52,7 @@ public class ReplicationObserver implements RegionCoprocessor, RegionObserver {
   @Override
   @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NP_NULL_ON_SOME_PATH",
       justification = "NPE should never happen; if it does it is a bigger issue")
-  public void preCommitStoreFile(final ObserverContext<RegionCoprocessorEnvironment> ctx,
+  public void preCommitStoreFile(final ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     final byte[] family, final List<Pair<Path, Path>> pairs) throws IOException {
     RegionCoprocessorEnvironment env = ctx.getEnvironment();
     Configuration c = env.getConfiguration();
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
index 9ccf3c85d61..d0367054343 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
@@ -1221,7 +1221,8 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   /* ---- RegionObserver implementation ---- */
 
   @Override
-  public void preOpen(ObserverContext<RegionCoprocessorEnvironment> c) throws IOException {
+  public void preOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c)
+    throws IOException {
     RegionCoprocessorEnvironment env = c.getEnvironment();
     final Region region = env.getRegion();
     if (region == null) {
@@ -1237,7 +1238,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void postOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
+  public void postOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c) {
     RegionCoprocessorEnvironment env = c.getEnvironment();
     final Region region = env.getRegion();
     if (region == null) {
@@ -1259,22 +1260,22 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void preFlush(ObserverContext<RegionCoprocessorEnvironment> c,
+  public void preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     FlushLifeCycleTracker tracker) throws IOException {
     requirePermission(c, "flush", getTableName(c.getEnvironment()), null, null, Action.ADMIN,
       Action.CREATE);
   }
 
   @Override
-  public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+  public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
     requirePermission(c, "compact", getTableName(c.getEnvironment()), null, null, Action.ADMIN,
       Action.CREATE);
     return scanner;
   }
 
-  private void internalPreRead(final ObserverContext<RegionCoprocessorEnvironment> c,
+  private void internalPreRead(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final Query query, OpType opType) throws IOException {
     Filter filter = query.getFilter();
     // Don't wrap an AccessControlFilter
@@ -1376,20 +1377,20 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> c, final Get get,
-    final List<Cell> result) throws IOException {
+  public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Get get, final List<Cell> result) throws IOException {
     internalPreRead(c, get, OpType.GET);
   }
 
   @Override
-  public boolean preExists(final ObserverContext<RegionCoprocessorEnvironment> c, final Get get,
-    final boolean exists) throws IOException {
+  public boolean preExists(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Get get, final boolean exists) throws IOException {
     internalPreRead(c, get, OpType.EXISTS);
     return exists;
   }
 
   @Override
-  public void prePut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
+  public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> c, final Put put,
     final WALEdit edit, final Durability durability) throws IOException {
     User user = getActiveUser(c);
     checkForReservedTagPresence(user, put);
@@ -1424,16 +1425,16 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void postPut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
-    final WALEdit edit, final Durability durability) {
+  public void postPut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Put put, final WALEdit edit, final Durability durability) {
     if (aclRegion) {
       updateACL(c.getEnvironment(), put.getFamilyCellMap());
     }
   }
 
   @Override
-  public void preDelete(final ObserverContext<RegionCoprocessorEnvironment> c, final Delete delete,
-    final WALEdit edit, final Durability durability) throws IOException {
+  public void preDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
     // An ACL on a delete is useless, we shouldn't allow it
     if (delete.getAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL) != null) {
       throw new DoNotRetryIOException("ACL on delete has no effect: " + delete.toString());
@@ -1458,7 +1459,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+  public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
     if (cellFeaturesEnabled && !compatibleEarlyTermination) {
       TableName table = c.getEnvironment().getRegion().getRegionInfo().getTable();
@@ -1509,15 +1510,15 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void postDelete(final ObserverContext<RegionCoprocessorEnvironment> c, final Delete delete,
-    final WALEdit edit, final Durability durability) throws IOException {
+  public void postDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
     if (aclRegion) {
       updateACL(c.getEnvironment(), delete.getFamilyCellMap());
     }
   }
 
   @Override
-  public boolean preCheckAndPut(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public boolean preCheckAndPut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final byte[] row, final byte[] family, final byte[] qualifier, final CompareOperator op,
     final ByteArrayComparable comparator, final Put put, final boolean result) throws IOException {
     User user = getActiveUser(c);
@@ -1549,8 +1550,9 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public boolean preCheckAndPutAfterRowLock(final ObserverContext<RegionCoprocessorEnvironment> c,
-    final byte[] row, final byte[] family, final byte[] qualifier, final CompareOperator opp,
+  public boolean preCheckAndPutAfterRowLock(
+    final ObserverContext<? extends RegionCoprocessorEnvironment> c, final byte[] row,
+    final byte[] family, final byte[] qualifier, final CompareOperator opp,
     final ByteArrayComparable comparator, final Put put, final boolean result) throws IOException {
     if (put.getAttribute(CHECK_COVERING_PERM) != null) {
       // We had failure with table, cf and q perm checks and now giving a chance for cell
@@ -1578,7 +1580,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public boolean preCheckAndDelete(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public boolean preCheckAndDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final byte[] row, final byte[] family, final byte[] qualifier, final CompareOperator op,
     final ByteArrayComparable comparator, final Delete delete, final boolean result)
     throws IOException {
@@ -1606,9 +1608,10 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
 
   @Override
   public boolean preCheckAndDeleteAfterRowLock(
-    final ObserverContext<RegionCoprocessorEnvironment> c, final byte[] row, final byte[] family,
-    final byte[] qualifier, final CompareOperator op, final ByteArrayComparable comparator,
-    final Delete delete, final boolean result) throws IOException {
+    final ObserverContext<? extends RegionCoprocessorEnvironment> c, final byte[] row,
+    final byte[] family, final byte[] qualifier, final CompareOperator op,
+    final ByteArrayComparable comparator, final Delete delete, final boolean result)
+    throws IOException {
     if (delete.getAttribute(CHECK_COVERING_PERM) != null) {
       // We had failure with table, cf and q perm checks and now giving a chance for cell
       // perm check
@@ -1635,7 +1638,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public Result preAppend(ObserverContext<RegionCoprocessorEnvironment> c, Append append)
+  public Result preAppend(ObserverContext<? extends RegionCoprocessorEnvironment> c, Append append)
     throws IOException {
     User user = getActiveUser(c);
     checkForReservedTagPresence(user, append);
@@ -1666,7 +1669,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public Result preIncrement(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public Result preIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final Increment increment) throws IOException {
     User user = getActiveUser(c);
     checkForReservedTagPresence(user, increment);
@@ -1699,7 +1702,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
 
   @Override
   public List<Pair<Cell, Cell>> postIncrementBeforeWAL(
-    ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
     List<Pair<Cell, Cell>> cellPairs) throws IOException {
     // If the HFile version is insufficient to persist tags, we won't have any
     // work to do here
@@ -1714,7 +1717,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
 
   @Override
   public List<Pair<Cell, Cell>> postAppendBeforeWAL(
-    ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
     List<Pair<Cell, Cell>> cellPairs) throws IOException {
     // If the HFile version is insufficient to persist tags, we won't have any
     // work to do here
@@ -1755,14 +1758,15 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c, final Scan scan)
-    throws IOException {
+  public void preScannerOpen(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Scan scan) throws IOException {
     internalPreRead(c, scan, OpType.SCAN);
   }
 
   @Override
-  public RegionScanner postScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c,
-    final Scan scan, final RegionScanner s) throws IOException {
+  public RegionScanner postScannerOpen(
+    final ObserverContext<? extends RegionCoprocessorEnvironment> c, final Scan scan,
+    final RegionScanner s) throws IOException {
     User user = getActiveUser(c);
     if (user != null && user.getShortName() != null) {
       // store reference to scanner owner for later checks
@@ -1772,7 +1776,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public boolean preScannerNext(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public boolean preScannerNext(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s, final List<Result> result, final int limit, final boolean hasNext)
     throws IOException {
     requireScannerOwner(s);
@@ -1780,13 +1784,13 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void preScannerClose(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public void preScannerClose(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s) throws IOException {
     requireScannerOwner(s);
   }
 
   @Override
-  public void postScannerClose(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public void postScannerClose(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s) throws IOException {
     // clean up any associated owner mapping
     scannerOwners.remove(s);
@@ -1812,7 +1816,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
    * bulkLoadHFile request. Specific Column Write privileges are presently ignored.
    */
   @Override
-  public void preBulkLoadHFile(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  public void preBulkLoadHFile(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     List<Pair<byte[], String>> familyPaths) throws IOException {
     User user = getActiveUser(ctx);
     for (Pair<byte[], String> el : familyPaths) {
@@ -1849,7 +1853,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   /* ---- EndpointObserver implementation ---- */
 
   @Override
-  public Message preEndpointInvocation(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  public Message preEndpointInvocation(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     Service service, String methodName, Message request) throws IOException {
     // Don't intercept calls to our own AccessControlService, we check for
     // appropriate permissions in the service handlers
@@ -1862,7 +1866,7 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void postEndpointInvocation(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  public void postEndpointInvocation(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     Service service, String methodName, Message request, Message.Builder responseBuilder)
     throws IOException {
   }
@@ -2076,8 +2080,8 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor,
   }
 
   @Override
-  public void preClose(ObserverContext<RegionCoprocessorEnvironment> c, boolean abortRequested)
-    throws IOException {
+  public void preClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    boolean abortRequested) throws IOException {
     requirePermission(c, "preClose", Action.ADMIN);
   }
 
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/VisibilityController.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/VisibilityController.java
index 7433b73ff3d..32fd57f836d 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/VisibilityController.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/VisibilityController.java
@@ -248,7 +248,7 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
   /****************************** Region related hooks ******************************/
 
   @Override
-  public void postOpen(ObserverContext<RegionCoprocessorEnvironment> e) {
+  public void postOpen(ObserverContext<? extends RegionCoprocessorEnvironment> e) {
     // Read the entire labels table and populate the zk
     if (e.getEnvironment().getRegion().getRegionInfo().getTable().equals(LABELS_TABLE_NAME)) {
       this.labelsRegion = true;
@@ -280,7 +280,7 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
   }
 
   @Override
-  public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+  public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
     if (c.getEnvironment().getRegion().getRegionInfo().getTable().isSystemTable()) {
       return;
@@ -370,8 +370,9 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
   }
 
   @Override
-  public void prePrepareTimeStampForDeleteVersion(ObserverContext<RegionCoprocessorEnvironment> ctx,
-    Mutation delete, Cell cell, byte[] byteNow, Get get) throws IOException {
+  public void prePrepareTimeStampForDeleteVersion(
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation delete, Cell cell,
+    byte[] byteNow, Get get) throws IOException {
     // Nothing to do if we are not filtering by visibility
     if (!authorizationEnabled) {
       return;
@@ -482,7 +483,7 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
   }
 
   @Override
-  public void preScannerOpen(ObserverContext<RegionCoprocessorEnvironment> e, Scan scan)
+  public void preScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> e, Scan scan)
     throws IOException {
     if (!initialized) {
       throw new VisibilityControllerNotReadyException("VisibilityController not yet initialized!");
@@ -522,7 +523,7 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
 
   @Override
   public DeleteTracker postInstantiateDeleteTracker(
-    ObserverContext<RegionCoprocessorEnvironment> ctx, DeleteTracker delTracker)
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, DeleteTracker delTracker)
     throws IOException {
     // Nothing to do if we are not filtering by visibility
     if (!authorizationEnabled) {
@@ -542,8 +543,9 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
   }
 
   @Override
-  public RegionScanner postScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c,
-    final Scan scan, final RegionScanner s) throws IOException {
+  public RegionScanner postScannerOpen(
+    final ObserverContext<? extends RegionCoprocessorEnvironment> c, final Scan scan,
+    final RegionScanner s) throws IOException {
     User user = VisibilityUtils.getActiveUser();
     if (user != null && user.getShortName() != null) {
       scannerOwners.put(s, user.getShortName());
@@ -552,7 +554,7 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
   }
 
   @Override
-  public boolean preScannerNext(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public boolean preScannerNext(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s, final List<Result> result, final int limit, final boolean hasNext)
     throws IOException {
     requireScannerOwner(s);
@@ -560,13 +562,13 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
   }
 
   @Override
-  public void preScannerClose(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public void preScannerClose(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s) throws IOException {
     requireScannerOwner(s);
   }
 
   @Override
-  public void postScannerClose(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public void postScannerClose(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s) throws IOException {
     // clean up any associated owner mapping
     scannerOwners.remove(s);
@@ -586,8 +588,8 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
   }
 
   @Override
-  public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get, List<Cell> results)
-    throws IOException {
+  public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
+    List<Cell> results) throws IOException {
     if (!initialized) {
       throw new VisibilityControllerNotReadyException("VisibilityController not yet initialized");
     }
@@ -629,7 +631,7 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
 
   @Override
   public List<Pair<Cell, Cell>> postIncrementBeforeWAL(
-    ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
     List<Pair<Cell, Cell>> cellPairs) throws IOException {
     List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());
     for (Pair<Cell, Cell> pair : cellPairs) {
@@ -641,7 +643,7 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso
 
   @Override
   public List<Pair<Cell, Cell>> postAppendBeforeWAL(
-    ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
     List<Pair<Cell, Cell>> cellPairs) throws IOException {
     List<Pair<Cell, Cell>> resultPairs = new ArrayList<>(cellPairs.size());
     for (Pair<Cell, Cell> pair : cellPairs) {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/WriteSinkCoprocessor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/WriteSinkCoprocessor.java
index e3df46cc9cb..074e22e26dd 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/WriteSinkCoprocessor.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/WriteSinkCoprocessor.java
@@ -67,12 +67,13 @@ public class WriteSinkCoprocessor implements RegionCoprocessor, RegionObserver {
   private String regionName;
 
   @Override
-  public void preOpen(ObserverContext<RegionCoprocessorEnvironment> e) throws IOException {
+  public void preOpen(ObserverContext<? extends RegionCoprocessorEnvironment> e)
+    throws IOException {
     regionName = e.getEnvironment().getRegion().getRegionInfo().getRegionNameAsString();
   }
 
   @Override
-  public void preBatchMutate(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public void preBatchMutate(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
     if (ops.incrementAndGet() % 20000 == 0) {
       LOG.info("Wrote " + ops.get() + " times in region " + regionName);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/AbstractTestAsyncTableRegionReplicasRead.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/AbstractTestAsyncTableRegionReplicasRead.java
index e33a861a775..229045af93c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/AbstractTestAsyncTableRegionReplicasRead.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/AbstractTestAsyncTableRegionReplicasRead.java
@@ -98,7 +98,7 @@ public abstract class AbstractTestAsyncTableRegionReplicasRead {
       return Optional.of(this);
     }
 
-    private void recordAndTryFail(ObserverContext<RegionCoprocessorEnvironment> c)
+    private void recordAndTryFail(ObserverContext<? extends RegionCoprocessorEnvironment> c)
       throws IOException {
       RegionInfo region = c.getEnvironment().getRegionInfo();
       if (!region.getTable().equals(TABLE_NAME)) {
@@ -112,13 +112,13 @@ public abstract class AbstractTestAsyncTableRegionReplicasRead {
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
       List<Cell> result) throws IOException {
       recordAndTryFail(c);
     }
 
     @Override
-    public void preScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Scan scan)
+    public void preScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c, Scan scan)
       throws IOException {
       recordAndTryFail(c);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/AbstractTestCITimeout.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/AbstractTestCITimeout.java
index 3659bf385ce..b9cbd36f584 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/AbstractTestCITimeout.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/AbstractTestCITimeout.java
@@ -67,15 +67,15 @@ public abstract class AbstractTestCITimeout {
     }
 
     @Override
-    public void postOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
+    public void postOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c) {
       RegionCoprocessorEnvironment env = c.getEnvironment();
       Configuration conf = env.getConfiguration();
       sleepTime.set(conf.getLong(SLEEP_TIME_CONF_KEY, DEFAULT_SLEEP_TIME));
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
       Threads.sleep(sleepTime.get());
       if (ct.incrementAndGet() == 1) {
         throw new IOException("first call I fail");
@@ -83,8 +83,8 @@ public abstract class AbstractTestCITimeout {
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       Threads.sleep(sleepTime.get());
       if (ct.incrementAndGet() == 1) {
         throw new IOException("first call I fail");
@@ -92,7 +92,7 @@ public abstract class AbstractTestCITimeout {
     }
 
     @Override
-    public void preDelete(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
       Threads.sleep(sleepTime.get());
       if (ct.incrementAndGet() == 1) {
@@ -101,7 +101,7 @@ public abstract class AbstractTestCITimeout {
     }
 
     @Override
-    public Result preIncrement(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public Result preIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Increment increment) throws IOException {
       Threads.sleep(sleepTime.get());
       if (ct.incrementAndGet() == 1) {
@@ -121,26 +121,26 @@ public abstract class AbstractTestCITimeout {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
       Threads.sleep(SLEEP_TIME);
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       Threads.sleep(SLEEP_TIME);
     }
 
     @Override
-    public Result preIncrement(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public Result preIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Increment increment) throws IOException {
       Threads.sleep(SLEEP_TIME);
       return null;
     }
 
     @Override
-    public void preDelete(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
       Threads.sleep(SLEEP_TIME);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/SleepAtFirstRpcCall.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/SleepAtFirstRpcCall.java
index c7be2e9e117..ab5adad1f17 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/SleepAtFirstRpcCall.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/SleepAtFirstRpcCall.java
@@ -45,14 +45,14 @@ public class SleepAtFirstRpcCall implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void postOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
+  public void postOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c) {
     RegionCoprocessorEnvironment env = c.getEnvironment();
     Configuration conf = env.getConfiguration();
     sleepTime.set(conf.getLong(SLEEP_TIME_CONF_KEY, DEFAULT_SLEEP_TIME));
   }
 
   @Override
-  public Result postIncrement(final ObserverContext<RegionCoprocessorEnvironment> e,
+  public Result postIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
     final Increment increment, final Result result) throws IOException {
     if (ct.incrementAndGet() == 1) {
       Threads.sleep(sleepTime.get());
@@ -61,7 +61,7 @@ public class SleepAtFirstRpcCall implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public Result postAppend(final ObserverContext<RegionCoprocessorEnvironment> e,
+  public Result postAppend(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
     final Append append, final Result result) throws IOException {
     if (ct.incrementAndGet() == 1) {
       Threads.sleep(sleepTime.get());
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.java
index 439d527effc..cfcec727981 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.java
@@ -89,7 +89,7 @@ public class TestAsyncNonMetaRegionLocatorConcurrenyLimit {
     }
 
     @Override
-    public boolean preScannerNext(ObserverContext<RegionCoprocessorEnvironment> c,
+    public boolean preScannerNext(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       InternalScanner s, List<Result> result, int limit, boolean hasNext) throws IOException {
       if (c.getEnvironment().getRegionInfo().isMetaRegion()) {
         int concurrency = CONCURRENCY.incrementAndGet();
@@ -108,7 +108,7 @@ public class TestAsyncNonMetaRegionLocatorConcurrenyLimit {
     }
 
     @Override
-    public boolean postScannerNext(ObserverContext<RegionCoprocessorEnvironment> c,
+    public boolean postScannerNext(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       InternalScanner s, List<Result> result, int limit, boolean hasNext) throws IOException {
       if (c.getEnvironment().getRegionInfo().isMetaRegion()) {
         CONCURRENCY.decrementAndGet();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.java
index 2291c28a7c8..5e858eb8d9d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.java
@@ -83,7 +83,7 @@ public class TestAsyncRegionLocator {
     }
 
     @Override
-    public void preScannerOpen(ObserverContext<RegionCoprocessorEnvironment> e, Scan scan)
+    public void preScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> e, Scan scan)
       throws IOException {
       if (SLEEP_MS > 0) {
         Threads.sleepWithoutInterrupt(SLEEP_MS);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableBatch.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableBatch.java
index 7e07526ea1d..e7ce9fa3405 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableBatch.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableBatch.java
@@ -265,7 +265,7 @@ public class TestAsyncTableBatch {
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
       List<Cell> results) throws IOException {
       if (e.getEnvironment().getRegionInfo().getEndKey().length == 0) {
         throw new DoNotRetryRegionException("Inject Error");
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.java
index e2356758709..b3889880c5e 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.java
@@ -96,7 +96,7 @@ public class TestAsyncTableNoncedRetry {
     }
 
     @Override
-    public void postBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void postBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       MiniBatchOperationInProgress<Mutation> miniBatchOp) {
       // We sleep when the last of the miniBatchOperation is executed
       if (CALLED.getAndIncrement() == miniBatchOperationCount - 1) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableScanException.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableScanException.java
index ad005745698..3729296a922 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableScanException.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableScanException.java
@@ -84,7 +84,7 @@ public class TestAsyncTableScanException {
     }
 
     @Override
-    public boolean postScannerNext(ObserverContext<RegionCoprocessorEnvironment> c,
+    public boolean postScannerNext(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       InternalScanner s, List<Result> result, int limit, boolean hasNext) throws IOException {
       REQ_COUNT.incrementAndGet();
       if ((ERROR_AT == REQ_COUNT.get()) || ERROR) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableUseMetaReplicas.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableUseMetaReplicas.java
index 2803db20e71..18c53a49de7 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableUseMetaReplicas.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableUseMetaReplicas.java
@@ -75,7 +75,7 @@ public class TestAsyncTableUseMetaReplicas {
     }
 
     @Override
-    public void preScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Scan scan)
+    public void preScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c, Scan scan)
       throws IOException {
       RegionInfo region = c.getEnvironment().getRegionInfo();
       if (
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.java
index 1017d265aee..e1f21502d90 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.java
@@ -262,8 +262,8 @@ public class TestAvoidCellReferencesIntoShippedBlocks {
     }
 
     @Override
-    public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+    public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
       CompactionRequest request) throws IOException {
       return new CompactorInternalScanner(scanner);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.java
index d2e90e0be43..41996f904c1 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.java
@@ -1565,8 +1565,8 @@ public class TestBlockEvictionFromClient {
 
   public static class CustomInnerRegionObserverWrapper extends CustomInnerRegionObserver {
     @Override
-    public RegionScanner postScannerOpen(ObserverContext<RegionCoprocessorEnvironment> e, Scan scan,
-      RegionScanner s) throws IOException {
+    public RegionScanner postScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      Scan scan, RegionScanner s) throws IOException {
       return new CustomScanner(s);
     }
   }
@@ -1585,7 +1585,7 @@ public class TestBlockEvictionFromClient {
     }
 
     @Override
-    public boolean postScannerNext(ObserverContext<RegionCoprocessorEnvironment> e,
+    public boolean postScannerNext(ObserverContext<? extends RegionCoprocessorEnvironment> e,
       InternalScanner s, List<Result> results, int limit, boolean hasMore) throws IOException {
       slowdownCode(e, false);
       if (getLatch != null && getLatch.getCount() > 0) {
@@ -1598,7 +1598,7 @@ public class TestBlockEvictionFromClient {
     }
 
     @Override
-    public void postGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get,
+    public void postGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
       List<Cell> results) throws IOException {
       slowdownCode(e, true);
     }
@@ -1607,7 +1607,7 @@ public class TestBlockEvictionFromClient {
       return cdl;
     }
 
-    private void slowdownCode(final ObserverContext<RegionCoprocessorEnvironment> e,
+    private void slowdownCode(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       boolean isGet) {
       CountDownLatch latch = getCdl().get();
       try {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientOperationInterrupt.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientOperationInterrupt.java
index 4faf7665ee3..dcb96b49871 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientOperationInterrupt.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientOperationInterrupt.java
@@ -71,8 +71,8 @@ public class TestClientOperationInterrupt {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
       Threads.sleep(2500);
     }
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionAttributes.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionAttributes.java
index 49c7e86975d..5d437881374 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionAttributes.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestConnectionAttributes.java
@@ -108,7 +108,7 @@ public class TestConnectionAttributes {
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
       List<Cell> result) throws IOException {
       RpcCall rpcCall = RpcServer.getCurrentCall().get();
       for (Map.Entry<String, byte[]> attr : rpcCall.getConnectionAttributes().entrySet()) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestDropTimeoutRequest.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestDropTimeoutRequest.java
index 077754a59c1..09689309d70 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestDropTimeoutRequest.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestDropTimeoutRequest.java
@@ -75,8 +75,8 @@ public class TestDropTimeoutRequest {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
       // After first sleep, all requests are timeout except the last retry. If we handle
       // all the following requests, finally the last request is also timeout. If we drop all
       // timeout requests, we can handle the last request immediately and it will not timeout.
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java
index ce63293fdd0..27a08a8e9b2 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java
@@ -1086,7 +1086,7 @@ public class TestFromClientSide3 {
     }
 
     @Override
-    public void postBatchMutate(final ObserverContext<RegionCoprocessorEnvironment> c,
+    public void postBatchMutate(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
       final MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       try {
         latch.await();
@@ -1105,7 +1105,7 @@ public class TestFromClientSide3 {
     }
 
     @Override
-    public void postBatchMutate(final ObserverContext<RegionCoprocessorEnvironment> c,
+    public void postBatchMutate(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
       final MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       try {
         // waiting for scanner
@@ -1116,8 +1116,9 @@ public class TestFromClientSide3 {
     }
 
     @Override
-    public RegionScanner postScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e,
-      final Scan scan, final RegionScanner s) throws IOException {
+    public RegionScanner postScannerOpen(
+      final ObserverContext<? extends RegionCoprocessorEnvironment> e, final Scan scan,
+      final RegionScanner s) throws IOException {
       latch.countDown();
       return s;
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMobCloneSnapshotFromClientCloneLinksAfterDelete.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMobCloneSnapshotFromClientCloneLinksAfterDelete.java
index 3c3b6c412af..e50be218747 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMobCloneSnapshotFromClientCloneLinksAfterDelete.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMobCloneSnapshotFromClientCloneLinksAfterDelete.java
@@ -64,7 +64,7 @@ public class TestMobCloneSnapshotFromClientCloneLinksAfterDelete
     }
 
     @Override
-    public void preFlush(ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> e,
       FlushLifeCycleTracker tracker) throws IOException {
       if (delayFlush) {
         try {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestReplicaWithCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestReplicaWithCluster.java
index e02403542a9..c38be19a238 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestReplicaWithCluster.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestReplicaWithCluster.java
@@ -96,8 +96,8 @@ public class TestReplicaWithCluster {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
 
       if (e.getEnvironment().getRegion().getRegionInfo().getReplicaId() == 0) {
         CountDownLatch latch = cdl.get();
@@ -136,8 +136,8 @@ public class TestReplicaWithCluster {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
 
       int replicaId = e.getEnvironment().getRegion().getRegionInfo().getReplicaId();
 
@@ -152,7 +152,7 @@ public class TestReplicaWithCluster {
     }
 
     @Override
-    public void preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preScannerOpen(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Scan scan) throws IOException {
       int replicaId = e.getEnvironment().getRegion().getRegionInfo().getReplicaId();
       // Fail for the primary replica and replica 1
@@ -180,8 +180,8 @@ public class TestReplicaWithCluster {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
 
       int replicaId = e.getEnvironment().getRegion().getRegionInfo().getReplicaId();
 
@@ -199,7 +199,7 @@ public class TestReplicaWithCluster {
     }
 
     @Override
-    public void preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preScannerOpen(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Scan scan) throws IOException {
 
       int replicaId = e.getEnvironment().getRegion().getRegionInfo().getReplicaId();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestReplicasClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestReplicasClient.java
index 1db90cb1b65..02d80eb57f5 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestReplicasClient.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestReplicasClient.java
@@ -111,19 +111,19 @@ public class TestReplicasClient {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
       slowdownCode(e);
     }
 
     @Override
-    public void preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preScannerOpen(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Scan scan) throws IOException {
       slowdownCode(e);
     }
 
     @Override
-    public boolean preScannerNext(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public boolean preScannerNext(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final InternalScanner s, final List<Result> results, final int limit, final boolean hasMore)
       throws IOException {
       // this will slow down a certain next operation if the conditions are met. The slowness
@@ -138,7 +138,7 @@ public class TestReplicasClient {
       return true;
     }
 
-    private void slowdownCode(final ObserverContext<RegionCoprocessorEnvironment> e) {
+    private void slowdownCode(final ObserverContext<? extends RegionCoprocessorEnvironment> e) {
       if (e.getEnvironment().getRegion().getRegionInfo().getReplicaId() == 0) {
         LOG.info("We're the primary replicas.");
         CountDownLatch latch = getPrimaryCdl().get();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRequestAttributes.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRequestAttributes.java
index c9c19c36326..9d6dc33a46a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRequestAttributes.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRequestAttributes.java
@@ -314,7 +314,7 @@ public class TestRequestAttributes {
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
       List<Cell> result) throws IOException {
       if (!isValidRequestAttributes(getRequestAttributesForRowKey(get.getRow()))) {
         throw new IOException("Incorrect request attributes");
@@ -322,7 +322,7 @@ public class TestRequestAttributes {
     }
 
     @Override
-    public boolean preScannerNext(ObserverContext<RegionCoprocessorEnvironment> c,
+    public boolean preScannerNext(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       InternalScanner s, List<Result> result, int limit, boolean hasNext) throws IOException {
       if (!isValidRequestAttributes(REQUEST_ATTRIBUTES_SCAN)) {
         throw new IOException("Incorrect request attributes");
@@ -331,8 +331,8 @@ public class TestRequestAttributes {
     }
 
     @Override
-    public void prePut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit)
-      throws IOException {
+    public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
+      WALEdit edit) throws IOException {
       if (!isValidRequestAttributes(getRequestAttributesForRowKey(put.getRow()))) {
         throw new IOException("Incorrect request attributes");
       }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResultFromCoprocessor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResultFromCoprocessor.java
index b96e19f9b05..2ab9b674dc8 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResultFromCoprocessor.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResultFromCoprocessor.java
@@ -119,13 +119,13 @@ public class TestResultFromCoprocessor {
     }
 
     @Override
-    public Result postAppend(final ObserverContext<RegionCoprocessorEnvironment> c,
+    public Result postAppend(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
       final Append append, final Result result) {
       return FIXED_RESULT;
     }
 
     @Override
-    public Result postIncrement(final ObserverContext<RegionCoprocessorEnvironment> c,
+    public Result postIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
       final Increment increment, final Result result) {
       return FIXED_RESULT;
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestServerBusyException.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestServerBusyException.java
index 1214ed07f08..6ed80b84e63 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestServerBusyException.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestServerBusyException.java
@@ -73,26 +73,26 @@ public class TestServerBusyException {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
       Threads.sleep(SLEEP_TIME);
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       Threads.sleep(SLEEP_TIME);
     }
 
     @Override
-    public Result preIncrement(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public Result preIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Increment increment) throws IOException {
       Threads.sleep(SLEEP_TIME);
       return null;
     }
 
     @Override
-    public void preDelete(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
       Threads.sleep(SLEEP_TIME);
     }
@@ -109,8 +109,8 @@ public class TestServerBusyException {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
       // After first sleep, all requests are timeout except the last retry. If we handle
       // all the following requests, finally the last request is also timeout. If we drop all
       // timeout requests, we can handle the last request immediately and it will not timeout.
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableOperationException.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableOperationException.java
index 7ce3d4d3e7c..9a60281aade 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableOperationException.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableOperationException.java
@@ -149,31 +149,31 @@ public class TestTableOperationException {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
       throw new DoNotRetryIOException("Call failed and don't retry");
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       throw new DoNotRetryIOException("Call failed and don't retry");
     }
 
     @Override
-    public void preDelete(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
       throw new DoNotRetryIOException("Call failed and don't retry");
     }
 
     @Override
-    public Result preIncrement(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public Result preIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Increment increment) throws IOException {
       throw new DoNotRetryIOException("Call failed and don't retry");
     }
 
     @Override
-    public Result preAppend(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public Result preAppend(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Append append) throws IOException {
       throw new DoNotRetryIOException("Call failed and don't retry");
     }
@@ -190,31 +190,31 @@ public class TestTableOperationException {
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-      final List<Cell> results) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Get get, final List<Cell> results) throws IOException {
       throw new IOException("Call failed and retry");
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       throw new IOException("Call failed and retry");
     }
 
     @Override
-    public void preDelete(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
       throw new IOException("Call failed and retry");
     }
 
     @Override
-    public Result preIncrement(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public Result preIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Increment increment) throws IOException {
       throw new IOException("Call failed and retry");
     }
 
     @Override
-    public Result preAppend(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public Result preAppend(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Append append) throws IOException {
       throw new IOException("Call failed and retry");
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java
index 62f65d6d614..42ddf84b877 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java
@@ -154,12 +154,12 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void preOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
+  public void preOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c) {
     ctPreOpen.incrementAndGet();
   }
 
   @Override
-  public void postOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
+  public void postOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c) {
     ctPostOpen.incrementAndGet();
   }
 
@@ -168,12 +168,14 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void preClose(ObserverContext<RegionCoprocessorEnvironment> c, boolean abortRequested) {
+  public void preClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    boolean abortRequested) {
     ctPreClose.incrementAndGet();
   }
 
   @Override
-  public void postClose(ObserverContext<RegionCoprocessorEnvironment> c, boolean abortRequested) {
+  public void postClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    boolean abortRequested) {
     ctPostClose.incrementAndGet();
   }
 
@@ -182,14 +184,14 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public InternalScanner preFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
+  public InternalScanner preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
     ctPreFlush.incrementAndGet();
     return scanner;
   }
 
   @Override
-  public void postFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
+  public void postFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store,
     StoreFile resultFile, FlushLifeCycleTracker tracker) throws IOException {
     ctPostFlush.incrementAndGet();
     if (throwOnPostFlush.get()) {
@@ -202,28 +204,29 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void preCompactSelection(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    List<? extends StoreFile> candidates, CompactionLifeCycleTracker tracker) throws IOException {
+  public void preCompactSelection(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, List<? extends StoreFile> candidates, CompactionLifeCycleTracker tracker)
+    throws IOException {
     ctPreCompactSelect.incrementAndGet();
   }
 
   @Override
-  public void postCompactSelection(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    List<? extends StoreFile> selected, CompactionLifeCycleTracker tracker,
+  public void postCompactSelection(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, List<? extends StoreFile> selected, CompactionLifeCycleTracker tracker,
     CompactionRequest request) {
     ctPostCompactSelect.incrementAndGet();
   }
 
   @Override
-  public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+  public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
     ctPreCompact.incrementAndGet();
     return scanner;
   }
 
   @Override
-  public void postCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
+  public void postCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store,
     StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request)
     throws IOException {
     ctPostCompact.incrementAndGet();
@@ -234,20 +237,21 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c, final Scan scan)
-    throws IOException {
+  public void preScannerOpen(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Scan scan) throws IOException {
     ctPreScannerOpen.incrementAndGet();
   }
 
   @Override
-  public RegionScanner postScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c,
-    final Scan scan, final RegionScanner s) throws IOException {
+  public RegionScanner postScannerOpen(
+    final ObserverContext<? extends RegionCoprocessorEnvironment> c, final Scan scan,
+    final RegionScanner s) throws IOException {
     ctPostScannerOpen.incrementAndGet();
     return s;
   }
 
   @Override
-  public boolean preScannerNext(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public boolean preScannerNext(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s, final List<Result> results, final int limit, final boolean hasMore)
     throws IOException {
     ctPreScannerNext.incrementAndGet();
@@ -255,7 +259,7 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public boolean postScannerNext(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public boolean postScannerNext(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s, final List<Result> results, final int limit, final boolean hasMore)
     throws IOException {
     ctPostScannerNext.incrementAndGet();
@@ -263,27 +267,28 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public boolean postScannerFilterRow(final ObserverContext<RegionCoprocessorEnvironment> e,
-    final InternalScanner s, final Cell currentRow, final boolean hasMore) throws IOException {
+  public boolean postScannerFilterRow(
+    final ObserverContext<? extends RegionCoprocessorEnvironment> e, final InternalScanner s,
+    final Cell currentRow, final boolean hasMore) throws IOException {
     ctPostScannerFilterRow.incrementAndGet();
     return hasMore;
   }
 
   @Override
-  public void preScannerClose(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public void preScannerClose(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s) throws IOException {
     ctPreScannerClose.incrementAndGet();
   }
 
   @Override
-  public void postScannerClose(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public void postScannerClose(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final InternalScanner s) throws IOException {
     ctPostScannerClose.incrementAndGet();
   }
 
   @Override
-  public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> c, final Get get,
-    final List<Cell> results) throws IOException {
+  public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Get get, final List<Cell> results) throws IOException {
     RegionCoprocessorEnvironment e = c.getEnvironment();
     assertNotNull(e);
     assertNotNull(e.getRegion());
@@ -293,8 +298,8 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void postGetOp(final ObserverContext<RegionCoprocessorEnvironment> c, final Get get,
-    final List<Cell> results) {
+  public void postGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Get get, final List<Cell> results) {
     RegionCoprocessorEnvironment e = c.getEnvironment();
     assertNotNull(e);
     assertNotNull(e.getRegion());
@@ -326,7 +331,7 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void prePut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
+  public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> c, final Put put,
     final WALEdit edit, final Durability durability) throws IOException {
     Map<byte[], List<Cell>> familyMap = put.getFamilyCellMap();
     RegionCoprocessorEnvironment e = c.getEnvironment();
@@ -363,8 +368,8 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void postPut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
-    final WALEdit edit, final Durability durability) throws IOException {
+  public void postPut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Put put, final WALEdit edit, final Durability durability) throws IOException {
     Map<byte[], List<Cell>> familyMap = put.getFamilyCellMap();
     RegionCoprocessorEnvironment e = c.getEnvironment();
     assertNotNull(e);
@@ -403,8 +408,8 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void preDelete(final ObserverContext<RegionCoprocessorEnvironment> c, final Delete delete,
-    final WALEdit edit, final Durability durability) throws IOException {
+  public void preDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
     Map<byte[], List<Cell>> familyMap = delete.getFamilyCellMap();
     RegionCoprocessorEnvironment e = c.getEnvironment();
     assertNotNull(e);
@@ -416,14 +421,15 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void prePrepareTimeStampForDeleteVersion(ObserverContext<RegionCoprocessorEnvironment> e,
-    Mutation delete, Cell cell, byte[] byteNow, Get get) throws IOException {
+  public void prePrepareTimeStampForDeleteVersion(
+    ObserverContext<? extends RegionCoprocessorEnvironment> e, Mutation delete, Cell cell,
+    byte[] byteNow, Get get) throws IOException {
     ctPrePrepareDeleteTS.incrementAndGet();
   }
 
   @Override
-  public void postDelete(final ObserverContext<RegionCoprocessorEnvironment> c, final Delete delete,
-    final WALEdit edit, final Durability durability) throws IOException {
+  public void postDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
     Map<byte[], List<Cell>> familyMap = delete.getFamilyCellMap();
     RegionCoprocessorEnvironment e = c.getEnvironment();
     assertNotNull(e);
@@ -434,7 +440,7 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+  public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
     MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
     RegionCoprocessorEnvironment e = c.getEnvironment();
     assertNotNull(e);
@@ -444,7 +450,7 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void postBatchMutate(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public void postBatchMutate(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
     RegionCoprocessorEnvironment e = c.getEnvironment();
     assertNotNull(e);
@@ -454,181 +460,190 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void postStartRegionOperation(final ObserverContext<RegionCoprocessorEnvironment> ctx,
-    Operation op) throws IOException {
+  public void postStartRegionOperation(
+    final ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Operation op)
+    throws IOException {
     ctPostStartRegionOperation.incrementAndGet();
   }
 
   @Override
-  public void postCloseRegionOperation(final ObserverContext<RegionCoprocessorEnvironment> ctx,
-    Operation op) throws IOException {
+  public void postCloseRegionOperation(
+    final ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Operation op)
+    throws IOException {
     if (ctPostStartRegionOperation.get() > 0) {
       ctPostCloseRegionOperation.incrementAndGet();
     }
   }
 
   @Override
-  public void postBatchMutateIndispensably(final ObserverContext<RegionCoprocessorEnvironment> ctx,
+  public void postBatchMutateIndispensably(
+    final ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     MiniBatchOperationInProgress<Mutation> miniBatchOp, final boolean success) throws IOException {
     ctPostBatchMutateIndispensably.incrementAndGet();
   }
 
   @Override
-  public Result preIncrement(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public Result preIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final Increment increment) throws IOException {
     ctPreIncrement.incrementAndGet();
     return null;
   }
 
   @Override
-  public Result preIncrementAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> e,
+  public Result preIncrementAfterRowLock(ObserverContext<? extends RegionCoprocessorEnvironment> e,
     Increment increment) throws IOException {
     ctPreIncrementAfterRowLock.incrementAndGet();
     return null;
   }
 
   @Override
-  public Result postIncrement(final ObserverContext<RegionCoprocessorEnvironment> c,
+  public Result postIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
     final Increment increment, final Result result) throws IOException {
     ctPostIncrement.incrementAndGet();
     return result;
   }
 
   @Override
-  public boolean preCheckAndPut(ObserverContext<RegionCoprocessorEnvironment> e, byte[] row,
-    byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,
-    Put put, boolean result) throws IOException {
+  public boolean preCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+    byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,
+    ByteArrayComparable comparator, Put put, boolean result) throws IOException {
     ctPreCheckAndPut.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean preCheckAndPut(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    Filter filter, Put put, boolean result) throws IOException {
+  public boolean preCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, Filter filter, Put put, boolean result) throws IOException {
     ctPreCheckAndPutWithFilter.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean preCheckAndPutAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> e,
-    byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,
-    ByteArrayComparable comparator, Put put, boolean result) throws IOException {
+  public boolean preCheckAndPutAfterRowLock(
+    ObserverContext<? extends RegionCoprocessorEnvironment> e, byte[] row, byte[] family,
+    byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator, Put put,
+    boolean result) throws IOException {
     ctPreCheckAndPutAfterRowLock.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean preCheckAndPutAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
-    byte[] row, Filter filter, Put put, boolean result) throws IOException {
+  public boolean preCheckAndPutAfterRowLock(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, Filter filter, Put put,
+    boolean result) throws IOException {
     ctPreCheckAndPutWithFilterAfterRowLock.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean postCheckAndPut(ObserverContext<RegionCoprocessorEnvironment> e, byte[] row,
-    byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,
-    Put put, boolean result) throws IOException {
+  public boolean postCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+    byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,
+    ByteArrayComparable comparator, Put put, boolean result) throws IOException {
     ctPostCheckAndPut.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean postCheckAndPut(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    Filter filter, Put put, boolean result) throws IOException {
+  public boolean postCheckAndPut(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, Filter filter, Put put, boolean result) throws IOException {
     ctPostCheckAndPutWithFilter.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean preCheckAndDelete(ObserverContext<RegionCoprocessorEnvironment> e, byte[] row,
-    byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,
-    Delete delete, boolean result) throws IOException {
+  public boolean preCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+    byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,
+    ByteArrayComparable comparator, Delete delete, boolean result) throws IOException {
     ctPreCheckAndDelete.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean preCheckAndDelete(ObserverContext<RegionCoprocessorEnvironment> c, byte[] row,
-    Filter filter, Delete delete, boolean result) throws IOException {
+  public boolean preCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    byte[] row, Filter filter, Delete delete, boolean result) throws IOException {
     ctPreCheckAndDeleteWithFilter.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean preCheckAndDeleteAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> e,
-    byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,
-    ByteArrayComparable comparator, Delete delete, boolean result) throws IOException {
+  public boolean preCheckAndDeleteAfterRowLock(
+    ObserverContext<? extends RegionCoprocessorEnvironment> e, byte[] row, byte[] family,
+    byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator, Delete delete,
+    boolean result) throws IOException {
     ctPreCheckAndDeleteAfterRowLock.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean preCheckAndDeleteAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
-    byte[] row, Filter filter, Delete delete, boolean result) throws IOException {
+  public boolean preCheckAndDeleteAfterRowLock(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, byte[] row, Filter filter,
+    Delete delete, boolean result) throws IOException {
     ctPreCheckAndDeleteWithFilterAfterRowLock.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean postCheckAndDelete(ObserverContext<RegionCoprocessorEnvironment> e, byte[] row,
-    byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,
-    Delete delete, boolean result) throws IOException {
+  public boolean postCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+    byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,
+    ByteArrayComparable comparator, Delete delete, boolean result) throws IOException {
     ctPostCheckAndDelete.incrementAndGet();
     return true;
   }
 
   @Override
-  public boolean postCheckAndDelete(ObserverContext<RegionCoprocessorEnvironment> e, byte[] row,
-    Filter filter, Delete delete, boolean result) throws IOException {
+  public boolean postCheckAndDelete(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+    byte[] row, Filter filter, Delete delete, boolean result) throws IOException {
     ctPostCheckAndDeleteWithFilter.incrementAndGet();
     return true;
   }
 
   @Override
-  public CheckAndMutateResult preCheckAndMutate(ObserverContext<RegionCoprocessorEnvironment> c,
-    CheckAndMutate checkAndMutate, CheckAndMutateResult result) throws IOException {
+  public CheckAndMutateResult preCheckAndMutate(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, CheckAndMutate checkAndMutate,
+    CheckAndMutateResult result) throws IOException {
     ctPreCheckAndMutate.incrementAndGet();
     return RegionObserver.super.preCheckAndMutate(c, checkAndMutate, result);
   }
 
   @Override
   public CheckAndMutateResult preCheckAndMutateAfterRowLock(
-    ObserverContext<RegionCoprocessorEnvironment> c, CheckAndMutate checkAndMutate,
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, CheckAndMutate checkAndMutate,
     CheckAndMutateResult result) throws IOException {
     ctPreCheckAndMutateAfterRowLock.incrementAndGet();
     return RegionObserver.super.preCheckAndMutateAfterRowLock(c, checkAndMutate, result);
   }
 
   @Override
-  public CheckAndMutateResult postCheckAndMutate(ObserverContext<RegionCoprocessorEnvironment> c,
-    CheckAndMutate checkAndMutate, CheckAndMutateResult result) throws IOException {
+  public CheckAndMutateResult postCheckAndMutate(
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, CheckAndMutate checkAndMutate,
+    CheckAndMutateResult result) throws IOException {
     ctPostCheckAndMutate.incrementAndGet();
     return RegionObserver.super.postCheckAndMutate(c, checkAndMutate, result);
   }
 
   @Override
-  public Result preAppendAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> e,
+  public Result preAppendAfterRowLock(ObserverContext<? extends RegionCoprocessorEnvironment> e,
     Append append) throws IOException {
     ctPreAppendAfterRowLock.incrementAndGet();
     return null;
   }
 
   @Override
-  public Result preAppend(ObserverContext<RegionCoprocessorEnvironment> e, Append append)
+  public Result preAppend(ObserverContext<? extends RegionCoprocessorEnvironment> e, Append append)
     throws IOException {
     ctPreAppend.incrementAndGet();
     return null;
   }
 
   @Override
-  public Result postAppend(ObserverContext<RegionCoprocessorEnvironment> e, Append append,
+  public Result postAppend(ObserverContext<? extends RegionCoprocessorEnvironment> e, Append append,
     Result result) throws IOException {
     ctPostAppend.incrementAndGet();
     return null;
   }
 
   @Override
-  public void preBulkLoadHFile(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  public void preBulkLoadHFile(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     List<Pair<byte[], String>> familyPaths) throws IOException {
     RegionCoprocessorEnvironment e = ctx.getEnvironment();
     assertNotNull(e);
@@ -649,7 +664,7 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void postBulkLoadHFile(ObserverContext<RegionCoprocessorEnvironment> ctx,
+  public void postBulkLoadHFile(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
     List<Pair<byte[], String>> familyPaths, Map<byte[], List<Path>> map) throws IOException {
     RegionCoprocessorEnvironment e = ctx.getEnvironment();
     assertNotNull(e);
@@ -682,43 +697,45 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public StoreFileReader preStoreFileReaderOpen(ObserverContext<RegionCoprocessorEnvironment> ctx,
-    FileSystem fs, Path p, FSDataInputStreamWrapper in, long size, CacheConfig cacheConf,
-    Reference r, StoreFileReader reader) throws IOException {
+  public StoreFileReader preStoreFileReaderOpen(
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, FileSystem fs, Path p,
+    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,
+    StoreFileReader reader) throws IOException {
     ctPreStoreFileReaderOpen.incrementAndGet();
     return null;
   }
 
   @Override
-  public StoreFileReader postStoreFileReaderOpen(ObserverContext<RegionCoprocessorEnvironment> ctx,
-    FileSystem fs, Path p, FSDataInputStreamWrapper in, long size, CacheConfig cacheConf,
-    Reference r, StoreFileReader reader) throws IOException {
+  public StoreFileReader postStoreFileReaderOpen(
+    ObserverContext<? extends RegionCoprocessorEnvironment> ctx, FileSystem fs, Path p,
+    FSDataInputStreamWrapper in, long size, CacheConfig cacheConf, Reference r,
+    StoreFileReader reader) throws IOException {
     ctPostStoreFileReaderOpen.incrementAndGet();
     return reader;
   }
 
   @Override
-  public void preStoreScannerOpen(ObserverContext<RegionCoprocessorEnvironment> ctx, Store store,
-    ScanOptions options) throws IOException {
+  public void preStoreScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
+    Store store, ScanOptions options) throws IOException {
     if (options.getScan().getTimeRange().isAllTime()) {
       setScanOptions(options);
     }
   }
 
   @Override
-  public void preCompactScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    ScanType scanType, ScanOptions options, CompactionLifeCycleTracker tracker,
+  public void preCompactScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, ScanType scanType, ScanOptions options, CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
     setScanOptions(options);
   }
 
-  public void preFlushScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
+  public void preFlushScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, ScanOptions options, FlushLifeCycleTracker tracker) throws IOException {
     setScanOptions(options);
   }
 
   public void preMemStoreCompactionCompactScannerOpen(
-    ObserverContext<RegionCoprocessorEnvironment> c, Store store, ScanOptions options)
+    ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store, ScanOptions options)
     throws IOException {
     setScanOptions(options);
   }
@@ -732,7 +749,7 @@ public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {
   }
 
   @Override
-  public void preWALAppend(ObserverContext<RegionCoprocessorEnvironment> ctx, WALKey key,
+  public void preWALAppend(ObserverContext<? extends RegionCoprocessorEnvironment> ctx, WALKey key,
     WALEdit edit) throws IOException {
     ctPreWALAppend.incrementAndGet();
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestAppendTimeRange.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestAppendTimeRange.java
index 2677128b07c..2abe2679e7e 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestAppendTimeRange.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestAppendTimeRange.java
@@ -99,7 +99,7 @@ public class TestAppendTimeRange {
     }
 
     @Override
-    public Result preAppend(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public Result preAppend(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Append append) throws IOException {
       NavigableMap<byte[], List<Cell>> map = append.getFamilyCellMap();
       for (Map.Entry<byte[], List<Cell>> entry : map.entrySet()) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java
index 2ba46d072c4..3f75a62e4d6 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java
@@ -184,54 +184,57 @@ public class TestCoprocessorInterface {
     }
 
     @Override
-    public void preOpen(ObserverContext<RegionCoprocessorEnvironment> e) {
+    public void preOpen(ObserverContext<? extends RegionCoprocessorEnvironment> e) {
       preOpenCalled = true;
     }
 
     @Override
-    public void postOpen(ObserverContext<RegionCoprocessorEnvironment> e) {
+    public void postOpen(ObserverContext<? extends RegionCoprocessorEnvironment> e) {
       postOpenCalled = true;
     }
 
     @Override
-    public void preClose(ObserverContext<RegionCoprocessorEnvironment> e, boolean abortRequested) {
+    public void preClose(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      boolean abortRequested) {
       preCloseCalled = true;
     }
 
     @Override
-    public void postClose(ObserverContext<RegionCoprocessorEnvironment> e, boolean abortRequested) {
+    public void postClose(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      boolean abortRequested) {
       postCloseCalled = true;
     }
 
     @Override
-    public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> e, Store store,
-      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+    public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
       CompactionRequest request) {
       preCompactCalled = true;
       return scanner;
     }
 
     @Override
-    public void postCompact(ObserverContext<RegionCoprocessorEnvironment> e, Store store,
+    public void postCompact(ObserverContext<? extends RegionCoprocessorEnvironment> e, Store store,
       StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request) {
       postCompactCalled = true;
     }
 
     @Override
-    public void preFlush(ObserverContext<RegionCoprocessorEnvironment> e,
+    public void preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> e,
       FlushLifeCycleTracker tracker) {
       preFlushCalled = true;
     }
 
     @Override
-    public void postFlush(ObserverContext<RegionCoprocessorEnvironment> e,
+    public void postFlush(ObserverContext<? extends RegionCoprocessorEnvironment> e,
       FlushLifeCycleTracker tracker) {
       postFlushCalled = true;
     }
 
     @Override
-    public RegionScanner postScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e,
-      final Scan scan, final RegionScanner s) throws IOException {
+    public RegionScanner postScannerOpen(
+      final ObserverContext<? extends RegionCoprocessorEnvironment> e, final Scan scan,
+      final RegionScanner s) throws IOException {
       return new CustomScanner(s);
     }
 
@@ -282,8 +285,8 @@ public class TestCoprocessorInterface {
     public Optional<RegionObserver> getRegionObserver() {
       return Optional.of(new RegionObserver() {
         @Override
-        public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get,
-          final List<Cell> results) throws IOException {
+        public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+          final Get get, final List<Cell> results) throws IOException {
           throw new RuntimeException();
         }
       });
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.java
index 523cea7997c..2079cb85f30 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.java
@@ -210,7 +210,7 @@ public class TestCoprocessorMetrics {
     private Counter preGetCounter;
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
       List<Cell> results) throws IOException {
       preGetCounter.increment();
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.java
index 42cd1476120..c9c6599689b 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.java
@@ -86,25 +86,26 @@ public class TestIncrementAndAppendWithNullResult {
     }
 
     @Override
-    public Result preIncrementAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
-      Increment increment) throws IOException {
+    public Result preIncrementAfterRowLock(
+      ObserverContext<? extends RegionCoprocessorEnvironment> c, Increment increment)
+      throws IOException {
       return TMP_RESULT;
     }
 
     @Override
-    public Result postIncrement(ObserverContext<RegionCoprocessorEnvironment> c,
+    public Result postIncrement(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       Increment increment, Result result) throws IOException {
       return null;
     }
 
     @Override
-    public Result postAppend(ObserverContext<RegionCoprocessorEnvironment> c, Append append,
-      Result result) {
+    public Result postAppend(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Append append, Result result) {
       return null;
     }
 
     @Override
-    public Result preAppendAfterRowLock(ObserverContext<RegionCoprocessorEnvironment> c,
+    public Result preAppendAfterRowLock(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       Append append) {
       return TMP_RESULT;
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.java
index 6c6fc4a169c..de643329a06 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.java
@@ -133,7 +133,7 @@ public class TestIncrementTimeRange {
     static TimeRange tr10 = null, tr2 = null;
 
     @Override
-    public Result preIncrement(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public Result preIncrement(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final Increment increment) throws IOException {
       NavigableMap<byte[], List<Cell>> map = increment.getFamilyCellMap();
       for (Map.Entry<byte[], List<Cell>> entry : map.entrySet()) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestNegativeMemStoreSizeWithSlowCoprocessor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestNegativeMemStoreSizeWithSlowCoprocessor.java
index 312b8e5b7aa..fd7c5e68c74 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestNegativeMemStoreSizeWithSlowCoprocessor.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestNegativeMemStoreSizeWithSlowCoprocessor.java
@@ -103,8 +103,8 @@ public class TestNegativeMemStoreSizeWithSlowCoprocessor {
   public static class FlushingRegionObserver extends SimpleRegionObserver {
 
     @Override
-    public void postPut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void postPut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       HRegion region = (HRegion) c.getEnvironment().getRegion();
       super.postPut(c, put, edit, durability);
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.java
index a05643469f4..9cc82d9876c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.java
@@ -80,8 +80,8 @@ public class TestOpenTableInCoprocessor {
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       try (Table table = e.getEnvironment().getConnection().getTable(otherTable)) {
         table.put(put);
         completed[0] = true;
@@ -118,8 +118,8 @@ public class TestOpenTableInCoprocessor {
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       try (Table table = e.getEnvironment().getConnection().getTable(otherTable, getPool())) {
         Put p = new Put(new byte[] { 'a' });
         p.addColumn(family, null, new byte[] { 'a' });
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.java
index 64f47e1d1ba..8a20c6152ee 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.java
@@ -270,7 +270,7 @@ public class TestPostIncrementAndAppendBeforeWAL {
 
     @Override
     public List<Pair<Cell, Cell>> postIncrementBeforeWAL(
-      ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+      ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
       List<Pair<Cell, Cell>> cellPairs) throws IOException {
       return cellPairs.stream()
         .map(
@@ -288,7 +288,7 @@ public class TestPostIncrementAndAppendBeforeWAL {
 
     @Override
     public List<Pair<Cell, Cell>> postAppendBeforeWAL(
-      ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+      ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
       List<Pair<Cell, Cell>> cellPairs) throws IOException {
       return cellPairs.stream()
         .map(
@@ -306,7 +306,7 @@ public class TestPostIncrementAndAppendBeforeWAL {
 
     @Override
     public List<Pair<Cell, Cell>> postIncrementBeforeWAL(
-      ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+      ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
       List<Pair<Cell, Cell>> cellPairs) throws IOException {
       return cellPairs.stream()
         .map(pair -> new Pair<>(pair.getFirst(), newCellWithNotExistColumnFamily(pair.getSecond())))
@@ -323,7 +323,7 @@ public class TestPostIncrementAndAppendBeforeWAL {
 
     @Override
     public List<Pair<Cell, Cell>> postAppendBeforeWAL(
-      ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+      ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
       List<Pair<Cell, Cell>> cellPairs) throws IOException {
       return cellPairs.stream()
         .map(pair -> new Pair<>(pair.getFirst(), newCellWithNotExistColumnFamily(pair.getSecond())))
@@ -339,7 +339,7 @@ public class TestPostIncrementAndAppendBeforeWAL {
 
     @Override
     public List<Pair<Cell, Cell>> postIncrementBeforeWAL(
-      ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+      ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
       List<Pair<Cell, Cell>> cellPairs) throws IOException {
       List<Pair<Cell, Cell>> result = super.postIncrementBeforeWAL(ctx, mutation, cellPairs);
       for (Pair<Cell, Cell> pair : result) {
@@ -355,7 +355,7 @@ public class TestPostIncrementAndAppendBeforeWAL {
 
     @Override
     public List<Pair<Cell, Cell>> postAppendBeforeWAL(
-      ObserverContext<RegionCoprocessorEnvironment> ctx, Mutation mutation,
+      ObserverContext<? extends RegionCoprocessorEnvironment> ctx, Mutation mutation,
       List<Pair<Cell, Cell>> cellPairs) throws IOException {
       List<Pair<Cell, Cell>> result = super.postAppendBeforeWAL(ctx, mutation, cellPairs);
       for (Pair<Cell, Cell> pair : result) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionCoprocessorQuotaUsage.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionCoprocessorQuotaUsage.java
index eeb3eb8bb0f..4cb6260e3be 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionCoprocessorQuotaUsage.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionCoprocessorQuotaUsage.java
@@ -61,7 +61,7 @@ public class TestRegionCoprocessorQuotaUsage {
 
   public static class MyRegionObserver implements RegionObserver {
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
       List<Cell> result) throws IOException {
 
       // For the purposes of this test, we only need to catch a throttle happening once, then
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.java
index 3a733a66e28..dd94faa2324 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.java
@@ -259,8 +259,8 @@ public class TestRegionObserverBypass {
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       PREPUT_INVOCATIONS.incrementAndGet();
       Map<byte[], List<Cell>> familyMap = put.getFamilyCellMap();
       if (familyMap.containsKey(test)) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.java
index 523f09444c3..b126282f4ff 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.java
@@ -210,7 +210,7 @@ public class TestRegionObserverForAddingMutationsFromCoprocessors {
     }
 
     @Override
-    public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       Mutation mut = miniBatchOp.getOperation(0);
       List<Cell> cells = mut.getFamilyCellMap().get(test);
@@ -229,7 +229,7 @@ public class TestRegionObserverForAddingMutationsFromCoprocessors {
     }
 
     @Override
-    public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       Mutation mut = miniBatchOp.getOperation(0);
       List<Cell> cells = mut.getFamilyCellMap().get(test);
@@ -249,7 +249,7 @@ public class TestRegionObserverForAddingMutationsFromCoprocessors {
     }
 
     @Override
-    public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       Mutation mut = miniBatchOp.getOperation(0);
 
@@ -272,7 +272,7 @@ public class TestRegionObserverForAddingMutationsFromCoprocessors {
     }
 
     @Override
-    public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       Mutation mut = miniBatchOp.getOperation(0);
 
@@ -295,7 +295,7 @@ public class TestRegionObserverForAddingMutationsFromCoprocessors {
     }
 
     @Override
-    public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       Mutation mut = miniBatchOp.getOperation(0);
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java
index f1c7d0770a0..81b51659571 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java
@@ -583,8 +583,8 @@ public class TestRegionObserverInterface {
     }
 
     @Override
-    public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> e, Store store,
-      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+    public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
       CompactionRequest request) {
       return new InternalScanner() {
 
@@ -620,13 +620,13 @@ public class TestRegionObserverInterface {
     }
 
     @Override
-    public void postCompact(ObserverContext<RegionCoprocessorEnvironment> e, Store store,
+    public void postCompact(ObserverContext<? extends RegionCoprocessorEnvironment> e, Store store,
       StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request) {
       lastCompaction = EnvironmentEdgeManager.currentTime();
     }
 
     @Override
-    public void postFlush(ObserverContext<RegionCoprocessorEnvironment> e,
+    public void postFlush(ObserverContext<? extends RegionCoprocessorEnvironment> e,
       FlushLifeCycleTracker tracker) {
       lastFlush = EnvironmentEdgeManager.currentTime();
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.java
index a2700f94ffc..5b7d60638de 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.java
@@ -68,14 +68,14 @@ public class TestRegionObserverPreFlushAndPreCompact {
    */
   public static class TestRegionObserver implements RegionObserver, RegionCoprocessor {
     @Override
-    public InternalScanner preFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
+    public InternalScanner preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
       return null;
     }
 
     @Override
-    public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+    public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
       CompactionRequest request) throws IOException {
       return null;
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.java
index beca58744a9..518106ed06a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.java
@@ -128,13 +128,13 @@ public class TestRegionObserverScannerOpenHook {
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
       List<Cell> result) throws IOException {
       c.bypass();
     }
 
     @Override
-    public void preScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Scan scan)
+    public void preScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c, Scan scan)
       throws IOException {
       scan.setFilter(new NoDataFilter());
     }
@@ -163,8 +163,8 @@ public class TestRegionObserverScannerOpenHook {
     }
 
     @Override
-    public InternalScanner preFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
+    public InternalScanner preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
       return NO_DATA;
     }
   }
@@ -180,8 +180,8 @@ public class TestRegionObserverScannerOpenHook {
     }
 
     @Override
-    public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+    public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
       CompactionRequest request) throws IOException {
       return NO_DATA;
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.java
index 74021967e41..4776cd89c79 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.java
@@ -69,8 +69,8 @@ public class TestRegionObserverStacking {
     }
 
     @Override
-    public void postPut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void postPut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       id = EnvironmentEdgeManager.currentTime();
       Threads.sleepWithoutInterrupt(10);
     }
@@ -85,8 +85,8 @@ public class TestRegionObserverStacking {
     }
 
     @Override
-    public void postPut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void postPut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       id = EnvironmentEdgeManager.currentTime();
       Threads.sleepWithoutInterrupt(10);
     }
@@ -101,8 +101,8 @@ public class TestRegionObserverStacking {
     }
 
     @Override
-    public void postPut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void postPut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       id = EnvironmentEdgeManager.currentTime();
       Threads.sleepWithoutInterrupt(10);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java
index 8088e501349..6949170da50 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java
@@ -152,8 +152,8 @@ public class TestRegionServerCoprocessorExceptionWithAbort {
   public static class BuggyRegionObserver extends SimpleRegionObserver {
     @SuppressWarnings("null")
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
-      final WALEdit edit, final Durability durability) {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      final Put put, final WALEdit edit, final Durability durability) {
       String tableName =
         c.getEnvironment().getRegion().getRegionInfo().getTable().getNameAsString();
       if (tableName.equals("observed_table")) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.java
index 52927a3bee3..e806c7abea2 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.java
@@ -55,8 +55,8 @@ public class TestRegionServerCoprocessorExceptionWithRemove {
   public static class BuggyRegionObserver extends SimpleRegionObserver {
     @SuppressWarnings("null")
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
-      final WALEdit edit, final Durability durability) {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      final Put put, final WALEdit edit, final Durability durability) {
       String tableName =
         c.getEnvironment().getRegion().getRegionInfo().getTable().getNameAsString();
       if (tableName.equals("observed_table")) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.java
index 4375ea36d93..216e47b59c6 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.java
@@ -112,8 +112,8 @@ public class TestMasterAbortAndRSGotKilled {
   public static class DelayCloseCP implements RegionCoprocessor, RegionObserver {
 
     @Override
-    public void preClose(ObserverContext<RegionCoprocessorEnvironment> c, boolean abortRequested)
-      throws IOException {
+    public void preClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      boolean abortRequested) throws IOException {
       if (!c.getEnvironment().getRegion().getRegionInfo().getTable().isSystemTable()) {
         LOG.info("begin to sleep");
         countDownLatch.countDown();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterHandlerFullWhenTransitRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterHandlerFullWhenTransitRegion.java
index 93e6706ff56..f522e244900 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterHandlerFullWhenTransitRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterHandlerFullWhenTransitRegion.java
@@ -78,7 +78,8 @@ public class TestMasterHandlerFullWhenTransitRegion {
   public static class DelayOpenCP implements RegionCoprocessor, RegionObserver {
 
     @Override
-    public void preOpen(ObserverContext<RegionCoprocessorEnvironment> c) throws IOException {
+    public void preOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c)
+      throws IOException {
       try {
         if (!c.getEnvironment().getRegion().getRegionInfo().getTable().isSystemTable()) {
           LOG.info("begin to sleep");
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestExceptionInAssignRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestExceptionInAssignRegion.java
index fad229f0ac6..aba42eb1384 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestExceptionInAssignRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestExceptionInAssignRegion.java
@@ -114,7 +114,7 @@ public class TestExceptionInAssignRegion {
 
   public static class ThrowInOpenCP implements RegionCoprocessor, RegionObserver {
     @Override
-    public void preOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
+    public void preOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c) {
       if (countDownLatch.getCount() == 1) {
         // We want to throw exception only first time in move region call
         // After that RS aborts and we don't want to throw in any other open region
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestExceptionInUnassignedRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestExceptionInUnassignedRegion.java
index 6b8b40c7c93..fcbca1ac017 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestExceptionInUnassignedRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestExceptionInUnassignedRegion.java
@@ -110,7 +110,8 @@ public class TestExceptionInUnassignedRegion {
   public static class ThrowInCloseCP implements RegionCoprocessor, RegionObserver {
 
     @Override
-    public void preClose(ObserverContext<RegionCoprocessorEnvironment> c, boolean abortRequested) {
+    public void preClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      boolean abortRequested) {
       if (!c.getEnvironment().getRegion().getRegionInfo().getTable().isSystemTable()) {
         throw new RuntimeException();
       }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java
index 99092712ec7..3d79fe208cf 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java
@@ -132,7 +132,8 @@ public class TestSplitTableRegionProcedure {
     }
 
     @Override
-    public void preOpen(ObserverContext<RegionCoprocessorEnvironment> c) throws IOException {
+    public void preOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c)
+      throws IOException {
       int replicaId = c.getEnvironment().getRegion().getRegionInfo().getReplicaId();
       if ((replicaId != RegionInfo.DEFAULT_REPLICA_ID) && (countForReplica == 0)) {
         countForReplica++;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.java
index d1e7dc14761..d2f04c674c9 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.java
@@ -96,7 +96,7 @@ public class TestProcedurePriority {
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
       List<Cell> result) throws IOException {
       if (FAIL && c.getEnvironment().getRegionInfo().isMetaRegion()) {
         throw new IOException("Inject error");
@@ -104,8 +104,8 @@ public class TestProcedurePriority {
     }
 
     @Override
-    public void prePut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit,
-      Durability durability) throws IOException {
+    public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
+      WALEdit edit, Durability durability) throws IOException {
       if (FAIL && c.getEnvironment().getRegionInfo().isMetaRegion()) {
         throw new IOException("Inject error");
       }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java
index ab17f94389e..3f52ff30026 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java
@@ -475,7 +475,7 @@ public class TestNamespaceAuditor {
     volatile CountDownLatch postCompact;
 
     @Override
-    public void postCompact(ObserverContext<RegionCoprocessorEnvironment> e, Store store,
+    public void postCompact(ObserverContext<? extends RegionCoprocessorEnvironment> e, Store store,
       StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request)
       throws IOException {
       postCompact.countDown();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/NoOpScanPolicyObserver.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/NoOpScanPolicyObserver.java
index 73fb8161613..7e886d4a911 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/NoOpScanPolicyObserver.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/NoOpScanPolicyObserver.java
@@ -41,14 +41,14 @@ public class NoOpScanPolicyObserver implements RegionCoprocessor, RegionObserver
   }
 
   @Override
-  public InternalScanner preFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
+  public InternalScanner preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
     return new DelegatingInternalScanner(scanner);
   }
 
   @Override
-  public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-    InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+  public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+    Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
     CompactionRequest request) throws IOException {
     return new DelegatingInternalScanner(scanner);
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBulkLoadReplication.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBulkLoadReplication.java
index d9aed0e6871..127ebcaabfe 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBulkLoadReplication.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBulkLoadReplication.java
@@ -311,7 +311,7 @@ public class TestBulkLoadReplication extends TestReplicationBase {
       return Optional.of(new RegionObserver() {
 
         @Override
-        public void postBulkLoadHFile(ObserverContext<RegionCoprocessorEnvironment> ctx,
+        public void postBulkLoadHFile(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
           List<Pair<byte[], String>> stagingFamilyPaths, Map<byte[], List<Path>> finalPaths)
           throws IOException {
           BULK_LOAD_LATCH.countDown();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.java
index 95150db6195..c7bced997f7 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.java
@@ -97,16 +97,17 @@ public class TestCompactionLifeCycleTracker {
     }
 
     @Override
-    public void preCompactSelection(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      List<? extends StoreFile> candidates, CompactionLifeCycleTracker tracker) throws IOException {
+    public void preCompactSelection(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, List<? extends StoreFile> candidates, CompactionLifeCycleTracker tracker)
+      throws IOException {
       if (TRACKER != null) {
         assertSame(tracker, TRACKER);
       }
     }
 
     @Override
-    public void postCompactSelection(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      List<? extends StoreFile> selected, CompactionLifeCycleTracker tracker,
+    public void postCompactSelection(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, List<? extends StoreFile> selected, CompactionLifeCycleTracker tracker,
       CompactionRequest request) {
       if (TRACKER != null) {
         assertSame(tracker, TRACKER);
@@ -114,8 +115,8 @@ public class TestCompactionLifeCycleTracker {
     }
 
     @Override
-    public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+    public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
       CompactionRequest request) throws IOException {
       if (TRACKER != null) {
         assertSame(tracker, TRACKER);
@@ -124,7 +125,7 @@ public class TestCompactionLifeCycleTracker {
     }
 
     @Override
-    public void postCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
+    public void postCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store,
       StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request)
       throws IOException {
       if (TRACKER != null) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionWithShippingCoprocessor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionWithShippingCoprocessor.java
index e448f383426..8f909767d7d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionWithShippingCoprocessor.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionWithShippingCoprocessor.java
@@ -110,8 +110,8 @@ public class TestCompactionWithShippingCoprocessor {
     }
 
     @Override
-    public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+    public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
       CompactionRequest request) throws IOException {
       return new ShippedObservingScanner(scanner);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.java
index 0fc31e9ec97..70c63bed005 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.java
@@ -88,7 +88,7 @@ public class TestFlushLifeCycleTracker {
     }
 
     @Override
-    public void preFlush(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       FlushLifeCycleTracker tracker) throws IOException {
       if (TRACKER != null) {
         assertSame(tracker, TRACKER);
@@ -96,8 +96,8 @@ public class TestFlushLifeCycleTracker {
     }
 
     @Override
-    public InternalScanner preFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
+    public InternalScanner preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
       if (TRACKER != null) {
         assertSame(tracker, TRACKER);
       }
@@ -105,7 +105,7 @@ public class TestFlushLifeCycleTracker {
     }
 
     @Override
-    public void postFlush(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void postFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       FlushLifeCycleTracker tracker) throws IOException {
       if (TRACKER != null) {
         assertSame(tracker, TRACKER);
@@ -113,7 +113,7 @@ public class TestFlushLifeCycleTracker {
     }
 
     @Override
-    public void postFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
+    public void postFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c, Store store,
       StoreFile resultFile, FlushLifeCycleTracker tracker) throws IOException {
       if (TRACKER != null) {
         assertSame(tracker, TRACKER);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.java
index 6a410f953fe..4206036df57 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.java
@@ -227,8 +227,8 @@ public class TestHRegionServerBulkLoad {
     }
 
     @Override
-    public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> e, Store store,
-      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+    public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
       CompactionRequest request) throws IOException {
       try {
         Thread.sleep(sleepDuration);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionInterrupt.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionInterrupt.java
index 5d308b7e2ad..c207affc895 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionInterrupt.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionInterrupt.java
@@ -326,29 +326,29 @@ public class TestRegionInterrupt {
     }
 
     @Override
-    public void prePut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit,
-      Durability durability) throws IOException {
+    public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
+      WALEdit edit, Durability durability) throws IOException {
       doSleep(Region.Operation.PUT);
       RegionObserver.super.prePut(c, put, edit, durability);
     }
 
     @Override
-    public void preDelete(ObserverContext<RegionCoprocessorEnvironment> c, Delete delete,
+    public void preDelete(ObserverContext<? extends RegionCoprocessorEnvironment> c, Delete delete,
       WALEdit edit, Durability durability) throws IOException {
       doSleep(Region.Operation.DELETE);
       RegionObserver.super.preDelete(c, delete, edit, durability);
     }
 
     @Override
-    public Result preAppend(ObserverContext<RegionCoprocessorEnvironment> c, Append append)
-      throws IOException {
+    public Result preAppend(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Append append) throws IOException {
       doSleep(Region.Operation.APPEND);
       return RegionObserver.super.preAppend(c, append);
     }
 
     @Override
-    public Result preIncrement(ObserverContext<RegionCoprocessorEnvironment> c, Increment increment)
-      throws IOException {
+    public Result preIncrement(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Increment increment) throws IOException {
       doSleep(Region.Operation.INCREMENT);
       return RegionObserver.super.preIncrement(c, increment);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.java
index dc05b82253c..feb9e0656e6 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.java
@@ -221,8 +221,8 @@ public class TestRegionServerAbort {
     }
 
     @Override
-    public void prePut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit,
-      Durability durability) throws IOException {
+    public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
+      WALEdit edit, Durability durability) throws IOException {
       if (put.getAttribute(DO_ABORT) != null) {
         // TODO: Change this so it throws a CP Abort Exception instead.
         RegionServerServices rss =
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerAbortTimeout.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerAbortTimeout.java
index 5a410a25465..8cb6e3953b4 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerAbortTimeout.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerAbortTimeout.java
@@ -147,8 +147,8 @@ public class TestRegionServerAbortTimeout {
     }
 
     @Override
-    public void preClose(ObserverContext<RegionCoprocessorEnvironment> c, boolean abortRequested)
-      throws IOException {
+    public void preClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      boolean abortRequested) throws IOException {
       Threads.sleep(SLEEP_TIME_WHEN_CLOSE_REGION);
     }
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.java
index 44e1cc1c4b8..1bcb46b8daa 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.java
@@ -463,7 +463,7 @@ public class TestRegionServerReadRequestMetrics {
     }
 
     @Override
-    public void postOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
+    public void postOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c) {
       RegionCoprocessorEnvironment env = c.getEnvironment();
       Region region = env.getRegion();
       try {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerRejectDuringAbort.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerRejectDuringAbort.java
index 8add191f9ab..61da536310a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerRejectDuringAbort.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerRejectDuringAbort.java
@@ -244,8 +244,8 @@ public class TestRegionServerRejectDuringAbort {
     }
 
     @Override
-    public void preClose(ObserverContext<RegionCoprocessorEnvironment> c, boolean abortRequested)
-      throws IOException {
+    public void preClose(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      boolean abortRequested) throws IOException {
       // Wait so that the region can't close until we get the information we need from our test
       UTIL.waitFor(60_000, () -> THROWN_EXCEPTION.get() != null);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.java
index 68835390493..93f6d595688 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.java
@@ -80,7 +80,7 @@ public class TestScannerRetriableFailure {
     }
 
     @Override
-    public boolean preScannerNext(final ObserverContext<RegionCoprocessorEnvironment> e,
+    public boolean preScannerNext(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
       final InternalScanner s, final List<Result> results, final int limit, final boolean hasMore)
       throws IOException {
       final TableName tableName = e.getEnvironment().getRegionInfo().getTable();
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScannerWithCorruptHFile.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScannerWithCorruptHFile.java
index 14d8257add3..d1fd841d842 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScannerWithCorruptHFile.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScannerWithCorruptHFile.java
@@ -80,7 +80,7 @@ public class TestScannerWithCorruptHFile {
     }
 
     @Override
-    public boolean preScannerNext(ObserverContext<RegionCoprocessorEnvironment> e,
+    public boolean preScannerNext(ObserverContext<? extends RegionCoprocessorEnvironment> e,
       InternalScanner s, List<Result> results, int limit, boolean hasMore) throws IOException {
       throw new CorruptHFileException("For test");
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.java
index 96a1c4b99fc..068334ce1ba 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.java
@@ -83,8 +83,9 @@ public class TestSettingTimeoutOnBlockingPoint {
     }
 
     @Override
-    public Result preIncrementAfterRowLock(final ObserverContext<RegionCoprocessorEnvironment> e,
-      final Increment increment) throws IOException {
+    public Result preIncrementAfterRowLock(
+      final ObserverContext<? extends RegionCoprocessorEnvironment> e, final Increment increment)
+      throws IOException {
       Threads.sleep(SLEEP_TIME);
       return null;
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestTags.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestTags.java
index 48d42ae1827..9adc117f98e 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestTags.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestTags.java
@@ -643,8 +643,8 @@ public class TestTags {
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       updateMutationAddingTags(put);
     }
 
@@ -678,21 +678,21 @@ public class TestTags {
     }
 
     @Override
-    public Result preIncrement(ObserverContext<RegionCoprocessorEnvironment> e, Increment increment)
-      throws IOException {
+    public Result preIncrement(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      Increment increment) throws IOException {
       updateMutationAddingTags(increment);
       return null;
     }
 
     @Override
-    public Result preAppend(ObserverContext<RegionCoprocessorEnvironment> e, Append append)
-      throws IOException {
+    public Result preAppend(ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      Append append) throws IOException {
       updateMutationAddingTags(append);
       return null;
     }
 
     @Override
-    public boolean postScannerNext(ObserverContext<RegionCoprocessorEnvironment> e,
+    public boolean postScannerNext(ObserverContext<? extends RegionCoprocessorEnvironment> e,
       InternalScanner s, List<Result> results, int limit, boolean hasMore) throws IOException {
       if (checkTagPresence) {
         if (results.size() > 0) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/regionreplication/TestRegionReplicationForWriteException.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/regionreplication/TestRegionReplicationForWriteException.java
index 88a7a2a7e73..59b9ae9349d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/regionreplication/TestRegionReplicationForWriteException.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/regionreplication/TestRegionReplicationForWriteException.java
@@ -316,7 +316,7 @@ public class TestRegionReplicationForWriteException {
     }
 
     @Override
-    public void postBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void postBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       if (!testCP || !RegionReplicaUtil.isDefaultReplica(c.getEnvironment().getRegionInfo())) {
         return;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestMasterReplication.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestMasterReplication.java
index c7a8ec7373b..4c0cc89c36d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestMasterReplication.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestMasterReplication.java
@@ -822,20 +822,20 @@ public class TestMasterReplication {
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       nCount++;
     }
 
     @Override
-    public void postDelete(final ObserverContext<RegionCoprocessorEnvironment> c,
+    public void postDelete(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
       final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
       nDelete++;
     }
 
     @Override
-    public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> c, final Get get,
-      final List<Cell> result) throws IOException {
+    public void preGetOp(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      final Get get, final List<Cell> result) throws IOException {
       if (get.getAttribute("count") != null) {
         result.clear();
         // order is important!
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationWithTags.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationWithTags.java
index 33efd51368b..f07025945e0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationWithTags.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationWithTags.java
@@ -212,8 +212,8 @@ public class TestReplicationWithTags {
     }
 
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> e,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       byte[] attribute = put.getAttribute("visibility");
       byte[] cf = null;
       List<Cell> updatedCells = new ArrayList<>();
@@ -252,7 +252,7 @@ public class TestReplicationWithTags {
     }
 
     @Override
-    public void postGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get,
+    public void postGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
       List<Cell> results) throws IOException {
       if (results.size() > 0) {
         // Check tag presence in the 1st cell in 1st Result
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationWithWALExtendedAttributes.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationWithWALExtendedAttributes.java
index 971b0938ccd..0d0ec060b7a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationWithWALExtendedAttributes.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationWithWALExtendedAttributes.java
@@ -215,8 +215,8 @@ public class TestReplicationWithWALExtendedAttributes {
     }
 
     @Override
-    public void preWALAppend(ObserverContext<RegionCoprocessorEnvironment> ctx, WALKey key,
-      WALEdit edit) throws IOException {
+    public void preWALAppend(ObserverContext<? extends RegionCoprocessorEnvironment> ctx,
+      WALKey key, WALEdit edit) throws IOException {
       key.addExtendedAttribute("extendedAttr1", Bytes.toBytes("Value of Extended attribute 01"));
       key.addExtendedAttribute("extendedAttr2", Bytes.toBytes("Value of Extended attribute 02"));
     }
@@ -231,8 +231,8 @@ public class TestReplicationWithWALExtendedAttributes {
     }
 
     @Override
-    public void prePut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit)
-      throws IOException {
+    public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> c, Put put,
+      WALEdit edit) throws IOException {
       String attrVal1 = Bytes.toString(put.getAttribute("extendedAttr1"));
       String attrVal2 = Bytes.toString(put.getAttribute("extendedAttr2"));
       if (attrVal1 == null || attrVal2 == null) {
@@ -248,7 +248,7 @@ public class TestReplicationWithWALExtendedAttributes {
     }
 
     @Override
-    public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
+    public void preBatchMutate(ObserverContext<? extends RegionCoprocessorEnvironment> c,
       MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
       String attrVal1 = Bytes.toString(miniBatchOp.getOperation(0).getAttribute("extendedAttr1"));
       String attrVal2 = Bytes.toString(miniBatchOp.getOperation(0).getAttribute("extendedAttr2"));
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java
index 10ca33e3872..7d5a5627d2c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java
@@ -411,8 +411,8 @@ public class TestVisibilityLabelsReplication {
     }
 
     @Override
-    public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put m, WALEdit edit,
-      Durability durability) throws IOException {
+    public void prePut(ObserverContext<? extends RegionCoprocessorEnvironment> e, Put m,
+      WALEdit edit, Durability durability) throws IOException {
       byte[] attribute = m.getAttribute(NON_VISIBILITY);
       byte[] cf = null;
       List<Cell> updatedCells = new ArrayList<>();
@@ -448,7 +448,7 @@ public class TestVisibilityLabelsReplication {
     }
 
     @Override
-    public void postGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get,
+    public void postGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
       List<Cell> results) throws IOException {
       if (results.size() > 0) {
         // Check tag presence in the 1st cell in 1st Result
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java
index 9e6d7d651bf..57714e0094f 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java
@@ -227,8 +227,8 @@ public class TestCoprocessorScanPolicy {
     // lame way to communicate with the coprocessor,
     // since it is loaded by a different class loader
     @Override
-    public void prePut(final ObserverContext<RegionCoprocessorEnvironment> c, final Put put,
-      final WALEdit edit, final Durability durability) throws IOException {
+    public void prePut(final ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      final Put put, final WALEdit edit, final Durability durability) throws IOException {
       if (put.getAttribute("ttl") != null) {
         Cell cell = put.getFamilyCellMap().values().stream().findFirst().get().get(0);
         ttls.put(
@@ -315,20 +315,20 @@ public class TestCoprocessorScanPolicy {
     }
 
     @Override
-    public InternalScanner preFlush(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
+    public InternalScanner preFlush(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {
       return wrap(store, scanner);
     }
 
     @Override
-    public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> c, Store store,
-      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
+    public InternalScanner preCompact(ObserverContext<? extends RegionCoprocessorEnvironment> c,
+      Store store, InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,
       CompactionRequest request) throws IOException {
       return wrap(store, scanner);
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> c, Get get,
       List<Cell> result) throws IOException {
       TableName tableName = c.getEnvironment().getRegion().getTableDescriptor().getTableName();
       Long ttl = this.ttls.get(tableName);
@@ -342,7 +342,7 @@ public class TestCoprocessorScanPolicy {
     }
 
     @Override
-    public void preScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, Scan scan)
+    public void preScannerOpen(ObserverContext<? extends RegionCoprocessorEnvironment> c, Scan scan)
       throws IOException {
       Region region = c.getEnvironment().getRegion();
       TableName tableName = region.getTableDescriptor().getTableName();
diff --git a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/ErrorThrowingGetObserver.java b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/ErrorThrowingGetObserver.java
index 45c91c4e2f1..8dcb10d1abd 100644
--- a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/ErrorThrowingGetObserver.java
+++ b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/ErrorThrowingGetObserver.java
@@ -56,8 +56,8 @@ public class ErrorThrowingGetObserver implements RegionCoprocessor, RegionObserv
   public static final String SHOULD_ERROR_ATTRIBUTE = "error";
 
   @Override
-  public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get, List<Cell> results)
-    throws IOException {
+  public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
+    List<Cell> results) throws IOException {
     byte[] errorType = get.getAttribute(SHOULD_ERROR_ATTRIBUTE);
     if (errorType != null) {
       ErrorType type = ErrorType.valueOf(Bytes.toString(errorType));
diff --git a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java
index 810bb87baa9..7e91ac74b81 100644
--- a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java
+++ b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java
@@ -1882,7 +1882,7 @@ public class TestThriftHBaseServiceHandler {
     }
 
     @Override
-    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get,
+    public void preGetOp(ObserverContext<? extends RegionCoprocessorEnvironment> e, Get get,
       List<Cell> results) throws IOException {
       try {
         long start = EnvironmentEdgeManager.currentTime();