mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-28 08:47:42 +08:00
Merge pull request #5107 from ipfs/fix/5102
improve swarm connect/disconnect commands
This commit is contained in:
@ -18,8 +18,10 @@ import (
|
|||||||
mafilter "gx/ipfs/QmSMZwvs3n4GBikZ7hKzT17c3bk65FmyZo2JqtJ16swqCv/multiaddr-filter"
|
mafilter "gx/ipfs/QmSMZwvs3n4GBikZ7hKzT17c3bk65FmyZo2JqtJ16swqCv/multiaddr-filter"
|
||||||
swarm "gx/ipfs/QmSvhbgtjQJKdT5avEeb7cvjYs7YrhebJyM1K6GAnkKgfd/go-libp2p-swarm"
|
swarm "gx/ipfs/QmSvhbgtjQJKdT5avEeb7cvjYs7YrhebJyM1K6GAnkKgfd/go-libp2p-swarm"
|
||||||
ma "gx/ipfs/QmUxSEGbv2nmYNnfXi7839wwQqTN3kwQeUxe8dTjZWZs7J/go-multiaddr"
|
ma "gx/ipfs/QmUxSEGbv2nmYNnfXi7839wwQqTN3kwQeUxe8dTjZWZs7J/go-multiaddr"
|
||||||
|
peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer"
|
||||||
|
inet "gx/ipfs/QmXdgNhVEgjLxjUoMs5ViQL7pboAt3Y7V7eGHRiE4qrmTE/go-libp2p-net"
|
||||||
pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore"
|
pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore"
|
||||||
iaddr "gx/ipfs/QmckPUj15AbTcLh6MpDEsQpfVCx34tmP2Xg1aNwLb5fiRF/go-ipfs-addr"
|
iaddr "gx/ipfs/QmaKviZCLQrpuyFdSjteik7kJFcQpcyZgb1VuuwaCBBaEa/go-ipfs-addr"
|
||||||
cmdkit "gx/ipfs/QmdE4gMduCKCGAcczM2F5ioYDfdeKuPix138wrES1YSr7f/go-ipfs-cmdkit"
|
cmdkit "gx/ipfs/QmdE4gMduCKCGAcczM2F5ioYDfdeKuPix138wrES1YSr7f/go-ipfs-cmdkit"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -457,26 +459,38 @@ it will reconnect.
|
|||||||
output := make([]string, len(iaddrs))
|
output := make([]string, len(iaddrs))
|
||||||
for i, addr := range iaddrs {
|
for i, addr := range iaddrs {
|
||||||
taddr := addr.Transport()
|
taddr := addr.Transport()
|
||||||
output[i] = "disconnect " + addr.ID().Pretty()
|
id := addr.ID()
|
||||||
|
output[i] = "disconnect " + id.Pretty()
|
||||||
|
|
||||||
found := false
|
net := n.PeerHost.Network()
|
||||||
conns := n.PeerHost.Network().ConnsToPeer(addr.ID())
|
|
||||||
for _, conn := range conns {
|
|
||||||
if !conn.RemoteMultiaddr().Equal(taddr) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := conn.Close(); err != nil {
|
if taddr == nil {
|
||||||
|
if net.Connectedness(id) != inet.Connected {
|
||||||
|
output[i] += " failure: not connected"
|
||||||
|
} else if err := net.ClosePeer(id); err != nil {
|
||||||
output[i] += " failure: " + err.Error()
|
output[i] += " failure: " + err.Error()
|
||||||
} else {
|
} else {
|
||||||
output[i] += " success"
|
output[i] += " success"
|
||||||
}
|
}
|
||||||
found = true
|
} else {
|
||||||
break
|
found := false
|
||||||
}
|
for _, conn := range net.ConnsToPeer(id) {
|
||||||
|
if !conn.RemoteMultiaddr().Equal(taddr) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if !found {
|
if err := conn.Close(); err != nil {
|
||||||
output[i] += " failure: conn not found"
|
output[i] += " failure: " + err.Error()
|
||||||
|
} else {
|
||||||
|
output[i] += " success"
|
||||||
|
}
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
output[i] += " failure: conn not found"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res.SetOutput(&stringList{output})
|
res.SetOutput(&stringList{output})
|
||||||
@ -522,16 +536,27 @@ func parseAddresses(addrs []string) (iaddrs []iaddr.IPFSAddr, err error) {
|
|||||||
|
|
||||||
// peersWithAddresses is a function that takes in a slice of string peer addresses
|
// peersWithAddresses is a function that takes in a slice of string peer addresses
|
||||||
// (multiaddr + peerid) and returns a slice of properly constructed peers
|
// (multiaddr + peerid) and returns a slice of properly constructed peers
|
||||||
func peersWithAddresses(addrs []string) (pis []pstore.PeerInfo, err error) {
|
func peersWithAddresses(addrs []string) ([]pstore.PeerInfo, error) {
|
||||||
iaddrs, err := parseAddresses(addrs)
|
iaddrs, err := parseAddresses(addrs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
peers := make(map[peer.ID][]ma.Multiaddr, len(iaddrs))
|
||||||
for _, iaddr := range iaddrs {
|
for _, iaddr := range iaddrs {
|
||||||
|
id := iaddr.ID()
|
||||||
|
current, ok := peers[id]
|
||||||
|
if tpt := iaddr.Transport(); tpt != nil {
|
||||||
|
peers[id] = append(current, tpt)
|
||||||
|
} else if !ok {
|
||||||
|
peers[id] = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pis := make([]pstore.PeerInfo, 0, len(peers))
|
||||||
|
for id, maddrs := range peers {
|
||||||
pis = append(pis, pstore.PeerInfo{
|
pis = append(pis, pstore.PeerInfo{
|
||||||
ID: iaddr.ID(),
|
ID: id,
|
||||||
Addrs: []ma.Multiaddr{iaddr.Transport()},
|
Addrs: maddrs,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return pis, nil
|
return pis, nil
|
||||||
|
@ -404,9 +404,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "why",
|
"author": "why",
|
||||||
"hash": "QmckPUj15AbTcLh6MpDEsQpfVCx34tmP2Xg1aNwLb5fiRF",
|
"hash": "QmaKviZCLQrpuyFdSjteik7kJFcQpcyZgb1VuuwaCBBaEa",
|
||||||
"name": "go-ipfs-addr",
|
"name": "go-ipfs-addr",
|
||||||
"version": "0.1.12"
|
"version": "0.1.13"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "The Go Authors",
|
"author": "The Go Authors",
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
iaddr "gx/ipfs/QmckPUj15AbTcLh6MpDEsQpfVCx34tmP2Xg1aNwLb5fiRF/go-ipfs-addr"
|
iaddr "gx/ipfs/QmaKviZCLQrpuyFdSjteik7kJFcQpcyZgb1VuuwaCBBaEa/go-ipfs-addr"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DefaultBootstrapAddresses are the hardcoded bootstrap addresses
|
// DefaultBootstrapAddresses are the hardcoded bootstrap addresses
|
||||||
|
@ -97,4 +97,26 @@ test_expect_success "Addresses.NoAnnounce with /ipcidr affects addresses" '
|
|||||||
|
|
||||||
test_kill_ipfs_daemon
|
test_kill_ipfs_daemon
|
||||||
|
|
||||||
|
test_expect_success "set up tcp testbed" '
|
||||||
|
iptb init -n 2 -p 0 -f --bootstrap=none
|
||||||
|
'
|
||||||
|
|
||||||
|
startup_cluster 2
|
||||||
|
|
||||||
|
test_expect_success "disconnect work without specifying a transport address" '
|
||||||
|
[ $(ipfsi 0 swarm peers | wc -l) -eq 1 ] &&
|
||||||
|
ipfsi 0 swarm disconnect "/ipfs/$(iptb get id 1)" &&
|
||||||
|
[ $(ipfsi 0 swarm peers | wc -l) -eq 0 ]
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success "connect work without specifying a transport address" '
|
||||||
|
[ $(ipfsi 0 swarm peers | wc -l) -eq 0 ] &&
|
||||||
|
ipfsi 0 swarm connect "/ipfs/$(iptb get id 1)" &&
|
||||||
|
[ $(ipfsi 0 swarm peers | wc -l) -eq 1 ]
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success "stopping cluster" '
|
||||||
|
iptb stop
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Reference in New Issue
Block a user