@cryptotaxi247 / kubo / commits / 597bf2a48

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: