Skip to content

Commit

Permalink
Added tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Vovchyk committed Nov 11, 2021
1 parent 92f700d commit f381f2c
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 22 deletions.
69 changes: 49 additions & 20 deletions rskj-core/src/main/java/co/rsk/cli/tools/IndexBlooms.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Nonnull;

/**
* The entry point for indexing block blooms
* This is an experimental/unsupported tool
Expand All @@ -42,36 +44,50 @@ public static void main(String[] args) {
BlockStore blockStore = ctx.getBlockStore();
BlocksBloomStore blocksBloomStore = ctx.getBlocksBloomStore();

long minNumber = blockStore.getMinNumber();
long maxNumber = blockStore.getMaxNumber();
execute(makeBlockRange(args, blockStore), blockStore, blocksBloomStore);
}
}

long fromBlockNumber = EARLIEST.equals(args[0]) ? minNumber : Long.parseLong(args[0]);
long toBlockNumber = LATEST.equals(args[1]) ? maxNumber : Long.parseLong(args[1]);
/**
* Creates a block range by extract from/to values from {@code args}.
*/
@Nonnull
static Range makeBlockRange(@Nonnull String[] args, @Nonnull BlockStore blockStore) {
if (args.length < 2) {
throw new IllegalArgumentException("Missing 'from' and/or 'to' block number(s)");
}

if (fromBlockNumber < 0 || fromBlockNumber > toBlockNumber) {
throw new IllegalArgumentException("Invalid 'from' and/or 'to' block number");
}
long minNumber = blockStore.getMinNumber();
long maxNumber = blockStore.getMaxNumber();

if (fromBlockNumber < minNumber) {
throw new IllegalArgumentException("'from' block number is lesser than the min block number stored");
}
long fromBlockNumber = EARLIEST.equals(args[0]) ? minNumber : Long.parseLong(args[0]);
long toBlockNumber = LATEST.equals(args[1]) ? maxNumber : Long.parseLong(args[1]);

if (toBlockNumber > maxNumber) {
throw new IllegalArgumentException("'to' block number is greater than the best block number");
}
if (fromBlockNumber < 0 || fromBlockNumber > toBlockNumber) {
throw new IllegalArgumentException("Invalid 'from' and/or 'to' block number");
}

execute(fromBlockNumber, toBlockNumber, blockStore, blocksBloomStore);
if (fromBlockNumber < minNumber) {
throw new IllegalArgumentException("'from' block number is lesser than the min block number stored");
}

if (toBlockNumber > maxNumber) {
throw new IllegalArgumentException("'to' block number is greater than the best block number");
}

return new Range(fromBlockNumber, toBlockNumber);
}

public static void execute(long fromBlockNumber,
long toBlockNumber,
BlockStore blockStore,
BlocksBloomStore blocksBloomStore) {
/**
* Indexes block blooms in the {@link blockRange} range.
*/
static void execute(Range blockRange,
BlockStore blockStore,
BlocksBloomStore blocksBloomStore) {
BlocksBloom auxiliaryBlocksBloom = null;
long curProgress = 0L;

for (long blockNum = fromBlockNumber; blockNum <= toBlockNumber; blockNum++) {
for (long blockNum = blockRange.fromBlockNumber; blockNum <= blockRange.toBlockNumber; blockNum++) {
if (blocksBloomStore.firstNumberInRange(blockNum) == blockNum) {
auxiliaryBlocksBloom = new BlocksBloom();
}
Expand All @@ -88,11 +104,24 @@ public static void execute(long fromBlockNumber,
blocksBloomStore.addBlocksBloom(auxiliaryBlocksBloom);
}

long progress = 100 * (blockNum - fromBlockNumber + 1) / (toBlockNumber - fromBlockNumber + 1);
long progress = 100 * (blockNum - blockRange.fromBlockNumber + 1) / (blockRange.toBlockNumber - blockRange.fromBlockNumber + 1);
if (progress > curProgress) {
curProgress = progress;
logger.info("Processed {}% of blocks", progress);
}
}
}

/**
* Represents a block range in a form of [from..to].
*/
static class Range {
public final long fromBlockNumber;
public final long toBlockNumber;

Range(long fromBlockNumber, long toBlockNumber) {
this.fromBlockNumber = fromBlockNumber;
this.toBlockNumber = toBlockNumber;
}
}
}
61 changes: 59 additions & 2 deletions rskj-core/src/test/java/co/rsk/cli/tools/CliToolsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,63 @@ public void rewindBlocks() {
verify(stopper).stop(0);
}

@Test
public void makeBlockRange() {
BlockStore blockStore = mock(BlockStore.class);
doReturn(5L).when(blockStore).getMinNumber();
doReturn(10L).when(blockStore).getMaxNumber();

try {
IndexBlooms.makeBlockRange(new String[]{}, blockStore);
fail();
} catch (IllegalArgumentException ignored) { /* ignored */ }

try {
IndexBlooms.makeBlockRange(new String[]{ "0" }, blockStore);
fail();
} catch (IllegalArgumentException ignored) { /* ignored */ }

try {
IndexBlooms.makeBlockRange(new String[]{ "0", "abc" }, blockStore);
fail();
} catch (NumberFormatException ignored) { /* ignored */ }

try {
IndexBlooms.makeBlockRange(new String[]{ "-1", "1" }, blockStore);
fail();
} catch (IllegalArgumentException e) {
assertEquals("Invalid 'from' and/or 'to' block number", e.getMessage());
}

try {
IndexBlooms.makeBlockRange(new String[]{ "2", "1" }, blockStore);
fail();
} catch (IllegalArgumentException e) {
assertEquals("Invalid 'from' and/or 'to' block number", e.getMessage());
}

doReturn(2L).when(blockStore).getMinNumber();

try {
IndexBlooms.makeBlockRange(new String[]{ "1", "10" }, blockStore); // min block num is 10
fail();
} catch (IllegalArgumentException e) {
assertEquals("'from' block number is lesser than the min block number stored", e.getMessage());
}

try {
IndexBlooms.makeBlockRange(new String[]{ "5", "11" }, blockStore); // best block num is 10
fail();
} catch (IllegalArgumentException e) {
assertEquals("'to' block number is greater than the best block number", e.getMessage());
}

IndexBlooms.Range range = IndexBlooms.makeBlockRange(new String[]{"5", "10"}, blockStore);

assertEquals(5, range.fromBlockNumber);
assertEquals(10, range.toBlockNumber);
}

@Test
public void indexBlooms() {
Block block = mock(Block.class);
Expand All @@ -399,7 +456,7 @@ public void indexBlooms() {
return num - (num % 64) + 64 - 1;
}).when(blocksBloomStore).lastNumberInRange(anyLong());

IndexBlooms.execute(0, 63, blockStore, blocksBloomStore);
IndexBlooms.execute(new IndexBlooms.Range(0, 63), blockStore, blocksBloomStore);

verify(blocksBloomStore, times(1)).addBlocksBloom(captor.capture());
verify(blockStore, times(64)).getChainBlockByNumber(anyLong());
Expand All @@ -411,7 +468,7 @@ public void indexBlooms() {

clearInvocations(blocksBloomStore, blockStore);

IndexBlooms.execute(60, 300, blockStore, blocksBloomStore);
IndexBlooms.execute(new IndexBlooms.Range(60, 300), blockStore, blocksBloomStore);

// saved 3 block blooms in range [60..300]
verify(blocksBloomStore, times(3)).addBlocksBloom(captor.capture());
Expand Down

0 comments on commit f381f2c

Please # to comment.