Return-Path: X-Original-To: apmail-hbase-commits-archive@www.apache.org Delivered-To: apmail-hbase-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B1529D776 for ; Sun, 26 Aug 2012 00:30:19 +0000 (UTC) Received: (qmail 61091 invoked by uid 500); 26 Aug 2012 00:30:18 -0000 Delivered-To: apmail-hbase-commits-archive@hbase.apache.org Received: (qmail 60978 invoked by uid 500); 26 Aug 2012 00:30:18 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 60966 invoked by uid 99); 26 Aug 2012 00:30:18 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 26 Aug 2012 00:30:18 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 26 Aug 2012 00:30:16 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id D5C3F238890D for ; Sun, 26 Aug 2012 00:29:33 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1377366 - in /hbase/trunk/hbase-server/src: main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java main/java/org/apache/hadoop/hbase/regionserver/HStore.java test/java/org/apache/hadoop/hbase/io/TestHalfStoreFileReader.java Date: Sun, 26 Aug 2012 00:29:33 -0000 To: commits@hbase.apache.org From: stack@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120826002933.D5C3F238890D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: stack Date: Sun Aug 26 00:29:33 2012 New Revision: 1377366 URL: http://svn.apache.org/viewvc?rev=1377366&view=rev Log: HBASE-5997 Fix concerns raised in HBASE-5922 related to HalfStoreFileReader Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHalfStoreFileReader.java Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java?rev=1377366&r1=1377365&r2=1377366&view=diff ============================================================================== --- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java (original) +++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java Sun Aug 26 00:29:33 2012 @@ -54,6 +54,10 @@ public class HalfStoreFileReader extends // This is the key we split around. Its the first possible entry on a row: // i.e. empty column and a timestamp of LATEST_TIMESTAMP. protected final byte [] splitkey; + + private byte[] firstKey = null; + + private boolean firstKeySeeked = false; /** * @param fs @@ -143,8 +147,11 @@ public class HalfStoreFileReader extends public boolean seekBefore(byte [] key, int offset, int length) throws IOException { if (top) { - if (getComparator().compare(key, offset, length, splitkey, 0, - splitkey.length) < 0) { + byte[] fk = getFirstKey(); + // This will be null when the file is empty in which we can not seekBefore to any key + if (fk == null) return false; + if (getComparator().compare(key, offset, length, fk, 0, + fk.length) <= 0) { return false; } } else { @@ -273,4 +280,20 @@ public class HalfStoreFileReader extends // Returns null to indicate file is not splitable. return null; } + + @Override + public byte[] getFirstKey() { + if (!firstKeySeeked) { + HFileScanner scanner = getScanner(true, true, false); + try { + if (scanner.seekTo()) { + this.firstKey = Bytes.toBytes(scanner.getKey()); + } + firstKeySeeked = true; + } catch (IOException e) { + LOG.warn("Failed seekTo first KV in the file", e); + } + } + return this.firstKey; + } } Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java?rev=1377366&r1=1377365&r2=1377366&view=diff ============================================================================== --- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java (original) +++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java Sun Aug 26 00:29:33 2012 @@ -1698,6 +1698,7 @@ public class HStore extends SchemaConfig } // TODO: Cache these keys rather than make each time? byte [] fk = r.getFirstKey(); + if (fk == null) return; KeyValue firstKV = KeyValue.createKeyValueFromKey(fk, 0, fk.length); byte [] lk = r.getLastKey(); KeyValue lastKV = KeyValue.createKeyValueFromKey(lk, 0, lk.length); @@ -1711,7 +1712,7 @@ public class HStore extends SchemaConfig firstOnRow = new KeyValue(lastKV.getRow(), HConstants.LATEST_TIMESTAMP); } // Get a scanner that caches blocks and that uses pread. - HFileScanner scanner = r.getHFileReader().getScanner(true, true, false); + HFileScanner scanner = r.getScanner(true, true, false); // Seek scanner. If can't seek it, return. if (!seekToScanner(scanner, firstOnRow, firstKV)) return; // If we found candidate on firstOnRow, just return. THIS WILL NEVER HAPPEN! Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHalfStoreFileReader.java URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHalfStoreFileReader.java?rev=1377366&r1=1377365&r2=1377366&view=diff ============================================================================== --- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHalfStoreFileReader.java (original) +++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHalfStoreFileReader.java Sun Aug 26 00:29:33 2012 @@ -195,6 +195,9 @@ public class TestHalfStoreFileReader { foundKeyValue = doTestOfSeekBefore(p, fs, bottom, items.get(1), cacheConf); assertEquals(items.get(0), foundKeyValue); + // Try to seek before the splitKey in the top file + foundKeyValue = doTestOfSeekBefore(p, fs, top, midKV, cacheConf); + assertNull(foundKeyValue); } private KeyValue doTestOfSeekBefore(Path p, FileSystem fs, Reference bottom, KeyValue seekBefore,