From a176808fb1b528f46cdb70057630fd28b7c77f0e Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Mon, 29 Dec 2025 12:44:39 -0800 Subject: [PATCH 1/4] HDDS-14259. Improve TestManagedDirectSlice. --- .../db/managed/TestManagedDirectSlice.java | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java b/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java index f13aba39a7b..1adf81fcf6e 100644 --- a/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java +++ b/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java @@ -20,30 +20,51 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.nio.ByteBuffer; -import java.util.Arrays; -import org.apache.commons.lang3.RandomUtils; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; +import java.util.Random; +import org.apache.hadoop.hdds.utils.db.CodecBuffer; +import org.junit.jupiter.api.Test; /** * Tests for ManagedDirectSlice. */ public class TestManagedDirectSlice { - static { ManagedRocksObjectUtils.loadRocksDBLibrary(); } - @ParameterizedTest - @CsvSource({"0, 1024", "1024, 1024", "512, 1024", "0, 100", "10, 512", "0, 0"}) - public void testManagedDirectSliceWithOffset(int offset, int numberOfBytesWritten) { - ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024); - byte[] randomBytes = RandomUtils.secure().nextBytes(numberOfBytesWritten); - byteBuffer.put(randomBytes); - byteBuffer.flip(); - byteBuffer.position(offset); - try (ManagedDirectSlice directSlice = new ManagedDirectSlice(byteBuffer); - ManagedSlice slice = new ManagedSlice(Arrays.copyOfRange(randomBytes, offset, numberOfBytesWritten))) { + static final Random RANDOM = new Random(); + + @Test + public void testManagedDirectSlice() { + testManagedDirectSlice(0); + testManagedDirectSlice(1); + for (int size = 2; size <= 10; size <<= 1) { + testManagedDirectSlice(size - 1); + testManagedDirectSlice(size); + testManagedDirectSlice(size + 1); + } + for (int i = 0; i < 5; i++) { + final int size = RANDOM.nextInt(1024); + testManagedDirectSlice(size); + } + } + + static void testManagedDirectSlice(int size) { + try { + runTestManagedDirectSlice(size); + } catch (Throwable e) { + System.out.printf("Failed for size %d%n", size); + throw e; + } + } + + static void runTestManagedDirectSlice(int size) { + final byte[] bytes = new byte[size]; + RANDOM.nextBytes(bytes); + try (CodecBuffer buffer = CodecBuffer.allocateDirect(size).put(ByteBuffer.wrap(bytes)); + ManagedDirectSlice directSlice = new ManagedDirectSlice(buffer.asReadOnlyByteBuffer()); + ManagedSlice slice = new ManagedSlice(bytes)) { + assertEquals(slice.size(), directSlice.size()); assertEquals(slice, directSlice); } } From 06c7c4769cb3146681da77e8196334acf8446fff Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Mon, 29 Dec 2025 13:06:18 -0800 Subject: [PATCH 2/4] Fix a bug. --- .../utils/db/managed/TestManagedDirectSlice.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java b/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java index 1adf81fcf6e..b38daf656c8 100644 --- a/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java +++ b/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java @@ -36,15 +36,19 @@ public class TestManagedDirectSlice { @Test public void testManagedDirectSlice() { - testManagedDirectSlice(0); - testManagedDirectSlice(1); - for (int size = 2; size <= 10; size <<= 1) { + for (int size = 0; size <= 16; size++) { + testManagedDirectSlice(size); + } + + for (int i = 0; i <= 10; i++) { + final int size = 32 << i; testManagedDirectSlice(size - 1); testManagedDirectSlice(size); testManagedDirectSlice(size + 1); } - for (int i = 0; i < 5; i++) { - final int size = RANDOM.nextInt(1024); + + for (int i = 0; i < 10; i++) { + final int size = RANDOM.nextInt( 1 << 20); testManagedDirectSlice(size); } } From 7f572727876c87a9cd04412e1a26b36fb6b20938 Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Mon, 29 Dec 2025 13:13:53 -0800 Subject: [PATCH 3/4] Fix checkstyle --- .../hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java b/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java index b38daf656c8..a5620924f0b 100644 --- a/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java +++ b/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java @@ -36,10 +36,12 @@ public class TestManagedDirectSlice { @Test public void testManagedDirectSlice() { + // test all values <= 16 for (int size = 0; size <= 16; size++) { testManagedDirectSlice(size); } + // test power of 2 for (int i = 0; i <= 10; i++) { final int size = 32 << i; testManagedDirectSlice(size - 1); @@ -47,8 +49,9 @@ public void testManagedDirectSlice() { testManagedDirectSlice(size + 1); } + // test random for (int i = 0; i < 10; i++) { - final int size = RANDOM.nextInt( 1 << 20); + final int size = RANDOM.nextInt(1 << 20); testManagedDirectSlice(size); } } From 895415d1125f5345533c0d39195c6b91f41bfe2b Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Tue, 30 Dec 2025 10:52:59 -0800 Subject: [PATCH 4/4] Test also position --- .../db/managed/TestManagedDirectSlice.java | 58 ++++++++++++++----- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java b/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java index a5620924f0b..a69bcd8d06c 100644 --- a/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java +++ b/hadoop-hdds/managed-rocksdb/src/test/java/org/apache/hadoop/hdds/utils/db/managed/TestManagedDirectSlice.java @@ -33,46 +33,72 @@ public class TestManagedDirectSlice { } static final Random RANDOM = new Random(); + static final byte[] ZEROS = new byte[1 << 10]; + private static int count = 0; @Test public void testManagedDirectSlice() { - // test all values <= 16 - for (int size = 0; size <= 16; size++) { + // test small sizes + final int small = 8; + for (int size = 0; size <= small; size++) { testManagedDirectSlice(size); } - // test power of 2 - for (int i = 0; i <= 10; i++) { - final int size = 32 << i; + // test power of 2 sizes + for (int i = 1; i <= 10; i++) { + final int size = small << i; testManagedDirectSlice(size - 1); testManagedDirectSlice(size); testManagedDirectSlice(size + 1); } - // test random - for (int i = 0; i < 10; i++) { - final int size = RANDOM.nextInt(1 << 20); + // test random sizes + final int bound = ZEROS.length << 10; + for (int i = 0; i < 4; i++) { + final int size = RANDOM.nextInt(bound); + testManagedDirectSlice(size); + } + for (int i = 0; i < 4; i++) { + final int size = RANDOM.nextInt(bound) + ZEROS.length; testManagedDirectSlice(size); } } static void testManagedDirectSlice(int size) { - try { - runTestManagedDirectSlice(size); - } catch (Throwable e) { - System.out.printf("Failed for size %d%n", size); - throw e; + // test small positions + final int small = 3; + for (int position = 0; position < small; position++) { + testManagedDirectSlice(size, position); + } + // test large positions + for (int i = 0; i < small; i++) { + testManagedDirectSlice(size, ZEROS.length - i); + } + // test random positions + for (int i = 0; i < 4; i++) { + final int bound = ZEROS.length - 2 * small + 1; + final int position = RANDOM.nextInt(bound) + small; // small <= position <= ZEROS.length-small + testManagedDirectSlice(size, position); } } - static void runTestManagedDirectSlice(int size) { + static void testManagedDirectSlice(int size, int position) { + System.out.printf("%3d: size %d and position %d%n", ++count, size, position); final byte[] bytes = new byte[size]; RANDOM.nextBytes(bytes); - try (CodecBuffer buffer = CodecBuffer.allocateDirect(size).put(ByteBuffer.wrap(bytes)); - ManagedDirectSlice directSlice = new ManagedDirectSlice(buffer.asReadOnlyByteBuffer()); + try (CodecBuffer buffer = CodecBuffer.allocateDirect(size + position) + .put(ByteBuffer.wrap(ZEROS, 0, position)) + .put(ByteBuffer.wrap(bytes)); + ManagedDirectSlice directSlice = new ManagedDirectSlice(getByteBuffer(buffer, position)); ManagedSlice slice = new ManagedSlice(bytes)) { assertEquals(slice.size(), directSlice.size()); assertEquals(slice, directSlice); } } + + static ByteBuffer getByteBuffer(CodecBuffer buffer, int position) { + final ByteBuffer byteBuffer = buffer.asReadOnlyByteBuffer(); + byteBuffer.position(position); + return byteBuffer; + } }