Repository navigation
Conversation
* rfc: remote optimize through the serving owner A bounded, manually requested optimize of a served graph's main branch, executed by the process that serves and publishes it: today's gate shape and one publication, a gate-hold bound with an exact outcome per table, a durable operation record under a caller-chosen id before any effect, lookup by that id after a lost response, and restart resolution from the graph's history. Replaces the closed served-maintenance proposal in the form its review asked for. * rfc: link the remote optimize RFC to its discussion * rfc: revise remote optimize after review Record the intent nonce and resolve by commit_id_answers; keep an in-doubt publication non-terminal; release the writer gates before the artifact scan; add a resume position, resource ceilings and per-table failure isolation; require maintain on every route; depend on ModernRelay#1175 and ModernRelay#1176. * rfc: settle remote optimize resume, ceilings and resolution after second review * rfc: settle remote optimize resolution reads and the artifact bound after third review * rfc: resolve through the buffered commit lookup and count both offset sides after fourth review * rfc: state the history cost of a released commit and reuse the collector's path resolution after fifth review
Adapt rather than take ModernRelay#1186's ceilings and list every difference; share the record's bounds with the deployment receipts; cap the resolution walk per attempt; name the exit from a full unresolved list; justify the callback over a two-phase engine API; narrow the containment claim; skip the artifact write under a pending shutdown and size its limit against the grace at qualification.
…path The HTTP request carries tables and max_gate_hold only; resource ceilings and the run budget are serve settings. The record is keyed by kind and holds no event history, progress, pause or resume. The out-of-process worker is deferred rather than rejected: Lance's compaction task API already separates planning, execute and the commit, and a later slice moves execute alone.
A §3.6 table names each hazard, the mechanism that owns it and where it is decided: the cluster lock, the S3 lease, the manifest version CAS, the record's conditional puts, detached staging, pinned reads, the in-process gates, standalone roots, raw writers, the other maintenance operations and a later worker. No mechanism is added.
|
Recommendation: revise. WhyA served graph cannot run WhatThis pull request is a design document. It adds the RFC and three pending amendments. It changes no executable code. The current head is HowAcceptance is a conditional put of the operation record. The run holds today's writer gates, works one table at a time, and publishes the finished tables once. The record stores the intent nonce before any manifest request. A ImpactThe serving process is the right owner. The findings on #1190, through the ready review of Two sentences still disagree with the catalog on this merge base. An implementation that follows them builds a second parent-chain walk, and it can leave a full unresolved list stuck after a write on the wrong graph. Fix those sentences before an implementation follows them. Keep #1186 closed. Two accepted optimize RFCs would leave two contracts. What the earlier discussion still holdsChecked again on merge base
Blocking1. Resolution needs the catalog's parent-chain page§2.4 walks main by calling
The resume sentence has a second defect. "Resumes the walk below that commit" drops the stored commit. That is sound only when the stored commit was already tested and was not the input head's child. A skipped child makes the walk pass the input head. §2.4 then stays in Call 2. One write settles the records of that graph onlyThe unresolved list is cluster-wide, with a cap of four. §2.4 already says that only a commit on this graph's main settles a record. A commit on another graph does not. The exit paragraph then says that any mutation, load, or merge that publishes on main settles every unresolved record at once. That is true for the records of the graph that moved. It is false for a record whose graph did not move. One cluster can hold doubts for more than one graph. A write on the wrong graph leaves the list full, and admission stays at 409. Say the graph in the operator instruction. A move of graph G's main head settles the unresolved records whose input head is on G. The same sentence should cover the earlier line that another maintenance publication "on main" settles the doubt. The active slot is cluster-wide. Settlement is per graph. Optional1. A late manifest put can still create the absent version§3.6 says a late manifest put meets a held version and fails as a conflict, so it never overwrites the successor's commit. The put-if-absent in 2.
|
Reopens the remote-optimize RFC for review. It merged early as #1190 (still
status: draft) and #1203 reverted it; this is the same text plus the fixes its post-merge review asked for, recorded in the decision log under 2026-10-29 "Reopened":resolution_walk_limit), resumed below the stop commit and reported by lookup;before_publishcallback was preferred over a two-phase engine API;RecoveryRequiredonly;Trimmed after comparing with LanceDB's served maintenance (its embedded
optimize()is a client-side call, its remote tables refuse it, and its managed service runs compaction off the request path as registry jobs with durable ids, cancel and reattach):tablesandmax_gate_holdonly; resource ceilings and the run budget are serve settings alone, as docs(rfc): optimize graphs through the running server #1186 had it;kindand holds no event history, progress, pause or resume; a job registry is the control plane's;plan_compaction, serializableCompactionTask,execute, then the commit) already separates the stepsTableStoreuses, so a later slice movesexecutealone while the owner keeps the plan and the one publication.A new §3.6 states every cross-process hazard once, in one table: the cluster lock, the S3 lease, the manifest version CAS, the record's conditional puts, detached staging, pinned reads, the in-process gates, standalone roots, raw writers, the other maintenance operations and a later worker. No mechanism is added.
A bounded, manually requested
optimizeof a served graph's main branch, executed by the process that serves and publishes it: today's gate shape and one publication, a gate-hold bound with an exact outcome per table, a durable operation record under a caller-chosen id before any effect, lookup by that id after a lost response, and restart resolution from the graph's history.Competing draft: #1186 (a synchronous call with no record). Only one of the two should be accepted; the comparison is in this RFC's Relationship to open work and Alternatives, and on #1186.
Blocked on #1175, #1176 and an in-region measurement, as the front matter says. Implementation drafts: #1204 (engine); the server and CLI slices reopen after acceptance.
Docs-only;
python3 scripts/check-docs.pypasses.