fix: watchMultiaddressChanges (#1093)

This commit is contained in:
frank 2024-04-18 19:21:31 +08:00 committed by GitHub
parent ea3f9d8d9d
commit 46e48044da
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 61 additions and 6 deletions

View File

@ -316,13 +316,13 @@ func (w *WakuNode) watchMultiaddressChanges(ctx context.Context) {
case <-ctx.Done():
return
case <-first:
addr := maps.Keys(addrsSet)
addr := maps.Values(addrsSet)
w.log.Info("listening", logging.MultiAddrs("multiaddr", addr...))
case <-w.addressChangesSub.Out():
newAddrs := utils.MultiAddrSet(w.ListenAddresses()...)
if !maps.Equal(addrsSet, newAddrs) {
if !utils.MultiAddrSetEquals(addrsSet, newAddrs) {
addrsSet = newAddrs
addrs := maps.Keys(addrsSet)
addrs := maps.Values(addrsSet)
w.log.Info("listening addresses update received", logging.MultiAddrs("multiaddr", addrs...))
err := w.setupENR(ctx, addrs)
if err != nil {

View File

@ -17,10 +17,23 @@ func EncapsulatePeerID(peerID peer.ID, addrs ...multiaddr.Multiaddr) []multiaddr
return result
}
func MultiAddrSet(addr ...multiaddr.Multiaddr) map[multiaddr.Multiaddr]struct{} {
r := make(map[multiaddr.Multiaddr]struct{})
func MultiAddrSetEquals(m1 map[string]multiaddr.Multiaddr, m2 map[string]multiaddr.Multiaddr) bool {
if len(m1) != len(m2) {
return false
}
for k1, v1 := range m1 {
v2, ok := m2[k1]
if !ok || !v1.Equal(v2) {
return false
}
}
return true
}
func MultiAddrSet(addr ...multiaddr.Multiaddr) map[string]multiaddr.Multiaddr {
r := make(map[string]multiaddr.Multiaddr)
for _, a := range addr {
r[a] = struct{}{}
r[a.String()] = a
}
return r
}

View File

@ -0,0 +1,42 @@
package utils
import (
"github.com/multiformats/go-multiaddr"
"github.com/stretchr/testify/require"
"golang.org/x/exp/maps"
"testing"
)
func TestMultiaddrAsKeyMap(t *testing.T) {
addr := "/ip4/127.0.0.1/tcp/63634/p2p/16Uiu2HAmJSLz9nyDMmjRpZzHAxMFiEUeszWgPReekzAroCgkTgbD"
m1 := make(map[multiaddr.Multiaddr]struct{})
mm1, err := multiaddr.NewMultiaddr(addr)
require.NoError(t, err)
m1[mm1] = struct{}{}
_, ok := m1[mm1]
require.True(t, ok)
mm2, err := multiaddr.NewMultiaddr(addr)
require.NoError(t, err)
_, ok = m1[mm2]
require.False(t, ok)
m2 := make(map[multiaddr.Multiaddr]struct{})
m2[mm2] = struct{}{}
require.False(t, maps.Equal(m1, m2))
}
func TestMultiAddrSetEquals(t *testing.T) {
addr := "/ip4/127.0.0.1/tcp/63634/p2p/16Uiu2HAmJSLz9nyDMmjRpZzHAxMFiEUeszWgPReekzAroCgkTgbD"
ma1, err := multiaddr.NewMultiaddr(addr)
require.NoError(t, err)
ma2, err := multiaddr.NewMultiaddr(addr)
require.NoError(t, err)
m1 := map[string]multiaddr.Multiaddr{
addr: ma1,
}
m2 := map[string]multiaddr.Multiaddr{
addr: ma2,
}
require.True(t, MultiAddrSetEquals(m1, m2))
}