[Bug] BitsArray rejects partial-byte clones but accepts bit lengths beyond backing capacity
Maintainers usually reply within 1 day
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 25/100
Research direction
The report identifies the BitsArray byte-array constructor and gives reproductions for cloning a 9-bit array and accepting a bit length beyond backing capacity. Start by locating BitsArray and its constructor, then inspect the existing tests for create(int) and byte-array construction. Done means valid partial-byte arrays clone with their logical length and independent storage, while lengths beyond capacity are rejected; linked pull request #11459 is already open.
Written by the indexing model from the issue text.
Description
Before Creating the Bug Report
-
I found a bug, not just asking a question, which should be created in GitHub Discussions.
-
I have searched the GitHub Issues and GitHub Discussions of this repository and believe that this is not a duplicate.
-
I have confirmed that this bug belongs to the current repository, not other repositories of RocketMQ.
Runtime platform environment
Windows 11, local utility reproducer and native Maven filter-module tests. No broker deployment or message-loss claim.
RocketMQ version
develop, revision 5.5.1, commit 57c2dc04f78cc7e73e6b8c9436ee0fff0d0f46c3. The current develop source still has the same constructor.
JDK Version
OpenJDK 1.8.0_302 (GraalVM CE 21.2.0); also reproduced with Java 21 using Java 8-targeted utility/test classes. Native Maven validation used Java 8 and Maven 3.6.3.
Describe the Bug
The byte-array constructor rejects bitLength < bytes.length * 8 instead of rejecting a logical length larger than the backing capacity. As a result, any positive non-byte-aligned array created by create(int) fails to clone, while an impossible byte-array capacity is accepted. The null/empty/non-positive checks and defensive copy are otherwise present.
Steps to Reproduce
BitsArray.create(9).clone();
// IllegalArgumentException: BitLength is less than bytes.length() * 8
BitsArray.create(new byte[] {1, 0}, 9);
// Same exception despite sufficient capacity.
BitsArray.create(new byte[] {1}, 9).getBit(8);
// Constructor accepts it; subsequent access is out of bounds.
What Did You Expect to See?
Cloning a valid 9-bit array preserves its logical length, contents and independent backing storage. A byte-array constructor accepts a logical bit length within storage capacity and rejects lengths beyond that capacity.
What Did You See Instead?
Valid partial-byte reconstruction and clone throw IllegalArgumentException. A one-byte backing array can be declared as nine bits, allowing a later ArrayIndexOutOfBoundsException.
Additional Context
Duplicate checks: #10506 (merged) and #8664 (closed) fix position bounds, not this constructor capacity comparison. No matching open BitsArray PR or discussion was found.
A minimal correction and regression tests are prepared. The updated utility class has 28 tests: 3 failed before the fix and all 28 passed after on Java 8/21. Native Java 8 filter reactor: 110 tests passed, 0 failures/errors/skips, with Checkstyle and SpotBugs passing. BloomFilter normally rounds to whole-byte lengths, so no live broker failure or message-loss claim is made.
AI assistance: OpenAI Codex was used for investigation, implementation and tests.
- Dominant language
- Java
- Stars
- 22.7k
- Forks
- 12k
- Avg merge
- 3d 18h
- Merged PRs (30d)
- 17
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from apache/rocketmq
-
[Bug] RemotingHelper.connect swaps the socket send and receive buffer configurationPossibly taken @amalsaidov claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
CompressionType.of fails under the Turkish localePossibly taken @sharanggupta claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
Maintainers usually reply within 1 day
-
[rocketmq-client-python] TransactionMQProducer allocates an unused producer during initializationOpen
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
[Bug] notifyMasterOnline aborts the long-polling wake-up with a NullPointerException when an arrival drains a bucket firstPossibly taken @iloveeyjafjalla claimed this 29 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
apache/rocketmq#11441 · 1 comment ·
Maintainers usually reply within 1 day
-
[Enhancement] FilterFactory duplicate-registration and unregister semantics lack testsPossibly taken @chennaji9 claimed this 34 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
apache/rocketmq#11340 · 2 comments ·
Maintainers usually reply within 1 day
Similar issues
-
bug emitter:client:csharp
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
microsoft/typespec#12572 · 1 comment · 1 reaction ·
Maintainers usually reply within 1 day
-
GCC 15.2: -Wcast-qual warning - cast discards const qualifier from pointer target type (H5trace.c)Open
Difficulty 2/5 1-3 hours Newbie friendliness 73/100
Maintainers usually reply within 1 day
-
needs-area-label
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 2 days
-
area/ai area/backend component/zeebe kind/task
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
spAnser/reacharound#38 ·