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 13:57:41 UTC
[accumulo] branch main updated: Adds tests to LogFileKeyTest (#2177)
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 89b411c Adds tests to LogFileKeyTest (#2177)
89b411c is described below
commit 89b411c391675cb3f1faed83f2dd4451b2ac6d12
Author: Mike Miller <mm...@apache.org>
AuthorDate: Wed Jun 23 09:57:31 2021 -0400
Adds tests to LogFileKeyTest (#2177)
---
.../apache/accumulo/tserver/logger/LogFileKey.java | 15 ++++++-
.../accumulo/tserver/log/LogFileKeyTest.java | 49 ++++++++++++++++++++++
2 files changed, 62 insertions(+), 2 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 cf5dc21..b860be5 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
@@ -28,6 +28,7 @@ import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.UncheckedIOException;
+import java.util.Arrays;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.Range;
@@ -36,10 +37,13 @@ import org.apache.hadoop.io.DataInputBuffer;
import org.apache.hadoop.io.DataOutputBuffer;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
public class LogFileKey implements WritableComparable<LogFileKey> {
+ private static final Logger log = LoggerFactory.getLogger(LogFileKey.class);
public LogEvents event;
public String filename = null;
@@ -258,7 +262,9 @@ public class LogFileKey implements WritableComparable<LogFileKey> {
/**
* Format the row using 13 bytes encoded to allow proper sorting of the RFile Key. The highest
- * byte is for the event number, 4 bytes for the tabletId and 8 bytes for the sequence long.
+ * byte is for the event number, 4 bytes for the tabletId and 8 bytes for the sequence long. The
+ * conversions of integer to byte[] and long to byte[] is similar to what DataOutputStream does
+ * for writeInt() and writeLong()
*/
private byte[] formatRow(int tabletId, long seq) {
byte eventNum = getEventByte();
@@ -283,11 +289,14 @@ public class LogFileKey implements WritableComparable<LogFileKey> {
row[10] = (byte) ((seq >>> 16) & mask);
row[11] = (byte) ((seq >>> 8) & mask);
row[12] = (byte) (seq & mask);
+
+ log.trace("Convert {} {} {} to row {}", event, tabletId, seq, Arrays.toString(row));
return row;
}
/**
- * Extract the tabletId integer from the byte encoded Row.
+ * Extract the tabletId integer from the byte encoded Row. Similar to what DataInputStream does
+ * for readInt()
*/
private static int getTabletId(byte[] row) {
int mask = 0xff; // use a mask of int type to convert byte to int without sign extension
@@ -335,6 +344,8 @@ public class LogFileKey implements WritableComparable<LogFileKey> {
if (eventType(logFileKey.event) != rowParts[0]) {
throw new AssertionError("Event in row differs from column family. Key: " + key);
}
+ log.trace("From row {} get {} {} {}", Arrays.toString(rowParts), logFileKey.event,
+ logFileKey.tabletId, logFileKey.seq);
// handle special cases of what is stored in the qualifier
switch (logFileKey.event) {
diff --git a/server/tserver/src/test/java/org/apache/accumulo/tserver/log/LogFileKeyTest.java b/server/tserver/src/test/java/org/apache/accumulo/tserver/log/LogFileKeyTest.java
index 72cc339..0f04aca 100644
--- a/server/tserver/src/test/java/org/apache/accumulo/tserver/log/LogFileKeyTest.java
+++ b/server/tserver/src/test/java/org/apache/accumulo/tserver/log/LogFileKeyTest.java
@@ -20,12 +20,17 @@ package org.apache.accumulo.tserver.log;
import static org.junit.Assert.assertEquals;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.TableId;
+import org.apache.accumulo.core.dataImpl.KeyExtent;
import org.apache.accumulo.tserver.logger.LogEvents;
import org.apache.accumulo.tserver.logger.LogFileKey;
+import org.apache.hadoop.io.Text;
import org.junit.Test;
public class LogFileKeyTest {
@@ -98,4 +103,48 @@ public class LogFileKeyTest {
}
}
+
+ private void testToFromKey(int tabletId, long seq) throws IOException {
+ var logFileKey = nk(LogEvents.DEFINE_TABLET, tabletId, seq);
+ logFileKey.tablet = new KeyExtent(TableId.of("5"), new Text("b"), null);
+ Key k = logFileKey.toKey();
+
+ var converted = LogFileKey.fromKey(k);
+ assertEquals("Failed to convert tabletId = " + tabletId + " seq = " + seq, logFileKey,
+ converted);
+ }
+
+ @Test
+ public void convertToKeyLargeTabletId() throws IOException {
+ // test continuous range of numbers to make sure all cases of signed bytes are covered
+ for (int i = -1_000; i < 1_000_000; i++) {
+ testToFromKey(i, 1);
+ }
+ }
+
+ @Test
+ public void convertToKeyLargeSeq() throws IOException {
+ // use numbers large enough to cover all bytes used
+ testToFromKey(1, 8); // 1 byte
+ testToFromKey(1, 1_000L); // 2 bytes
+ testToFromKey(1, 1_222_333L); // 3 bytes
+ testToFromKey(1, 100_000_000L); // 4 bytes
+ testToFromKey(1, 111_222_333_444L); // 5 bytes
+ testToFromKey(1, 1_000_222_333_777L); // 6 bytes
+ testToFromKey(1, 5_222_000_222_333_777L); // 7 bytes
+ testToFromKey(1, 500_222_333_444_555_666L); // 8 bytes
+
+ // test with more tabletId bytes
+ testToFromKey(-1000, 500_222_333_444_555_666L);
+ testToFromKey(10_000_000, 500_222_333_444_555_666L);
+ testToFromKey(Integer.MAX_VALUE, Long.MAX_VALUE);
+ testToFromKey(Integer.MIN_VALUE, Long.MAX_VALUE);
+ testToFromKey(Integer.MIN_VALUE, 0);
+ testToFromKey(Integer.MAX_VALUE, 0);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testNegativeSeq() throws IOException {
+ testToFromKey(1, -1);
+ }
}