这篇我们继续看moreRows = scanner.nextRaw(values, scannerContext);
,这里的scanner是通过HRegion#getScanner创建出来的一个RegionScannerImpl实例,他的nextRaw方法调用了RegionScannerImpl#nextInternal方法。这个方法主要目的是获取下一条数据放入results,并取得返回值表示是否还有更多的数据。
我们知道HBase没有建立索引,数据的查找是靠遍历文件实现的,所以查找下一行数据需要一个while循环。为了方便理解,代码稍有调整。
private boolean nextInternal(List<Cell> results, ScannerContext scannerContext)
throws IOException {
while (true) {
...
}
}
- 剥去while,看内部,首先从storeHeap里取了个值,第一次取得的值是null,后续会往storeHeap里塞数据。前一篇我们说过,多次的请求其实用的是同一个Scanner实例,所以可以在一次请求时,将值放入storeHeap,下一次请求还是可以从storeHeap里取出来。
Cell current = this.storeHeap.peek();
byte[] currentRow = null;
int offset =