Repository navigation
GoGraph v0.17.2 — see CHANGELOG.md for the per-release entry.
0.17.2 — 2026-10-13
10 commits — 8 non-merge commits and 2 merges — counted at 700eaed6, the tip of
release/0.17.2: the back-merge of v0.17.1 into develop (2b96446d); sprint 369, Bounded
rollback latency and memory for cut write statements (5 commits, merged at 18ec0dc7); the
release-preparation commit (b87ec901); and two stabilisation commits on the release branch, a
test-only fix to a gauge sampler (3b03915a, rmp #3126) and the constraint fix below
(700eaed6). 17 files changed, 1 262 insertions, 85 deletions
(git diff --shortstat v0.17.1..700eaed6).
This is a PATCH release: no exported API change, no WAL or on-disk format change. The only
non-test Go files changed are four files of package graph/lpg (lpg.go,
mvcc_abort_reclaim.go, mvcc_abort_release.go, mvcc_abort_sides.go) and four of package
cypher (api.go, exectx.go, undo_record.go, exec/constraints.go). Every declaration they
add or change is unexported: in graph/lpg, abortWithdrawsCreation, tombstoneAbortedBatch,
idBatchBitmap, countSideStores, and the lifeWithdrawal field sizeHint with its methods
tombstone and revive; in cypher, the Engine test seams beginTxGatesHookForTest and
delPropProbedHookForTest, the releasesOwed fields of Result and ExplicitTx,
Result.applyOwedReleases, and the signature of recordDelNodeProperty. No file under store/
changed. go.mod and go.sum are unchanged from v0.17.1.
Fixed
- A write statement cut by its context deadline no longer takes many times its deadline to
roll back, nor multiplies its peak heap while doing so (rmp #3122, #3123,b1e9e21f).
Present in v0.17.1 and earlier. The rollback deleted every node the statement had created
through the ordinary delete path, which copied the whole copy-on-write tombstone bitmap once per
node and recorded bookkeeping the abort then withdrew: the rollback was quadratic. A
MATCH (a), (b), (c) CREATE ()over 600 nodes cut at 1 s returned 8.6 to 9.2 s after its deadline
and peaked at about 1.7 GB of heap; cut at 5 s it returned 64 s late and peaked at 7.2 GB. The
abort now withdraws the nodes the statement created and flips their tombstones in batches, with
the same end state. The same statement now returns about 1.4 s after a 1 s deadline with a peak
of about 0.75 GB, and about 7.1 s after a 5 s deadline with a peak of about 3 GB. The rollback is
now linear, at about 1 µs per created node. The deadline itself was always noticed within
microseconds. - A
REMOVEracing a peer's rolled-back removal can no longer commit a node without a
property itsNOT NULLconstraint requires (rmp #3127,700eaed6). Present in v0.17.1 and
earlier. The removal decided whether to check the node at commit from a probe of the present
state; when that probe read a peer's uncommitted removal that the peer then rolled back, the
removal still deleted the committed value but skipped the commit-time check. The check now
follows the removal's effect. A second, narrower window is closed in the same commit: an
explicit transaction whoseBeginTxstraddled a constraint registration between its catalogue
reads skipped both the commit-timeNOT NULLcheck and the straddler validation;BeginTxnow
reads the constraint generation first. - Readers can no longer briefly see two holders of a
UNIQUEvalue (rmp #3128,
700eaed6). Present in v0.17.1 and earlier. A transaction that freed aUNIQUEvalue
released it at its commit decision, before it was visible, so a peer could take the value and
publish first; a snapshot between the two publications held the value twice. The release is now
applied after publication, on the autocommit and the explicit-transaction path. Behaviour
change: a concurrent write of a just-freedUNIQUEvalue, inside the window between the
freeing transaction's commit decision and its visibility, is now refused with a constraint
violation; a retry succeeds.
The concurrency test that exposes both defects,TestConstraintDDLvsDML_NoViolationAdmitted,
failed 9 runs in 200 on v0.17.1 and 3 in 100 at3b03915a; after the fix it passed 1 000 of
1 000 runs, and 200 of 200 under-race.
Performance
- The abort path allocates about a third less per created node (rmp #3125,
2885d7d3):
pre-sized withdrawal lists, one bitmapOr/AndNotper batch of at least 1024 ids instead of
per-id updates, and no duplicate unborn-mark pass. Rolling back a 5 s cutCREATEallocates
197 B per id instead of 307. A largeDELETErollback was measured linear and is unchanged
(rmp #3124).
Further reading
- Narrative release notes:
release-notes/v0.17.2.md - Measured benchmark report:
docs/benchmarks/v0.17.2.md - Changelog file at this tag:
CHANGELOG.md - Commits in this release: https://github.com/FlavioCFOliveira/GoGraph/commits/v0.17.2
Reproducibility: built from commit 3d5fd8c with Go 1.26.