Skip to content

perf(runtime): tombstone deletes default-on again — the #9200 corruption that rolled them back is fixed (26x on populated delete) - #9331

Merged
proggeramlug merged 1 commit into
PerryTS:mainfrom
proggeramlug:perf/9038-tombstones-default-on
Sep 1, 2026
Merged

perf(runtime): tombstone deletes default-on again — the #9200 corruption that rolled them back is fixed (26x on populated delete)#9331
proggeramlug merged 1 commit into
PerryTS:mainfrom
proggeramlug:perf/9038-tombstones-default-on

Conversation

@proggeramlug

@proggeramlug proggeramlug commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Restores #9038's default. The chain of custody:

This PR is the one-hunk default flip plus the changelog. PERRY_OBJECT_TOMBSTONES=0 remains the kill switch — deliberately, since that same switch attributed #9108, #9110 and #9200 each in one command.

Verified on this exact build

The five-configuration matrix over both #9200 fixtures — including the precise configuration that broke the old default — all byte-identical to node, 3/3 runs each:

fixture default (ON) kill HL=8+FORCE_EVAC HL=4+FORCE+VERIFY evac+kill
tower_delete PASS PASS PASS PASS PASS
tombstone_oldgen_delete PASS PASS PASS PASS PASS

Tombstone unit suite: 27/27 with the flipped default.

The win it restores (500-key object, 200k delete/re-add rounds, interleaved on one box; node 24–25 ms):

ms
default (tombstones ON) 82–89
kill switch (old default) 2,137–2,352

~26×. Perry remains ~3.4× node on this shape — the residual is the per-delete IC retirement documented in #9064, a separate lane.

Summary by CodeRabbit

  • Performance
    • Tombstone-based object deletion is now enabled by default, improving deletion speed.
    • An environment-variable kill switch remains available to disable the behavior when needed.
  • Documentation
    • Added release notes describing the default behavior, rollback history, structural fix, and performance improvements.

…d the PerryTS#9200 corruption that rolled them back

PerryTS#9038 shipped O(1) tombstone deletes default-on; PerryTS#9212 returned them to
opt-in because PerryTS#9200 let an evacuating minor sweep a deleted receiver's
live keys array (an unarmed successor descriptor was the only root).
PerryTS#9317 fixed that structurally: every post-birth ShapeId publish routes
through stamp_object_shape_id_with_carrier_note, which arms old_carrier
for any non-nursery receiver, so the descriptor and its keys array are
rooted by construction.

The default flips back to ON; PERRY_OBJECT_TOMBSTONES=0 remains the
kill switch (the same switch that attributed PerryTS#9108, PerryTS#9110 and PerryTS#9200
each in one command).

Verified on this build: both PerryTS#9200 fixtures (tower + oldgen) x five
configurations (default, kill, HL=8+FORCE_EVACUATE, HL=4+FORCE+VERIFY,
evac+kill) all byte-identical to node, 3/3 runs each; tombstone unit
suite 27/27; populated-delete bench (500 keys, 200k delete/re-add
rounds, interleaved): default 82-89 ms vs kill-switch 2137-2352 ms —
the flip restores a ~26x improvement (node: 24-25 ms on the same box).

Claude-Session: https://claude.ai/code/session_01TE3JXAYXtdnKcLu8TCFWR6
@coderabbitai

coderabbitai Bot commented Aug 31, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: 4ca4cf9a-2ea2-4f5b-ba0e-918ea7efc0e9

📥 Commits

Reviewing files that changed from the base of the PR and between 9943dd9 and b81b57c.

📒 Files selected for processing (2)
  • changelog.d/9330-tombstones-default-on.md
  • crates/perry-runtime/src/object/delete_rest.rs

Included review availability: Your plan provides up to 8 included reviews per hour; 5 remain after this review.


📝 Walkthrough

Walkthrough

Tombstone deletes are now enabled by default. PERRY_OBJECT_TOMBSTONES disables them when set to 0, off, or false. The changelog documents this behavior and the related performance improvements.

Changes

Tombstone delete behavior

Layer / File(s) Summary
Default-on configuration and documentation
crates/perry-runtime/src/object/delete_rest.rs, changelog.d/9330-tombstones-default-on.md
The runtime enables tombstone deletes by default and treats PERRY_OBJECT_TOMBSTONES=0, off, or false as disable values. The changelog documents the change and opt-out.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: 🔵 Low · up to b81b5

This change restores faster default object deletion while retaining an emergency opt-out. The known rooting failure is structurally addressed, but real evacuating-collection behavior and production kill-switch initialization still warrant explicit owner awareness before merge.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: restoring tombstone deletes as the default runtime behavior. It also provides relevant context about the prior corruption fix and performance impact, alth…
Description check ✅ Passed The description provides a clear summary, concrete change rationale, related issue references, detailed validation results, and benchmark data. It does not use the template headings or include the che…
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 …
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Title check

Explanation

The title clearly identifies the main change: restoring tombstone deletes as the default runtime behavior. It also provides relevant context about the prior corruption fix and performance impact, although it is longer than necessary.

Full details: Description check

Explanation

The description provides a clear summary, concrete change rationale, related issue references, detailed validation results, and benchmark data. It does not use the template headings or include the checklist, but the required information is mostly present.

Full details: Docstring Coverage

Explanation

Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 unsupported.)

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@proggeramlug
proggeramlug merged commit 289f15b into PerryTS:main Sep 1, 2026
23 of 29 checks passed
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.

1 participant