Skip to content

Back up a database whose index has not passed the placeholder - #1257

Merged
noha merged 1 commit into
mainfrom
backup-a-database-that-only-has-its-root
Sep 15, 2026
Merged

noha merged 1 commit into
mainfrom
backup-a-database-that-only-has-its-root

Conversation

@noha

@noha noha commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

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.

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>
@noha
noha requested a review from MarcusDenker September 15, 2026 09:01
@noha
noha merged commit 7be0d22 into main Sep 15, 2026
5 checks passed
@noha
noha deleted the backup-a-database-that-only-has-its-root branch September 15, 2026 09:20
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