Repository navigation
Conversation
Draft RFC for issue ModernRelay#1233. A whole-root copy opened at a new location on the same backend kind serves every branch from its own objects; a base outside the root or a missing copied object refuses. Settles the base-provenance rule, fail-closed handling of mismatched names, the extension to pre-v11 table forks and the collector, object-store scope, and the Lance fence row.
|
Recommendation: revise. This RFC is the right decision for issue #1233, and it is not ready to accept. A whole-root copy must read only the root it was opened at. Today a retained branch keeps the absolute path from Five sentences do not match Lance 13.0.0 or the code at main Blocking1. The base-store cache outlives the public manifest ArcLance 13.0.0
The door must rewrite the map before the first base resolution. The handle must have an empty cache, and it must not share that cache with a handle that still has the recorded paths. A later swap of the public State this limit in "Inherited Lance behavior". Make the door obey it. The fence row that says every 2. The storage upgrade does not convert branches through
|
State the base-store cache limit and that the door installs the rebound map on a fresh, unshared cache before any base resolves; the storage upgrade overwrites rather than clones; what a same-version publish, a stale-handle publish and a new branch persist; the layout page's shallow-clone port step; one owner each for table pin paths and Lance bases, the relocation bit included. Also the builder's I/O, the NotFound class and message path, separator normalization, the main-name residual, and links to lance#10661 and draft ModernRelay#1235.
|
Thanks. I checked every point against Lance 13.0.0 and main Blocking
Optional
One addition, from fixing #1235. At first the accessor that resolves a base path also re-classified bases, and that broke Still open. The CI wiring for the other-bucket and Azurite halves (a second bucket and container, and the required cells) needs a token with |
|
Recommendation: ready. This RFC is the right decision for issue #1233. A whole-root copy must read only the root it was opened at. The text at Prior findingsAll 5 blocking findings are resolved. All 6 optional findings are resolved.
OptionalOne sentence overstates a clone. A same-version publish does record the opened URI for every base, ancestors included, because Tradeoff and liabilityThe change removes a second frozen location. The opened root is the authority (invariants 3 and 12). A same-kind backup can stand alone. There is no new persisted state, no stamp, and no Lance patch. The change adds a permanent in-memory reading of one persisted shape, a fail-closed refusal, and a door on every open and checkout. The door owns the cache rule. A late swap of the public manifest cannot restore the cross-tree read. The pin path and the Lance base each have one owner. The text forbids a third path rule. A new location fact names one of those two owners. The read contract comes first. An on-disk rewrite stays rejected. Old versions would still need the reader rule, and e-tags and branch identity would change. What I checkedHead Lance 13.0.0:
Main #1235 at Open RFCs #1213, #1202, #1214, #1224, and #996 do not mention this contract. Their diffs have no The stated tests can fail before the fix and pass after it. On main, a branched graph has a non-empty Docs, on a detached worktree of LimitationsI did not run the implementation tests, S3, Azure, or the predecessor journeys. I did not re-check Lance 14 or 15. I did not push, and I did not change this pull request. Inline comment on Optional. This sentence now sits on the claim that a same-version publish records the opened URI for every base, ancestors included. A clone does not do that. The next two bullets already split a stale publish from a new branch. Narrow this sentence so it does not say a clone rewrites ancestors. The three cases stay the contract. |
Why
Issue #1233 is labeled
needs-rfc. The fix changes when Omnigraph trusts a stored Lance field (BasePath.path) for one class of bases. It also changes what RFC 0029 and RFC 0064 say about copying a graph root to a new path. GOVERNANCE.md makes that size L: the decision comes before the code.What changed
There is one new draft RFC,
docs/rfcs/2026-11-03-relocated-graph-roots.md, and its registry row. Nothing outsidedocs/rfcs/changes.Why a new RFC, not amendments to RFC 0029 and RFC 0064. The rule is a compatibility decision that neither RFC owns. Amending both would state it twice.
docs/rfcs/README.mdprescribes a disposition note when an accepted RFC replaces part of an earlier one. The draft does not edit RFC 0029 or RFC 0064: a draft cannot change an accepted contract. The exact disposition notes are in the RFC's Rollout section, and they land with acceptance. That matches how PR #872 added disposition notes after acceptance.Decisions the RFC takes:
NotFoundand names the opened root. A base that is not graph-internal refuses with aPermanentfailure before anything is read through it.lance_clone::create_branchcall thatforbidden_apis.rsalready pins. The RFC explains why this is consistent with invariant 8 and with lance.md's "names never establish ownership".ref_name. It has no branch rename, and Omnigraph never callsadd_bases. So a mismatch comes only from a foreign writer or corruption. Keeping the recorded path would be the cross-tree read the contract removes.borrowed_originswould protect the original location's files on a relocated root, and could delete files the copy's retained forks still borrow.pub(crate)cache that clones share and that a swap of the public manifestArcdoes not clear. The door therefore installs the rebound map on a fresh clone with an empty cache (Dataset::with_object_store) before any base resolves.manifest_pathis rebuilt byfull_manifest_object_store_path. A LanceBasePathis rebound bybranch_base, which is also the only classifier: the refusal, the collector's borrowed origins, and the relocation bit.Evidence
The prototype on
ragnorc/omnigraph:proto/1233-branch-base-follows-rootpasses the issue's acceptance list on local files. It also shows a silent cross-tree read on main: a copy missing one inherited object returned 4 rows read from the original path. The RFC lists the evidence the implementation must add. The draft code PR is #1235. It implements these decisions and waits for this RFC to be accepted.Checks
python3 scripts/check-docs.py: OK (450 Markdown files).Not covered
The status stays
draft.blocked_onnames two evidence gates: the RustFS and Azurite relocation owners, and the genuine predecessor journeys passing with the fail-closed rule. The upstream Lance issue is filed as lance#10661.