[default values] Handshake and drop read-bridge overlays on the server - #678
Open
cbb330 wants to merge 4 commits into
Open
[default values] Handshake and drop read-bridge overlays on the server#678cbb330 wants to merge 4 commits into
cbb330 wants to merge 4 commits into
Conversation
This was referenced Aug 12, 2026
cbb330
force-pushed
the
chbush/read-bridge-sanitize-on-write
branch
5 times, most recently
from
August 13, 2026 02:48
ff60798 to
a5571f8
Compare
cbb330
force-pushed
the
chbush/read-bridge-policy-ramp
branch
from
August 13, 2026 05:42
ab56db9 to
d5faa07
Compare
cbb330
force-pushed
the
chbush/read-bridge-sanitize-on-write
branch
from
August 13, 2026 05:42
f05903f to
9d1bb96
Compare
17 tasks
cbb330
marked this pull request as ready for review
August 13, 2026 06:05
cbb330
force-pushed
the
chbush/read-bridge-policy-ramp
branch
from
August 13, 2026 06:10
d5faa07 to
b0fbf21
Compare
cbb330
force-pushed
the
chbush/read-bridge-sanitize-on-write
branch
from
August 13, 2026 06:10
253129c to
7c005b2
Compare
2 tasks
cbb330
force-pushed
the
chbush/read-bridge-sanitize-on-write
branch
from
August 13, 2026 22:27
7c005b2 to
a93119a
Compare
cbb330
changed the base branch from
chbush/read-bridge-policy-ramp
to
chbush/read-bridge-apply
August 13, 2026 22:27
cbb330
force-pushed
the
chbush/read-bridge-sanitize-on-write
branch
from
August 13, 2026 22:35
a93119a to
4ad3f14
Compare
cbb330
changed the base branch from
chbush/read-bridge-apply
to
chbush/read-bridge-policy-ramp
August 13, 2026 22:35
cbb330
force-pushed
the
chbush/read-bridge-policy-ramp
branch
from
August 13, 2026 23:55
b0fbf21 to
ea956d9
Compare
Default-aware clients must send the overlay on the wire; the server uses it to block unaware overwrite/replace, rejects dropping a live default, then strips stamped keys before persist.
Type 1/2 only run when the table is ramped. Awareness is JSON equality with the stamp, not key presence. Write-path source and parse failures are 400; a bug stays 500. HTTP e2e proves overlays do not persist.
cbb330
force-pushed
the
chbush/read-bridge-sanitize-on-write
branch
from
August 13, 2026 23:56
4ad3f14 to
b8a8a8b
Compare
Those tests belong on the apply PR. This PR is the server handshake and drop; the client still does not overlay until apply lands.
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.
Summary
Depends on #674 (policy), stacked on #668 → #645. #679 (
ReadBridge.apply) restacks on this PR.Read-bridge overlays must not persist. This PR puts the drop on the server before apply lands, so there is no deployable cut where overlays are applied but not stripped.
Default-aware clients send
initial-defaulton stamped field-ids (the handshake). The server gates Type 1 / Type 2, then strips those keys before Iceberg commit. Unstamped ids keep the writer's defaults.Until #679, apply is still a no-op; PUTs only carry
initial-defaultif the writer set it. The server is already safe: drop is a no-op when the handshake is absent, and Type 2 fail-closes unaware rewrites on ramped tables.How strip protection works
COLUMN_DEFAULT_REMOVEDreplace/overwriteon main) while previous stamps are nonemptyCOLUMN_DEFAULT_REWRITEunless each remaining id'sinitial-defaultJSON equals the stampCOLUMN_DEFAULT_UNUSABLEinitial-defaulton stamped ids (samefindParents("id")walk as the client)Unramped tables are a no-op. GET
resolve()still fail-opens; only the write path is fail-closed. Awareness isJsonNode.equalsagainst the stamped config, not key presence.OSS never parses ASL.
ColumnDefaultsSourceis the seam (NONEin OSS); LinkedIn fills it. Type 1 compares stamped field-id sets from the resolver.Changes
ReadBridgeStripProtection.prepareon PUT table / snapshotsstampedColumnDefaults/isRampedForCommitMockTablesApplication, HTTP e2e that GETinitialDefault()is null after overlay PUTTesting Done
./gradlew :services:tables:test --tests '*ReadBridgeStripProtectionTest' --tests '*ReadBridgeConfigResolverTest' --tests '*ReadBridgeColumnDefaultE2ETest'Additional Information
Stack
ReadBridge.apply(merge after this PR)Rollback Plan
Revert this PR. After #679, clients send overlays; without the server drop they persist in Iceberg metadata.