Index: src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java (revision 1551829) +++ src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java (working copy) @@ -78,6 +78,7 @@ // The shared data map private static ReferenceMap sharedDataMap = new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK); + private final boolean hasCustomPostScannerFilterRow; /** * Encapsulation of the environment of each coprocessor @@ -153,6 +154,18 @@ // load Coprocessor From HDFS loadTableCoprocessors(conf); + boolean hasCustomPostScannerFilterRow = false; + for (RegionEnvironment env: coprocessors) { + if (env.getInstance() instanceof RegionObserver) { + try { + env.getInstance().getClass().getDeclaredMethod("postScannerFilterRow", ObserverContext.class, + InternalScanner.class, byte[].class, boolean.class); + hasCustomPostScannerFilterRow = true; + } catch (NoSuchMethodException ignore) { + } + } + } + this.hasCustomPostScannerFilterRow = hasCustomPostScannerFilterRow; } void loadTableCoprocessors(final Configuration conf) { @@ -1395,6 +1408,8 @@ */ public boolean postScannerFilterRow(final InternalScanner s, final byte[] currentRow) throws IOException { + // short circuit for performance + if (!hasCustomPostScannerFilterRow) return true; boolean hasMore = true; // By default assume more rows there. ObserverContext ctx = null; for (RegionEnvironment env : coprocessors) {