Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - fix race in fptree (sync v2) #6792

Closed
wants to merge 1 commit into from

Conversation

poszu
Copy link
Contributor

@poszu poszu commented Mar 13, 2025

Motivation

Fix race condition in FPTree (sync v2).

Description

Race caught when syncing from scratch on a binary build with the race detector (-race flag). Example report:

==================
WARNING: DATA RACE
Write at 0x00c03a3258bc by goroutine 8553232:
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*rcPool[go.shape.struct { github.com/spacemeshos/go-spacemesh/sync2/fptree.fp github.com/spacemeshos/go-spacemesh/sync2/rangesync.Fingerprint; github.com/spacemeshos/go-spacemesh/sync2/fptree.c uint32; github.com/spacemeshos/go-spacemesh/sync2/fptree.l github.com/spacemeshos/go-spacemesh/sync2/fptree.nodeIndex; github.com/spacemeshos/go-spacemesh/sync2/fptree.r github.com/spacemeshos/go-spacemesh/sync2/fptree.nodeIndex },go.shape.uint32]).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/refcountpool.go:98 +0xc4
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:184 +0xb9
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:192 +0xee
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:189 +0xda
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:192 +0xee
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:189 +0xda
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:192 +0xee
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:192 +0xee
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:189 +0xda
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:189 +0xda
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:189 +0xda
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:189 +0xda
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:189 +0xda
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:192 +0xee
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:192 +0xee
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*FPTree).Release()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/fptree.go:430 +0xf9
  github.com/spacemeshos/go-spacemesh/sync2/dbset.(*DBSet).release()
      /home/bartosz/workspace/go-spacemesh/sync2/dbset/dbset.go:289 +0x6a
  github.com/spacemeshos/go-spacemesh/sync2/dbset.(*DBSet).WithCopy.deferwrap1()
      /home/bartosz/workspace/go-spacemesh/sync2/dbset/dbset.go:248 +0x1f
  runtime.deferreturn()
      /home/bartosz/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.1.linux-amd64/src/runtime/panic.go:610 +0x5d
  github.com/spacemeshos/go-spacemesh/sql.(*sqliteDatabase).WithConnection()
      /home/bartosz/workspace/go-spacemesh/sql/database.go:861 +0x288
  github.com/spacemeshos/go-spacemesh/sql/statesql.(*database).WithConnection()
      <autogenerated>:1 +0x4d
  github.com/spacemeshos/go-spacemesh/sync2/dbset.(*DBSet).WithCopy()
      /home/bartosz/workspace/go-spacemesh/sync2/dbset/dbset.go:251 +0x76e
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*SetSyncBase).syncPeer()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/setsyncbase.go:65 +0x1ec
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*SetSyncBase).Sync()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/setsyncbase.go:90 +0x211
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*splitSync).startPeerSync.func1()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/split_sync.go:89 +0x16a
  golang.org/x/sync/errgroup.(*Group).Go.func1()
      /home/bartosz/go/pkg/mod/golang.org/x/sync@v0.12.0/errgroup/errgroup.go:78 +0x91

Previous read at 0x00c03a3258bc by goroutine 8554412:
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*rcPool[go.shape.struct { github.com/spacemeshos/go-spacemesh/sync2/fptree.fp github.com/spacemeshos/go-spacemesh/sync2/rangesync.Fingerprint; github.com/spacemeshos/go-spacemesh/sync2/fptree.c uint32; github.com/spacemeshos/go-spacemesh/sync2/fptree.l github.com/spacemeshos/go-spacemesh/sync2/fptree.nodeIndex; github.com/spacemeshos/go-spacemesh/sync2/fptree.r github.com/spacemeshos/go-spacemesh/sync2/fptree.nodeIndex },go.shape.uint32]).entry()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/refcountpool.go:52 +0x67
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*rcPool[go.shape.struct { github.com/spacemeshos/go-spacemesh/sync2/fptree.fp github.com/spacemeshos/go-spacemesh/sync2/rangesync.Fingerprint; github.com/spacemeshos/go-spacemesh/sync2/fptree.c uint32; github.com/spacemeshos/go-spacemesh/sync2/fptree.l github.com/spacemeshos/go-spacemesh/sync2/fptree.nodeIndex; github.com/spacemeshos/go-spacemesh/sync2/fptree.r github.com/spacemeshos/go-spacemesh/sync2/fptree.nodeIndex },go.shape.uint32]).item()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/refcountpool.go:46 +0x64
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*nodePool).leaf()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/nodepool.go:137 +0x32
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*FPTree).followPrefix()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/fptree.go:645 +0x33c
  github.com/spacemeshos/go-spacemesh/sync2/fptree.(*FPTree).CheckKey()
      /home/bartosz/workspace/go-spacemesh/sync2/fptree/fptree.go:623 +0x12c
  github.com/spacemeshos/go-spacemesh/sync2/dbset.(*DBSet).Has()
      /home/bartosz/workspace/go-spacemesh/sync2/dbset/dbset.go:269 +0x78
  github.com/spacemeshos/go-spacemesh/sync2.(*ATXHandler).setupState-range1()
      /home/bartosz/workspace/go-spacemesh/sync2/atxs.go:73 +0x137
  github.com/spacemeshos/go-spacemesh/sync2/dbset.(*DBSet).Received.func1()
      /home/bartosz/workspace/go-spacemesh/sync2/dbset/dbset.go:89 +0xe7
  github.com/spacemeshos/go-spacemesh/sync2.(*ATXHandler).setupState()
      /home/bartosz/workspace/go-spacemesh/sync2/atxs.go:72 +0x34a
  github.com/spacemeshos/go-spacemesh/sync2.(*ATXHandler).Commit()
      /home/bartosz/workspace/go-spacemesh/sync2/atxs.go:135 +0x189
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*SetSyncBase).syncPeer()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/setsyncbase.go:79 +0x491
  github.com/spacemeshos/go-spacemesh/sql.(*sqliteDatabase).WithConnection()
      /home/bartosz/workspace/go-spacemesh/sql/database.go:861 +0x288
  github.com/spacemeshos/go-spacemesh/sql/statesql.(*database).WithConnection()
      <autogenerated>:1 +0x4d
  github.com/spacemeshos/go-spacemesh/sync2/dbset.(*DBSet).WithCopy()
      /home/bartosz/workspace/go-spacemesh/sync2/dbset/dbset.go:251 +0x76e
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*SetSyncBase).syncPeer()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/setsyncbase.go:65 +0x1ec
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*SetSyncBase).Sync()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/setsyncbase.go:90 +0x211
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*splitSync).startPeerSync.func1()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/split_sync.go:89 +0x16a
  golang.org/x/sync/errgroup.(*Group).Go.func1()
      /home/bartosz/go/pkg/mod/golang.org/x/sync@v0.12.0/errgroup/errgroup.go:78 +0x91

