You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2010/11/16 22:20:32 UTC
svn commit: r1035818 - in /hbase/trunk: CHANGES.txt
src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java
src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
Author: rawson
Date: Tue Nov 16 21:20:31 2010
New Revision: 1035818
URL: http://svn.apache.org/viewvc?rev=1035818&view=rev
Log:
HBASE-3235 Intermittent incrementColumnValue failure in TestHRegion
Modified:
hbase/trunk/CHANGES.txt
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java
hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1035818&r1=1035817&r2=1035818&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Tue Nov 16 21:20:31 2010
@@ -679,7 +679,9 @@ Release 0.90.0 - Unreleased
HBASE-3221 Race between splitting and disabling
HBASE-3224 NPE in KeyValue$KVComparator.compare when compacting
HBASE-3233 Fix Long Running Stats
- HBASE-3232 : Fix KeyOnlyFilter + Add Value Length (Nicolas via Ryan)
+ HBASE-3232 Fix KeyOnlyFilter + Add Value Length (Nicolas via Ryan)
+ HBASE-3235 Intermittent incrementColumnValue failure in TestHRegion
+ (Gary via Ryan)
IMPROVEMENTS
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java?rev=1035818&r1=1035817&r2=1035818&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java Tue Nov 16 21:20:31 2010
@@ -466,9 +466,13 @@ public class MemStore implements HeapSiz
// Add the KeyValue to the MemStore
long addedSize = add(kv);
- // Iterate the KeyValues after the one just inserted, cleaning up any
- // other KeyValues with the same row/family/qualifier
- SortedSet<KeyValue> ss = kvset.tailSet(kv);
+ // Get the KeyValues for the row/family/qualifier regardless of timestamp.
+ // For this case we want to clean up any other puts
+ KeyValue firstKv = KeyValue.createFirstOnRow(
+ kv.getBuffer(), kv.getRowOffset(), kv.getRowLength(),
+ kv.getBuffer(), kv.getFamilyOffset(), kv.getFamilyLength(),
+ kv.getBuffer(), kv.getQualifierOffset(), kv.getQualifierLength());
+ SortedSet<KeyValue> ss = kvset.tailSet(firstKv);
Iterator<KeyValue> it = ss.iterator();
while ( it.hasNext() ) {
KeyValue cur = it.next();
Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java?rev=1035818&r1=1035817&r2=1035818&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java (original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java Tue Nov 16 21:20:31 2010
@@ -61,6 +61,8 @@ import org.apache.hadoop.hbase.filter.Si
import org.apache.hadoop.hbase.regionserver.HRegion.RegionScanner;
import org.apache.hadoop.hbase.regionserver.wal.HLog;
import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.EnvironmentEdge;
+import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;
import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;
import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;
@@ -2066,6 +2068,59 @@ public class TestHRegion extends HBaseTe
assertICV(row, fam1, qual3, amount);
}
+ /**
+ * Added for HBASE-3235.
+ *
+ * When the initial put and an ICV update were arriving with the same timestamp,
+ * the initial Put KV was being skipped during {@link MemStore#upsert(KeyValue)}
+ * causing the iteration for matching KVs, causing the update-in-place to not
+ * happen and the ICV put to effectively disappear.
+ * @throws IOException
+ */
+ public void testIncrementColumnValue_UpdatingInPlace_TimestampClobber() throws IOException {
+ initHRegion(tableName, getName(), fam1);
+
+ long value = 1L;
+ long amount = 3L;
+ long now = EnvironmentEdgeManager.currentTimeMillis();
+ ManualEnvironmentEdge mock = new ManualEnvironmentEdge();
+ mock.setValue(now);
+ EnvironmentEdgeManagerTestHelper.injectEdge(mock);
+
+ // verify we catch an ICV on a put with the same timestamp
+ Put put = new Put(row);
+ put.add(fam1, qual1, now, Bytes.toBytes(value));
+ region.put(put);
+
+ long result = region.incrementColumnValue(row, fam1, qual1, amount, true);
+
+ assertEquals(value+amount, result);
+
+ Store store = region.getStore(fam1);
+ // ICV should update the existing Put with the same timestamp
+ assertEquals(1, store.memstore.kvset.size());
+ assertTrue(store.memstore.snapshot.isEmpty());
+
+ assertICV(row, fam1, qual1, value+amount);
+
+ // verify we catch an ICV even when the put ts > now
+ put = new Put(row);
+ put.add(fam1, qual2, now+1, Bytes.toBytes(value));
+ region.put(put);
+
+ result = region.incrementColumnValue(row, fam1, qual2, amount, true);
+
+ assertEquals(value+amount, result);
+
+ store = region.getStore(fam1);
+ // ICV should update the existing Put with the same timestamp
+ assertEquals(2, store.memstore.kvset.size());
+ assertTrue(store.memstore.snapshot.isEmpty());
+
+ assertICV(row, fam1, qual2, value+amount);
+ EnvironmentEdgeManagerTestHelper.reset();
+ }
+
private void assertICV(byte [] row,
byte [] familiy,
byte[] qualifier,