{"record":{"id":"c84d05be077f32c7","repo":"App-vNext/Polly","slug":"maxburst-must-be-an-integer-greater-than-or-equal-c84d05","errorCode":null,"errorMessage":"maxBurst must be an integer greater than or equal to 1.","messagePattern":"maxBurst must be an integer greater than or equal to 1\\.","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"src/Polly/RateLimit/RateLimitTResultSyntax.cs","lineNumber":78,"sourceCode":"    public static RateLimitPolicy<TResult> RateLimit<TResult>(\n        int numberOfExecutions,\n        TimeSpan perTimeSpan,\n        int maxBurst,\n        Func<TimeSpan, Context, TResult>? retryAfterFactory)\n    {\n        if (numberOfExecutions < 1)\n        {\n            throw new ArgumentOutOfRangeException(nameof(numberOfExecutions), numberOfExecutions, $\"{nameof(numberOfExecutions)} per timespan must be an integer greater than or equal to 1.\");\n        }\n\n        if (perTimeSpan <= TimeSpan.Zero)\n        {\n            throw new ArgumentOutOfRangeException(nameof(perTimeSpan), perTimeSpan, $\"{nameof(perTimeSpan)} must be a positive timespan.\");\n        }\n\n        if (maxBurst < 1)\n        {\n            throw new ArgumentOutOfRangeException(nameof(maxBurst), maxBurst, $\"{nameof(maxBurst)} must be an integer greater than or equal to 1.\");\n        }\n\n        var onePer = TimeSpan.FromTicks(perTimeSpan.Ticks / numberOfExecutions);\n\n        if (onePer <= TimeSpan.Zero)\n        {\n            throw new ArgumentOutOfRangeException(nameof(perTimeSpan), perTimeSpan, \"The number of executions per timespan must be positive.\");\n        }\n\n        IRateLimiter rateLimiter = new LockFreeTokenBucketRateLimiter(onePer, maxBurst);\n\n        return new RateLimitPolicy<TResult>(rateLimiter, retryAfterFactory);\n    }\n}\n","sourceCodeStart":60,"sourceCodeEnd":93,"githubUrl":"https://github.com/App-vNext/Polly/blob/d0e46bdb1ee11ea50d0e4b6846d2633d6bc09bac/src/Polly/RateLimit/RateLimitTResultSyntax.cs#L60-L93","documentation":"Thrown by RateLimitTResultSyntax.RateLimit<TResult> when maxBurst is less than 1. The generic overload's token-bucket capacity must be at least one, otherwise no execution could ever be permitted.","triggerScenarios":"Calling Policy.RateLimit<TResult>(n, perTimeSpan, maxBurst: 0) or a negative maxBurst on the generic sync overload.","commonSituations":"maxBurst defaulted to 0 from config; burst value omitted in a per-result-type policy.","solutions":["Set maxBurst to at least 1.","Default maxBurst to numberOfExecutions when not specified.","Validate burst config before building."],"exampleFix":"// before\nvar policy = Policy.RateLimit<MyResult>(5, TimeSpan.FromSeconds(10), 0, factory);\n// after\nvar policy = Policy.RateLimit<MyResult>(5, TimeSpan.FromSeconds(10), 5, factory);","handlingStrategy":"validation","validationCode":"var maxBurst = config.GetValue(\"RateLimit:MaxBurst\", numberOfExecutions);\nif (maxBurst < 1) maxBurst = numberOfExecutions;\nvar policy = Policy.RateLimit<TResult>(numberOfExecutions, perTimeSpan, maxBurst, retryAfterFactory);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Default maxBurst to numberOfExecutions when unset.","Validate burst config at startup.","Treat missing burst as an explicit error, not zero."],"tags":["rate-limit","argumentoutofrange","generic","token-bucket"],"backgroundTag":null,"analyzedSha":"d0e46bdb1ee11ea50d0e4b6846d2633d6bc09bac","analyzedAt":"2026-08-13T16:36:01.959Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}