.../hadoop/hbase/regionserver/DefaultMemStore.java | 14 ++++++++++++-- .../hbase/regionserver/DefaultStoreFlusher.java | 4 ++-- .../hadoop/hbase/regionserver/MemStoreSnapshot.java | 8 +++++++- .../hadoop/hbase/regionserver/TestHRegion.java | 20 ++++++++++++++++++++ 4 files changed, 41 insertions(+), 5 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 f8a1182..491296f 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 @@ -100,6 +100,7 @@ public class DefaultMemStore implements MemStore { volatile MemStoreLAB allocator; volatile MemStoreLAB snapshotAllocator; volatile long snapshotId; + volatile int tagsCount; /** * Default constructor. Used for tests. @@ -171,8 +172,11 @@ public class DefaultMemStore implements MemStore { timeOfOldestEdit = Long.MAX_VALUE; } } - return new MemStoreSnapshot(this.snapshotId, snapshot.size(), this.snapshotSize, - this.snapshotTimeRangeTracker, new CollectionBackedScanner(snapshot, this.comparator)); + MemStoreSnapshot memStoreSnapshot = new MemStoreSnapshot(this.snapshotId, snapshot.size(), this.snapshotSize, + this.snapshotTimeRangeTracker, new CollectionBackedScanner(snapshot, this.comparator), + this.tagsCount > 0); + this.tagsCount = 0; + return memStoreSnapshot; } /** @@ -234,12 +238,18 @@ public class DefaultMemStore implements MemStore { private boolean addToCellSet(Cell e) { boolean b = this.cellSet.add(e); + if(b && e.getTagsLength() > 0) { + tagsCount++; + } setOldestEditTimeToNow(); return b; } private boolean removeFromCellSet(Cell e) { boolean b = this.cellSet.remove(e); + if(b && e.getTagsLength() > 0) { + tagsCount--; + } setOldestEditTimeToNow(); return b; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.java index e68d267..fe70b0c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.java @@ -63,8 +63,8 @@ public class DefaultStoreFlusher extends StoreFlusher { synchronized (flushLock) { status.setStatus("Flushing " + store + ": creating writer"); // Write the map out to the disk - writer = store.createWriterInTmp( - cellsCount, store.getFamily().getCompressionType(), false, true, true); + writer = store.createWriterInTmp(cellsCount, store.getFamily().getCompressionType(), false, + true, snapshot.getTagsAvailable()); writer.setTimeRangeTracker(snapshot.getTimeRangeTracker()); IOException e = null; try { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java index 619cff5..99102cb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java @@ -32,14 +32,16 @@ public class MemStoreSnapshot { private final long size; private final TimeRangeTracker timeRangeTracker; private final KeyValueScanner scanner; + private final boolean tagsAvailable; public MemStoreSnapshot(long id, int cellsCount, long size, TimeRangeTracker timeRangeTracker, - KeyValueScanner scanner) { + KeyValueScanner scanner, boolean tagsAvailable) { this.id = id; this.cellsCount = cellsCount; this.size = size; this.timeRangeTracker = timeRangeTracker; this.scanner = scanner; + this.tagsAvailable = tagsAvailable; } /** @@ -76,4 +78,8 @@ public class MemStoreSnapshot { public KeyValueScanner getScanner() { return this.scanner; } + + public boolean getTagsAvailable() { + return this.tagsAvailable; + } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java index d46c2e3..73da8dc 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java @@ -116,6 +116,7 @@ import org.apache.hadoop.hbase.filter.NullComparator; import org.apache.hadoop.hbase.filter.PrefixFilter; import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter; import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; +import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding; import org.apache.hadoop.hbase.io.hfile.HFile; import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler; import org.apache.hadoop.hbase.monitoring.MonitoredTask; @@ -5822,6 +5823,25 @@ public class TestHRegion { } @Test + public void testFlushedFileWithNoTags() throws Exception { + TableName tableName = TableName.valueOf(getClass().getSimpleName()); + HTableDescriptor htd = new HTableDescriptor(tableName); + htd.addFamily(new HColumnDescriptor(fam1)); + HRegionInfo info = new HRegionInfo(tableName, null, null, false); + Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName()); + region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd); + Put put = new Put(Bytes.toBytes("a-b-0-0")); + put.addColumn(fam1, qual1, Bytes.toBytes("c1-value")); + region.put(put); + region.flush(true); + Store store = region.getStore(fam1); + Collection storefiles = store.getStorefiles(); + for (StoreFile sf : storefiles) { + assertFalse("Tags should not be present " + ,sf.getReader().getHFileReader().getFileContext().isIncludesTags()); + } + } + @Test @SuppressWarnings("unchecked") public void testOpenRegionWrittenToWALForLogReplay() throws Exception { // similar to the above test but with distributed log replay