HBASE-15759 RegionObserver.preStoreScannerOpen() doesn't have acces to current readpoint
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/532b914f Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/532b914f Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/532b914f Branch: refs/heads/hbase-12439 Commit: 532b914f08af31d34a9b4ede7e8f5a567a9b211e Parents: c716a75 Author: tedyu <yuzhih...@gmail.com> Authored: Thu May 5 15:20:37 2016 -0700 Committer: tedyu <yuzhih...@gmail.com> Committed: Thu May 5 15:20:37 2016 -0700 ---------------------------------------------------------------------- .../hbase/coprocessor/BaseRegionObserver.java | 7 +++++ .../hbase/coprocessor/RegionObserver.java | 32 ++++++++++++++++++++ .../hadoop/hbase/regionserver/HStore.java | 2 +- .../regionserver/RegionCoprocessorHost.java | 4 +-- .../TestRegionObserverScannerOpenHook.java | 5 ++- .../hbase/util/TestCoprocessorScanPolicy.java | 5 ++- 6 files changed, 46 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/532b914f/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRegionObserver.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRegionObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRegionObserver.java index 67093f8..eaf9f43 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRegionObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRegionObserver.java @@ -401,6 +401,13 @@ public class BaseRegionObserver implements RegionObserver { } @Override + public KeyValueScanner preStoreScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c, + final Store store, final Scan scan, final NavigableSet<byte[]> targetCols, + final KeyValueScanner s, final long readPt) throws IOException { + return preStoreScannerOpen(c, store, scan, targetCols, s); + } + + @Override public RegionScanner postScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e, final Scan scan, final RegionScanner s) throws IOException { return s; http://git-wip-us.apache.org/repos/asf/hbase/blob/532b914f/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionObserver.java ---------------------------------------------------------------------- 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..1d985df 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 @@ -1036,12 +1036,44 @@ public interface RegionObserver extends Coprocessor { * @param s the base scanner, if not {@code null}, from previous RegionObserver in the chain * @return a KeyValueScanner instance to use or {@code null} to use the default implementation * @throws IOException if an error occurred on the coprocessor + * @deprecated use {@link #preStoreScannerOpen(ObserverContext, Store, Scan, NavigableSet, + * KeyValueScanner, long)} instead */ + @Deprecated KeyValueScanner preStoreScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c, final Store store, final Scan scan, final NavigableSet<byte[]> targetCols, final KeyValueScanner s) throws IOException; /** + * Called before a store opens a new scanner. + * This hook is called when a "user" scanner is opened. + * <p> + * 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. + * <p> + * Call CoprocessorEnvironment#complete to skip any subsequent chained + * coprocessors. + * Calling {@link org.apache.hadoop.hbase.coprocessor.ObserverContext#bypass()} has no + * effect in this hook. + * <p> + * 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<RegionCoprocessorEnvironment> c, + final Store store, final Scan scan, final NavigableSet<byte[]> targetCols, + final KeyValueScanner s, final long readPt) throws IOException; + + /** * Called after the client opens a new scanner. * <p> * Call CoprocessorEnvironment#complete to skip any subsequent chained http://git-wip-us.apache.org/repos/asf/hbase/blob/532b914f/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java ---------------------------------------------------------------------- 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; http://git-wip-us.apache.org/repos/asf/hbase/blob/532b914f/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java ---------------------------------------------------------------------- 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<byte[]> targetCols) throws IOException { + final NavigableSet<byte[]> targetCols, final long readPt) throws IOException { return execOperationWithResult(null, coprocessors.isEmpty() ? null : new RegionOperationWithResult<KeyValueScanner>() { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { - setResult(oserver.preStoreScannerOpen(ctx, store, scan, targetCols, getResult())); + setResult(oserver.preStoreScannerOpen(ctx, store, scan, targetCols, getResult(), readPt)); } }); } http://git-wip-us.apache.org/repos/asf/hbase/blob/532b914f/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.java ---------------------------------------------------------------------- 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 a8983ef..02bb0d3 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 @@ -105,11 +105,10 @@ public class TestRegionObserverScannerOpenHook { public static class NoDataFromScan extends BaseRegionObserver { @Override public KeyValueScanner preStoreScannerOpen(ObserverContext<RegionCoprocessorEnvironment> c, - Store store, Scan scan, NavigableSet<byte[]> targetCols, KeyValueScanner s) + Store store, Scan scan, NavigableSet<byte[]> targetCols, KeyValueScanner s, long readPt) throws IOException { scan.setFilter(new NoDataFilter()); - return new StoreScanner(store, store.getScanInfo(), scan, targetCols, - ((HStore)store).getHRegion().getReadPoint(IsolationLevel.READ_COMMITTED)); + return new StoreScanner(store, store.getScanInfo(), scan, targetCols, readPt); } } http://git-wip-us.apache.org/repos/asf/hbase/blob/532b914f/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java ---------------------------------------------------------------------- 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 b4eb798..58aa56a 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 @@ -285,7 +285,7 @@ public class TestCoprocessorScanPolicy { @Override public KeyValueScanner preStoreScannerOpen( final ObserverContext<RegionCoprocessorEnvironment> c, Store store, final Scan scan, - final NavigableSet<byte[]> targetCols, KeyValueScanner s) throws IOException { + final NavigableSet<byte[]> targetCols, KeyValueScanner s, long readPt) throws IOException { TableName tn = store.getTableName(); if (!tn.isSystemTable()) { Long newTtl = ttls.get(store.getTableName()); @@ -297,8 +297,7 @@ public class TestCoprocessorScanPolicy { newVersions == null ? family.getMaxVersions() : newVersions, newTtl == null ? oldSI.getTtl() : newTtl, family.getKeepDeletedCells(), oldSI.getTimeToPurgeDeletes(), oldSI.getComparator()); - return new StoreScanner(store, scanInfo, scan, targetCols, - ((HStore) store).getHRegion().getReadPoint(IsolationLevel.READ_COMMITTED)); + return new StoreScanner(store, scanInfo, scan, targetCols, readPt); } else { return s; }