From 3a40f8e461f1e0656bf16a854b6d5058aa0ea721 Mon Sep 17 00:00:00 2001 From: ramkrishna Date: Wed, 21 Oct 2015 10:12:38 +0530 Subject: [PATCH] HBASE-14643 - Avoid Splits from once again opening a closed reader for fetching the first and last key (Heng Chen) --- .../hbase/regionserver/HRegionFileSystem.java | 8 ++++---- .../hadoop/hbase/regionserver/StoreFile.java | 23 ++++++++++++++++++++++ .../hadoop/hbase/regionserver/TestStoreFile.java | 6 +++++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java index 8a93c19..584dc41 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java @@ -585,24 +585,24 @@ public class HRegionFileSystem { if (top) { //check if larger than last key. KeyValue splitKey = KeyValueUtil.createFirstOnRow(splitRow); - byte[] lastKey = f.createReader().getLastKey(); + byte[] lastKey = f.getLastKey(); // If lastKey is null means storefile is empty. if (lastKey == null) { return null; } - if (f.getReader().getComparator().compareFlatKey(splitKey.getBuffer(), + if (f.getComparator().compareFlatKey(splitKey.getBuffer(), splitKey.getKeyOffset(), splitKey.getKeyLength(), lastKey, 0, lastKey.length) > 0) { return null; } } else { //check if smaller than first key KeyValue splitKey = KeyValueUtil.createLastOnRow(splitRow); - byte[] firstKey = f.createReader().getFirstKey(); + byte[] firstKey = f.getFirstKey(); // If firstKey is null means storefile is empty. if (firstKey == null) { return null; } - if (f.getReader().getComparator().compareFlatKey(splitKey.getBuffer(), + if (f.getComparator().compareFlatKey(splitKey.getBuffer(), splitKey.getKeyOffset(), splitKey.getKeyLength(), firstKey, 0, firstKey.length) < 0) { return null; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java index 36e642f..fe80aa4 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java @@ -126,6 +126,25 @@ public class StoreFile { // Set when we obtain a Reader. private long maxMemstoreTS = -1; + // firstKey, lastkey and cellComparator will be set when openReader. + private byte[] firstKey; + + private byte[] lastKey; + + private KVComparator comparator; + + public byte[] getFirstKey() { + return firstKey; + } + + public byte[] getLastKey() { + return lastKey; + } + + public KVComparator getComparator() { + return comparator; + } + public long getMaxMemstoreTS() { return maxMemstoreTS; } @@ -459,6 +478,10 @@ public class StoreFile { "proceeding without", e); this.reader.timeRangeTracker = null; } + // initialize so we can reuse them after reader closed. + firstKey = reader.getFirstKey(); + lastKey = reader.getLastKey(); + comparator = reader.getComparator(); return this.reader; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java index d1aabfb..5a804f9 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java @@ -164,10 +164,13 @@ public class TestStoreFile extends HBaseTestCase { // Split on a row, not in middle of row. Midkey returned by reader // may be in middle of row. Create new one with empty column and // timestamp. + KeyValue kv = KeyValue.createKeyValueFromKey(reader.midkey()); byte [] midRow = kv.getRow(); kv = KeyValue.createKeyValueFromKey(reader.getLastKey()); byte [] finalRow = kv.getRow(); + hsf.closeReader(true); + // Make a reference HRegionInfo splitHri = new HRegionInfo(hri.getTable(), null, midRow); Path refPath = splitStoreFile(regionFs, splitHri, TEST_FAMILY, hsf, midRow, true); @@ -264,9 +267,10 @@ public class TestStoreFile extends HBaseTestCase { HRegionInfo splitHriA = new HRegionInfo(hri.getTable(), null, SPLITKEY); HRegionInfo splitHriB = new HRegionInfo(hri.getTable(), SPLITKEY, null); StoreFile f = new StoreFile(fs, linkFilePath, testConf, cacheConf, BloomType.NONE); + f.createReader(); Path pathA = splitStoreFile(cloneRegionFs, splitHriA, TEST_FAMILY, f, SPLITKEY, true); // top Path pathB = splitStoreFile(cloneRegionFs, splitHriB, TEST_FAMILY, f, SPLITKEY, false);// bottom - + f.closeReader(true); // OK test the thing FSUtils.logFileSystemState(fs, this.testDir, LOG); -- 1.9.3 (Apple Git-50)