fix(swarm): collect maddr by channel
License: MIT Signed-off-by: Overbool <overbool.xu@gmail.com>
Overbool committed
Oct 25, 2018 at 21:19 UTC
597bf2a481dff2e9ea6b8a1c27ed576c552f95e7
1 file changed
+21
-4
core/commands/swarm.go
+21
-4
@@ -7,7 +7,6 @@ import (
7
"io"
8
"path"
9
"sort"
10
- "strings"
10
"sync"
11
"time"
12
@@ -25,6 +24,7 @@ import (
24
pstore "github.com/libp2p/go-libp2p-peerstore"
25
swarm "github.com/libp2p/go-libp2p-swarm"
26
ma "github.com/multiformats/go-multiaddr"
27
+ madns "github.com/multiformats/go-multiaddr-dns"
28
mafilter "github.com/whyrusleeping/multiaddr-filter"
29
)
30
@@ -505,13 +505,27 @@ func resolveAddresses(addrs []string) ([]ma.Multiaddr, error) {
505
var wg sync.WaitGroup
506
resolveErrC := make(chan error, len(addrs))
507
508
+ maddrC := make(chan ma.Multiaddr)
509
+ go func() {
510
+ for {
511
+ select {
512
+ case maddr, ok := <-maddrC:
513
+ if !ok {
514
+ return
515
+ }
516
+ maddrs = append(maddrs, maddr)
517
+ }
518
+ }
519
+ }()
520
+
521
for _, addr := range addrs {
522
maddr, err := ma.NewMultiaddr(addr)
523
if err != nil {
524
return nil, err
525
}
526
+
527
// check whether address ends in `ipfs/Qm...`
514
- if _, err := maddr.ValueForProtocol(ma.P_IPFS); err != ma.ErrProtocolNotFound {
528
+ if _, last := ma.SplitLast(maddr); last.Protocol().Code == ma.P_IPFS {
529
maddrs = append(maddrs, maddr)
530
continue
531
}
@@ -531,14 +545,17 @@ func resolveAddresses(addrs []string) ([]ma.Multiaddr, error) {
545
}
546
// filter out addresses that still doesn't end in `ipfs/Qm...`
547
for _, raddr := range raddrs {
534
- if _, err := raddr.ValueForProtocol(ma.P_IPFS); err != ma.ErrProtocolNotFound {
535
- maddrs = append(maddrs, raddr)
548
+ if _, last := ma.SplitLast(raddr); last.Protocol().Code == ma.P_IPFS {
549
+ maddrC <- raddr
550
+ continue
551
}
552
}
553
}(maddr)
554
}
555
// wait for address resolving
556
wg.Wait()
557
+ // close the channel of collecting multiaddr
558
+ close(maddrC)
559
560
select {
561
case err := <-resolveErrC: