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 cbad200..5c1b7df 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 @@ -1042,6 +1042,35 @@ public interface RegionObserver extends Coprocessor { final KeyValueScanner s) throws IOException; /** + * Called before a store opens a new scanner. + * This hook is called when a "user" scanner is opened. + *

+ * See {@link #preFlushScannerOpen(ObserverContext, Store, KeyValueScanner, InternalScanner)} + * and {@link #preCompactScannerOpen(ObserverContext, + * Store, List, ScanType, long, InternalScanner)} + * to override scanners created for flushes or compactions, resp. + *

+ * Call CoprocessorEnvironment#complete to skip any subsequent chained + * coprocessors. + * Calling {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no + * effect in this hook. + *

+ * Note: Do not retain references to any Cells returned by scanner, beyond the life of this + * invocation. If need a Cell reference for later use, copy the cell and use that. + * @param c the environment provided by the region server + * @param store the store being scanned + * @param scan the Scan specification + * @param targetCols columns to be used in the scanner + * @param s the base scanner, if not {@code null}, from previous RegionObserver in the chain + * @param readPt the read point + * @return a KeyValueScanner instance to use or {@code null} to use the default implementation + * @throws IOException if an error occurred on the coprocessor + */ + KeyValueScanner preStoreScannerOpen(final ObserverContext c, + final Store store, final Scan scan, final NavigableSet targetCols, + final KeyValueScanner s, final long readPt) throws IOException; + + /** * Called after the client opens a new scanner. *

* Call CoprocessorEnvironment#complete to skip any subsequent chained diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java index c02627f..8dfa0e0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java @@ -1868,7 +1868,7 @@ public class HStore implements Store { try { KeyValueScanner scanner = null; if (this.getCoprocessorHost() != null) { - scanner = this.getCoprocessorHost().preStoreScannerOpen(this, scan, targetCols); + scanner = this.getCoprocessorHost().preStoreScannerOpen(this, scan, targetCols, readPt); } scanner = createScanner(scan, targetCols, readPt, scanner); return scanner; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java index 6614b3e..25e0200 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java @@ -1282,13 +1282,13 @@ public class RegionCoprocessorHost * Store, Scan, NavigableSet, KeyValueScanner)} */ public KeyValueScanner preStoreScannerOpen(final Store store, final Scan scan, - final NavigableSet targetCols) throws IOException { + final NavigableSet targetCols, final long readPt) throws IOException { return execOperationWithResult(null, coprocessors.isEmpty() ? null : new RegionOperationWithResult() { @Override public void call(RegionObserver oserver, ObserverContext ctx) throws IOException { - setResult(oserver.preStoreScannerOpen(ctx, store, scan, targetCols, getResult())); + setResult(oserver.preStoreScannerOpen(ctx, store, scan, targetCols, getResult(), readPt)); } }); }