Repository navigation
v0.17.1
GoGraph v0.17.1 — see CHANGELOG.md for the per-release entry.
0.17.1 — 2026-10-13
4 commits — 2 non-merge commits and 2 merges — counted at 4743de3d, the develop tip
before release preparation: the back-merge of v0.17.0 into develop (81ed1eae) and sprint
368, Rollback memory reclamation in graph.Mapper (2 commits, merged at 4743de3d). 18 files
changed, 1 870 insertions, 40 deletions (git diff --shortstat v0.17.0..4743de3d).
This is a PATCH release: no exported API change, no WAL or on-disk format change. Measured
by parsing every non-test Go file outside internal/, examples/, cmd/ and any gen/, tck/
or testdata/ directory at both v0.17.0 and 4743de3d, and diffing the rendered declarations
— a superset of the API surface docs/semver.md defines: the two renderings
are identical. The only new declarations are in internal/synthkey, which the module does not
export. No file under store/ changed. go.mod and go.sum are unchanged from v0.17.0.
Fixed
- A rolled-back write statement no longer leaves its node keys interned in
graph.Mapper
(rmp #3119, #3120,78039599). Present in v0.15.0, v0.16.0 and v0.17.0; fixed in
v0.17.1, so embedders pinned to an earlier version should move their pin. When a
transaction that created nodes aborted as a whole — an autocommit statement cut by its context
deadline, a failed or refused statement, or an explicit transaction rolled back — the anonymous
keys it minted forCREATE ()stayed in the Mapper, together with the transaction's write set,
adjacency-version entries and unborn marks. A cutMATCH (a), (b), (c) CREATE ()over 600
nodes left the live heap at 1847.5 MB afterruntime.GC(), against 2.3 MB before the
statement. The abort now releases every never-born node created under a minted key: the key no
longer resolves, its id becomes a hole, and the Mapper gives the memory back; the same scenario
now leaves 2.5 MB. Committed ids andelementId()are unchanged, ids are never issued twice,
and a statement that fails inside a transaction that later commits keeps its bindings, as
before.
(*graph.Mapper).MaxNodeIDno longer counts holes trimmed from the end of a shard. - New keys interned after a large rollback no longer re-create the released id range in memory
(rmp #3121,54a2e218). Ids are never reissued, so the first keys after a rollback land past
the released range; that range was materialised again as holes, about 16 B per released id
(1000 creates after the cut above: 124.3 MB live). A shard now keeps such a run of holes at its
end in no memory, with the new keys held in small pages allocated on demand; the same 1000
creates leave 2.9 MB. Holes in the middle of a shard — nodes committed in the same shard while a
large statement was rolled back — still cost about 16 B per id.
Performance
Figures are development-time measurements recorded in the rmp task log of sprint 368 (#3119 to
#3121) on this code. They are not additive.
- The dense Mapper paths did not regress:
Resolve+0.9 % (p=0.089, not significant),
Walk−3.5 % (benchstat, 10 interleaved rounds;54a2e218). - Cost recorded: releasing the keys of an aborted transaction adds about 1.5 s to its
rollback per about 1.6 M released ids.
Further reading
- Narrative release notes:
release-notes/v0.17.1.md - Measured benchmark report:
docs/benchmarks/v0.17.1.md - Changelog file at this tag:
CHANGELOG.md - Commits in this release: https://github.com/FlavioCFOliveira/GoGraph/commits/v0.17.1
Reproducibility: built from commit 7e71665 with Go 1.26.