{"record":{"id":"2d937b4f989e8648","repo":"MyCATApache/Mycat-Server","slug":"a-batchsize-of-batchsize-with-batchstatsat-of","errorCode":null,"errorMessage":"A batchSize of: ${batchSize} with batchStatsAt of: ${batchStartsAt} will overrun the available number of arguments: ${available}","messagePattern":"A batchSize of: (.+?) with batchStatsAt of: (.+?) will overrun the available number of arguments: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/io/mycat/memory/unsafe/ringbuffer/RingBuffer.java","lineNumber":270,"sourceCode":"    @Override\n    public boolean tryPublishEvent(EventTranslatorVararg<E> translator, Object... args) {\n        try {\n            final long sequence = sequencer.tryNext();\n            translateAndPublish(translator, sequence, args);\n            return true;\n        } catch (InsufficientCapacityException e) {\n            return false;\n        }\n    }\n\n    private void checkBounds(final EventTranslator<E>[] translators, final int batchStartsAt, final int batchSize) {\n        checkBatchSizing(batchStartsAt, batchSize);\n        batchOverRuns(translators, batchStartsAt, batchSize);\n    }\n\n    private <A> void batchOverRuns(final A[] arg0, final int batchStartsAt, final int batchSize) {\n        if (batchStartsAt + batchSize > arg0.length) {\n            throw new IllegalArgumentException(\n                    \"A batchSize of: \" + batchSize +\n                            \" with batchStatsAt of: \" + batchStartsAt +\n                            \" will overrun the available number of arguments: \" + (arg0.length - batchStartsAt));\n        }\n    }\n\n    private void checkBatchSizing(int batchStartsAt, int batchSize) {\n        if (batchStartsAt < 0 || batchSize < 0) {\n            throw new IllegalArgumentException(\"Both batchStartsAt and batchSize must be positive but got: batchStartsAt \" + batchStartsAt + \" and batchSize \" + batchSize);\n        } else if (batchSize > bufferSize) {\n            throw new IllegalArgumentException(\"The ring buffer cannot accommodate \" + batchSize + \" it only has space for \" + bufferSize + \" entities.\");\n        }\n    }\n\n    /**\n     * @see io.mycat.memory.unsafe.ringbuffer.common.event.EventSink#publishEvent(EventTranslator)\n     */\n    @Override","sourceCodeStart":252,"sourceCodeEnd":288,"githubUrl":"https://github.com/MyCATApache/Mycat-Server/blob/65f8d8beb752f935752f2a0eec0ab017facab9ef/src/main/java/io/mycat/memory/unsafe/ringbuffer/RingBuffer.java#L252-L288","documentation":"batchOverRuns verifies that a batch publish request does not ask for more translator arguments than the supplied argument array actually holds. When batchStartsAt + batchSize exceeds arg0.length, the call would read past the end of the array, so IllegalArgumentException is thrown with the remaining argument count in the message.","triggerScenarios":"Calling RingBuffer batch publish APIs (e.g. publishEvents(translators, batchStartsAt, batchSize)) where batchStartsAt + batchSize > translators.length, e.g. 10 translators with batchStartsAt=5, batchSize=8.","commonSituations":"Off-by-one errors when slicing an array of event translators, computing batchSize from a list size but a different offset, or reusing a batch size constant after changing array contents.","solutions":["Clamp batchSize to translators.length - batchStartsAt before the call.","Verify batchStartsAt is the intended offset and that the array contains all expected elements.","Pass the full array with batchStartsAt=0 and batchSize=translators.length when publishing everything.","Add an assertion/unit test covering the offset+size arithmetic."],"exampleFix":"// before\nring.publishEvents(translators, 5, 8); // overrun\n// after\nint start = 5;\nint size = Math.min(8, translators.length - start);\nring.publishEvents(translators, start, size);","handlingStrategy":"validation","validationCode":"public static void checkBatch(Object[] args, int batchStartsAt, int batchSize) {\n    if (batchStartsAt < 0 || batchSize < 0 || batchStartsAt + batchSize > args.length)\n        throw new IllegalArgumentException(\"batch out of bounds: start=\" + batchStartsAt + \" size=\" + batchSize + \" len=\" + args.length);\n}","typeGuard":null,"tryCatchPattern":"try {\n    ring.publishEvents(translators, start, size);\n} catch (IllegalArgumentException e) {\n    logger.warn(\"batch overrun, clamping\", e);\n    ring.publishEvents(translators, start, translators.length - start);\n}","preventionTips":["Clamp batchSize to array.length - batchStartsAt before every call","Unit-test offset/size arithmetic for boundary conditions","Prefer the whole-array publishEvents(translators) overload when no slicing is needed"],"tags":["java","ringbuffer","batch","bounds-check"],"backgroundTag":"argument-out-of-range","analyzedSha":"65f8d8beb752f935752f2a0eec0ab017facab9ef","analyzedAt":"2026-09-11T00:12:21.696Z","contentChangedAt":"2026-09-11T00:12:21.696Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}