Hi all,
I got a trouble in using HRegion's RegionScanner in RegionServer.
In my project, a custom RPC server was started in RegionServer using
coprocessor mechanism, and it work well. In this RPC server, it receive a
call from client, and scan the HRegion specialised by the params setted by
the client like this:
---------------------------------------------------------------------------------------------------------------------
HRegion region = this.getHRegionByEncodeName(encodeName);
Scan scan = new Scan();
RegionScanner scanner = null;
try {
scanner = region.getScanner(scan);
long total = 0;
boolean hasNext = true;
List<KeyValue> kvs = new ArrayList<KeyValue>();
while (hasNext) {
kvs.clear();
hasNext = scanner.next(kvs);
if (kvs.size() > 0) {
total++;
}
} catch (IOException e) {
LOG.warn("Exception thrown when scanning region '" + regionName
+ "', SKIP IT!", e);
} finally {
if (scanner != null) {
try {
scanner.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
LOG.info("Total " + total + " rows scanned.");
---------------------------------------------------------------------------------------------------------------------
Then, I put a row to a HRegion by HTable interface, and make an RPC call of
my custom RPC server to scan the HRegion(the code lines above is executed
in a HRegionServer, a HRegion is scanned), and got nothing, total = 0. But
if I use client side scan like HTable's scan interface or HBase shell, I
can get the row I insert just now. I tried to flush the region and do a
major compaction on the HRegion using hbase shell, Nothing changed.
So, what's wrong with the code above? how to scan a HRegion in
HRegionServer instance?
Any responses is Appreciated!