You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Proactive blob backfill: repair already-committed records whose blobs are missing/corrupt (no recovery once the resume cursor advances past them) #388
Split out of #386 (self-repair half). #368 added the async durability watermark so the resume cursor holds on an in-flight blob gap and a reconnect re-streams the disrupted blob — this prevents new loss and recovers gaps within the in-flight window. But there is no mechanism to repair a blob that has already diverged after its record committed durably and the cursor advanced past it.
Confirmed by tracing the current code:
No read-time repair. When a blob read hits Incomplete blob (core/resources/blob.ts:189, :1167), the error just propagates — there is no re-request of that blob from a replication peer. (Cache re-source via sourcedFrom exists for caching tables, but that is application-specific, not blob-repair infrastructure, and authoritative tables have no source to fall back to.)
No reconciliation sweep. Nothing periodically checks for blob-level divergence across peers and heals it. The only blob sweep is orphan cleanup (core/resources/blob.ts:~1281), which deletes unreferenced files — the opposite of repair.
Net: if a blob file is missing/corrupt after its record committed and the cursor moved past it (the [customer-cluster] shape in #386, where records committed but the bytes are absent on every node), there is no proactive recovery path. On an authoritative table the read fails permanently.
Re-requests the missing/corrupt blob from a peer that has a complete copy (extend the existing per-record fetch / getRecord path to a blob-targeted request), and
ideally a bounded reconciliation pass that can run on reconnect or on demand to converge a node that diverged outside the audit-retention/base-copy window.
Gap
Split out of #386 (self-repair half). #368 added the async durability watermark so the resume cursor holds on an in-flight blob gap and a reconnect re-streams the disrupted blob — this prevents new loss and recovers gaps within the in-flight window. But there is no mechanism to repair a blob that has already diverged after its record committed durably and the cursor advanced past it.
Confirmed by tracing the current code:
Incomplete blob(core/resources/blob.ts:189,:1167), the error just propagates — there is no re-request of that blob from a replication peer. (Cache re-source viasourcedFromexists for caching tables, but that is application-specific, not blob-repair infrastructure, and authoritative tables have no source to fall back to.)core/resources/blob.ts:~1281), which deletes unreferenced files — the opposite of repair.replicationBlobRepairAuthoritative.test.mjsexercises exactly the held-cursor + reconnect-restream path; it does not cover already-committed divergence.Net: if a blob file is missing/corrupt after its record committed and the cursor moved past it (the [customer-cluster] shape in #386, where records committed but the bytes are absent on every node), there is no proactive recovery path. On an authoritative table the read fails permanently.
Ask
A blob-level reconciliation / backfill path that:
cluster_statusblob-divergence signal (feat(replication): surface blob-replication divergence in cluster_status (#386) #387) gives the observability hook; this is the repair side.getRecordpath to a blob-targeted request), andRelated