{"record":{"id":"926d173ea01c9f08","repo":"quarkusio/quarkus","slug":"cannot-set-the-eviction-limit-when-using-exact-tri-926d17","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/XTrimArgs.java","lineNumber":95,"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        return args;\n    }\n}\n","sourceCodeStart":77,"sourceCodeEnd":104,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/datasource/stream/XTrimArgs.java#L77-L104","documentation":"The LIMIT option caps how many entries Redis may evict in one XTRIM call and is only valid with approximate trimming (~). When exact trimming (=, the default) is used, LIMIT has no meaning, so XTrimArgs.toArgs() throws this IllegalArgumentException when limit(long) is set but nearlyExactTrimming() was not called.","triggerScenarios":"Chaining limit(N) without nearlyExactTrimming(), e.g. new XTrimArgs().maxlen(1000).limit(50) or new XTrimArgs().minid(\"1234-0\").limit(50), then invoking xtrim(key, args).","commonSituations":"Developers wanting to bound the work per trim add limit(...) but forget the default is exact trimming; copying args-building code where approximate trimming was configured elsewhere; confusion with Redis docs that show LIMIT only alongside ~.","solutions":["Call nearlyExactTrimming() (approximate trimming) when using limit(...), e.g. new XTrimArgs().maxlen(1000).nearlyExactTrimming().limit(50)","Remove the limit(...) call if exact trimming is intentionally used","Only use limit() when slight over-retention is acceptable and trimming cost must be bounded"],"exampleFix":"// before\nXTrimArgs args = new XTrimArgs().maxlen(1000).limit(50);\n// after\nXTrimArgs args = new XTrimArgs().maxlen(1000).nearlyExactTrimming().limit(50);","handlingStrategy":"validation","validationCode":"if (!approximateTrimming && limit > 0) {\n    throw new IllegalArgumentException(\"LIMIT requires approximate trimming: call nearlyExactTrimming() when using limit()\");\n}","typeGuard":"boolean supportsLimit(XTrimArgs a) {\n    return a != null;\n}","tryCatchPattern":"try {\n    streamCommands.xtrim(key, args);\n} catch (IllegalArgumentException e) {\n    log.error(\"Invalid XTRIM args: \" + e.getMessage());\n}","preventionTips":["Always pair limit(...) with nearlyExactTrimming()","Remember the default is exact trimming (=); only approximate trimming (~) accepts LIMIT","If exact trimming is desired, simply omit limit(...)"],"tags":["redis","streams","xtrim","invalid-arguments"],"backgroundTag":"mutually-exclusive-options","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"}