From b6c19bfa5df7d24326f8c728eeef73b82a276db0 Mon Sep 17 00:00:00 2001 From: Ragnor Comerford Date: Thu, 25 Jun 2026 09:08:12 +0200 Subject: [PATCH] release: v0.7.2 (#301) Patch release over v0.7.1: write-path latency reductions (#288 direct table opener, #298 schema-once + open-each-table-once) and three correctness fixes on the maintenance and recovery paths (#297 optimize survives a cross-process write race, #291 optimize compacts the internal metadata tables + non-destructive auto_cleanup strip, #296 recovery converges under a concurrent manifest advance). No breaking changes, no on-disk format change, no migration. Version coherence: all 7 crate manifests + path-dep constraints, Cargo.lock, openapi.json, and the AGENTS.md surveyed version bumped 0.7.1 -> 0.7.2. Build green under --locked; OpenAPI drift check green. --- AGENTS.md | 2 +- Cargo.lock | 14 +++---- crates/omnigraph-api-types/Cargo.toml | 6 +-- crates/omnigraph-cli/Cargo.toml | 14 +++---- crates/omnigraph-cluster/Cargo.toml | 6 +-- crates/omnigraph-compiler/Cargo.toml | 2 +- crates/omnigraph-policy/Cargo.toml | 2 +- crates/omnigraph-server/Cargo.toml | 12 +++--- crates/omnigraph/Cargo.toml | 8 ++-- docs/releases/v0.7.2.md | 60 +++++++++++++++++++++++++++ openapi.json | 2 +- 11 files changed, 94 insertions(+), 34 deletions(-) create mode 100644 docs/releases/v0.7.2.md diff --git a/AGENTS.md b/AGENTS.md index bf60a57..a871f88 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,7 +16,7 @@ Tools that support `@`-imports (Claude Code) auto-include all three files via th `CLAUDE.md` is a symlink to this file — there is exactly one source of truth. Edit `AGENTS.md`. -**Version surveyed:** 0.7.1 +**Version surveyed:** 0.7.2 **Workspace crates:** `omnigraph-compiler`, `omnigraph` (engine), `omnigraph-policy`, `omnigraph-api-types` (shared HTTP wire DTOs), `omnigraph-cluster`, `omnigraph-cli`, `omnigraph-server` **Storage substrate:** Lance 7.x (columnar, versioned, branchable) **License:** MIT diff --git a/Cargo.lock b/Cargo.lock index 85846cf..16a1827 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4851,7 +4851,7 @@ dependencies = [ [[package]] name = "omnigraph-api-types" -version = "0.7.1" +version = "0.7.2" dependencies = [ "omnigraph-compiler", "omnigraph-engine", @@ -4862,7 +4862,7 @@ dependencies = [ [[package]] name = "omnigraph-cli" -version = "0.7.1" +version = "0.7.2" dependencies = [ "assert_cmd", "clap", @@ -4886,7 +4886,7 @@ dependencies = [ [[package]] name = "omnigraph-cluster" -version = "0.7.1" +version = "0.7.2" dependencies = [ "fail", "omnigraph-compiler", @@ -4905,7 +4905,7 @@ dependencies = [ [[package]] name = "omnigraph-compiler" -version = "0.7.1" +version = "0.7.2" dependencies = [ "ahash", "arrow-array", @@ -4924,7 +4924,7 @@ dependencies = [ [[package]] name = "omnigraph-engine" -version = "0.7.1" +version = "0.7.2" dependencies = [ "arc-swap", "arrow-array", @@ -4968,7 +4968,7 @@ dependencies = [ [[package]] name = "omnigraph-policy" -version = "0.7.1" +version = "0.7.2" dependencies = [ "cedar-policy", "clap", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "omnigraph-server" -version = "0.7.1" +version = "0.7.2" dependencies = [ "arc-swap", "async-trait", diff --git a/crates/omnigraph-api-types/Cargo.toml b/crates/omnigraph-api-types/Cargo.toml index 037edba..96677d1 100644 --- a/crates/omnigraph-api-types/Cargo.toml +++ b/crates/omnigraph-api-types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-api-types" -version = "0.7.1" +version = "0.7.2" edition = "2024" description = "Shared HTTP wire DTOs for Omnigraph — request/response types and engine-result → DTO mappings used by both omnigraph-server and omnigraph-cli (RFC-009). Plain serde/utoipa types; no transport or server internals." license = "MIT" @@ -9,8 +9,8 @@ homepage = "https://github.com/ModernRelay/omnigraph" documentation = "https://docs.rs/omnigraph-api-types" [dependencies] -omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" } serde = { workspace = true } serde_json = { workspace = true } utoipa = { workspace = true } diff --git a/crates/omnigraph-cli/Cargo.toml b/crates/omnigraph-cli/Cargo.toml index 87c42aa..df4ac8d 100644 --- a/crates/omnigraph-cli/Cargo.toml +++ b/crates/omnigraph-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-cli" -version = "0.7.1" +version = "0.7.2" edition = "2024" description = "CLI for the Omnigraph graph database." license = "MIT" @@ -13,12 +13,12 @@ name = "omnigraph" path = "src/main.rs" [dependencies] -omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } -omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.1" } -omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.1" } -omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" } -omnigraph-server = { path = "../omnigraph-server", version = "0.7.1" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" } +omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.2" } +omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.2" } +omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.2" } +omnigraph-server = { path = "../omnigraph-server", version = "0.7.2" } clap = { workspace = true } color-eyre = { workspace = true } serde = { workspace = true } diff --git a/crates/omnigraph-cluster/Cargo.toml b/crates/omnigraph-cluster/Cargo.toml index 19a325b..ad3cf24 100644 --- a/crates/omnigraph-cluster/Cargo.toml +++ b/crates/omnigraph-cluster/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-cluster" -version = "0.7.1" +version = "0.7.2" edition = "2024" description = "Cluster configuration validation, planning, and config-only apply for Omnigraph." license = "MIT" @@ -14,8 +14,8 @@ documentation = "https://docs.rs/omnigraph-cluster" failpoints = ["dep:fail", "fail/failpoints", "omnigraph/failpoints"] [dependencies] -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } -omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" } fail = { workspace = true, optional = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/crates/omnigraph-compiler/Cargo.toml b/crates/omnigraph-compiler/Cargo.toml index 13c3bbf..f885a9f 100644 --- a/crates/omnigraph-compiler/Cargo.toml +++ b/crates/omnigraph-compiler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-compiler" -version = "0.7.1" +version = "0.7.2" edition = "2024" description = "Schema/query compiler for Omnigraph. Zero Lance dependency." license = "MIT" diff --git a/crates/omnigraph-policy/Cargo.toml b/crates/omnigraph-policy/Cargo.toml index 25bedd1..136df84 100644 --- a/crates/omnigraph-policy/Cargo.toml +++ b/crates/omnigraph-policy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-policy" -version = "0.7.1" +version = "0.7.2" edition = "2024" description = "Policy / authorization layer for Omnigraph — Cedar-backed PolicyEngine, PolicyChecker trait, ResourceScope enum." license = "MIT" diff --git a/crates/omnigraph-server/Cargo.toml b/crates/omnigraph-server/Cargo.toml index 0f6bcfc..fe349e9 100644 --- a/crates/omnigraph-server/Cargo.toml +++ b/crates/omnigraph-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-server" -version = "0.7.1" +version = "0.7.2" edition = "2024" description = "HTTP server for the Omnigraph graph database." license = "MIT" @@ -19,11 +19,11 @@ default = [] aws = ["dep:aws-config", "dep:aws-sdk-secretsmanager"] [dependencies] -omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } -omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" } -omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.1" } -omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.1" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" } +omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.2" } +omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.2" } +omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.2" } axum = { workspace = true } clap = { workspace = true } color-eyre = { workspace = true } diff --git a/crates/omnigraph/Cargo.toml b/crates/omnigraph/Cargo.toml index c830367..5038fd1 100644 --- a/crates/omnigraph/Cargo.toml +++ b/crates/omnigraph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-engine" -version = "0.7.1" +version = "0.7.2" edition = "2024" description = "Runtime engine for the Omnigraph graph database." license = "MIT" @@ -16,8 +16,8 @@ default = [] failpoints = ["dep:fail", "fail/failpoints"] [dependencies] -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } -omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" } +omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.2" } lance = { workspace = true } lance-datafusion = { workspace = true } datafusion = { workspace = true } @@ -52,7 +52,7 @@ chrono = { workspace = true } arc-swap = { workspace = true } [dev-dependencies] -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" } tokio = { workspace = true } lance-namespace-impls = { workspace = true } lance-io = "7.0.0" diff --git a/docs/releases/v0.7.2.md b/docs/releases/v0.7.2.md new file mode 100644 index 0000000..ecf0acf --- /dev/null +++ b/docs/releases/v0.7.2.md @@ -0,0 +1,60 @@ +# Omnigraph v0.7.2 + +A patch release over v0.7.1: write-path latency reductions plus three +correctness fixes on the maintenance and recovery paths. No breaking changes, no +on-disk format change, and no migration — drop-in over v0.7.1. + +## Performance + +- **Write opens go direct, schema validates once (#288, #298).** Write opens + used to route through the per-table Lance namespace catalog, which re-opened + the dataset just to read its location and re-resolved the latest version on + every table open — an O(commit-depth) double resolution that dominated write + latency on object stores (~70%). Writes now open each touched data table + directly by its manifest-recorded location (Lance's O(1) version-hint path), + validate the schema contract once per write instead of ~4×, and open each + touched table once instead of 4×. + +- **`optimize` compacts the internal metadata tables (#291).** `optimize` + previously iterated only node/edge tables, so the internal `__manifest`, + `_graph_commits`, and `_graph_commit_actors` tables accumulated one fragment + per commit and were never compacted — making every write's metadata scan grow + with commit history. `optimize` now compacts all three, so a periodically + optimized long-lived graph keeps its per-write metadata scan flat in history. + +## Fixes + +- **`optimize` survives a cross-process write race (#297).** A CLI `optimize` + racing a served write on the same table could fail: the in-process write queue + doesn't serialize across processes, so a concurrent insert/delete advancing the + manifest between optimize's compaction and its publish broke the strict + equality CAS. Optimize now reopens-and-replans on a genuine Lance conflict and + fast-forwards its publish monotonically, so a maintenance compaction never + fails a live write. Bounded retry; sustained contention surfaces a loud + conflict rather than dropping work. + +- **`optimize` is non-destructive on upgraded graphs (#291).** A graph created by + a pre-0.7.0 binary carries an on-by-default Lance auto-cleanup config; under it, + optimize's compaction commit could fire Lance's version-GC hook and prune + `__manifest`-pinned versions (breaking snapshots and time travel). Optimize now + strips any stale `lance.auto_cleanup.*` config off every table — data and + internal — before its HEAD-advancing commits, so compaction can never GC pinned + versions. + +- **Recovery converges instead of failing `open` under a concurrent manifest + advance (#296).** The open-time recovery sweep published its roll-forward at the + sidecar's pinned expected version; if another writer advanced the manifest + during the classify→publish window, the CAS failed and aborted the whole + `Omnigraph::open`. The sweep now treats roll-forward as "the manifest reflects + the sidecar's committed state," not "this sweep won the CAS": on a CAS loss it + re-reads the live manifest and, when the sidecar's intent is already satisfied, + records the recovery and deletes the sidecar idempotently — so a concurrent + advance no longer fails the open. (The destructive roll-back twin still defers + to a cross-process lease, as documented.) + +## Upgrade notes + +Drop-in over v0.7.1 — no configuration, schema, or data changes. Upgrade the +server and CLI together as usual. Graphs created on v0.7.1 read and write +identically on v0.7.2; the optimize non-destructive fix additionally protects +graphs created by pre-0.7.0 binaries from version GC during compaction. diff --git a/openapi.json b/openapi.json index 0308087..7333248 100644 --- a/openapi.json +++ b/openapi.json @@ -7,7 +7,7 @@ "name": "MIT", "identifier": "MIT" }, - "version": "0.7.1" + "version": "0.7.2" }, "paths": { "/graphs": {