From b82c960b4acf99cddfac82cd7e44723e2e65abde Mon Sep 17 00:00:00 2001 From: horizonzy Date: Sat, 26 Nov 2022 00:57:32 +0800 Subject: [PATCH 1/8] Enhance SimpleTestCommand: add read case, and always remove test ledger. --- .../tools/cli/commands/client/SimpleTestCommand.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java index c083a515ed1..19809fbb8f0 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java @@ -29,6 +29,7 @@ import lombok.experimental.Accessors; import org.apache.bookkeeper.client.api.BookKeeper; import org.apache.bookkeeper.client.api.DigestType; +import org.apache.bookkeeper.client.api.ReadHandle; import org.apache.bookkeeper.client.api.WriteHandle; import org.apache.bookkeeper.tools.cli.commands.client.SimpleTestCommand.Flags; import org.apache.bookkeeper.tools.cli.helpers.ClientCommand; @@ -61,8 +62,6 @@ public static class Flags extends CliFlags { private int ackQuorumSize = 2; @Parameter(names = { "-n", "--num-entries" }, description = "Entries to write (default 100)") private int numEntries = 100; - @Parameter(names = { "-c", "--clean-up" }, description = "Clean up ledger created after simple test") - private boolean cleanup = false; } public SimpleTestCommand() { @@ -102,10 +101,12 @@ protected void run(BookKeeper bk, Flags flags) throws Exception { } } LOG.info("{} entries written to ledger {}", flags.numEntries, wh.getId()); - if (flags.cleanup) { - LOG.info("Cleaning up the ledger {}", wh.getId()); - result(bk.newDeleteLedgerOp().withLedgerId(wh.getId()).execute()); + + try (ReadHandle rh = result(bk.newOpenLedgerOp().withLedgerId(wh.getId()).withDigestType(DigestType.CRC32C) + .withPassword(new byte[0]).execute())) { + rh.read(0, flags.numEntries); } + result(bk.newDeleteLedgerOp().withLedgerId(wh.getId()).execute()); } } } From aa5b58b1a352e80f11f49a0e4f93e1da1b1186ff Mon Sep 17 00:00:00 2001 From: horizonzy Date: Mon, 28 Nov 2022 09:35:15 +0800 Subject: [PATCH 2/8] enhance simple test command. --- .../client/SimpleTestCommandTest.java | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java index d7c80279ee9..281e985c1a7 100644 --- a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java +++ b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java @@ -30,13 +30,18 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.Collections; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicLong; import org.apache.bookkeeper.client.api.CreateBuilder; import org.apache.bookkeeper.client.api.DeleteBuilder; import org.apache.bookkeeper.client.api.DigestType; +import org.apache.bookkeeper.client.api.OpenBuilder; +import org.apache.bookkeeper.client.api.ReadHandle; import org.apache.bookkeeper.client.api.WriteHandle; +import org.apache.bookkeeper.client.impl.LedgerEntriesImpl; +import org.apache.bookkeeper.client.impl.LedgerEntryImpl; import org.apache.bookkeeper.common.concurrent.FutureUtils; import org.apache.bookkeeper.tools.cli.helpers.ClientCommandTestBase; import org.junit.Test; @@ -53,8 +58,7 @@ public void testCommandShortArgs() throws Exception { "-e", "5", "-w", "3", "-a", "3", - "-n", "10", - "-c"); + "-n", "10"); } @Test @@ -63,8 +67,7 @@ public void testCommandLongArgs() throws Exception { "--ensemble-size", "5", "--write-quorum-size", "3", "--ack-quorum-size", "3", - "--num-entries", "10", - "-c"); + "--num-entries", "10"); } @SuppressWarnings("unchecked") @@ -82,6 +85,16 @@ public void testCommand(String... args) throws Exception { when(createBuilder.withPassword(any(byte[].class))).thenReturn(createBuilder); when(createBuilder.execute()).thenReturn(CompletableFuture.completedFuture(wh)); when(mockBk.newCreateLedgerOp()).thenReturn(createBuilder); + + ReadHandle rh = mock(ReadHandle.class); + when(rh.read(anyLong(), anyLong())).thenReturn( + LedgerEntriesImpl.create(Collections.singletonList(LedgerEntryImpl.create(0, 0)))); + OpenBuilder openBuilder = mock(OpenBuilder.class); + when(openBuilder.withLedgerId(anyLong())).thenReturn(openBuilder); + when(openBuilder.withDigestType(any())).thenReturn(openBuilder); + when(openBuilder.withPassword(any())).thenReturn(openBuilder); + when(openBuilder.execute()).thenReturn(CompletableFuture.completedFuture(rh)); + when(mockBk.newOpenLedgerOp()).thenReturn(openBuilder); DeleteBuilder deleteBuilder = mock(DeleteBuilder.class); when(deleteBuilder.withLedgerId(anyLong())).thenReturn(deleteBuilder); @@ -102,12 +115,17 @@ public void testCommand(String... args) throws Exception { verify(createBuilder, times(1)).withDigestType(eq(DigestType.CRC32C)); verify(createBuilder, times(1)).withPassword(eq(new byte[0])); verify(createBuilder, times(1)).execute(); - + + verify(openBuilder, times(1)).withLedgerId(eq(0L)); + verify(openBuilder, times(1)).execute(); + verify(deleteBuilder, times(1)).withLedgerId(eq(0L)); verify(deleteBuilder, times(1)).execute(); // verify appends verify(wh, times(10)).append(eq(new byte[100])); + + verify(rh, times(1)).read(anyLong(), anyLong()); } } From 4245a9eb41e66f811c424d3dad6d8d82ccf39700 Mon Sep 17 00:00:00 2001 From: horizonzy Date: Mon, 28 Nov 2022 10:21:02 +0800 Subject: [PATCH 3/8] Make write data sense. --- .../commands/client/SimpleTestCommand.java | 9 ++++++- .../client/SimpleTestCommandTest.java | 27 ++++++++++++++++--- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java index 19809fbb8f0..21a699c7ffd 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java @@ -24,11 +24,14 @@ import com.google.common.collect.ImmutableMap; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.concurrent.TimeUnit; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.api.BookKeeper; import org.apache.bookkeeper.client.api.DigestType; +import org.apache.bookkeeper.client.api.LedgerEntries; +import org.apache.bookkeeper.client.api.LedgerEntry; import org.apache.bookkeeper.client.api.ReadHandle; import org.apache.bookkeeper.client.api.WriteHandle; import org.apache.bookkeeper.tools.cli.commands.client.SimpleTestCommand.Flags; @@ -80,6 +83,7 @@ public SimpleTestCommand(Flags flags) { @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") protected void run(BookKeeper bk, Flags flags) throws Exception { byte[] data = new byte[100]; // test data + Arrays.fill(data, (byte) '1'); try (WriteHandle wh = result(bk.newCreateLedgerOp() .withEnsembleSize(flags.ensembleSize) @@ -104,7 +108,10 @@ protected void run(BookKeeper bk, Flags flags) throws Exception { try (ReadHandle rh = result(bk.newOpenLedgerOp().withLedgerId(wh.getId()).withDigestType(DigestType.CRC32C) .withPassword(new byte[0]).execute())) { - rh.read(0, flags.numEntries); + LedgerEntries ledgerEntries = rh.read(0, flags.numEntries); + for (LedgerEntry ledgerEntry : ledgerEntries) { + assert Arrays.equals(ledgerEntry.getEntryBytes(), data); + } } result(bk.newDeleteLedgerOp().withLedgerId(wh.getId()).execute()); } diff --git a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java index 281e985c1a7..e31c3bc5709 100644 --- a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java +++ b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java @@ -28,15 +28,24 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicLong; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.UnpooledByteBufAllocator; +import io.netty.buffer.UnpooledHeapByteBuf; import org.apache.bookkeeper.client.api.CreateBuilder; import org.apache.bookkeeper.client.api.DeleteBuilder; import org.apache.bookkeeper.client.api.DigestType; +import org.apache.bookkeeper.client.api.LedgerEntry; import org.apache.bookkeeper.client.api.OpenBuilder; import org.apache.bookkeeper.client.api.ReadHandle; import org.apache.bookkeeper.client.api.WriteHandle; @@ -85,10 +94,20 @@ public void testCommand(String... args) throws Exception { when(createBuilder.withPassword(any(byte[].class))).thenReturn(createBuilder); when(createBuilder.execute()).thenReturn(CompletableFuture.completedFuture(wh)); when(mockBk.newCreateLedgerOp()).thenReturn(createBuilder); - + + List entries = new ArrayList<>(); + byte[] data = new byte[100]; // test data + Arrays.fill(data, (byte) '1'); + for (int i = 0; i < 10; i++) { + ByteBuf buffer = UnpooledByteBufAllocator.DEFAULT.heapBuffer(100); + buffer.writeBytes(data); + entries.add(LedgerEntryImpl.create(counter.get(), i, data.length, buffer)); + } + + LedgerEntriesImpl ledgerEntries = LedgerEntriesImpl.create(entries); + ReadHandle rh = mock(ReadHandle.class); - when(rh.read(anyLong(), anyLong())).thenReturn( - LedgerEntriesImpl.create(Collections.singletonList(LedgerEntryImpl.create(0, 0)))); + when(rh.read(anyLong(), anyLong())).thenReturn(ledgerEntries); OpenBuilder openBuilder = mock(OpenBuilder.class); when(openBuilder.withLedgerId(anyLong())).thenReturn(openBuilder); when(openBuilder.withDigestType(any())).thenReturn(openBuilder); @@ -123,7 +142,7 @@ public void testCommand(String... args) throws Exception { verify(deleteBuilder, times(1)).execute(); // verify appends - verify(wh, times(10)).append(eq(new byte[100])); + verify(wh, times(10)).append(eq(data)); verify(rh, times(1)).read(anyLong(), anyLong()); } From 686c7afd4167bc33b9613fab5826ee3414174e4a Mon Sep 17 00:00:00 2001 From: horizonzy Date: Mon, 28 Nov 2022 10:39:08 +0800 Subject: [PATCH 4/8] Fix checkstyle. --- .../bookkeeper/tools/cli/commands/client/SimpleTestCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java index 21a699c7ffd..63925e3cb06 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java @@ -105,7 +105,7 @@ protected void run(BookKeeper bk, Flags flags) throws Exception { } } LOG.info("{} entries written to ledger {}", flags.numEntries, wh.getId()); - + try (ReadHandle rh = result(bk.newOpenLedgerOp().withLedgerId(wh.getId()).withDigestType(DigestType.CRC32C) .withPassword(new byte[0]).execute())) { LedgerEntries ledgerEntries = rh.read(0, flags.numEntries); From c94e2d1a4274283c748753cb13a3520ffcddc3aa Mon Sep 17 00:00:00 2001 From: horizonzy Date: Mon, 28 Nov 2022 10:48:29 +0800 Subject: [PATCH 5/8] Fix checkstyle. --- .../cli/commands/client/SimpleTestCommandTest.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java index e31c3bc5709..5af0bee16a2 100644 --- a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java +++ b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java @@ -28,20 +28,15 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicLong; - import io.netty.buffer.ByteBuf; -import io.netty.buffer.PooledByteBufAllocator; import io.netty.buffer.UnpooledByteBufAllocator; -import io.netty.buffer.UnpooledHeapByteBuf; import org.apache.bookkeeper.client.api.CreateBuilder; import org.apache.bookkeeper.client.api.DeleteBuilder; import org.apache.bookkeeper.client.api.DigestType; @@ -134,16 +129,16 @@ public void testCommand(String... args) throws Exception { verify(createBuilder, times(1)).withDigestType(eq(DigestType.CRC32C)); verify(createBuilder, times(1)).withPassword(eq(new byte[0])); verify(createBuilder, times(1)).execute(); - + verify(openBuilder, times(1)).withLedgerId(eq(0L)); verify(openBuilder, times(1)).execute(); - + verify(deleteBuilder, times(1)).withLedgerId(eq(0L)); verify(deleteBuilder, times(1)).execute(); // verify appends verify(wh, times(10)).append(eq(data)); - + verify(rh, times(1)).read(anyLong(), anyLong()); } From 2fa3165d209f204278c7c7614e8e356cc72835d9 Mon Sep 17 00:00:00 2001 From: horizonzy Date: Mon, 28 Nov 2022 11:28:38 +0800 Subject: [PATCH 6/8] Fix checkstyle. --- .../tools/cli/commands/client/SimpleTestCommandTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java index 5af0bee16a2..29714262824 100644 --- a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java +++ b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java @@ -28,6 +28,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.UnpooledByteBufAllocator; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; @@ -35,8 +37,6 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicLong; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.UnpooledByteBufAllocator; import org.apache.bookkeeper.client.api.CreateBuilder; import org.apache.bookkeeper.client.api.DeleteBuilder; import org.apache.bookkeeper.client.api.DigestType; From 76c8b71f05e3832dd90a65b61cccf42b9aadf837 Mon Sep 17 00:00:00 2001 From: horizonzy Date: Tue, 29 Nov 2022 11:09:31 +0800 Subject: [PATCH 7/8] Address the comment. --- .../commands/client/SimpleTestCommand.java | 38 ++++++++++++------- .../client/SimpleTestCommandTest.java | 6 ++- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java index 63925e3cb06..be45a9e7138 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java @@ -25,6 +25,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.Random; import java.util.concurrent.TimeUnit; import lombok.Setter; import lombok.experimental.Accessors; @@ -47,7 +48,7 @@ public class SimpleTestCommand extends ClientCommand { private static final String NAME = "simpletest"; - private static final String DESC = "Simple test to create a ledger and write entries to it."; + private static final String DESC = "Simple test to create a ledger and write entries to it, then read it."; private static final Logger LOG = LoggerFactory.getLogger(SimpleTestCommand.class); /** @@ -83,17 +84,20 @@ public SimpleTestCommand(Flags flags) { @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") protected void run(BookKeeper bk, Flags flags) throws Exception { byte[] data = new byte[100]; // test data - Arrays.fill(data, (byte) '1'); - - try (WriteHandle wh = result(bk.newCreateLedgerOp() - .withEnsembleSize(flags.ensembleSize) - .withWriteQuorumSize(flags.writeQuorumSize) - .withAckQuorumSize(flags.ackQuorumSize) - .withDigestType(DigestType.CRC32C) - .withCustomMetadata(ImmutableMap.of("Bookie", NAME.getBytes(StandardCharsets.UTF_8))) - .withPassword(new byte[0]) - .execute())) { - + Random random = new Random(0); + for (int i = 0; i < data.length; i++) { + data[i] = (byte) (random.nextInt(26) + 65); + } + WriteHandle wh = null; + try { + wh = result(bk.newCreateLedgerOp() + .withEnsembleSize(flags.ensembleSize) + .withWriteQuorumSize(flags.writeQuorumSize) + .withAckQuorumSize(flags.ackQuorumSize) + .withDigestType(DigestType.CRC32C) + .withCustomMetadata(ImmutableMap.of("Bookie", NAME.getBytes(StandardCharsets.UTF_8))) + .withPassword(new byte[0]) + .execute()); LOG.info("Ledger ID: {}", wh.getId()); long lastReport = System.nanoTime(); for (int i = 0; i < flags.numEntries; i++) { @@ -110,10 +114,16 @@ protected void run(BookKeeper bk, Flags flags) throws Exception { .withPassword(new byte[0]).execute())) { LedgerEntries ledgerEntries = rh.read(0, flags.numEntries); for (LedgerEntry ledgerEntry : ledgerEntries) { - assert Arrays.equals(ledgerEntry.getEntryBytes(), data); + if (!Arrays.equals(ledgerEntry.getEntryBytes(), data)) { + LOG.error("Read test failed, the reading data is not equals writing data."); + } } } - result(bk.newDeleteLedgerOp().withLedgerId(wh.getId()).execute()); + } finally { + if (wh != null) { + wh.close(); + result(bk.newDeleteLedgerOp().withLedgerId(wh.getId()).execute()); + } } } } diff --git a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java index 29714262824..b06f0a62c3a 100644 --- a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java +++ b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommandTest.java @@ -35,6 +35,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicLong; import org.apache.bookkeeper.client.api.CreateBuilder; @@ -92,7 +93,10 @@ public void testCommand(String... args) throws Exception { List entries = new ArrayList<>(); byte[] data = new byte[100]; // test data - Arrays.fill(data, (byte) '1'); + Random random = new Random(0); + for (int i = 0; i < data.length; i++) { + data[i] = (byte) (random.nextInt(26) + 65); + } for (int i = 0; i < 10; i++) { ByteBuf buffer = UnpooledByteBufAllocator.DEFAULT.heapBuffer(100); buffer.writeBytes(data); From aac051649c1bc4f4203346d65a2cc77165441513 Mon Sep 17 00:00:00 2001 From: horizonzy Date: Tue, 29 Nov 2022 11:20:34 +0800 Subject: [PATCH 8/8] ignore DMI_RANDOM_USED_ONLY_ONCE. --- .../bookkeeper/tools/cli/commands/client/SimpleTestCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java index be45a9e7138..ca94cac4a73 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java @@ -81,7 +81,7 @@ public SimpleTestCommand(Flags flags) { } @Override - @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") + @SuppressFBWarnings({"RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE", "DMI_RANDOM_USED_ONLY_ONCE"}) protected void run(BookKeeper bk, Flags flags) throws Exception { byte[] data = new byte[100]; // test data Random random = new Random(0);