@@ -18,12 +18,13 @@ import (
1818)
1919
2020type peerRegistry struct {
21- underlays map [string ]libp2ppeer.ID // map overlay address to underlay peer id
22- overlays map [libp2ppeer.ID ]swarm.Address // map underlay peer id to overlay address
23- full map [libp2ppeer.ID ]bool // map to track whether a node is full or light node (true=full)
24- connections map [libp2ppeer.ID ]map [network.Conn ]struct {} // list of connections for safe removal on Disconnect notification
25- streams map [libp2ppeer.ID ]map [network.Stream ]context.CancelFunc
26- mu sync.RWMutex
21+ overlayToPeerID map [string ]libp2ppeer.ID // map overlay address to underlay peer id
22+ overlays map [libp2ppeer.ID ]swarm.Address // map underlay peer id to overlay address
23+ full map [libp2ppeer.ID ]bool // map to track whether a node is full or light node (true=full)
24+ bee260Compatibility map [libp2ppeer.ID ]bool // map to track bee260 backward compatibility
25+ connections map [libp2ppeer.ID ]map [network.Conn ]struct {} // list of connections for safe removal on Disconnect notification
26+ streams map [libp2ppeer.ID ]map [network.Stream ]context.CancelFunc
27+ mu sync.RWMutex
2728
2829 //nolint:misspell
2930 disconnecter disconnecter // peerRegistry notifies libp2p on peer disconnection
@@ -36,11 +37,12 @@ type disconnecter interface {
3637
3738func newPeerRegistry () * peerRegistry {
3839 return & peerRegistry {
39- underlays : make (map [string ]libp2ppeer.ID ),
40- overlays : make (map [libp2ppeer.ID ]swarm.Address ),
41- full : make (map [libp2ppeer.ID ]bool ),
42- connections : make (map [libp2ppeer.ID ]map [network.Conn ]struct {}),
43- streams : make (map [libp2ppeer.ID ]map [network.Stream ]context.CancelFunc ),
40+ overlayToPeerID : make (map [string ]libp2ppeer.ID ),
41+ overlays : make (map [libp2ppeer.ID ]swarm.Address ),
42+ full : make (map [libp2ppeer.ID ]bool ),
43+ bee260Compatibility : make (map [libp2ppeer.ID ]bool ),
44+ connections : make (map [libp2ppeer.ID ]map [network.Conn ]struct {}),
45+ streams : make (map [libp2ppeer.ID ]map [network.Stream ]context.CancelFunc ),
4446
4547 Notifiee : new (network.NoopNotifiee ),
4648 }
@@ -75,12 +77,13 @@ func (r *peerRegistry) Disconnected(_ network.Network, c network.Conn) {
7577 delete (r .connections , peerID )
7678 overlay := r .overlays [peerID ]
7779 delete (r .overlays , peerID )
78- delete (r .underlays , overlay .ByteString ())
80+ delete (r .overlayToPeerID , overlay .ByteString ())
7981 for _ , cancel := range r .streams [peerID ] {
8082 cancel ()
8183 }
8284 delete (r .streams , peerID )
8385 delete (r .full , peerID )
86+ delete (r .bee260Compatibility , peerID )
8487 r .mu .Unlock ()
8588 r .disconnecter .disconnected (overlay )
8689
@@ -143,12 +146,12 @@ func (r *peerRegistry) addIfNotExists(c network.Conn, overlay swarm.Address, ful
143146 // this is solving a case of multiple underlying libp2p connections for the same peer
144147 r.connections [peerID ][c ] = struct {}{}
145148
146- if _ , exists := r .underlays [overlay .ByteString ()]; exists {
149+ if _ , exists := r .overlayToPeerID [overlay .ByteString ()]; exists {
147150 return true
148151 }
149152
150153 r .streams [peerID ] = make (map [network.Stream ]context.CancelFunc )
151- r .underlays [overlay .ByteString ()] = peerID
154+ r .overlayToPeerID [overlay .ByteString ()] = peerID
152155 r .overlays [peerID ] = overlay
153156 r .full [peerID ] = full
154157 return false
@@ -157,7 +160,7 @@ func (r *peerRegistry) addIfNotExists(c network.Conn, overlay swarm.Address, ful
157160
158161func (r * peerRegistry ) peerID (overlay swarm.Address ) (peerID libp2ppeer.ID , found bool ) {
159162 r .mu .RLock ()
160- peerID , found = r .underlays [overlay .ByteString ()]
163+ peerID , found = r .overlayToPeerID [overlay .ByteString ()]
161164 r .mu .RUnlock ()
162165 return peerID , found
163166}
@@ -176,6 +179,19 @@ func (r *peerRegistry) fullnode(peerID libp2ppeer.ID) (bool, bool) {
176179 return full , found
177180}
178181
182+ func (r * peerRegistry ) bee260 (peerID libp2ppeer.ID ) (compat , found bool ) {
183+ r .mu .RLock ()
184+ defer r .mu .RUnlock ()
185+ compat , found = r .bee260Compatibility [peerID ]
186+ return compat , found
187+ }
188+
189+ func (r * peerRegistry ) setBee260 (peerID libp2ppeer.ID , compat bool ) {
190+ r .mu .Lock ()
191+ defer r .mu .Unlock ()
192+ r .bee260Compatibility [peerID ] = compat
193+ }
194+
179195func (r * peerRegistry ) isConnected (peerID libp2ppeer.ID , remoteAddr ma.Multiaddr ) (swarm.Address , bool ) {
180196 if remoteAddr == nil {
181197 return swarm .ZeroAddress , false
@@ -207,16 +223,17 @@ func (r *peerRegistry) isConnected(peerID libp2ppeer.ID, remoteAddr ma.Multiaddr
207223
208224func (r * peerRegistry ) remove (overlay swarm.Address ) (found , full bool , peerID libp2ppeer.ID ) {
209225 r .mu .Lock ()
210- peerID , found = r .underlays [overlay .ByteString ()]
226+ peerID , found = r .overlayToPeerID [overlay .ByteString ()]
211227 delete (r .overlays , peerID )
212- delete (r .underlays , overlay .ByteString ())
228+ delete (r .overlayToPeerID , overlay .ByteString ())
213229 delete (r .connections , peerID )
214230 for _ , cancel := range r .streams [peerID ] {
215231 cancel ()
216232 }
217233 delete (r .streams , peerID )
218234 full = r .full [peerID ]
219235 delete (r .full , peerID )
236+ delete (r .bee260Compatibility , peerID )
220237 r .mu .Unlock ()
221238
222239 return found , full , peerID
0 commit comments