{"record":{"id":"e137833212fa02f4","repo":"elastic/elasticsearch","slug":"maxconcurrentsearchrequests-must-be-positive","errorCode":null,"errorMessage":"maxConcurrentSearchRequests must be positive","messagePattern":"maxConcurrentSearchRequests must be positive","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MultiSearchTemplateRequest.java","lineNumber":87,"sourceCode":"     */\n    public MultiSearchTemplateRequest add(SearchTemplateRequest request) {\n        requests.add(request);\n        return this;\n    }\n\n    /**\n     * Returns the amount of search requests specified in this multi search requests are allowed to be ran concurrently.\n     */\n    public int maxConcurrentSearchRequests() {\n        return maxConcurrentSearchRequests;\n    }\n\n    /**\n     * Sets how many search requests specified in this multi search requests are allowed to be ran concurrently.\n     */\n    public MultiSearchTemplateRequest maxConcurrentSearchRequests(int maxConcurrentSearchRequests) {\n        if (maxConcurrentSearchRequests < 1) {\n            throw new IllegalArgumentException(\"maxConcurrentSearchRequests must be positive\");\n        }\n\n        this.maxConcurrentSearchRequests = maxConcurrentSearchRequests;\n        return this;\n    }\n\n    public List<SearchTemplateRequest> requests() {\n        return this.requests;\n    }\n\n    @Override\n    public ActionRequestValidationException validate() {\n        ActionRequestValidationException validationException = null;\n        if (requests.isEmpty()) {\n            validationException = addValidationError(\"no requests added\", validationException);\n        }\n        for (SearchTemplateRequest request : requests) {\n            ActionRequestValidationException ex = request.validate();","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MultiSearchTemplateRequest.java#L69-L105","documentation":"Thrown by MultiSearchTemplateRequest.maxConcurrentSearchRequests(int) when the provided value is less than 1. This setter validates that the concurrency level is a positive integer because zero or negative concurrency would mean no search requests can execute. The value is typically set from the 'max_concurrent_searches' URL parameter in _msearch/template.","triggerScenarios":"Sending a _msearch/template request with ?max_concurrent_searches=0 or a negative value. Also triggered by programmatically calling multiSearchTemplateRequest.maxConcurrentSearchRequests(0) or maxConcurrentSearchRequests(-1). The parseRequest method in RestMultiSearchTemplateAction reads the parameter via restRequest.paramAsInt(\"max_concurrent_searches\", 0) and passes it to this setter.","commonSituations":"Passing max_concurrent_searches=0 expecting it to mean 'unlimited' or 'default'. Using a default value of 0 in client code without checking. Misunderstanding that the value must be >= 1. Configuring via a UI or config file that allows zero.","solutions":["Set max_concurrent_searches to a positive integer (1 or greater): ?max_concurrent_searches=5","If you want Elasticsearch to decide concurrency, omit the parameter entirely rather than setting it to 0","In client code, validate the value before passing: if (value < 1) skip the setter call","Use a reasonable default based on your cluster size, e.g., 5 or 10 for moderate workloads"],"exampleFix":"// before — zero concurrency:\nPOST /_msearch/template?max_concurrent_searches=0\n\n// after — positive value or omit entirely:\nPOST /_msearch/template?max_concurrent_searches=5","handlingStrategy":"validation","validationCode":"// Validate max_concurrent_searches before building the request\nint maxConcurrent = clientConfig.getMaxConcurrentSearches();\nif (maxConcurrent < 1) {\n    // omit the parameter or use a sensible default\n    maxConcurrent = 5; // or skip setting it\n}\nrequest.maxConcurrentSearchRequests(maxConcurrent);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass a positive integer for max_concurrent_searches","Omit the parameter if you want Elasticsearch to use its default","Never use 0 to mean 'unlimited' — it means 'invalid'"],"tags":["elasticsearch","lang-mustache","msearch-template","concurrency","validation"],"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T12:17:08.281Z"}