Index: hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MockStoreFile.java =================================================================== --- hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MockStoreFile.java (revision 1572728) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MockStoreFile.java (working copy) @@ -108,7 +108,7 @@ @Override public long getMaxTimestamp() { - return timeRange == null ? Long.MAX_VALUE : timeRange.maximumTimestamp; + return timeRange == null ? Long.MAX_VALUE : timeRange.maximumTimestamp.get(); } @Override Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java (revision 1572728) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java (working copy) @@ -21,6 +21,7 @@ import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import java.util.concurrent.atomic.AtomicLong; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.hbase.KeyValue; @@ -39,8 +40,8 @@ @InterfaceAudience.Private public class TimeRangeTracker implements Writable { - long minimumTimestamp = -1; - long maximumTimestamp = -1; + AtomicLong minimumTimestamp = new AtomicLong(Long.MAX_VALUE); + AtomicLong maximumTimestamp = new AtomicLong(Long.MIN_VALUE); /** * Default constructor. @@ -55,13 +56,13 @@ * @param trt source TimeRangeTracker */ public TimeRangeTracker(final TimeRangeTracker trt) { - this.minimumTimestamp = trt.getMinimumTimestamp(); - this.maximumTimestamp = trt.getMaximumTimestamp(); + this.minimumTimestamp.set(trt.getMinimumTimestamp()); + this.maximumTimestamp.set(trt.getMaximumTimestamp()); } public TimeRangeTracker(long minimumTimestamp, long maximumTimestamp) { - this.minimumTimestamp = minimumTimestamp; - this.maximumTimestamp = maximumTimestamp; + this.minimumTimestamp.set(minimumTimestamp); + this.maximumTimestamp.set(maximumTimestamp); } /** @@ -96,17 +97,13 @@ * 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; - } + private void includeTimestamp(final long timestamp) { + long max; + while ((max = maximumTimestamp.get()) < timestamp && + !maximumTimestamp.compareAndSet(max, timestamp)); + long min; + while ((min = minimumTimestamp.get()) > timestamp && + !minimumTimestamp.compareAndSet(min, timestamp)); return; } @@ -115,33 +112,33 @@ * @param tr TimeRange * @return True if there is overlap, false otherwise */ - public synchronized boolean includesTimeRange(final TimeRange tr) { - return (this.minimumTimestamp < tr.getMax() && - this.maximumTimestamp >= tr.getMin()); + public boolean includesTimeRange(final TimeRange tr) { + return (this.minimumTimestamp.get() < tr.getMax() && + this.maximumTimestamp.get() >= tr.getMin()); } /** * @return the minimumTimestamp */ - public synchronized long getMinimumTimestamp() { - return minimumTimestamp; + public long getMinimumTimestamp() { + return minimumTimestamp.get(); } /** * @return the maximumTimestamp */ - public synchronized long getMaximumTimestamp() { - return maximumTimestamp; + public long getMaximumTimestamp() { + return maximumTimestamp.get(); } public void write(final DataOutput out) throws IOException { - out.writeLong(minimumTimestamp); - out.writeLong(maximumTimestamp); + out.writeLong(minimumTimestamp.get()); + out.writeLong(maximumTimestamp.get()); } public void readFields(final DataInput in) throws IOException { - this.minimumTimestamp = in.readLong(); - this.maximumTimestamp = in.readLong(); + this.minimumTimestamp.set(in.readLong()); + this.maximumTimestamp.set(in.readLong()); } @Override Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java (revision 1572728) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java (working copy) @@ -635,7 +635,7 @@ public Long getMinimumTimestamp() { return (getReader().timeRangeTracker == null) ? null : - getReader().timeRangeTracker.minimumTimestamp; + getReader().timeRangeTracker.minimumTimestamp.get(); } /** @@ -1505,7 +1505,7 @@ } public long getMaxTimestamp() { - return timeRangeTracker == null ? Long.MAX_VALUE : timeRangeTracker.maximumTimestamp; + return timeRangeTracker == null ? Long.MAX_VALUE : timeRangeTracker.maximumTimestamp.get(); } } Index: hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java =================================================================== --- hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java (revision 1572728) +++ hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java (working copy) @@ -190,7 +190,7 @@ TIMERANGE = align(ClassSize.OBJECT + Bytes.SIZEOF_LONG * 2 + Bytes.SIZEOF_BOOLEAN); - TIMERANGE_TRACKER = align(ClassSize.OBJECT + Bytes.SIZEOF_LONG * 2); + TIMERANGE_TRACKER = align(ClassSize.OBJECT + REFERENCE * 2); KEYVALUE_SKIPLIST_SET = align(OBJECT + REFERENCE); }