ipfs-cluster/peer_manager.go
Hector Sanjuan b852dfa892 Fix #219: WIP: Remove duplicate peer accounting
This change removes the duplicities of the PeerManager component:

* No more commiting PeerAdd and PeerRm log entries
* The Raft peer set is the source of truth
* Basic broadcasting is used to communicate peer multiaddresses
  in the cluster
* A peer can only be added in a healthy cluster
* A peer can be removed from any cluster which can still commit
* This also adds support for multiple multiaddresses per peer

License: MIT
Signed-off-by: Hector Sanjuan <hector@protocol.ai>
2017-11-08 20:04:04 +01:00

82 lines
1.8 KiB
Go

package ipfscluster
import (
"fmt"
host "github.com/libp2p/go-libp2p-host"
peer "github.com/libp2p/go-libp2p-peer"
peerstore "github.com/libp2p/go-libp2p-peerstore"
ma "github.com/multiformats/go-multiaddr"
)
// peerManager provides wrappers peerset control
type peerManager struct {
host host.Host
}
func newPeerManager(h host.Host) *peerManager {
return &peerManager{h}
}
func (pm *peerManager) addPeer(addr ma.Multiaddr) error {
logger.Debugf("adding peer address %s", addr)
pid, decapAddr, err := multiaddrSplit(addr)
if err != nil {
return err
}
pm.host.Peerstore().AddAddr(pid, decapAddr, peerstore.PermanentAddrTTL)
return nil
}
func (pm *peerManager) rmPeer(pid peer.ID) error {
logger.Debugf("forgetting peer %s", pid.Pretty())
pm.host.Peerstore().ClearAddrs(pid)
return nil
}
// func (pm *peerManager) savePeers() {
// peers := pm.peersAddrs()
// logger.Debugf("saving peers: %s", peers)
// pm.cluster.config.Peers = peers
// pm.cluster.config.NotifySave()
// }
// func (pm *peerManager) isPeer(p peer.ID) bool {
// if p == pm.cluster.id {
// return true
// }
// peers := pm.cluster.consensus.Peers()
// for _, pid := range peers {
// if p == pid {
// return true
// }
// }
// return false
// }
// cluster peer addresses (NOT including ourselves)
func (pm *peerManager) addresses(peers []peer.ID) []ma.Multiaddr {
addrs := []ma.Multiaddr{}
if peers == nil {
return addrs
}
for _, p := range peers {
if p == pm.host.ID() {
continue
}
peerAddr, _ := ma.NewMultiaddr(fmt.Sprintf("/ipfs/%s", peer.IDB58Encode(p)))
for _, a := range pm.host.Peerstore().Addrs(p) {
addrs = append(addrs, a.Encapsulate(peerAddr))
}
}
return addrs
}
func (pm *peerManager) importAddresses(addrs []ma.Multiaddr) error {
for _, a := range addrs {
pm.addPeer(a)
}
return nil
}