From 38aeedfd0295c4d34ff2eb507dfe20707ad4fd51 Mon Sep 17 00:00:00 2001 From: Overbool Date: Thu, 25 Oct 2018 21:19:15 +0800 Subject: [PATCH] fix(swarm): collect maddr by channel License: MIT Signed-off-by: Overbool --- core/commands/swarm.go | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 7256c80cab33..c7010bc0200c 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -7,7 +7,6 @@ import ( "io" "path" "sort" - "strings" "sync" "time" @@ -19,6 +18,7 @@ import ( ma "gx/ipfs/QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1/go-multiaddr" inet "gx/ipfs/QmRKbEchaYADxSCyyjhDh4cTrUby8ftXUb8MRLBTHQYupw/go-libp2p-net" mafilter "gx/ipfs/QmSMZwvs3n4GBikZ7hKzT17c3bk65FmyZo2JqtJ16swqCv/multiaddr-filter" + madns "gx/ipfs/QmT4zgnKCyZBpRyxzsvZqUjzUkMWLJ2pZCw7uk6M6Kto5m/go-multiaddr-dns" iaddr "gx/ipfs/QmUSE3APe1pMFVsUBZUZaKQKERiPteCWvTAERtVQmtXzgE/go-ipfs-addr" pstore "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore" cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds" @@ -505,13 +505,27 @@ func resolveAddresses(addrs []string) ([]ma.Multiaddr, error) { var wg sync.WaitGroup 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 { maddr, err := ma.NewMultiaddr(addr) if err != nil { return nil, err } + // 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) continue } @@ -531,14 +545,17 @@ func resolveAddresses(addrs []string) ([]ma.Multiaddr, error) { } // filter out addresses that still doesn't end in `ipfs/Qm...` for _, raddr := range raddrs { - if _, err := raddr.ValueForProtocol(ma.P_IPFS); err != ma.ErrProtocolNotFound { - maddrs = append(maddrs, raddr) + if _, last := ma.SplitLast(raddr); last.Protocol().Code == ma.P_IPFS { + maddrC <- raddr + continue } } }(maddr) } // wait for address resolving wg.Wait() + // close the channel of collecting multiaddr + close(maddrC) select { case err := <-resolveErrC: