{"record":{"id":"fc432a80a83fbb19","repo":"MyCATApache/Mycat-Server","slug":"buffersize-must-not-be-less-than-1-fc432a","errorCode":null,"errorMessage":"bufferSize must not be less than 1","messagePattern":"bufferSize must not be less than 1","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/io/mycat/memory/unsafe/ringbuffer/producer/AbstractSequencer.java","lineNumber":31,"sourceCode":" * @author lmax.Disruptor\n * @version 3.3.5\n * @date 2016/7/24\n */\npublic abstract class AbstractSequencer implements Sequencer {\n\n    private static final AtomicReferenceFieldUpdater<AbstractSequencer, Sequence[]> SEQUENCE_UPDATER =\n            AtomicReferenceFieldUpdater.newUpdater(AbstractSequencer.class, Sequence[].class, \"gatingSequences\");\n\n    protected final int bufferSize;\n    protected final WaitStrategy waitStrategy;\n    protected final Sequence cursor = new Sequence(Sequencer.INITIAL_CURSOR_VALUE);\n    protected volatile Sequence[] gatingSequences = new Sequence[0];\n\n    public AbstractSequencer(int bufferSize, WaitStrategy waitStrategy)\n    {\n        if (bufferSize < 1)\n        {\n            throw new IllegalArgumentException(\"bufferSize must not be less than 1\");\n        }\n        if (Integer.bitCount(bufferSize) != 1)\n        {\n            throw new IllegalArgumentException(\"bufferSize must be a power of 2\");\n        }\n\n        this.bufferSize = bufferSize;\n        this.waitStrategy = waitStrategy;\n    }\n\n    @Override\n    public final long getCursor()\n    {\n        return cursor.get();\n    }\n\n\n    @Override","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/MyCATApache/Mycat-Server/blob/65f8d8beb752f935752f2a0eec0ab017facab9ef/src/main/java/io/mycat/memory/unsafe/ringbuffer/producer/AbstractSequencer.java#L13-L49","documentation":"AbstractSequencer's constructor validates the ring buffer size before initializing the sequencer. It throws IllegalArgumentException when bufferSize is less than 1, because a ring buffer must hold at least one entry. This is an eager fail-fast guard so misconfiguration is caught at construction time rather than at first publish.","triggerScenarios":"Calling new RingBufferFields / MultiProducerSequencer / SingleProducerSequencer (or any subclass constructor) with bufferSize < 1, typically via a RingBuffer.create(...) factory with a size computed to 0 or a negative value.","commonSituations":"Sizing the buffer from a config value that is unset (0) or computed as records-per-batch minus one; typos passing an index instead of a size; reading buffer size from properties where the key is missing and the default is 0.","solutions":["Pass a bufferSize >= 1 when constructing the sequencer or RingBuffer.create* factory","If the size comes from config, default it to a sane positive value (e.g. 1024) before constructing","Clamp/validate user-supplied size with Math.max(1, size) before constructing"],"exampleFix":"// before\nint size = config.getBufferSize(); // 0 when unset\nRingBuffer<ByteBuffer> rb = RingBuffer.createMultiProducer(()->ByteBuffer.allocate(64), size);\n// after\nint size = Math.max(1, config.getBufferSize(\"ring.buffer.size\", 1024));\nRingBuffer<ByteBuffer> rb = RingBuffer.createMultiProducer(()->ByteBuffer.allocate(64), size);","handlingStrategy":"validation","validationCode":"if (bufferSize < 1) throw new IllegalArgumentException(\"bufferSize must be >= 1, got \" + bufferSize);\nRingBuffer<T> rb = RingBuffer.createMultiProducer(factory, bufferSize);","typeGuard":"boolean isValidBufferSize(int n) { return n >= 1; }","tryCatchPattern":null,"preventionTips":["Never pass raw config values; default to a positive size","Compute sizes only from validated inputs","Add an assertion/log at startup logging the chosen buffer size"],"tags":["java","ringbuffer","argument-validation"],"backgroundTag":"invalid-argument-value","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"}