Skip to content

Commit d8de3c7

Browse files
authored
fix: topology bidder dedup checks wrong map, dropping bidders silently (#898)
The `add` method checked `t.providers` instead of `t.bidders` when deduplicating bidder connections. If a bidder's address existed in the provider map, the bidder was silently dropped and never added to the topology. This caused new provider broadcasts to reach an incomplete bidder list, requiring a bootnode restart for new providers to become visible to all bidders.
1 parent a331744 commit d8de3c7

2 files changed

Lines changed: 81 additions & 1 deletion

File tree

p2p/pkg/topology/topology.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func (t *Topology) add(p p2p.Peer) {
109109
t.providers[p.EthAddress] = p
110110
t.metrics.ConnectedProvidersCount.Inc()
111111
case p2p.PeerTypeBidder:
112-
if _, alreadyConnected := t.providers[p.EthAddress]; alreadyConnected {
112+
if _, alreadyConnected := t.bidders[p.EthAddress]; alreadyConnected {
113113
return
114114
}
115115
t.bidders[p.EthAddress] = p

p2p/pkg/topology/topology_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,83 @@ func TestTopology(t *testing.T) {
152152
t.Fatal("wrong peer in disconnect notification")
153153
}
154154
}
155+
156+
func TestBidderDedupChecksCorrectMap(t *testing.T) {
157+
t.Parallel()
158+
159+
notifier := &testNotifier{}
160+
topo := topology.New(&testAddressbook{}, notifier, util.NewTestLogger(io.Discard))
161+
162+
// Provider and bidder with the same eth address
163+
addr := common.HexToAddress("0xABC")
164+
165+
provider := p2p.Peer{EthAddress: addr, Type: p2p.PeerTypeProvider}
166+
bidder := p2p.Peer{EthAddress: addr, Type: p2p.PeerTypeBidder}
167+
168+
topo.Connected(provider)
169+
170+
// Before the fix, this bidder would be silently dropped because `add`
171+
// checked t.providers (wrong map) for the bidder dedup.
172+
topo.Connected(bidder)
173+
174+
providers := topo.GetPeers(topology.Query{Type: p2p.PeerTypeProvider})
175+
bidders := topo.GetPeers(topology.Query{Type: p2p.PeerTypeBidder})
176+
177+
if len(providers) != 1 {
178+
t.Fatalf("expected 1 provider, got %d", len(providers))
179+
}
180+
if len(bidders) != 1 {
181+
t.Fatalf("expected 1 bidder, got %d", len(bidders))
182+
}
183+
184+
// Duplicate bidder should be deduped
185+
topo.Connected(bidder)
186+
bidders = topo.GetPeers(topology.Query{Type: p2p.PeerTypeBidder})
187+
if len(bidders) != 1 {
188+
t.Fatalf("expected 1 bidder after duplicate connect, got %d", len(bidders))
189+
}
190+
}
191+
192+
func TestNewProviderBroadcastsToAllBidders(t *testing.T) {
193+
t.Parallel()
194+
195+
ann := &announcer{}
196+
notifier := &testNotifier{}
197+
topo := topology.New(&testAddressbook{}, notifier, util.NewTestLogger(io.Discard))
198+
topo.SetAnnouncer(ann)
199+
200+
// Connect 3 bidders first
201+
bidders := []p2p.Peer{
202+
{EthAddress: common.HexToAddress("0xB1"), Type: p2p.PeerTypeBidder},
203+
{EthAddress: common.HexToAddress("0xB2"), Type: p2p.PeerTypeBidder},
204+
{EthAddress: common.HexToAddress("0xB3"), Type: p2p.PeerTypeBidder},
205+
}
206+
for _, b := range bidders {
207+
topo.Connected(b)
208+
}
209+
210+
ann.mu.Lock()
211+
ann.broadcasts = nil // clear broadcasts from bidder connections
212+
ann.mu.Unlock()
213+
214+
// Now connect a new provider — it should be broadcast to all 3 bidders
215+
provider := p2p.Peer{EthAddress: common.HexToAddress("0xP1"), Type: p2p.PeerTypeProvider}
216+
topo.Connected(provider)
217+
218+
ann.mu.Lock()
219+
defer ann.mu.Unlock()
220+
221+
if len(ann.broadcasts) != 3 {
222+
t.Fatalf("expected new provider to be broadcast to 3 bidders, got %d", len(ann.broadcasts))
223+
}
224+
225+
broadcastAddrs := make(map[common.Address]bool)
226+
for _, b := range ann.broadcasts {
227+
broadcastAddrs[b.EthAddress] = true
228+
}
229+
for _, b := range bidders {
230+
if !broadcastAddrs[b.EthAddress] {
231+
t.Fatalf("bidder %s did not receive provider broadcast", b.EthAddress.Hex())
232+
}
233+
}
234+
}

0 commit comments

Comments
 (0)