Skip to content

CASSANDRA-21390 trunk TrieMemtable MemtableReclaimMemory AssertionError: Negative released in MemtablePool$SubPool#4878

Open
smiklosovic wants to merge 1 commit into
apache:trunkfrom
smiklosovic:CASSANDRA-21390-trunk
Open

CASSANDRA-21390 trunk TrieMemtable MemtableReclaimMemory AssertionError: Negative released in MemtablePool$SubPool#4878
smiklosovic wants to merge 1 commit into
apache:trunkfrom
smiklosovic:CASSANDRA-21390-trunk

Conversation

@smiklosovic

Copy link
Copy Markdown
Contributor

Thanks for sending a pull request! Here are some tips if you're new here:

  • Ensure you have added or run the appropriate tests for your PR.
  • Be sure to keep the PR description updated to reflect all changes.
  • Write your PR title to summarize what this PR proposes.
  • If possible, provide a concise example to reproduce the issue for a faster review.
  • Read our contributor guidelines
  • If you're making a documentation change, see our guide to documentation contribution

Commit messages should follow the following format:

<One sentence description, usually Jira title or CHANGES.txt summary>

<Optional lengthier description (context on patch)>

patch by <Authors>; reviewed by <Reviewers> for CASSANDRA-#####

Co-authored-by: Name1 <email1>
Co-authored-by: Name2 <email2>

The Cassandra Jira

Comment thread src/java/org/apache/cassandra/db/rows/ColumnData.java Outdated
…by an existing row deletion

When BTreeRow.merge reconciles an update into a row whose existing deletion
shadows the update's cells, it filtered the update (incoming) side of the merge
with Reconciler.retain, which records the removal via
PostReconciliationFunction.delete. On the memtable write path that subtracts the
shadowed cells' on-heap size from the allocator's ownership even though that
incoming data was never allocated to the memtable. Under overwrite/delete churn
that re-applies cells already covered by a newer row/partition deletion (e.g.
repair re-streaming), the allocator's "owns" counter drifts negative and the next
flush trips "AssertionError: Negative released" in MemtablePool$SubPool.released
via MemtableAllocator$SubAllocator.releaseAll during discard.

Filter the update (incoming) side with a non-recording variant,
Reconciler.removeShadowed, and keep retain() for the existing side,
whose data the memtable already owns. The filtered result is identical; only the
erroneous accounting notification is dropped. This mirrors the already-correct
complex-column path in ColumnData.merge.

patch by Stefan Miklosovic; reviewed by Dmitry Konstantinov for CASSANDRA-21390

Assisted-By: Claude Opus 4.8 <noreply@anthropic.com>
@smiklosovic smiklosovic force-pushed the CASSANDRA-21390-trunk branch from 8c45eb9 to b6a3d88 Compare June 16, 2026 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants