You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2014/10/08 21:10:34 UTC
[2/5] git commit: Revert "HBASE-12148 Remove TimeRangeTracker as
point of contention when many threads writing a Store"
Revert "HBASE-12148 Remove TimeRangeTracker as point of contention when many threads writing a Store"
This reverts commit 9f2e748f0a33a5b939a3768c8aeb10432ad43b23.
Post commit consensus is this change isn't ready yet.
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/00d3eec5
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/00d3eec5
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/00d3eec5
Branch: refs/heads/0.98
Commit: 00d3eec5d69a8ac735a23fc09be7b8a13c85c0cb
Parents: be64e48
Author: Andrew Purtell <ap...@apache.org>
Authored: Wed Oct 8 12:00:52 2014 -0700
Committer: Andrew Purtell <ap...@apache.org>
Committed: Wed Oct 8 12:00:52 2014 -0700
----------------------------------------------------------------------
.../hbase/regionserver/TimeRangeTracker.java | 80 ++++++++++----------
1 file changed, 39 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/00d3eec5/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java
index 3d48b7a..dfa0ded 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java
@@ -24,7 +24,9 @@ import java.io.IOException;
import org.apache.hadoop.hbase.classification.InterfaceAudience;
import org.apache.hadoop.hbase.KeyValue;
+import org.apache.hadoop.hbase.KeyValue.Type;
import org.apache.hadoop.hbase.io.TimeRange;
+import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.Writable;
/**
@@ -36,41 +38,30 @@ import org.apache.hadoop.io.Writable;
*/
@InterfaceAudience.Private
public class TimeRangeTracker implements Writable {
- static final long INITIAL_MINIMUM_TIMESTAMP = Long.MAX_VALUE;
- long minimumTimestamp = INITIAL_MINIMUM_TIMESTAMP;
+
+ long minimumTimestamp = -1;
long maximumTimestamp = -1;
/**
* Default constructor.
* Initializes TimeRange to be null
*/
- public TimeRangeTracker() {}
+ public TimeRangeTracker() {
+
+ }
/**
* Copy Constructor
* @param trt source TimeRangeTracker
*/
public TimeRangeTracker(final TimeRangeTracker trt) {
- set(trt.getMinimumTimestamp(), trt.getMaximumTimestamp());
+ this.minimumTimestamp = trt.getMinimumTimestamp();
+ this.maximumTimestamp = trt.getMaximumTimestamp();
}
public TimeRangeTracker(long minimumTimestamp, long maximumTimestamp) {
- set(minimumTimestamp, maximumTimestamp);
- }
-
- private void set(final long min, final long max) {
- this.minimumTimestamp = min;
- this.maximumTimestamp = max;
- }
-
- /**
- * @param l
- * @return True if we initialized values
- */
- private boolean init(final long l) {
- if (this.minimumTimestamp != INITIAL_MINIMUM_TIMESTAMP) return false;
- set(l, l);
- return true;
+ this.minimumTimestamp = minimumTimestamp;
+ this.maximumTimestamp = maximumTimestamp;
}
/**
@@ -87,30 +78,36 @@ public class TimeRangeTracker implements Writable {
}
/**
+ * Update the current TimestampRange to include the timestamp from Key.
+ * If the Key is of type DeleteColumn or DeleteFamily, it includes the
+ * entire time range from 0 to timestamp of the key.
+ * @param key
+ */
+ public void includeTimestamp(final byte[] key) {
+ includeTimestamp(Bytes.toLong(key,key.length-KeyValue.TIMESTAMP_TYPE_SIZE));
+ int type = key[key.length - 1];
+ if (type == Type.DeleteColumn.getCode() ||
+ type == Type.DeleteFamily.getCode()) {
+ includeTimestamp(0);
+ }
+ }
+
+ /**
* If required, update the current TimestampRange to include timestamp
* @param timestamp the timestamp value to include
*/
- void includeTimestamp(final long timestamp) {
- // Do test outside of synchronization block. Synchronization in here can be problematic
- // when many threads writing one Store -- they can all pile up trying to add in here.
- // Happens when doing big write upload where we are hammering on one region.
- if (timestamp < this.minimumTimestamp) {
- synchronized (this) {
- if (!init(timestamp)) {
- if (timestamp < this.minimumTimestamp) {
- this.minimumTimestamp = timestamp;
- }
- }
- }
- } else if (timestamp > this.maximumTimestamp) {
- synchronized (this) {
- if (!init(timestamp)) {
- if (this.maximumTimestamp < timestamp) {
- this.maximumTimestamp = timestamp;
- }
- }
- }
+ private synchronized void includeTimestamp(final long timestamp) {
+ if (maximumTimestamp == -1) {
+ minimumTimestamp = timestamp;
+ maximumTimestamp = timestamp;
+ }
+ else if (minimumTimestamp > timestamp) {
+ minimumTimestamp = timestamp;
+ }
+ else if (maximumTimestamp < timestamp) {
+ maximumTimestamp = timestamp;
}
+ return;
}
/**
@@ -119,7 +116,8 @@ public class TimeRangeTracker implements Writable {
* @return True if there is overlap, false otherwise
*/
public synchronized boolean includesTimeRange(final TimeRange tr) {
- return (this.minimumTimestamp < tr.getMax() && this.maximumTimestamp >= tr.getMin());
+ return (this.minimumTimestamp < tr.getMax() &&
+ this.maximumTimestamp >= tr.getMin());
}
/**