{"record":{"id":"aafb8e191937a87b","repo":"quarkusio/quarkus","slug":"cannot-set-the-eviction-limit-when-using-exact-tri","errorCode":null,"errorMessage":"Cannot set the eviction limit when using exact trimming","messagePattern":"Cannot set the eviction limit when using exact trimming","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/redis-client/runtime/src/main/java/io/quarkus/redis/datasource/stream/XAddArgs.java","lineNumber":128,"sourceCode":"            } else {\n                args.add(\"=\");\n            }\n            args.add(Long.toString(maxlen));\n        }\n\n        if (minid != null) {\n            args.add(\"MINID\");\n            if (approximateTrimming) {\n                args.add(\"~\");\n            } else {\n                args.add(\"=\");\n            }\n            args.add(minid);\n        }\n\n        if (limit > 0) {\n            if (!approximateTrimming) {\n                throw new IllegalArgumentException(\"Cannot set the eviction limit when using exact trimming\");\n            }\n            args.add(\"LIMIT\");\n            args.add(Long.toString(limit));\n        }\n\n        args.add(Objects.requireNonNullElse(id, \"*\"));\n        return args;\n    }\n}\n","sourceCodeStart":110,"sourceCodeEnd":138,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/datasource/stream/XAddArgs.java#L110-L138","documentation":"The LIMIT option for XADD trimming limits how many entries the eviction may remove per trim, and Redis only permits it when trimming is approximate (with ~). If limit > 0 was set but approximateTrimming is false (exact trimming via =), XAddArgs.toArgs() throws IllegalArgumentException because the LIMIT argument would be invalid.","triggerScenarios":"Calling xAddArgs().maxlen(n).limit(m) without .approximateTrimming(true), or setting exact trimming while a limit remains from previous configuration.","commonSituations":"Copy-pasting example code that sets limit but forgetting approximateTrimming(); defaults that set limit but code path chooses exact trimming; misunderstanding that LIMIT implies '~'.","solutions":["Enable approximate trimming: add .approximateTrimming(true) when using .limit(m)","Or remove the .limit(m) call if exact (MAXLEN =) trimming is required","Reset the XAddArgs builder so a stale limit isn't combined with exact trimming"],"exampleFix":"// before\nXAddArgs args = new XAddArgs().maxlen(1000).limit(50);\n// after\nXAddArgs args = new XAddArgs().maxlen(1000).approximateTrimming(true).limit(50);","handlingStrategy":"validation","validationCode":"if (limit > 0 && !approximateTrimming) throw new IllegalArgumentException(\"LIMIT requires approximate (~) trimming\");","typeGuard":null,"tryCatchPattern":"try {\n    stream.xadd(key, args, entries);\n} catch (IllegalArgumentException e) {\n    // rebuild args with approximateTrimming(true) or drop limit\n}","preventionTips":["Always pair .limit(n) with .approximateTrimming(true)","Remember exact trimming (=) rejects LIMIT in Redis","If limit comes from config, also read the trimming-mode flag from the same config block"],"tags":["redis","streams","trimming","xadd","invalid-combination"],"backgroundTag":"invalid-option-combination","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}