mirror of
https://github.com/signalapp/Signal-Server
synced 2026-04-19 13:18:02 +01:00
Use long instead of int for rate limiter permits
This commit is contained in:
committed by
Jon Chambers
parent
77d04ccb70
commit
5f25b6a412
@@ -68,7 +68,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validate(final String key, final int amount) throws RateLimitExceededException {
|
||||
public void validate(final String key, final long amount) throws RateLimitExceededException {
|
||||
final RateLimiterConfig config = config();
|
||||
try {
|
||||
final long deficitPermitsAmount = executeValidateScript(config, key, amount, true);
|
||||
@@ -90,7 +90,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletionStage<Void> validateAsync(final String key, final int amount) {
|
||||
public CompletionStage<Void> validateAsync(final String key, final long amount) {
|
||||
final RateLimiterConfig config = config();
|
||||
|
||||
return executeValidateScriptAsync(config, key, amount, true)
|
||||
@@ -117,7 +117,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasAvailablePermits(final String key, final int permits) {
|
||||
public boolean hasAvailablePermits(final String key, final long permits) {
|
||||
final RateLimiterConfig config = config();
|
||||
try {
|
||||
final long deficitPermitsAmount = executeValidateScript(config, key, permits, false);
|
||||
@@ -132,7 +132,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletionStage<Boolean> hasAvailablePermitsAsync(final String key, final int amount) {
|
||||
public CompletionStage<Boolean> hasAvailablePermitsAsync(final String key, final long amount) {
|
||||
final RateLimiterConfig config = config();
|
||||
return executeValidateScriptAsync(config, key, amount, false)
|
||||
.thenApply(deficitPermitsAmount -> deficitPermitsAmount == 0)
|
||||
@@ -162,7 +162,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
|
||||
return configResolver.get();
|
||||
}
|
||||
|
||||
private long executeValidateScript(final RateLimiterConfig config, final String key, final int amount, final boolean applyChanges) {
|
||||
private long executeValidateScript(final RateLimiterConfig config, final String key, final long amount, final boolean applyChanges) {
|
||||
final List<String> keys = List.of(bucketName(name, key));
|
||||
final List<String> arguments = List.of(
|
||||
String.valueOf(config.bucketSize()),
|
||||
@@ -174,7 +174,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
|
||||
return (Long) validateScript.execute(keys, arguments);
|
||||
}
|
||||
|
||||
private CompletionStage<Long> executeValidateScriptAsync(final RateLimiterConfig config, final String key, final int amount, final boolean applyChanges) {
|
||||
private CompletionStage<Long> executeValidateScriptAsync(final RateLimiterConfig config, final String key, final long amount, final boolean applyChanges) {
|
||||
final List<String> keys = List.of(bucketName(name, key));
|
||||
final List<String> arguments = List.of(
|
||||
String.valueOf(config.bucketSize()),
|
||||
|
||||
@@ -13,13 +13,13 @@ import reactor.core.publisher.Mono;
|
||||
|
||||
public interface RateLimiter {
|
||||
|
||||
void validate(String key, int amount) throws RateLimitExceededException;
|
||||
void validate(String key, long amount) throws RateLimitExceededException;
|
||||
|
||||
CompletionStage<Void> validateAsync(String key, int amount);
|
||||
CompletionStage<Void> validateAsync(String key, long amount);
|
||||
|
||||
boolean hasAvailablePermits(String key, int permits);
|
||||
boolean hasAvailablePermits(String key, long permits);
|
||||
|
||||
CompletionStage<Boolean> hasAvailablePermitsAsync(String key, int amount);
|
||||
CompletionStage<Boolean> hasAvailablePermitsAsync(String key, long amount);
|
||||
|
||||
void clear(String key);
|
||||
|
||||
@@ -35,7 +35,7 @@ public interface RateLimiter {
|
||||
validate(accountUuid.toString());
|
||||
}
|
||||
|
||||
default void validate(final UUID accountUuid, final int permits) throws RateLimitExceededException {
|
||||
default void validate(final UUID accountUuid, final long permits) throws RateLimitExceededException {
|
||||
validate(accountUuid.toString(), permits);
|
||||
}
|
||||
|
||||
@@ -63,11 +63,11 @@ public interface RateLimiter {
|
||||
return validateReactive(accountUuid.toString());
|
||||
}
|
||||
|
||||
default boolean hasAvailablePermits(final UUID accountUuid, final int permits) {
|
||||
default boolean hasAvailablePermits(final UUID accountUuid, final long permits) {
|
||||
return hasAvailablePermits(accountUuid.toString(), permits);
|
||||
}
|
||||
|
||||
default CompletionStage<Boolean> hasAvailablePermitsAsync(final UUID accountUuid, final int permits) {
|
||||
default CompletionStage<Boolean> hasAvailablePermitsAsync(final UUID accountUuid, final long permits) {
|
||||
return hasAvailablePermitsAsync(accountUuid.toString(), permits);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.AssertTrue;
|
||||
import java.time.Duration;
|
||||
|
||||
public record RateLimiterConfig(int bucketSize, Duration permitRegenerationDuration, boolean failOpen) {
|
||||
public record RateLimiterConfig(long bucketSize, Duration permitRegenerationDuration, boolean failOpen) {
|
||||
|
||||
public double leakRatePerMillis() {
|
||||
return 1.0 / (permitRegenerationDuration.toNanos() / 1e6);
|
||||
|
||||
Reference in New Issue
Block a user