Goroutine 8553232 (running) created at:
  golang.org/x/sync/errgroup.(*Group).Go()
      /home/bartosz/go/pkg/mod/golang.org/x/sync@v0.12.0/errgroup/errgroup.go:75 +0x124
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*splitSync).startPeerSync()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/split_sync.go:88 +0x288
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*splitSync).Sync()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/split_sync.go:188 +0x3ea
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*runner).SplitSync()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/multipeer.go:46 +0x2a4
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*MultiPeerReconciler).syncOnce()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/multipeer.go:411 +0xfd2
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).SelectBestWithProtocols()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:166 +0x104
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*MultiPeerReconciler).syncOnce()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/multipeer.go:370 +0x1f1
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*MultiPeerReconciler).Run()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/multipeer.go:473 +0x127
  github.com/spacemeshos/go-spacemesh/sync2.(*P2PHashSync).start.func1.1()
      /home/bartosz/workspace/go-spacemesh/sync2/p2p.go:157 +0x109
  golang.org/x/sync/errgroup.(*Group).Go.func1()
      /home/bartosz/go/pkg/mod/golang.org/x/sync@v0.12.0/errgroup/errgroup.go:78 +0x91

Goroutine 8554412 (running) created at:
  golang.org/x/sync/errgroup.(*Group).Go()
      /home/bartosz/go/pkg/mod/golang.org/x/sync@v0.12.0/errgroup/errgroup.go:75 +0x124
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*splitSync).startPeerSync()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/split_sync.go:88 +0x288
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*splitSync).Sync()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/split_sync.go:188 +0x3ea
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*runner).SplitSync()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/multipeer.go:46 +0x2a4
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*MultiPeerReconciler).syncOnce()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/multipeer.go:411 +0xfd2
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).selectBest()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:180 +0x38f
  github.com/spacemeshos/go-spacemesh/fetch/peers.(*Peers).SelectBestWithProtocols()
      /home/bartosz/workspace/go-spacemesh/fetch/peers/peers.go:166 +0x104
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*MultiPeerReconciler).syncOnce()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/multipeer.go:370 +0x1f1
  github.com/spacemeshos/go-spacemesh/sync2/multipeer.(*MultiPeerReconciler).Run()
      /home/bartosz/workspace/go-spacemesh/sync2/multipeer/multipeer.go:473 +0x127
  github.com/spacemeshos/go-spacemesh/sync2.(*P2PHashSync).start.func1.1()
      /home/bartosz/workspace/go-spacemesh/sync2/p2p.go:157 +0x109
  golang.org/x/sync/errgroup.(*Group).Go.func1()
      /home/bartosz/go/pkg/mod/golang.org/x/sync@v0.12.0/errgroup/errgroup.go:78 +0x91
==================

Verified

This commit was signed with the committer’s verified signature.
coditva Utkarsh Maheshwari
Copy link

codecov bot commented Mar 13, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 76.9%. Comparing base (7a87af7) to head (f62b022).
Report is 1 commits behind head on develop.

✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff            @@
##           develop   #6792     +/-   ##
=========================================
- Coverage     76.9%   76.9%   -0.1%     
=========================================
  Files          369     369             
  Lines        50284   50286      +2     
=========================================
- Hits         38685   38674     -11     
- Misses        9390    9400     +10     
- Partials      2209    2212      +3     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@poszu
Copy link
Contributor Author

poszu commented Mar 14, 2025

Bors merge

spacemesh-bors bot pushed a commit that referenced this pull request Mar 14, 2025
## Motivation

Fix race condition in `FPTree` (sync v2).
@spacemesh-bors
Copy link

Pull request successfully merged into develop.

Build succeeded:

@spacemesh-bors spacemesh-bors bot changed the title fix race in fptree (sync v2) [Merged by Bors] - fix race in fptree (sync v2) Mar 14, 2025
@spacemesh-bors spacemesh-bors bot closed this Mar 14, 2025
@spacemesh-bors spacemesh-bors bot deleted the fix-race-in-syncv2 branch March 14, 2025 08:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants