From 50ecbf1c8a9d57a43c043a01bb76d4eef2cce739 Mon Sep 17 00:00:00 2001 From: tedyu Date: Mon, 23 Jan 2017 09:30:39 -0800 Subject: [PATCH] HBASE-17510 DefaultMemStore gets the wrong heap size after rollback (ChiaPing Tsai) --- .../hbase/regionserver/DefaultMemStore.java | 4 ++-- .../hadoop/hbase/regionserver/TestStore.java | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java index 8412d6ef7e8..a47cafd38d6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java @@ -347,8 +347,8 @@ public class DefaultMemStore implements MemStore { // If the key is in the memstore, delete it. Update this.size. found = this.cellSet.get(cell); if (found != null && found.getSequenceId() == cell.getSequenceId()) { - removeFromCellSet(cell); - long s = heapSizeChange(cell, true); + removeFromCellSet(found); + long s = heapSizeChange(found, true); this.size.addAndGet(-s); } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java index 414c663edc2..5b7f8e85064 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java @@ -90,6 +90,7 @@ import org.junit.rules.TestName; import org.mockito.Mockito; import com.google.common.collect.Lists; +import java.util.Arrays; /** * Test class for the Store @@ -358,6 +359,29 @@ public class TestStore { } } + @Test + public void testRollback() throws IOException { + Configuration conf = HBaseConfiguration.create(); + FileSystem fs = FileSystem.get(conf); + // Initialize region + init(name.getMethodName(), conf); + Cell cell = CellUtil.createCell(row, family, qf1); + int len = KeyValueUtil.length(cell); + int offset = 77; + byte[] buf = new byte[offset + len]; + KeyValueUtil.appendToByteArray(cell, buf, offset); + KeyValue newKv = new KeyValue(buf, offset, len); + newKv.setSequenceId(cell.getSequenceId()); + List testCells = Arrays.asList(cell, cell, newKv); + for (Cell c : testCells) { + long sizeBeforeRollback = store.heapSize(); + store.add(cell); + store.rollback(cell); + long sizeAeforeRollback = store.heapSize(); + assertEquals(sizeBeforeRollback, sizeAeforeRollback); + } + } + @Test public void testLowestModificationTime() throws Exception { Configuration conf = HBaseConfiguration.create();