mirror of
https://github.com/ModernRelay/omnigraph.git
synced 2026-06-27 02:39:38 +02:00
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.
This commit is contained in:
parent
4a5277b9c0
commit
b6c19bfa5d
11 changed files with 94 additions and 34 deletions
|
|
@ -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`.
|
`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`
|
**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)
|
**Storage substrate:** Lance 7.x (columnar, versioned, branchable)
|
||||||
**License:** MIT
|
**License:** MIT
|
||||||
|
|
|
||||||
14
Cargo.lock
generated
14
Cargo.lock
generated
|
|
@ -4851,7 +4851,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "omnigraph-api-types"
|
name = "omnigraph-api-types"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"omnigraph-compiler",
|
"omnigraph-compiler",
|
||||||
"omnigraph-engine",
|
"omnigraph-engine",
|
||||||
|
|
@ -4862,7 +4862,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "omnigraph-cli"
|
name = "omnigraph-cli"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert_cmd",
|
"assert_cmd",
|
||||||
"clap",
|
"clap",
|
||||||
|
|
@ -4886,7 +4886,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "omnigraph-cluster"
|
name = "omnigraph-cluster"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"fail",
|
"fail",
|
||||||
"omnigraph-compiler",
|
"omnigraph-compiler",
|
||||||
|
|
@ -4905,7 +4905,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "omnigraph-compiler"
|
name = "omnigraph-compiler"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash",
|
||||||
"arrow-array",
|
"arrow-array",
|
||||||
|
|
@ -4924,7 +4924,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "omnigraph-engine"
|
name = "omnigraph-engine"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
"arrow-array",
|
"arrow-array",
|
||||||
|
|
@ -4968,7 +4968,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "omnigraph-policy"
|
name = "omnigraph-policy"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cedar-policy",
|
"cedar-policy",
|
||||||
"clap",
|
"clap",
|
||||||
|
|
@ -4981,7 +4981,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "omnigraph-server"
|
name = "omnigraph-server"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "omnigraph-api-types"
|
name = "omnigraph-api-types"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
edition = "2024"
|
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."
|
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"
|
license = "MIT"
|
||||||
|
|
@ -9,8 +9,8 @@ homepage = "https://github.com/ModernRelay/omnigraph"
|
||||||
documentation = "https://docs.rs/omnigraph-api-types"
|
documentation = "https://docs.rs/omnigraph-api-types"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" }
|
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" }
|
||||||
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" }
|
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
|
||||||
serde = { workspace = true }
|
serde = { workspace = true }
|
||||||
serde_json = { workspace = true }
|
serde_json = { workspace = true }
|
||||||
utoipa = { workspace = true }
|
utoipa = { workspace = true }
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "omnigraph-cli"
|
name = "omnigraph-cli"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
description = "CLI for the Omnigraph graph database."
|
description = "CLI for the Omnigraph graph database."
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
@ -13,12 +13,12 @@ name = "omnigraph"
|
||||||
path = "src/main.rs"
|
path = "src/main.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" }
|
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" }
|
||||||
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" }
|
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
|
||||||
omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.1" }
|
omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.2" }
|
||||||
omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.1" }
|
omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.2" }
|
||||||
omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" }
|
omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.2" }
|
||||||
omnigraph-server = { path = "../omnigraph-server", version = "0.7.1" }
|
omnigraph-server = { path = "../omnigraph-server", version = "0.7.2" }
|
||||||
clap = { workspace = true }
|
clap = { workspace = true }
|
||||||
color-eyre = { workspace = true }
|
color-eyre = { workspace = true }
|
||||||
serde = { workspace = true }
|
serde = { workspace = true }
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "omnigraph-cluster"
|
name = "omnigraph-cluster"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
description = "Cluster configuration validation, planning, and config-only apply for Omnigraph."
|
description = "Cluster configuration validation, planning, and config-only apply for Omnigraph."
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
@ -14,8 +14,8 @@ documentation = "https://docs.rs/omnigraph-cluster"
|
||||||
failpoints = ["dep:fail", "fail/failpoints", "omnigraph/failpoints"]
|
failpoints = ["dep:fail", "fail/failpoints", "omnigraph/failpoints"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" }
|
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
|
||||||
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" }
|
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" }
|
||||||
fail = { workspace = true, optional = true }
|
fail = { workspace = true, optional = true }
|
||||||
serde = { workspace = true }
|
serde = { workspace = true }
|
||||||
serde_json = { workspace = true }
|
serde_json = { workspace = true }
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "omnigraph-compiler"
|
name = "omnigraph-compiler"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
description = "Schema/query compiler for Omnigraph. Zero Lance dependency."
|
description = "Schema/query compiler for Omnigraph. Zero Lance dependency."
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "omnigraph-policy"
|
name = "omnigraph-policy"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
description = "Policy / authorization layer for Omnigraph — Cedar-backed PolicyEngine, PolicyChecker trait, ResourceScope enum."
|
description = "Policy / authorization layer for Omnigraph — Cedar-backed PolicyEngine, PolicyChecker trait, ResourceScope enum."
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "omnigraph-server"
|
name = "omnigraph-server"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
description = "HTTP server for the Omnigraph graph database."
|
description = "HTTP server for the Omnigraph graph database."
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
@ -19,11 +19,11 @@ default = []
|
||||||
aws = ["dep:aws-config", "dep:aws-sdk-secretsmanager"]
|
aws = ["dep:aws-config", "dep:aws-sdk-secretsmanager"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" }
|
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" }
|
||||||
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" }
|
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
|
||||||
omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" }
|
omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.2" }
|
||||||
omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.1" }
|
omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.2" }
|
||||||
omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.1" }
|
omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.2" }
|
||||||
axum = { workspace = true }
|
axum = { workspace = true }
|
||||||
clap = { workspace = true }
|
clap = { workspace = true }
|
||||||
color-eyre = { workspace = true }
|
color-eyre = { workspace = true }
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "omnigraph-engine"
|
name = "omnigraph-engine"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
description = "Runtime engine for the Omnigraph graph database."
|
description = "Runtime engine for the Omnigraph graph database."
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
@ -16,8 +16,8 @@ default = []
|
||||||
failpoints = ["dep:fail", "fail/failpoints"]
|
failpoints = ["dep:fail", "fail/failpoints"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" }
|
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
|
||||||
omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" }
|
omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.2" }
|
||||||
lance = { workspace = true }
|
lance = { workspace = true }
|
||||||
lance-datafusion = { workspace = true }
|
lance-datafusion = { workspace = true }
|
||||||
datafusion = { workspace = true }
|
datafusion = { workspace = true }
|
||||||
|
|
@ -52,7 +52,7 @@ chrono = { workspace = true }
|
||||||
arc-swap = { workspace = true }
|
arc-swap = { workspace = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" }
|
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
|
||||||
tokio = { workspace = true }
|
tokio = { workspace = true }
|
||||||
lance-namespace-impls = { workspace = true }
|
lance-namespace-impls = { workspace = true }
|
||||||
lance-io = "7.0.0"
|
lance-io = "7.0.0"
|
||||||
|
|
|
||||||
60
docs/releases/v0.7.2.md
Normal file
60
docs/releases/v0.7.2.md
Normal file
|
|
@ -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.
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
"name": "MIT",
|
"name": "MIT",
|
||||||
"identifier": "MIT"
|
"identifier": "MIT"
|
||||||
},
|
},
|
||||||
"version": "0.7.1"
|
"version": "0.7.2"
|
||||||
},
|
},
|
||||||
"paths": {
|
"paths": {
|
||||||
"/graphs": {
|
"/graphs": {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue