Skip to content

v0.17.1

Choose a tag to compare

@github-actions github-actions released this 13 Oct 13:12
· 12 commits to main since this release

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 for CREATE () stayed in the Mapper, together with the transaction's write set,
    adjacency-version entries and unborn marks. A cut MATCH (a), (b), (c) CREATE () over 600
    nodes left the live heap at 1847.5 MB after runtime.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 and elementId() 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).MaxNodeID no 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


Reproducibility: built from commit 7e71665 with Go 1.26.