You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2014/10/02 21:30:36 UTC

git commit: HBASE-12148 Remove TimeRangeTracker as point of contention when many threads writing a Store

Repository: hbase
Updated Branches:
  refs/heads/master 2bc28ebb0 -> 129b93bc0


HBASE-12148 Remove TimeRangeTracker as point of contention when many threads writing a Store


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/129b93bc
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/129b93bc
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/129b93bc

Branch: refs/heads/master
Commit: 129b93bc0ef1291784752aeaf86e029c13d9a51b
Parents: 2bc28eb
Author: stack <st...@apache.org>
Authored: Thu Oct 2 12:30:31 2014 -0700
Committer: stack <st...@apache.org>
Committed: Thu Oct 2 12:30:31 2014 -0700

----------------------------------------------------------------------
 .../hbase/regionserver/TimeRangeTracker.java    | 85 ++++++++++----------
 1 file changed, 43 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/129b93bc/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 6f25129..0044634 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
@@ -22,13 +22,10 @@ import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.KeyValue;
-import org.apache.hadoop.hbase.KeyValue.Type;
+import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.io.TimeRange;
-import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.io.Writable;
 
 /**
@@ -40,30 +37,41 @@ import org.apache.hadoop.io.Writable;
  */
 @InterfaceAudience.Private
 public class TimeRangeTracker implements Writable {
-
-  long minimumTimestamp = -1;
+  static final long INITIAL_MINIMUM_TIMESTAMP = Long.MAX_VALUE;
+  long minimumTimestamp = INITIAL_MINIMUM_TIMESTAMP;
   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) {
-    this.minimumTimestamp = trt.getMinimumTimestamp();
-    this.maximumTimestamp = trt.getMaximumTimestamp();
+    set(trt.getMinimumTimestamp(), trt.getMaximumTimestamp());
   }
 
   public TimeRangeTracker(long minimumTimestamp, long maximumTimestamp) {
-    this.minimumTimestamp = minimumTimestamp;
-    this.maximumTimestamp = 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;
   }
 
   /**
@@ -80,36 +88,30 @@ 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
    */
-  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;
+  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;
+          }
+        }
+      }
     }
-    return;
   }
 
   /**
@@ -118,8 +120,7 @@ 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());
   }
 
   /**
@@ -150,4 +151,4 @@ public class TimeRangeTracker implements Writable {
   public synchronized String toString() {
     return "[" + minimumTimestamp + "," + maximumTimestamp + "]";
   }
-}
+}
\ No newline at end of file