HBASE-15076 Add getScanner(Scan scan, List<KeyValueScanner> additionalScanners) API into Region interface (Anoop Sam John)

This commit is contained in:
stack 2016-01-07 13:45:01 -08:00
parent 3d3677932a
commit 5bde960b95
2 changed files with 31 additions and 10 deletions

View File

@ -1819,27 +1819,27 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
* We are trying to remove / relax the region read lock for compaction. * We are trying to remove / relax the region read lock for compaction.
* Let's see what are the potential race conditions among the operations (user scan, * Let's see what are the potential race conditions among the operations (user scan,
* region split, region close and region bulk load). * region split, region close and region bulk load).
* *
* user scan ---> region read lock * user scan ---> region read lock
* region split --> region close first --> region write lock * region split --> region close first --> region write lock
* region close --> region write lock * region close --> region write lock
* region bulk load --> region write lock * region bulk load --> region write lock
* *
* read lock is compatible with read lock. ---> no problem with user scan/read * read lock is compatible with read lock. ---> no problem with user scan/read
* region bulk load does not cause problem for compaction (no consistency problem, store lock * region bulk load does not cause problem for compaction (no consistency problem, store lock
* will help the store file accounting). * will help the store file accounting).
* They can run almost concurrently at the region level. * They can run almost concurrently at the region level.
* *
* The only remaining race condition is between the region close and compaction. * The only remaining race condition is between the region close and compaction.
* So we will evaluate, below, how region close intervenes with compaction if compaction does * So we will evaluate, below, how region close intervenes with compaction if compaction does
* not acquire region read lock. * not acquire region read lock.
* *
* Here are the steps for compaction: * Here are the steps for compaction:
* 1. obtain list of StoreFile's * 1. obtain list of StoreFile's
* 2. create StoreFileScanner's based on list from #1 * 2. create StoreFileScanner's based on list from #1
* 3. perform compaction and save resulting files under tmp dir * 3. perform compaction and save resulting files under tmp dir
* 4. swap in compacted files * 4. swap in compacted files
* *
* #1 is guarded by store lock. This patch does not change this --> no worse or better * #1 is guarded by store lock. This patch does not change this --> no worse or better
* For #2, we obtain smallest read point (for region) across all the Scanners (for both default * For #2, we obtain smallest read point (for region) across all the Scanners (for both default
* compactor and stripe compactor). * compactor and stripe compactor).
@ -1851,7 +1851,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
* This will not conflict with compaction. * This will not conflict with compaction.
* For #3, it can be performed in parallel to other operations. * For #3, it can be performed in parallel to other operations.
* For #4 bulk load and compaction don't conflict with each other on the region level * For #4 bulk load and compaction don't conflict with each other on the region level
* (for multi-family atomicy). * (for multi-family atomicy).
* Region close and compaction are guarded pretty well by the 'writestate'. * Region close and compaction are guarded pretty well by the 'writestate'.
* In HRegion#doClose(), we have : * In HRegion#doClose(), we have :
* synchronized (writestate) { * synchronized (writestate) {
@ -2575,6 +2575,12 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
return getScanner(scan, true); return getScanner(scan, true);
} }
@Override
public RegionScanner getScanner(Scan scan, List<KeyValueScanner> additionalScanners)
throws IOException {
return getScanner(scan, additionalScanners, true);
}
public RegionScanner getScanner(Scan scan, boolean copyCellsFromSharedMem) throws IOException { public RegionScanner getScanner(Scan scan, boolean copyCellsFromSharedMem) throws IOException {
RegionScanner scanner = getScanner(scan, null, copyCellsFromSharedMem); RegionScanner scanner = getScanner(scan, null, copyCellsFromSharedMem);
return scanner; return scanner;
@ -7073,7 +7079,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
*/ */
private static List<Tag> carryForwardTags(final Cell cell, final List<Tag> tags) { private static List<Tag> carryForwardTags(final Cell cell, final List<Tag> tags) {
if (cell.getTagsLength() <= 0) return tags; if (cell.getTagsLength() <= 0) return tags;
List<Tag> newTags = tags == null? new ArrayList<Tag>(): /*Append Tags*/tags; List<Tag> newTags = tags == null? new ArrayList<Tag>(): /*Append Tags*/tags;
Iterator<Tag> i = CellUtil.tagsIterator(cell); Iterator<Tag> i = CellUtil.tagsIterator(cell);
while (i.hasNext()) newTags.add(i.next()); while (i.hasNext()) newTags.add(i.next());
return newTags; return newTags;
@ -7349,7 +7355,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
// They are subtley different in quiet a few ways. This came out only // They are subtley different in quiet a few ways. This came out only
// after study. I am not sure that many of the differences are intentional. // after study. I am not sure that many of the differences are intentional.
// TODO: St.Ack 20150907 // TODO: St.Ack 20150907
@Override @Override
public Result increment(Increment mutation, long nonceGroup, long nonce) public Result increment(Increment mutation, long nonceGroup, long nonce)
@ -7363,7 +7369,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
boolean writeToWAL = durability != Durability.SKIP_WAL; boolean writeToWAL = durability != Durability.SKIP_WAL;
WALEdit walEdits = null; WALEdit walEdits = null;
List<Cell> allKVs = new ArrayList<Cell>(mutation.size()); List<Cell> allKVs = new ArrayList<Cell>(mutation.size());
Map<Store, List<Cell>> tempMemstore = new HashMap<Store, List<Cell>>(); Map<Store, List<Cell>> tempMemstore = new HashMap<Store, List<Cell>>();
long size = 0; long size = 0;
long txid = 0; long txid = 0;
@ -8166,7 +8172,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
WALKey key = new HLogKey(getRegionInfo().getEncodedNameAsBytes(), WALKey key = new HLogKey(getRegionInfo().getEncodedNameAsBytes(),
getRegionInfo().getTable(), WALKey.NO_SEQUENCE_ID, 0, null, getRegionInfo().getTable(), WALKey.NO_SEQUENCE_ID, 0, null,
HConstants.NO_NONCE, HConstants.NO_NONCE, getMVCC()); HConstants.NO_NONCE, HConstants.NO_NONCE, getMVCC());
// Call append but with an empty WALEdit. The returned sequence id will not be associated // Call append but with an empty WALEdit. The returned sequence id will not be associated
// with any edit and we can be sure it went in after all outstanding appends. // with any edit and we can be sure it went in after all outstanding appends.
try { try {

View File

@ -392,6 +392,21 @@ public interface Region extends ConfigurationObserver {
*/ */
RegionScanner getScanner(Scan scan) throws IOException; RegionScanner getScanner(Scan scan) throws IOException;
/**
* Return an iterator that scans over the HRegion, returning the indicated columns and rows
* specified by the {@link Scan}. The scanner will also include the additional scanners passed
* along with the scanners for the specified Scan instance. Should be careful with the usage to
* pass additional scanners only within this Region
* <p>
* This Iterator must be closed by the caller.
*
* @param scan configured {@link Scan}
* @param additionalScanners Any additional scanners to be used
* @return RegionScanner
* @throws IOException read exceptions
*/
RegionScanner getScanner(Scan scan, List<KeyValueScanner> additionalScanners) throws IOException;
/** The comparator to be used with the region */ /** The comparator to be used with the region */
CellComparator getCellCompartor(); CellComparator getCellCompartor();