{"record":{"id":"63917a321b803a30","repo":"theonedev/onedev","slug":"0-flags-already-created","errorCode":null,"errorMessage":"{0} flags already created","messagePattern":"(.+?) flags already created","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"server-core/src/main/java/org/eclipse/jgit/revwalk/RevWalk.java","lineNumber":1427,"sourceCode":"\t * <p>\n\t * Applications are only assured to be able to create 24 unique flags on any\n\t * given revision walker instance. Any flags beyond 24 are offered only if\n\t * the implementation has extra free space within its internal storage.\n\t *\n\t * @param name\n\t *            description of the flag, primarily useful for debugging.\n\t * @return newly constructed flag instance.\n\t * @throws java.lang.IllegalArgumentException\n\t *             too many flags have been reserved on this revision walker.\n\t */\n\tpublic RevFlag newFlag(String name) {\n\t\tfinal int m = allocFlag();\n\t\treturn new RevFlag(this, name, m);\n\t}\n\n\tint allocFlag() {\n\t\tif (freeFlags == 0)\n\t\t\tthrow new IllegalArgumentException(\n\t\t\t\t\tMessageFormat.format(JGitText.get().flagsAlreadyCreated,\n\t\t\t\t\t\t\tInteger.valueOf(32 - RESERVED_FLAGS)));\n\t\tfinal int m = Integer.lowestOneBit(freeFlags);\n\t\tfreeFlags &= ~m;\n\t\treturn m;\n\t}\n\n\t/**\n\t * Automatically carry a flag from a child commit to its parents.\n\t * <p>\n\t * A carried flag is copied from the child commit onto its parents when the\n\t * child commit is popped from the lowest level of walk's internal graph.\n\t *\n\t * @param flag\n\t *            the flag to carry onto parents, if set on a descendant.\n\t */\n\tpublic void carry(RevFlag flag) {\n\t\tif ((freeFlags & flag.mask) != 0)","sourceCodeStart":1409,"sourceCodeEnd":1445,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/org/eclipse/jgit/revwalk/RevWalk.java#L1409-L1445","documentation":"A RevWalk can create at most 32 RevFlags (one bit per flag, minus reserved bits); allocFlag() throws this IllegalArgumentException once no free bits remain. It is thrown when RevWalk.newFlag(name) is called after all flag bits have been handed out.","triggerScenarios":"Calling revWalk.newFlag(...) more than 32-minus-reserved times on the same RevWalk instance; creating flags inside a loop that runs per item instead of once per walk; leaking flags by never disposing them (revWalk.disposeFlag) in long-lived walks.","commonSituations":"Long-running server walks reused across many requests that accumulate new flags; plugin/framework code generating flags per user request from a shared walk.","solutions":["Reuse a fixed small set of flags instead of creating one per item or per request.","Call revWalk.disposeFlag(flag) when a flag is no longer needed to return its bit.","Create a fresh RevWalk per traversal instead of reusing one indefinitely.","Refactor to encode per-item state elsewhere (e.g. a map keyed by commit) rather than flags."],"exampleFix":"// before\nfor (String name : names) flags.add(walk.newFlag(name)); // >32 names -> throws\n// after\nMap<String, RevFlag> flags = new HashMap<>();\nfor (String name : names) {\n    if (flags.size() >= 20) throw new IllegalStateException(\"too many flags\");\n    flags.put(name, walk.newFlag(name));\n}","handlingStrategy":"validation","validationCode":"if (flagCount >= 20) throw new IllegalStateException(\"RevWalk flag budget exhausted\");\nRevFlag f = walk.newFlag(name);","typeGuard":"// track budget in a small wrapper\nclass FlagPool { int used = 0; RevFlag create(RevWalk w, String n) { if (used >= 20) throw new IllegalStateException(); used++; return w.newFlag(n); } }","tryCatchPattern":"try {\n    flag = walk.newFlag(name);\n} catch (IllegalArgumentException e) {\n    throw new IllegalStateException(\"Too many RevFlags created (max 32)\", e);\n}","preventionTips":["Define a fixed set of flags at walk construction","Dispose flags with disposeFlag when done","Never create flags inside per-item loops","Use one RevWalk per traversal, not a long-lived shared one"],"tags":["git","resource-limit","revflag"],"backgroundTag":"value-out-of-range","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}