[ 
https://issues.apache.org/jira/browse/HBASE-27580?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Bryan Beaudreault updated HBASE-27580:
--------------------------------------
    Fix Version/s: 2.6.0

> Reverse scan over rows with tags throw exceptions when using DataBlockEncoding
> ------------------------------------------------------------------------------
>
>                 Key: HBASE-27580
>                 URL: https://issues.apache.org/jira/browse/HBASE-27580
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Bryan Beaudreault
>            Assignee: Bryan Beaudreault
>            Priority: Major
>             Fix For: 2.6.0, 3.0.0-alpha-4, 2.4.17, 2.5.4
>
>
> This is easily reproducible, see test below. All you need to do is create a 
> table with a DBE, write some puts with setTTL, then do a reverse scan. All 3 
> compressing DBE's fail. 
> PREFIX throws an exception:
> {code:java}
> Caused by: java.lang.IndexOutOfBoundsException: index (0) must be less than 
> size (0)
>     at 
> org.apache.hbase.thirdparty.com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:1355)
>     at 
> org.apache.hbase.thirdparty.com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:1337)
>     at 
> org.apache.hadoop.hbase.io.util.LRUDictionary$BidirectionalLRUMap.get(LRUDictionary.java:153)
>     at 
> org.apache.hadoop.hbase.io.util.LRUDictionary$BidirectionalLRUMap.access$000(LRUDictionary.java:79)
>     at 
> org.apache.hadoop.hbase.io.util.LRUDictionary.getEntry(LRUDictionary.java:43)
>     at 
> org.apache.hadoop.hbase.io.TagCompressionContext.uncompressTags(TagCompressionContext.java:152)
>     at 
> org.apache.hadoop.hbase.io.encoding.BufferedDataBlockEncoder$BufferedEncodedSeeker.decodeTags(BufferedDataBlockEncoder.java:819)
>     at 
> org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder$SeekerStateBufferedEncodedSeeker.decodeNext(PrefixKeyDeltaEncoder.java:209)
>     at 
> org.apache.hadoop.hbase.io.encoding.BufferedDataBlockEncoder$BufferedEncodedSeeker.seekToKeyInBlock(BufferedDataBlockEncoder.java:920)
>  {code}
>  
> DIFF throws an exception:
> {code:java}
> Caused by: java.lang.ArrayIndexOutOfBoundsException: arraycopy: length -22 is 
> negative
>     at java.base/java.lang.System.arraycopy(Native Method)
>     at 
> org.apache.hadoop.hbase.util.ByteBufferUtils.copyFromBufferToArray(ByteBufferUtils.java:1140)
>     at org.apache.hadoop.hbase.nio.SingleByteBuff.get(SingleByteBuff.java:213)
>     at 
> org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder$DiffSeekerStateBufferedEncodedSeeker.decode(DiffKeyDeltaEncoder.java:431)
>     at 
> org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder$DiffSeekerStateBufferedEncodedSeeker.decodeNext(DiffKeyDeltaEncoder.java:502)
>     at 
> org.apache.hadoop.hbase.io.encoding.BufferedDataBlockEncoder$BufferedEncodedSeeker.seekToKeyInBlock(BufferedDataBlockEncoder.java:920)
>  {code}
>  
> FAST_DIFF throws a similar exception:
> {code:java}
> Caused by: java.lang.ArrayIndexOutOfBoundsException: arraycopy: length -22 is 
> negative
>     at java.base/java.lang.System.arraycopy(Native Method)
>     at 
> org.apache.hadoop.hbase.util.ByteBufferUtils.copyFromBufferToArray(ByteBufferUtils.java:1140)
>     at org.apache.hadoop.hbase.nio.SingleByteBuff.get(SingleByteBuff.java:213)
>     at 
> org.apache.hadoop.hbase.io.encoding.FastDiffDeltaEncoder$FastDiffSeekerStateBufferedEncodedSeeker.decode(FastDiffDeltaEncoder.java:424)
>     at 
> org.apache.hadoop.hbase.io.encoding.FastDiffDeltaEncoder$FastDiffSeekerStateBufferedEncodedSeeker.decodeNext(FastDiffDeltaEncoder.java:490)
>     at 
> org.apache.hadoop.hbase.io.encoding.BufferedDataBlockEncoder$BufferedEncodedSeeker.seekToKeyInBlock(BufferedDataBlockEncoder.java:920)
>  {code}
>  
> Reproduce with:
> {code:java}
> private static final Logger LOG = LoggerFactory.getLogger(TestTags.class);
> @Test
> public void testReverseScanWithDBE() throws IOException {
>   byte[] family = Bytes.toBytes("0");
>   Configuration conf = new Configuration(TEST_UTIL.getConfiguration());
>   conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);
>   try (Connection connection = ConnectionFactory.createConnection(conf)) {
>     for (DataBlockEncoding encoding : DataBlockEncoding.values()) {
>       boolean isCompressing = encoding != DataBlockEncoding.NONE && encoding 
> != DataBlockEncoding.ROW_INDEX_V1;
>       try {
>         testReverseScanWithDBE(connection, encoding, family);
>         if (isCompressing) {
>           Assert.fail("Expected to throw exception for DBE " + encoding);
>         }
>       } catch (Exception e) {
>         LOG.info("Got exception for DBE {}", encoding, e);
>         assertTrue("Only expected compressing encodings to fail, but failed 
> on " + encoding, isCompressing);
>       }
>     }
>   }
> }
> private void testReverseScanWithDBE(Connection conn, DataBlockEncoding 
> encoding, byte[] family)
>   throws IOException {
>   LOG.info("Running test with DBE={}", encoding);
>   TableName tableName = TableName.valueOf(TEST_NAME.getMethodName() + "-" + 
> encoding);
>   TEST_UTIL.createTable(
>     TableDescriptorBuilder.newBuilder(tableName)
>       .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(family)
>         .setDataBlockEncoding(encoding)
>         .build())
>       .build(),
>     null);
>   Table table = conn.getTable(tableName);
>   for (int i = 0; i < 10; i++) {
>     table.put(new Put(Bytes.toBytes(i)).addColumn(family, Bytes.toBytes(0), 
> new byte[10]).setTTL(600_000));
>   }
>   TEST_UTIL.flush(table.getName());
>   Scan scan = new Scan();
>   scan.setReversed(true);
>   try (ResultScanner scanner = table.getScanner(scan)) {
>     // should fail for compressing encodings
>     scanner.next();
>   }
> } {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to