You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by mm...@apache.org on 2021/06/23 12:46:23 UTC

[accumulo] branch main updated: Fix row encoding/decoding in LogFileKey (#2176)

This is an automated email from the ASF dual-hosted git repository.

mmiller pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/main by this push:
     new b8262a4  Fix row encoding/decoding in LogFileKey (#2176)
b8262a4 is described below

commit b8262a424db92729c89d6870ba5973386b9e3ea1
Author: Christopher Tubbs <ct...@apache.org>
AuthorDate: Wed Jun 23 08:46:15 2021 -0400

    Fix row encoding/decoding in LogFileKey (#2176)
    
    Fix bitwise operations to encode and decode the tabletId and sequence
    number to/from a row
    
    This fixes #2173
---
 .../apache/accumulo/tserver/logger/LogFileKey.java | 54 +++++++++++++---------
 1 file changed, 31 insertions(+), 23 deletions(-)

diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/logger/LogFileKey.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/logger/LogFileKey.java
index bf08ca4..cf5dc21 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/logger/LogFileKey.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/logger/LogFileKey.java
@@ -245,8 +245,8 @@ public class LogFileKey implements WritableComparable<LogFileKey> {
    * byte in the row.
    */
   private byte getEventByte() {
-    int evenTypeInteger = eventType(event);
-    return (byte) (evenTypeInteger & 0xff);
+    int eventTypeInteger = eventType(event);
+    return (byte) (eventTypeInteger & 0xff);
   }
 
   /**
@@ -269,19 +269,20 @@ public class LogFileKey implements WritableComparable<LogFileKey> {
     // encode the signed integer so negatives will sort properly for tabletId
     int encodedTabletId = tabletId ^ 0x80000000;
 
+    int mask = 0xff; // use a mask of int type to truncate the selected 8 bits
     row[0] = eventNum;
-    row[1] = (byte) ((encodedTabletId >>> 24) & 0xff);
-    row[2] = (byte) ((encodedTabletId >>> 16) & 0xff);
-    row[3] = (byte) ((encodedTabletId >>> 8) & 0xff);
-    row[4] = (byte) (encodedTabletId & 0xff);
-    row[5] = (byte) (seq >>> 56);
-    row[6] = (byte) (seq >>> 48);
-    row[7] = (byte) (seq >>> 40);
-    row[8] = (byte) (seq >>> 32);
-    row[9] = (byte) (seq >>> 24);
-    row[10] = (byte) (seq >>> 16);
-    row[11] = (byte) (seq >>> 8);
-    row[12] = (byte) (seq); // >>> 0
+    row[1] = (byte) ((encodedTabletId >>> 24) & mask);
+    row[2] = (byte) ((encodedTabletId >>> 16) & mask);
+    row[3] = (byte) ((encodedTabletId >>> 8) & mask);
+    row[4] = (byte) (encodedTabletId & mask);
+    row[5] = (byte) ((seq >>> 56) & mask);
+    row[6] = (byte) ((seq >>> 48) & mask);
+    row[7] = (byte) ((seq >>> 40) & mask);
+    row[8] = (byte) ((seq >>> 32) & mask);
+    row[9] = (byte) ((seq >>> 24) & mask);
+    row[10] = (byte) ((seq >>> 16) & mask);
+    row[11] = (byte) ((seq >>> 8) & mask);
+    row[12] = (byte) (seq & mask);
     return row;
   }
 
@@ -289,7 +290,13 @@ public class LogFileKey implements WritableComparable<LogFileKey> {
    * Extract the tabletId integer from the byte encoded Row.
    */
   private static int getTabletId(byte[] row) {
-    int encoded = ((row[1] << 24) + (row[2] << 16) + (row[3] << 8) + row[4]);
+    int mask = 0xff; // use a mask of int type to convert byte to int without sign extension
+    // @formatter:off
+    int encoded = (row[1] & mask) << 24 |
+                  (row[2] & mask) << 16 |
+                  (row[3] & mask) <<  8 |
+                  (row[4] & mask);
+    // @formatter:on
     return encoded ^ 0x80000000;
   }
 
@@ -297,15 +304,16 @@ public class LogFileKey implements WritableComparable<LogFileKey> {
    * Extract the sequence long from the byte encoded Row.
    */
   private static long getSequence(byte[] row) {
+    long mask = 0xff; // use a mask of long type to convert byte to long without sign extension
     // @formatter:off
-    return (((long) row[5] << 56) +
-            ((long) (row[6] & 255) << 48) +
-            ((long) (row[7] & 255) << 40) +
-            ((long) (row[8] & 255) << 32) +
-            ((long) (row[9] & 255) << 24) +
-            ((row[10] & 255) << 16) +
-            ((row[11] & 255) << 8) +
-            ((row[12] & 255)));
+    return (row[5]  & mask) << 56 |
+           (row[6]  & mask) << 48 |
+           (row[7]  & mask) << 40 |
+           (row[8]  & mask) << 32 |
+           (row[9]  & mask) << 24 |
+           (row[10] & mask) << 16 |
+           (row[11] & mask) <<  8 |
+           (row[12] & mask);
     // @formatter:on
   }