You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ga...@apache.org on 2011/04/16 01:05:03 UTC
svn commit: r1092842 - in /hbase/trunk: ./
src/main/java/org/apache/hadoop/hbase/regionserver/
src/test/java/org/apache/hadoop/hbase/coprocessor/
Author: garyh
Date: Fri Apr 15 23:05:02 2011
New Revision: 1092842
URL: http://svn.apache.org/viewvc?rev=1092842&view=rev
Log:
HBASE-3758 Delete triggers pre/postScannerOpen upcalls of RegionObserver
Modified:
hbase/trunk/CHANGES.txt
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java
hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java
Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1092842&r1=1092841&r2=1092842&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Fri Apr 15 23:05:02 2011
@@ -73,6 +73,8 @@ Release 0.91.0 - Unreleased
and some keyvalue is outdated (Zhou Shuaifeng via Stack)
HBASE-3624 Only one coprocessor of each priority can be loaded for a table
HBASE-3598 Broken formatting in LRU stats output (Erik Onnen)
+ HBASE-3758 Delete triggers pre/postScannerOpen upcalls of RegionObserver
+ (Mingjie Lai via garyh)
IMPROVEMENTS
HBASE-3290 Max Compaction Size (Nicolas Spiegelberg via Stack)
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1092842&r1=1092841&r2=1092842&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Fri Apr 15 23:05:02 2011
@@ -1199,19 +1199,25 @@ public class HRegion implements HeapSize
return getScanner(scan, null);
}
+ void prepareScanner(Scan scan) throws IOException {
+ if(!scan.hasFamilies()) {
+ // Adding all families to scanner
+ for(byte[] family: regionInfo.getTableDesc().getFamiliesKeys()){
+ scan.addFamily(family);
+ }
+ }
+ }
+
protected InternalScanner getScanner(Scan scan, List<KeyValueScanner> additionalScanners) throws IOException {
startRegionOperation();
this.readRequestsCount.increment();
try {
// Verify families are all valid
+ prepareScanner(scan);
if(scan.hasFamilies()) {
for(byte [] family : scan.getFamilyMap().keySet()) {
checkFamily(family);
}
- } else { // Adding all families to scanner
- for(byte[] family: regionInfo.getTableDesc().getFamiliesKeys()){
- scan.addFamily(family);
- }
}
return instantiateInternalScanner(scan, additionalScanners);
@@ -1222,17 +1228,7 @@ public class HRegion implements HeapSize
protected InternalScanner instantiateInternalScanner(Scan scan,
List<KeyValueScanner> additionalScanners) throws IOException {
- InternalScanner s = null;
- if (coprocessorHost != null) {
- s = coprocessorHost.preScannerOpen(scan);
- }
- if (s == null) {
- s = new RegionScanner(scan, additionalScanners);
- }
- if (coprocessorHost != null) {
- s = coprocessorHost.postScannerOpen(scan, s);
- }
- return s;
+ return new RegionScanner(scan, additionalScanners);
}
/*
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1092842&r1=1092841&r2=1092842&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Fri Apr 15 23:05:02 2011
@@ -1882,7 +1882,18 @@ public class HRegionServer implements HR
requestCount.incrementAndGet();
try {
HRegion r = getRegion(regionName);
- return addScanner(r.getScanner(scan));
+ r.prepareScanner(scan);
+ InternalScanner s = null;
+ if (r.getCoprocessorHost() != null) {
+ s = r.getCoprocessorHost().preScannerOpen(scan);
+ }
+ if (s == null) {
+ s = r.getScanner(scan);
+ }
+ if (r.getCoprocessorHost() != null) {
+ s = r.getCoprocessorHost().postScannerOpen(scan, s);
+ }
+ return addScanner(s);
} catch (Throwable t) {
throw convertThrowableToIOE(cleanup(t, "Failed openScanner"));
}
Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java?rev=1092842&r1=1092841&r2=1092842&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java (original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java Fri Apr 15 23:05:02 2011
@@ -34,6 +34,7 @@ import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Increment;
import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.regionserver.HRegion;
import org.apache.hadoop.hbase.regionserver.InternalScanner;
import org.apache.hadoop.hbase.util.Bytes;
@@ -73,6 +74,8 @@ public class SimpleRegionObserver extend
boolean hadPostScannerNext = false;
boolean hadPreScannerClose = false;
boolean hadPostScannerClose = false;
+ boolean hadPreScannerOpen = false;
+ boolean hadPostScannerOpen = false;
@Override
public void preOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
@@ -140,6 +143,21 @@ public class SimpleRegionObserver extend
hadPostCompact = true;
}
+ @Override
+ public InternalScanner preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c,
+ final Scan scan,
+ final InternalScanner s) throws IOException {
+ hadPreScannerOpen = true;
+ return null;
+ }
+
+ @Override
+ public InternalScanner postScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c,
+ final Scan scan, final InternalScanner s)
+ throws IOException {
+ hadPostScannerOpen = true;
+ return s;
+ }
@Override
public boolean preScannerNext(final ObserverContext<RegionCoprocessorEnvironment> c,
@@ -372,4 +390,10 @@ public class SimpleRegionObserver extend
public boolean wasScannerCloseCalled() {
return hadPreScannerClose && hadPostScannerClose;
}
+ public boolean wasScannerOpenCalled() {
+ return hadPreScannerOpen && hadPostScannerOpen;
+ }
+ public boolean hadDeleted() {
+ return hadPreDeleted && hadPostDeleted;
+ }
}
Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java?rev=1092842&r1=1092841&r2=1092842&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java (original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java Fri Apr 15 23:05:02 2011
@@ -206,6 +206,50 @@ public class TestRegionObserverInterface
util.deleteTable(tableName);
}
+ @Test
+ // HBase-3758
+ public void testHBase3758() throws IOException {
+ byte[] tableName = Bytes.toBytes("testHBase3758");
+ util.createTable(tableName, new byte[][] {A, B, C});
+
+ verifyMethodResult(SimpleRegionObserver.class,
+ new String[] {"hadDeleted", "wasScannerOpenCalled"},
+ tableName,
+ new Boolean[] {false, false}
+ );
+
+ HTable table = new HTable(util.getConfiguration(), tableName);
+ Put put = new Put(ROW);
+ put.add(A, A, A);
+ table.put(put);
+
+ Delete delete = new Delete(ROW);
+ table.delete(delete);
+
+ verifyMethodResult(SimpleRegionObserver.class,
+ new String[] {"hadDeleted", "wasScannerOpenCalled"},
+ tableName,
+ new Boolean[] {true, false}
+ );
+
+ Scan s = new Scan();
+ ResultScanner scanner = table.getScanner(s);
+ try {
+ for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
+ }
+ } finally {
+ scanner.close();
+ }
+
+ // now scanner hooks should be invoked.
+ verifyMethodResult(SimpleRegionObserver.class,
+ new String[] {"wasScannerOpenCalled"},
+ tableName,
+ new Boolean[] {true}
+ );
+ util.deleteTable(tableName);
+ }
+
// check each region whether the coprocessor upcalls are called or not.
private void verifyMethodResult(Class c, String methodName[], byte[] tableName,
Object value[]) throws IOException {