Back up a database whose index has not passed the placeholder - #1257
Merged
Merged
Conversation
A database with one commit and nothing but its root cannot be backed up at all: SoilBackupVisitor>>visitObjectSegment: copies the source segment's lastObjectIndex into a freshly created target, and #lastObjectIndex: demands strict growth. But a fresh target does not start empty - SoilObjectRepository>>initializeFilesystem gives its first segment lastObjectIndex 1 and its meta segment 2, as placeholders for the root and the meta description. A source that has not yet overtaken those copies a value that is equal, the setter reads that as an index that failed to grow, and the backup dies with "segment indexes can only grow". Which of the two segments trips first depends on how far the source has grown, so the same database can copy on one image and fail on another - it looked like a Pharo version difference and is not one. #updateLastObjectIndex: is the tolerant sibling that already exists for exactly this shape: it returns early when the value has not grown rather than refusing it. Copying an index that equals the placeholder is a faithful copy, and the target keeps the higher placeholder, which is what a fresh database has anyway. This is the state a user database is in between being created and being used for the first time, so it is reachable in production and not only in tests. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.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.
A database with one commit and nothing but its root cannot be backed up at all: SoilBackupVisitor>>visitObjectSegment: copies the source segment's lastObjectIndex into a freshly created target, and #lastObjectIndex: demands strict growth. But a fresh target does not start empty - SoilObjectRepository>>initializeFilesystem gives its first segment lastObjectIndex 1 and its meta segment 2, as placeholders for the root and the meta description. A source that has not yet overtaken those copies a value that is equal, the setter reads that as an index that failed to grow, and the backup dies with "segment indexes can only grow".
Which of the two segments trips first depends on how far the source has grown, so the same database can copy on one image and fail on another - it looked like a Pharo version difference and is not one.
#updateLastObjectIndex: is the tolerant sibling that already exists for exactly this shape: it returns early when the value has not grown rather than refusing it. Copying an index that equals the placeholder is a faithful copy, and the target keeps the higher placeholder, which is what a fresh database has anyway.
This is the state a user database is in between being created and being used for the first time, so it is reachable in production and not only in tests.