• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

orneryd / NornicDB / 30370857083
89%

Build:
DEFAULT BRANCH: main
Ran 28 Jul 2026 03:09PM UTC
Jobs 1
Files 491
Run time 2min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

28 Jul 2026 02:56PM UTC coverage: 89.207% (+0.03%) from 89.179%
30370857083

push

github

orneryd
fix(storage): classify post-snapshot edge updates as retryable conflicts

Updating a relationship that a peer transaction committed after this
transaction began failed with a hard "not found" instead of a retryable
conflict, surfaced over Bolt as the non-retryable
Neo.ClientError.Statement.SyntaxError.

BadgerTransaction used two different visibility views for the same edge
inside one transaction. MERGE resolves an existing relationship through a
latest-committed lookup (GetEdgesBetween), but UpdateEdge read the same
edge through the begin-time snapshot (getCommittedEdgeLocked), which maps
ErrNotVisibleAtSnapshot to ErrNotFound. So a peer's post-begin commit of
the same relationship was found by the lookup and reported missing by the
update, failing MERGE ... SET in both the plain and UNWIND batch forms.

Neo4j does not behave this way. Verified against Neo4j 5.26.28: the same
interleaving succeeds outright (read-committed; MERGE takes exclusive
endpoint locks and re-MATCHes after locking), and with both transactions
open the second blocks on the relationship lock and then commits. Neo4j's
only sanctioned conflict failure here is a transient code that drivers
retry automatically. Returning a non-retryable client error defeats the
managed-transaction retry (session.ExecuteWrite) every Neo4j driver ships.

UpdateEdge now resolves through getCommittedEdgeForUpdateLocked, which
returns ErrConflict when the edge is invisible at the snapshot but live at
latest-committed state. That reuses the wire contract checkEdgeWriteConflict
already produces for the same race at commit time ("edge <id> changed after
transaction start" -> Neo.TransientError.Transaction.Outdated), so it
discloses nothing new -- it moves an existing sanctioned disclosure to
statement time. The node-side MERGE commit race is already reclassified the
same way; the edge-update path had simply never received it.

Read paths are untouched. getCommittedEdgeLocked keeps mapping
ErrNotVisibleAtSna... (continued)

24 of 26 new or added lines in 1 file covered. (92.31%)

7 existing lines in 4 files now uncovered.

147685 of 165554 relevant lines covered (89.21%)

1.05 hits per line

Uncovered Changes

Lines Coverage ∆ File
2
87.2
0.13% pkg/storage/badger_transaction.go

Coverage Regressions

Lines Coverage ∆ File
2
90.79
-0.66% pkg/cypher/optimized_executors.go
2
90.84
0.29% pkg/nornicdb/search_services.go
2
81.41
0.02% pkg/search/search.go
1
93.67
-0.14% pkg/nornicdb/embed_queue.go
Jobs
ID Job ID Ran Files Coverage
1 30370857083.1 28 Jul 2026 03:09PM UTC 491
89.21
GitHub Action Run
Source Files on build 30370857083
  • Tree
  • List 491
  • Changed 15
  • Source Changed 0
  • Coverage Changed 15
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • 36f2e532 on github
  • Prev Build on main (#30298294008)
  • Next Build on main (#30375186007)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc