Remove default rate limits
For both uploadpack and restapi rate limits remove defaults, so that
no configuration consistently means no imposed limits.
Change-Id: Iac8ca09950a11330f748592225578e2048246769
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/AccountLimitsConfig.java b/src/main/java/com/googlesource/gerrit/plugins/quota/AccountLimitsConfig.java
index 591d1bb..81dbcd8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/AccountLimitsConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/AccountLimitsConfig.java
@@ -35,8 +35,6 @@
import org.slf4j.LoggerFactory;
public class AccountLimitsConfig {
- private static final int DEFAULT_BURST_COUNT = 30;
- private static final int DEFAULT_INTERVAL_SECONDS = 60;
private static final Pattern PATTERN =
Pattern.compile("^\\s*(\\d+)\\s*/\\s*(.*)\\s*burst\\s*(\\d+)$");
private static final Logger log = LoggerFactory.getLogger(AccountLimitsConfig.class);
@@ -97,45 +95,44 @@
}
rateLimits = ArrayTable.create(Arrays.asList(Type.values()), groups);
for (String groupName : groups) {
- rateLimits.put(UPLOADPACK, groupName, parseRateLimit(c, groupName, UPLOADPACK));
- rateLimits.put(RESTAPI, groupName, parseRateLimit(c, groupName, RESTAPI));
+ parseRateLimit(c, groupName, UPLOADPACK);
+ parseRateLimit(c, groupName, RESTAPI);
}
}
- RateLimit parseRateLimit(Config c, String groupName, Type type) {
+ void parseRateLimit(Config c, String groupName, Type type) {
String name = type.toConfigValue();
String value = c.getString(GROUP_SECTION, groupName, name);
if (value == null) {
- return defaultRateLimit(type);
+ return;
}
value = value.trim();
Matcher m = PATTERN.matcher(value);
if (!m.matches()) {
- log.warn(
- "Invalid ''{}'' ratelimit configuration ''{}'', use default ratelimit {}/hour",
+ log.error(
+ "Invalid ''{}'' ratelimit configuration ''{}''; ignoring the configuration entry",
name,
- value,
- 3600.0D / DEFAULT_INTERVAL_SECONDS);
- return defaultRateLimit(type);
+ value);
+ return;
}
String digits = m.group(1);
String unitName = m.group(2).trim();
String storeCountString = m.group(3).trim();
- long burstCount = DEFAULT_BURST_COUNT;
+ long burstCount;
try {
burstCount = Long.parseLong(storeCountString);
} catch (NumberFormatException e) {
- log.warn(
- "Invalid ''{}'' ratelimit store configuration ''{}'', use default burst count ''{}''",
+ log.error(
+ "Invalid ''{}'' ratelimit store configuration ''{}''; ignoring the configuration entry",
name,
- storeCountString,
- burstCount);
+ storeCountString);
+ return;
}
TimeUnit inputUnit = TimeUnit.HOURS;
- double ratePerSecond = 1.0D / DEFAULT_INTERVAL_SECONDS;
+ double ratePerSecond;
if (match(unitName, "s", "sec", "second")) {
inputUnit = TimeUnit.SECONDS;
} else if (match(unitName, "m", "min", "minute")) {
@@ -146,15 +143,17 @@
inputUnit = TimeUnit.DAYS;
} else {
logNotRateUnit(GROUP_SECTION, groupName, name, value);
+ return;
}
try {
ratePerSecond = 1.0D * Long.parseLong(digits) / TimeUnit.SECONDS.convert(1, inputUnit);
} catch (NumberFormatException nfe) {
logNotRateUnit(GROUP_SECTION, groupName, unitName, value);
+ return;
}
int maxBurstSeconds = (int) (burstCount / ratePerSecond);
- return new RateLimit(type, ratePerSecond, maxBurstSeconds);
+ rateLimits.put(type, groupName, new RateLimit(type, ratePerSecond, maxBurstSeconds));
}
private static boolean match(final String a, final String... cases) {
@@ -170,18 +169,16 @@
if (subsection != null) {
log.error(
MessageFormat.format(
- "Invalid rate unit value: {0}.{1}.{2}={3}", section, subsection, name, valueString));
+ "Invalid rate unit value: {0}.{1}.{2}={3}; ignoring the configuration entry",
+ section, subsection, name, valueString));
} else {
log.error(
- MessageFormat.format("Invalid rate unit value: {0}.{1}={2}", section, name, valueString));
+ MessageFormat.format(
+ "Invalid rate unit value: {0}.{1}={2}; ignoring the configuration entry",
+ section, name, valueString));
}
}
- private RateLimit defaultRateLimit(Type type) {
- return new RateLimit(
- type, 1.0D / DEFAULT_INTERVAL_SECONDS, DEFAULT_INTERVAL_SECONDS * DEFAULT_BURST_COUNT);
- }
-
/**
* @param type type of rate limit
* @return map of rate limits per group name
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/RateMsgHelper.java b/src/main/java/com/googlesource/gerrit/plugins/quota/RateMsgHelper.java
index a09ecfa..9640d06 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/RateMsgHelper.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/RateMsgHelper.java
@@ -26,7 +26,6 @@
private static final String UPLOADPACK_INLINE_NAME = "fetch";
private static final String RESTAPI_INLINE_NAME = "REST API";
- // compare AccountLimitsConfig's constructor for default rate limits
private static String getDefaultTemplateMsg(String rateLimitTypeName) {
return "Exceeded rate limit of "
+ RATE_LIMIT_TOKEN
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 9a27a46..c8eaaea 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -199,7 +199,6 @@
`/m`, `/min`, `/minute`: requests per minute<br />
`/h`, `/hr`, `/hour`: requests per hour<br />
`/d`, `/day`: requests per day<br />
-The default unit used if no unit is configured is `/hour`.
<a id="burst" />
`group.<groupName>.<storedRequests>`
@@ -211,13 +210,7 @@
as if idle time would already have been accumulated.
If a rate limit configuration value is invalid or missing for a group,
-default values are assumed.
-
-For `uploadpack`, a default rate limit of 1
-request per minute with 30 stored requests is assumed.
-
-For `restapi`, the default rate limit is 20 requests per minute
-and at most 90 stored requests.
+the configuration entry gets ignored, and a warning is being logged.
Example: