HBASE-4938 Create a HRegion.getScanner public method that allows reading from a specified readPoint (Dhruba)

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1222890 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Zhihong Yu 2011-12-23 23:57:55 +00:00
parent 8b4c4f094e
commit 0c9fad8f6b
3 changed files with 90 additions and 1 deletions

View File

@ -0,0 +1,54 @@
/*
* Copyright The Apache Software Foundation
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hbase.client;
/**
* Specify Isolation levels in Scan operations.
* <p>
* There are two isolation levels. A READ_COMMITTED isolation level
* indicates that only data that is committed be returned in a scan.
* An isolation level of READ_UNCOMMITTED indicates that a scan
* should return data that is being modified by transactions that might
* not have been committed yet.
*/
public enum IsolationLevel {
READ_COMMITTED(1),
READ_UNCOMMITTED(2);
IsolationLevel(int value) {}
public byte [] toBytes() {
return new byte [] { toByte() };
}
public byte toByte() {
return (byte)this.ordinal();
}
public static IsolationLevel fromBytes(byte [] bytes) {
return IsolationLevel.fromByte(bytes[0]);
}
public static IsolationLevel fromByte(byte vbyte) {
return IsolationLevel.values()[vbyte];
}
}

View File

@ -82,6 +82,7 @@ import java.util.TreeSet;
*/
public class Scan extends OperationWithAttributes implements Writable {
private static final String RAW_ATTR = "_raw_";
private static final String ISOLATION_LEVEL = "_isolationlevel_";
private static final byte SCAN_VERSION = (byte)2;
private byte [] startRow = HConstants.EMPTY_START_ROW;
@ -632,4 +633,30 @@ public class Scan extends OperationWithAttributes implements Writable {
byte[] attr = getAttribute(RAW_ATTR);
return attr == null ? false : Bytes.toBoolean(attr);
}
/*
* Set the isolation level for this scan. If the
* isolation level is set to READ_UNCOMMITTED, then
* this scan will return data from committed and
* uncommitted transactions. If the isolation level
* is set to READ_COMMITTED, then this scan will return
* data from committed transactions only. If a isolation
* level is not explicitly set on a Scan, then it
* is assumed to be READ_COMMITTED.
* @param level IsolationLevel for this scan
*/
public void setIsolationLevel(IsolationLevel level) {
setAttribute(ISOLATION_LEVEL, level.toBytes());
}
/*
* @return The isolation level of this scan.
* If no isolation level was set for this scan object,
* then it returns READ_COMMITTED.
* @return The IsolationLevel for this scan
*/
public IsolationLevel getIsolationLevel() {
byte[] attr = getAttribute(ISOLATION_LEVEL);
return attr == null ? IsolationLevel.READ_COMMITTED :
IsolationLevel.fromBytes(attr);
}
}

View File

@ -74,6 +74,7 @@ import org.apache.hadoop.hbase.client.Append;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Increment;
import org.apache.hadoop.hbase.client.IsolationLevel;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Row;
@ -3154,8 +3155,15 @@ public class HRegion implements HeapSize { // , Writable{
// synchronize on scannerReadPoints so that nobody calculates
// getSmallestReadPoint, before scannerReadPoints is updated.
IsolationLevel isolationLevel = scan.getIsolationLevel();
synchronized(scannerReadPoints) {
this.readPt = MultiVersionConsistencyControl.resetThreadReadPoint(mvcc);
if (isolationLevel == IsolationLevel.READ_UNCOMMITTED) {
// This scan can read even uncommitted transactions
this.readPt = Long.MAX_VALUE;
MultiVersionConsistencyControl.setThreadReadPoint(this.readPt);
} else {
this.readPt = MultiVersionConsistencyControl.resetThreadReadPoint(mvcc);
}
scannerReadPoints.put(this, this.readPt);
}