0.1.0: the schema squashed into one migration per context, and an encryption check that can decide - #99
Merged
Merged
Conversation
A Documentation section near the top, linking the sections of docs.algojudge.pl that document this repository rather than the site's front page, and saying which reader each half is for: the site is written for somebody without this source open, and the README is the other half. The Related repositories bullet no longer repeats which sections those are, so the fact lives in one place.
Every migration added since the previous release becomes one named version_0_1_0, in both contexts. Names what a regeneration drops -- the hand-written FileContents block and three column defaults -- and how the squashed schema is compared against the chain it replaces. The rest of the checklist is verified and dated: dependency currency, .env.example in both directions, no .env, documentation currency, and the release order Runner then External-Runner then Ops.
Eight migrations and one became version_0_1_0, named for the release that creates the schema. The FileContents block was carried across by hand; the three column defaults left behind by AddColumn backfills are gone, which is what a table created in one statement should have. Verified by comparing pg_dump of both chains against empty databases: 2610 lines each, 53 tables, 102 indexes, 61 foreign keys, differing only in column order and those three defaults.
The image has carried a HEALTHCHECK since 2026-08-09, so `--wait` waits for the application and not merely for the container. The polling stays: it asks the same question from the host, through the published port.
0.1.0 is the case where nothing has been released and everything collapses into one CREATE TABLE. From 0.1.1 the squash is a delta: released migrations stay, the snapshot rolls back to the released state, every backfill decision is made again, and a schema dump stops being the whole proof.
The disk grep that stood behind §13.3's last item could not decide it. Measured 2026-09-07 against SeaweedFS: the object's bytes are on disk, complete and contiguous -- od shows all forty-eight characters of the needle -- while at that same moment grep finds a forty-four character prefix of it in that very file and not the whole string. It failed in the dangerous direction. `false` was what the assertion read as "encrypted", so a store that encrypted nothing would have passed, and the control invented to rule that out was built from the same instrument. What replaces it asserts what the S3 contract can state: the store takes bucket-default AES256, keeps accepting writes, and reports AES256 for the object. It runs on the default endpoint, where the old pair only skipped -- 824 tests pass with none skipped, against 823 and two. SeaweedFS skips it, and the reason is measured rather than remembered: 4.43 and 4.45 alike accept PutBucketEncryption, return the rule from GetBucketEncryption, and then fail every write to that bucket.
rustfs rc.4 to rc.5 and seaweedfs 4.43 to 4.45, both pinned in two places, beside the two NuGet patches that were deliberately not taken.
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.
Everything 0.1.0 needs from this repository — and the first CI run this branch has ever had, since
ci.ymltriggers onmainand pull requests only.The squash
Eight migrations and one became
version_0_1_0, named for the release that creates the schema. That is the standing rule from now on: before each release the migrations added since the previous one become one, calledversion_<major>_<minor>_<patch>. Only unreleased migrations are ever squashed, so no released history row is removed and no released database is stranded.Carried across by hand: the
FileContentsblock and itsSET STORAGE EXTERNAL, which is not an EF entity and no regeneration produces. Dropped on purpose: three column defaults —EvaluationJobs.Releases,EvaluationJobs.Refunds,Instance.ShowHero— each left by anAddColumnbackfilling a table that already held rows. A table created in one statement has none, the model declares no default for any of them, and each has a CLR initializer.Verified by comparing schemas, not by reading the generated file.
pg_dump --schema-onlyof an empty database migrated by the old chain and by the new one: 2610 lines each, 53 tables, 102 indexes, 4 check constraints, 61 foreign keys on both sides. The whole difference ispg_dump's session token, column order inside two tables, and those threeDEFAULTs.RunnerTags''{}'::text[]survives, because that one is in the model. One history row per context afterwards.docs/RELEASE.mdcarries the procedure and, with it, the case this release does not exercise: from 0.1.1 the squash is a delta — released migrations stay, the snapshot rolls back to the released state, every backfill decision is made again, and a schema dump stops being the whole proof.The encryption check could not decide what it was asked
The disk grep behind §13.3's last item was unsound. Measured against SeaweedFS: the object's bytes are on disk, complete and contiguous —
odshows all forty-eight characters of the needle — while at that same momentgrepfinds a forty-four character prefix of it in that very file and not the whole string.It failed in the dangerous direction.
falseis what the assertion read as "encrypted", so a store that encrypted nothing would have passed — and the control invented to rule that out was built from the same instrument.What replaces it asserts what the S3 contract can state: the store takes bucket-default AES256, keeps accepting writes, and reports AES256 for the object. 824 tests pass with none skipped, against 823 and two before.
SeaweedFS skips it for a measured reason rather than a remembered one: 4.43 and 4.45 alike accept
PutBucketEncryption, return the rule fromGetBucketEncryption, and then fail every write to that bucket.Images
rustfs1.0.0-rc.4→rc.5: the full suite is identical on either.chrislusf/seaweedfs4.43→4.45: the pin had stood two versions back on a comparison confounded by the test above — ten runs showed one failure in five against three in five, that test and nothing else, p = 0.52.Two comments that had stopped being true
CLAUDE.mdsaid the schema was one migration per context; seven had followed the 2026-08-28 squash.ci.ymlsaid the application service has no healthcheck. The image has carried one since 2026-08-09 (d05babc) and--waitreports itHealthy. The polling stays — it asks from the host, through the published port.Checked locally on 2026-09-07
dotnet build -c Release -warnaserrordotnet test -c Releaseopenapi.jsonvs the running containersha256 79f61ee5….env.examplevs compose.envin tree or index.env.exampleDirectory.Build.props, READMEdocker pull0.1.0