Skip to content

docs(rfc): RFC-006 — object-storage-native omnigraph (S3-first, local-FS deprecation)#185

Open
aaltshuler wants to merge 1 commit into
mainfrom
docs/rfc-006-object-storage-native
Open

docs(rfc): RFC-006 — object-storage-native omnigraph (S3-first, local-FS deprecation)#185
aaltshuler wants to merge 1 commit into
mainfrom
docs/rfc-006-object-storage-native

Conversation

@aaltshuler

Copy link
Copy Markdown
Collaborator

Design for the directive: OmniGraph becomes object-storage only. The engine already is (Lance on object_store, S3 CI-tested); this RFC migrates the one holdout — the cluster control plane's raw-filesystem layer — and defines what "local FS deprecation" means.

Shape

  • D1 — one interface: sealed ClusterStore over object_store; every stored byte URI-addressed; raw fs::* for cluster state becomes a deny-list entry. Declared config (cluster.yaml, .pg/.gq/policies) stays in the working tree — Terraform's config-local/state-remote split.
  • D2 — storage: root in cluster.yaml (s3://bucket/prefix): ledger, lock, catalog, sidecars, approvals, and derived graph roots all live under it.
  • D3 — CAS + locking on S3: ledger writes via PutMode::Update(etag), lock via PutMode::Createverified live against RustFS beta.8 before writing this (If-None-Match: 200→412; If-Match: 200→412). Cross-machine locking becomes real (the file lock never was).
  • D5/D6 — graph roots as URIs; --cluster s3://… serving: cluster deployments become stateless again — Railway = service + Bucket, no volume; the classic and cluster topologies converge.
  • D7 — cluster migrate-storage <dest-uri>: object-copy + ledger-last atomic cutover, both directions.
  • D8 — deprecation policy (the one place the RFC pushes back): "object-storage only" is enforced at the interface, not by deleting file:// — which ships inside object_store either way and keeps cargo test hermetic. S3-first docs at Stage D, deprecation warning on implicit local storage, storage: required at v0.9 with file:// legal-but-explicit for dev/test. A harder line later is a validation flip, not an architecture change.

Staging

A (ClusterStore port — the big one) → B (URI graph roots + executors/sweep) → C (bucket-backed serving + Railway Bucket validation, converging with cookbooks PR #12) → D (migrate-storage + docs flip + deprecation).

Open questions

RustFS GA contract (probes to be pinned as guard tests), multi-writer lease UX, catalog GC (existing gap, carries over), config-in-git workflow docs.

🤖 Generated with Claude Code

The migration design making object storage THE deployment model: a sealed
ClusterStore interface (object_store-backed) replaces every raw-fs call in
the cluster crate; cluster.yaml gains a storage: root (s3://... — state
ledger via conditional-put CAS, cross-machine locking, catalog/sidecars/
approvals as objects, derived graph roots as engine-native S3 URIs); the
server takes --cluster s3://... and cluster deployments become stateless
(bucket, no volume). Config files stay in the working tree — Terraform's
config-local/state-remote split. Local FS is demoted, not deleted: one
interface, file:// as an explicit dev/test backend, S3-first everywhere in
docs, storage: required at the v0.9 boundary.

Grounded: conditional writes (If-None-Match and If-Match) verified live
against RustFS 1.0.0-beta.8 — both probes pass; Lance 6 already commits via
S3 conditional writes; Omnigraph::init/open accept S3 URIs today. Staged
A-D with sizes and the migrate-storage cutover tool.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aaltshuler has reached the 50-review limit for trial accounts. To continue receiving code reviews, upgrade your plan.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant