Repository navigation
fix(ilm): count a version under old and healed headers as one revision - #332
Merged
Merged
Conversation
The version history that an ILM expiry reads accepts a version only when one revision of it is on more than half of the drives and on its read quorum, and a revision was the header as the drive stores it plus a digest of the metadata. A drive holds the header that the release which wrote the version there stored: before RELEASE.2024-04-28 without erasure coding, and until RELEASE.2022-01-25 with a signature that counted empty part ETags. A heal writes the header of its own release and leaves the other drives alone. Reads and heal take both for one version; the history counted two revisions. With 5 to 11 of 16 drives healed (EC:4) neither had the quorum, objectVersions failed with a read quorum error, and every expiry that reads the history was refused on each scanner cycle, with nothing to bring the drives together: every expiry in a versioned bucket with several pools, and an expiry of all versions of a key with one pool too. versionRevision now gives the key of an object version the signature and the erasure coding as the current release computes them from the decoded metadata. The key of a version this release wrote carries its header as stored, so its history decides as before, including the order of versions of one time, which the signature breaks. The digest covers what both fields say. The stored flags stay in the key: whether a transitioned version uses its data directory follows the moment a drive wrote the entry (fileInfoRevisions). TestPoolsLifecycleHeaderEras accepts both old headers on every count of healed drives. TestPoolsLifecycleHealedOldHeaders expires a noncurrent version with two pools, and all versions with one, after half of the drives were wiped and healed. Both fail before this change. Drives that differ only in the data directory flag of a restored version are still two revisions; that is a separate defect. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> Signed-off-by: Feng Ruohang <rh@vonng.com>
Vonng
added a commit
to pgsty/silo.pgsty.com
that referenced
this pull request
Nov 10, 2026
pgsty/silo#332 merged to main as 36c8d1683. Update the status line of the design record in both languages, and note that its CI ran the full cmd suite, the race selection and the cross compile. Not released yet. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> Signed-off-by: Feng Ruohang <rh@vonng.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Regression in
RELEASE.2026-11-09T00-00-00Z, introduced by 9f7b493 (the authoritative version history of the #278 fix). The history accepts a version only when one revision of it is on more than half of the drives and on its read quorum, and it identified a revision by the stored version header plus a digest of the metadata. A drive keeps the header that the release which wrote the version there stored: beforeRELEASE.2024-04-28without erasure coding, and untilRELEASE.2022-01-25with a signature that counted empty part ETags. A heal writes a current header and leaves the other drives alone. Reads and heal take both for one version; the history counted two revisions.With 5 to 11 of 16 drives healed (EC:4),
objectVersionsfails with a read quorum error and every expiry that reads the history is refused on each scanner cycle, for good: every ILM expiry in a versioned bucket with several pools, andExpiredObjectAllVersions,DelMarkerExpirationand batch purges of all versions with one pool too. No data is deleted. GET works and heal finds nothing to do; the traces areexpiry_incomplete_total{reason="history_unavailable"}, the ILM trace, an audit entry and a log line.versionRevisionnow gives the key of an object version the signature and the erasure coding as the current release computes them from the decoded metadata. The key of a version a current release wrote carries its header exactly as stored, so nothing changes for it, including the order of versions of one modification time. The stored flags stay in the key, asfileInfoRevisionsrelies on. Nothing on disk changes; an upgraded node expires the refused keys when the scanner queues them again.TestPoolsLifecycleHeaderErasaccepts both old headers on every count of healed drives.TestPoolsLifecycleHealedOldHeaderswipes and heals half of the drives of a set, then expires a noncurrent version with two pools and all versions with one. Both fail on main.Validation: the two new tests, 194 tests of the lifecycle, restore, delete-all, tier, migration and
xl.metaformat suites, andgo vet ./cmdpass locally. The fullcmdsuite was not run. The tests model old headers; noxl.metawritten by the old releases was used. An adversarial review approved the change in its second round; the first round replaced a digest-derived signature, which reordered versions of one modification time in the merge.Not covered: drives of a restored, transitioned version that differ only in the data-directory flag are still two revisions. That is a separate defect. No CHANGELOG entry yet: the section of the next release does not exist.
Design record, in English and Chinese: pgsty/silo.pgsty.com#58.
🤖 Generated with Claude Code