提交 597bf2a4 作者: Overbool 提交者: Steven Allen

fix(swarm): collect maddr by channel

License: MIT
Signed-off-by: 's avatarOverbool <overbool.xu@gmail.com>
上级 309cf705
...@@ -7,7 +7,6 @@ import ( ...@@ -7,7 +7,6 @@ import (
"io" "io"
"path" "path"
"sort" "sort"
"strings"
"sync" "sync"
"time" "time"
...@@ -25,6 +24,7 @@ import ( ...@@ -25,6 +24,7 @@ import (
pstore "github.com/libp2p/go-libp2p-peerstore" pstore "github.com/libp2p/go-libp2p-peerstore"
swarm "github.com/libp2p/go-libp2p-swarm" swarm "github.com/libp2p/go-libp2p-swarm"
ma "github.com/multiformats/go-multiaddr" ma "github.com/multiformats/go-multiaddr"
madns "github.com/multiformats/go-multiaddr-dns"
mafilter "github.com/whyrusleeping/multiaddr-filter" mafilter "github.com/whyrusleeping/multiaddr-filter"
) )
...@@ -505,13 +505,27 @@ func resolveAddresses(addrs []string) ([]ma.Multiaddr, error) { ...@@ -505,13 +505,27 @@ func resolveAddresses(addrs []string) ([]ma.Multiaddr, error) {
var wg sync.WaitGroup var wg sync.WaitGroup
resolveErrC := make(chan error, len(addrs)) resolveErrC := make(chan error, len(addrs))
maddrC := make(chan ma.Multiaddr)
go func() {
for {
select {
case maddr, ok := <-maddrC:
if !ok {
return
}
maddrs = append(maddrs, maddr)
}
}
}()
for _, addr := range addrs { for _, addr := range addrs {
maddr, err := ma.NewMultiaddr(addr) maddr, err := ma.NewMultiaddr(addr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// check whether address ends in `ipfs/Qm...` // check whether address ends in `ipfs/Qm...`
if _, err := maddr.ValueForProtocol(ma.P_IPFS); err != ma.ErrProtocolNotFound { if _, last := ma.SplitLast(maddr); last.Protocol().Code == ma.P_IPFS {
maddrs = append(maddrs, maddr) maddrs = append(maddrs, maddr)
continue continue
} }
...@@ -531,14 +545,17 @@ func resolveAddresses(addrs []string) ([]ma.Multiaddr, error) { ...@@ -531,14 +545,17 @@ func resolveAddresses(addrs []string) ([]ma.Multiaddr, error) {
} }
// filter out addresses that still doesn't end in `ipfs/Qm...` // filter out addresses that still doesn't end in `ipfs/Qm...`
for _, raddr := range raddrs { for _, raddr := range raddrs {
if _, err := raddr.ValueForProtocol(ma.P_IPFS); err != ma.ErrProtocolNotFound { if _, last := ma.SplitLast(raddr); last.Protocol().Code == ma.P_IPFS {
maddrs = append(maddrs, raddr) maddrC <- raddr
continue
} }
} }
}(maddr) }(maddr)
} }
// wait for address resolving // wait for address resolving
wg.Wait() wg.Wait()
// close the channel of collecting multiaddr
close(maddrC)
select { select {
case err := <-resolveErrC: case err := <-resolveErrC:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论