diff --git a/bucket4j-core/src/main/java/io/github/bucket4j/distributed/remote/commands/VerboseCommand.java b/bucket4j-core/src/main/java/io/github/bucket4j/distributed/remote/commands/VerboseCommand.java index 8d560a0c..6d844192 100644 --- a/bucket4j-core/src/main/java/io/github/bucket4j/distributed/remote/commands/VerboseCommand.java +++ b/bucket4j-core/src/main/java/io/github/bucket4j/distributed/remote/commands/VerboseCommand.java @@ -52,8 +52,13 @@ public CommandResult> execute(MutableBucketEntry mutableE } RemoteBucketState state = mutableEntry.get(); - CommandResult result = targetCommand.execute(mutableEntry, currentTimeNanos); - RemoteVerboseResult verboseResult = new RemoteVerboseResult<>(currentTimeNanos, result.getResultTypeId(), result.getData(), state); + BucketEntryWrapper entryWrapper = new BucketEntryWrapper(state); + CommandResult result = targetCommand.execute(entryWrapper, currentTimeNanos); + if (entryWrapper.isStateModified()) { + mutableEntry.set(entryWrapper.get()); + } + + RemoteVerboseResult verboseResult = new RemoteVerboseResult<>(currentTimeNanos, result.getResultTypeId(), result.getData(), entryWrapper.get()); return CommandResult.success(verboseResult, RemoteVerboseResult.SERIALIZATION_HANDLE); } diff --git a/bucket4j-core/src/test/java/io/github/bucket4j/tck/AbstractDistributedBucketTest.java b/bucket4j-core/src/test/java/io/github/bucket4j/tck/AbstractDistributedBucketTest.java index 1a2145e3..548d0f7a 100644 --- a/bucket4j-core/src/test/java/io/github/bucket4j/tck/AbstractDistributedBucketTest.java +++ b/bucket4j-core/src/test/java/io/github/bucket4j/tck/AbstractDistributedBucketTest.java @@ -10,6 +10,7 @@ import org.junit.Test; import java.time.Duration; +import java.util.Arrays; import java.util.Optional; import java.util.concurrent.*; import java.util.function.Function; @@ -293,4 +294,29 @@ public void testBucketWithNotLazyConfiguration() { assertFalse(bucket.tryConsume(1)); } + // https://github.com/bucket4j/bucket4j/issues/279 + @Test + public void testVerboseBucket() { + int MIN_CAPACITY = 4; + int MAX_CAPACITY = 10; + BucketConfiguration configuration = BucketConfiguration.builder() + .addLimit(Bandwidth.classic(MIN_CAPACITY, Refill.intervally(4, Duration.ofMinutes(20)))) + .addLimit(Bandwidth.classic(MAX_CAPACITY, Refill.intervally(10, Duration.ofMinutes(60)))) + .build(); + + K key = generateRandomKey(); + Bucket bucket = proxyManager.builder().build(key, configuration); + + for (int i = 1; i <= 4; i++) { + VerboseResult verboseResult = bucket.asVerbose().tryConsumeAndReturnRemaining(1); + ConsumptionProbe probe = verboseResult.getValue(); + long[] availableTokensPerEachBandwidth = verboseResult.getDiagnostics().getAvailableTokensPerEachBandwidth(); + System.out.println("Remaining tokens = " + probe.getRemainingTokens()); + System.out.println("Tokens per bandwidth = " + Arrays.toString(availableTokensPerEachBandwidth)); + assertEquals(MIN_CAPACITY - i, probe.getRemainingTokens()); + assertEquals(MIN_CAPACITY - i, availableTokensPerEachBandwidth[0]); + assertEquals(MAX_CAPACITY - i, availableTokensPerEachBandwidth[1]); + } + } + }