Merge branch 'master' into fix/expose-badger-conf
This commit is contained in:
commit
588596d28e
4
Makefile
4
Makefile
|
@ -75,9 +75,9 @@ test_problem: gx-deps
|
|||
|
||||
$(sharness):
|
||||
@echo "Downloading sharness"
|
||||
@curl -L -s -o sharness/lib/sharness.tar.gz http://github.com/chriscool/sharness/archive/master.tar.gz
|
||||
@curl -L -s -o sharness/lib/sharness.tar.gz http://github.com/chriscool/sharness/archive/8fa4b9b0465d21b7ec114ec4528fa17f5a6eb361.tar.gz
|
||||
@cd sharness/lib; tar -zxf sharness.tar.gz; cd ../..
|
||||
@mv sharness/lib/sharness-master sharness/lib/sharness
|
||||
@mv sharness/lib/sharness-8fa4b9b0465d21b7ec114ec4528fa17f5a6eb361 sharness/lib/sharness
|
||||
@rm sharness/lib/sharness.tar.gz
|
||||
|
||||
clean_sharness:
|
||||
|
|
|
@ -206,20 +206,23 @@ func (cfg *Config) LoadJSON(raw []byte) error {
|
|||
}
|
||||
|
||||
func (cfg *Config) applyJSONConfig(jcfg *jsonConfig) error {
|
||||
proxyAddr, err := ma.NewMultiaddr(jcfg.ListenMultiaddress)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error parsing proxy listen_multiaddress: %s", err)
|
||||
if jcfg.ListenMultiaddress != "" {
|
||||
proxyAddr, err := ma.NewMultiaddr(jcfg.ListenMultiaddress)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error parsing proxy listen_multiaddress: %s", err)
|
||||
}
|
||||
cfg.ListenAddr = proxyAddr
|
||||
}
|
||||
nodeAddr, err := ma.NewMultiaddr(jcfg.NodeMultiaddress)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error parsing ipfs node_multiaddress: %s", err)
|
||||
if jcfg.NodeMultiaddress != "" {
|
||||
nodeAddr, err := ma.NewMultiaddr(jcfg.NodeMultiaddress)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error parsing ipfs node_multiaddress: %s", err)
|
||||
}
|
||||
cfg.NodeAddr = nodeAddr
|
||||
}
|
||||
|
||||
cfg.ListenAddr = proxyAddr
|
||||
cfg.NodeAddr = nodeAddr
|
||||
config.SetIfNotDefault(jcfg.NodeHTTPS, &cfg.NodeHTTPS)
|
||||
|
||||
err = config.ParseDurations(
|
||||
err := config.ParseDurations(
|
||||
"ipfsproxy",
|
||||
&config.DurationOpt{Duration: jcfg.ReadTimeout, Dst: &cfg.ReadTimeout, Name: "read_timeout"},
|
||||
&config.DurationOpt{Duration: jcfg.ReadHeaderTimeout, Dst: &cfg.ReadHeaderTimeout, Name: "read_header_timeout"},
|
||||
|
|
|
@ -8,11 +8,10 @@ import (
|
|||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/ipfs/ipfs-cluster/api"
|
||||
|
||||
p2phttp "github.com/hsanjuan/go-libp2p-http"
|
||||
libp2p "github.com/libp2p/go-libp2p"
|
||||
ipnet "github.com/libp2p/go-libp2p-interface-pnet"
|
||||
peer "github.com/libp2p/go-libp2p-peer"
|
||||
peerstore "github.com/libp2p/go-libp2p-peerstore"
|
||||
pnet "github.com/libp2p/go-libp2p-pnet"
|
||||
madns "github.com/multiformats/go-multiaddr-dns"
|
||||
|
@ -41,11 +40,15 @@ func (c *defaultClient) defaultTransport() {
|
|||
func (c *defaultClient) enableLibp2p() error {
|
||||
c.defaultTransport()
|
||||
|
||||
pid, addr, err := api.Libp2pMultiaddrSplit(c.config.APIAddr)
|
||||
pinfo, err := peerstore.InfoFromP2pAddr(c.config.APIAddr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(pinfo.Addrs) == 0 {
|
||||
return errors.New("APIAddr only includes a Peer ID")
|
||||
}
|
||||
|
||||
var prot ipnet.Protector
|
||||
if c.config.ProtectorKey != nil && len(c.config.ProtectorKey) > 0 {
|
||||
if len(c.config.ProtectorKey) != 32 {
|
||||
|
@ -67,16 +70,16 @@ func (c *defaultClient) enableLibp2p() error {
|
|||
|
||||
ctx, cancel := context.WithTimeout(c.ctx, ResolveTimeout)
|
||||
defer cancel()
|
||||
resolvedAddrs, err := madns.Resolve(ctx, addr)
|
||||
resolvedAddrs, err := madns.Resolve(ctx, pinfo.Addrs[0])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
h.Peerstore().AddAddrs(pid, resolvedAddrs, peerstore.PermanentAddrTTL)
|
||||
h.Peerstore().AddAddrs(pinfo.ID, resolvedAddrs, peerstore.PermanentAddrTTL)
|
||||
c.transport.RegisterProtocol("libp2p", p2phttp.NewTransport(h))
|
||||
c.net = "libp2p"
|
||||
c.p2p = h
|
||||
c.hostname = pid.Pretty()
|
||||
c.hostname = peer.IDB58Encode(pinfo.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
12
api/types.go
12
api/types.go
|
@ -12,7 +12,6 @@ import (
|
|||
"encoding/json"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
@ -191,14 +190,13 @@ type IPFSPinStatus int
|
|||
// IPFSPinStatusFromString parses a string and returns the matching
|
||||
// IPFSPinStatus.
|
||||
func IPFSPinStatusFromString(t string) IPFSPinStatus {
|
||||
// Since indirect statuses are of the form "indirect through <cid>",
|
||||
// use a regexp to match
|
||||
var ind, _ = regexp.MatchString("^indirect", t)
|
||||
var rec, _ = regexp.MatchString("^recursive", t)
|
||||
// Since indirect statuses are of the form "indirect through <cid>"
|
||||
// use a prefix match
|
||||
|
||||
switch {
|
||||
case ind:
|
||||
case strings.HasPrefix(t, "indirect"):
|
||||
return IPFSPinStatusIndirect
|
||||
case rec:
|
||||
case strings.HasPrefix(t, "recursive"):
|
||||
// FIXME: Maxdepth?
|
||||
return IPFSPinStatusRecursive
|
||||
case t == "direct":
|
||||
|
|
|
@ -53,6 +53,12 @@ func TestIPFSPinStatusFromString(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func BenchmarkIPFSPinStatusFromString(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
IPFSPinStatusFromString("indirect")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMetric(t *testing.T) {
|
||||
m := Metric{
|
||||
Name: "hello",
|
||||
|
|
25
api/util.go
25
api/util.go
|
@ -1,8 +1,6 @@
|
|||
package api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
peer "github.com/libp2p/go-libp2p-peer"
|
||||
ma "github.com/multiformats/go-multiaddr"
|
||||
)
|
||||
|
@ -32,29 +30,6 @@ func StringsToPeers(strs []string) []peer.ID {
|
|||
return peers
|
||||
}
|
||||
|
||||
// Libp2pMultiaddrSplit takes a LibP2P multiaddress (/<multiaddr>/ipfs/<peerID>)
|
||||
// and decapsulates it, parsing the peer ID. Returns an error if there is
|
||||
// any problem (for example, the provided address not being a Libp2p one).
|
||||
func Libp2pMultiaddrSplit(addr ma.Multiaddr) (peer.ID, ma.Multiaddr, error) {
|
||||
pid, err := addr.ValueForProtocol(ma.P_IPFS)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("invalid peer multiaddress: %s: %s", addr, err)
|
||||
logger.Error(err)
|
||||
return "", nil, err
|
||||
}
|
||||
|
||||
ipfs, _ := ma.NewMultiaddr("/ipfs/" + pid)
|
||||
decapAddr := addr.Decapsulate(ipfs)
|
||||
|
||||
peerID, err := peer.IDB58Decode(pid)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("invalid peer ID in multiaddress: %s: %s", pid, err)
|
||||
logger.Error(err)
|
||||
return "", nil, err
|
||||
}
|
||||
return peerID, decapAddr, nil
|
||||
}
|
||||
|
||||
// MustLibp2pMultiaddrJoin takes a LibP2P multiaddress and a peer ID and
|
||||
// encapsulates a new /ipfs/<peerID> address. It will panic if the given
|
||||
// peer ID is bad.
|
||||
|
|
49
cluster.go
49
cluster.go
|
@ -24,6 +24,7 @@ import (
|
|||
host "github.com/libp2p/go-libp2p-host"
|
||||
dht "github.com/libp2p/go-libp2p-kad-dht"
|
||||
peer "github.com/libp2p/go-libp2p-peer"
|
||||
peerstore "github.com/libp2p/go-libp2p-peerstore"
|
||||
ma "github.com/multiformats/go-multiaddr"
|
||||
|
||||
ocgorpc "github.com/lanzafame/go-libp2p-ocgorpc"
|
||||
|
@ -36,7 +37,10 @@ import (
|
|||
// consensus layer.
|
||||
var ReadyTimeout = 30 * time.Second
|
||||
|
||||
var pingMetricName = "ping"
|
||||
const (
|
||||
pingMetricName = "ping"
|
||||
bootstrapCount = 3
|
||||
)
|
||||
|
||||
// Cluster is the main IPFS cluster component. It provides
|
||||
// the go-API for it and orchestrates the components that make up the system.
|
||||
|
@ -116,9 +120,7 @@ func NewCluster(
|
|||
|
||||
logger.Infof("IPFS Cluster v%s listening on:\n%s\n", version.Version, listenAddrs)
|
||||
|
||||
// Note, we already loaded peers from peerstore into the host
|
||||
// in daemon.go.
|
||||
peerManager := pstoremgr.New(host, cfg.GetPeerstorePath())
|
||||
peerManager := pstoremgr.New(ctx, host, cfg.GetPeerstorePath())
|
||||
|
||||
c := &Cluster{
|
||||
ctx: ctx,
|
||||
|
@ -144,6 +146,18 @@ func NewCluster(
|
|||
readyB: false,
|
||||
}
|
||||
|
||||
// Import known cluster peers from peerstore file. Set
|
||||
// a non permanent TTL.
|
||||
c.peerManager.ImportPeersFromPeerstore(false, peerstore.AddressTTL)
|
||||
// Attempt to connect to some peers (up to bootstrapCount)
|
||||
actualCount := c.peerManager.Bootstrap(bootstrapCount)
|
||||
// We cannot warn about this as this is normal if going to Join() later
|
||||
logger.Debugf("bootstrap count %d", actualCount)
|
||||
// Bootstrap the DHT now that we possibly have some connections
|
||||
c.dht.Bootstrap(c.ctx)
|
||||
|
||||
// After setupRPC components can do their tasks with a fully operative
|
||||
// routed libp2p host with some connections and a working DHT (hopefully).
|
||||
err = c.setupRPC()
|
||||
if err != nil {
|
||||
c.Shutdown(ctx)
|
||||
|
@ -465,9 +479,6 @@ This might be due to one or several causes:
|
|||
|
||||
// Cluster is ready.
|
||||
|
||||
// Bootstrap the DHT now that we possibly have some connections
|
||||
c.dht.Bootstrap(c.ctx)
|
||||
|
||||
peers, err := c.consensus.Peers(ctx)
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
|
@ -582,7 +593,6 @@ func (c *Cluster) Shutdown(ctx context.Context) error {
|
|||
}
|
||||
|
||||
c.cancel()
|
||||
c.host.Close() // Shutdown all network services
|
||||
c.wg.Wait()
|
||||
|
||||
// Cleanly close the datastore
|
||||
|
@ -633,12 +643,24 @@ func (c *Cluster) ID(ctx context.Context) *api.ID {
|
|||
peers, _ = c.consensus.Peers(ctx)
|
||||
}
|
||||
|
||||
clusterPeerInfos := c.peerManager.PeerInfos(peers)
|
||||
addresses := []api.Multiaddr{}
|
||||
for _, pinfo := range clusterPeerInfos {
|
||||
addrs, err := peerstore.InfoToP2pAddrs(&pinfo)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
for _, a := range addrs {
|
||||
addresses = append(addresses, api.NewMultiaddrWithValue(a))
|
||||
}
|
||||
}
|
||||
|
||||
return &api.ID{
|
||||
ID: c.id,
|
||||
//PublicKey: c.host.Peerstore().PubKey(c.id),
|
||||
Addresses: addrs,
|
||||
ClusterPeers: peers,
|
||||
ClusterPeersAddresses: c.peerManager.PeersAddresses(peers),
|
||||
ClusterPeersAddresses: addresses,
|
||||
Version: version.Version.String(),
|
||||
RPCProtocolVersion: version.RPCProtocol,
|
||||
IPFS: ipfsID,
|
||||
|
@ -721,20 +743,15 @@ func (c *Cluster) Join(ctx context.Context, addr ma.Multiaddr) error {
|
|||
|
||||
logger.Debugf("Join(%s)", addr)
|
||||
|
||||
pid, _, err := api.Libp2pMultiaddrSplit(addr)
|
||||
// Add peer to peerstore so we can talk to it (and connect)
|
||||
pid, err := c.peerManager.ImportPeer(addr, true, peerstore.PermanentAddrTTL)
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
return err
|
||||
}
|
||||
|
||||
// Bootstrap to myself
|
||||
if pid == c.id {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Add peer to peerstore so we can talk to it (and connect)
|
||||
c.peerManager.ImportPeer(addr, true)
|
||||
|
||||
// Note that PeerAdd() on the remote peer will
|
||||
// figure out what our real address is (obviously not
|
||||
// ListenAddr).
|
||||
|
|
|
@ -32,8 +32,18 @@ const (
|
|||
DefaultLeaveOnShutdown = false
|
||||
DefaultDisableRepinning = false
|
||||
DefaultPeerstoreFile = "peerstore"
|
||||
DefaultConnMgrHighWater = 400
|
||||
DefaultConnMgrLowWater = 100
|
||||
DefaultConnMgrGracePeriod = 2 * time.Minute
|
||||
)
|
||||
|
||||
// ConnMgrConfig configures the libp2p host connection manager.
|
||||
type ConnMgrConfig struct {
|
||||
HighWater int
|
||||
LowWater int
|
||||
GracePeriod time.Duration
|
||||
}
|
||||
|
||||
// Config is the configuration object containing customizable variables to
|
||||
// initialize the main ipfs-cluster component. It implements the
|
||||
// config.ComponentConfig interface.
|
||||
|
@ -62,6 +72,10 @@ type Config struct {
|
|||
// the RPC and Consensus components.
|
||||
ListenAddr ma.Multiaddr
|
||||
|
||||
// ConnMgr holds configuration values for the connection manager
|
||||
// for the libp2p host.
|
||||
ConnMgr ConnMgrConfig
|
||||
|
||||
// Time between syncs of the consensus state to the
|
||||
// tracker state. Normally states are synced anyway, but this helps
|
||||
// when new nodes are joining the cluster. Reduce for faster
|
||||
|
@ -123,20 +137,28 @@ type Config struct {
|
|||
// saved using JSON. Most configuration keys are converted into simple types
|
||||
// like strings, and key names aim to be self-explanatory for the user.
|
||||
type configJSON struct {
|
||||
ID string `json:"id,omitempty"`
|
||||
Peername string `json:"peername"`
|
||||
PrivateKey string `json:"private_key,omitempty"`
|
||||
Secret string `json:"secret"`
|
||||
LeaveOnShutdown bool `json:"leave_on_shutdown"`
|
||||
ListenMultiaddress string `json:"listen_multiaddress"`
|
||||
StateSyncInterval string `json:"state_sync_interval"`
|
||||
IPFSSyncInterval string `json:"ipfs_sync_interval"`
|
||||
ReplicationFactorMin int `json:"replication_factor_min"`
|
||||
ReplicationFactorMax int `json:"replication_factor_max"`
|
||||
MonitorPingInterval string `json:"monitor_ping_interval"`
|
||||
PeerWatchInterval string `json:"peer_watch_interval"`
|
||||
DisableRepinning bool `json:"disable_repinning"`
|
||||
PeerstoreFile string `json:"peerstore_file,omitempty"`
|
||||
ID string `json:"id,omitempty"`
|
||||
Peername string `json:"peername"`
|
||||
PrivateKey string `json:"private_key,omitempty"`
|
||||
Secret string `json:"secret"`
|
||||
LeaveOnShutdown bool `json:"leave_on_shutdown"`
|
||||
ListenMultiaddress string `json:"listen_multiaddress"`
|
||||
ConnectionManager *connMgrConfigJSON `json:"connection_manager"`
|
||||
StateSyncInterval string `json:"state_sync_interval"`
|
||||
IPFSSyncInterval string `json:"ipfs_sync_interval"`
|
||||
ReplicationFactorMin int `json:"replication_factor_min"`
|
||||
ReplicationFactorMax int `json:"replication_factor_max"`
|
||||
MonitorPingInterval string `json:"monitor_ping_interval"`
|
||||
PeerWatchInterval string `json:"peer_watch_interval"`
|
||||
DisableRepinning bool `json:"disable_repinning"`
|
||||
PeerstoreFile string `json:"peerstore_file,omitempty"`
|
||||
}
|
||||
|
||||
// connMgrConfigJSON configures the libp2p host connection manager.
|
||||
type connMgrConfigJSON struct {
|
||||
HighWater int `json:"high_water"`
|
||||
LowWater int `json:"low_water"`
|
||||
GracePeriod string `json:"grace_period"`
|
||||
}
|
||||
|
||||
// ConfigKey returns a human-readable string to identify
|
||||
|
@ -185,6 +207,22 @@ func (cfg *Config) Validate() error {
|
|||
return errors.New("cluster.listen_multiaddress is undefined")
|
||||
}
|
||||
|
||||
if cfg.ConnMgr.LowWater <= 0 {
|
||||
return errors.New("cluster.connection_manager.low_water is invalid")
|
||||
}
|
||||
|
||||
if cfg.ConnMgr.HighWater <= 0 {
|
||||
return errors.New("cluster.connection_manager.high_water is invalid")
|
||||
}
|
||||
|
||||
if cfg.ConnMgr.LowWater > cfg.ConnMgr.HighWater {
|
||||
return errors.New("cluster.connection_manager.low_water is greater than high_water")
|
||||
}
|
||||
|
||||
if cfg.ConnMgr.GracePeriod == 0 {
|
||||
return errors.New("cluster.connection_manager.grace_period is invalid")
|
||||
}
|
||||
|
||||
if cfg.StateSyncInterval <= 0 {
|
||||
return errors.New("cluster.state_sync_interval is invalid")
|
||||
}
|
||||
|
@ -273,6 +311,11 @@ func (cfg *Config) setDefaults() {
|
|||
|
||||
addr, _ := ma.NewMultiaddr(DefaultListenAddr)
|
||||
cfg.ListenAddr = addr
|
||||
cfg.ConnMgr = ConnMgrConfig{
|
||||
HighWater: DefaultConnMgrHighWater,
|
||||
LowWater: DefaultConnMgrLowWater,
|
||||
GracePeriod: DefaultConnMgrGracePeriod,
|
||||
}
|
||||
cfg.LeaveOnShutdown = DefaultLeaveOnShutdown
|
||||
cfg.StateSyncInterval = DefaultStateSyncInterval
|
||||
cfg.IPFSSyncInterval = DefaultIPFSSyncInterval
|
||||
|
@ -320,6 +363,19 @@ func (cfg *Config) applyConfigJSON(jcfg *configJSON) error {
|
|||
}
|
||||
cfg.ListenAddr = clusterAddr
|
||||
|
||||
if conman := jcfg.ConnectionManager; conman != nil {
|
||||
cfg.ConnMgr = ConnMgrConfig{
|
||||
HighWater: jcfg.ConnectionManager.HighWater,
|
||||
LowWater: jcfg.ConnectionManager.LowWater,
|
||||
}
|
||||
err = config.ParseDurations("cluster",
|
||||
&config.DurationOpt{Duration: jcfg.ConnectionManager.GracePeriod, Dst: &cfg.ConnMgr.GracePeriod, Name: "connection_manager.grace_period"},
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
rplMin := jcfg.ReplicationFactorMin
|
||||
rplMax := jcfg.ReplicationFactorMax
|
||||
config.SetIfNotDefault(rplMin, &cfg.ReplicationFactorMin)
|
||||
|
@ -369,6 +425,11 @@ func (cfg *Config) toConfigJSON() (jcfg *configJSON, err error) {
|
|||
jcfg.ReplicationFactorMax = cfg.ReplicationFactorMax
|
||||
jcfg.LeaveOnShutdown = cfg.LeaveOnShutdown
|
||||
jcfg.ListenMultiaddress = cfg.ListenAddr.String()
|
||||
jcfg.ConnectionManager = &connMgrConfigJSON{
|
||||
HighWater: cfg.ConnMgr.HighWater,
|
||||
LowWater: cfg.ConnMgr.LowWater,
|
||||
GracePeriod: cfg.ConnMgr.GracePeriod.String(),
|
||||
}
|
||||
jcfg.StateSyncInterval = cfg.StateSyncInterval.String()
|
||||
jcfg.IPFSSyncInterval = cfg.IPFSSyncInterval.String()
|
||||
jcfg.MonitorPingInterval = cfg.MonitorPingInterval.String()
|
||||
|
|
|
@ -4,15 +4,19 @@ import (
|
|||
"encoding/json"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
var ccfgTestJSON = []byte(`
|
||||
{
|
||||
"id": "QmUfSFm12eYCaRdypg48m8RqkXfLW7A2ZeGZb2skeHHDGA",
|
||||
"peername": "testpeer",
|
||||
"private_key": "CAASqAkwggSkAgEAAoIBAQDpT16IRF6bb9tHsCbQ7M+nb2aI8sz8xyt8PoAWM42ki+SNoESIxKb4UhFxixKvtEdGxNE6aUUVc8kFk6wTStJ/X3IGiMetwkXiFiUxabUF/8A6SyvnSVDm+wFuavugpVrZikjLcfrf2xOVgnG3deQQvd/qbAv14jTwMFl+T+8d/cXBo8Mn/leLZCQun/EJEnkXP5MjgNI8XcWUE4NnH3E0ESSm6Pkm8MhMDZ2fmzNgqEyJ0GVinNgSml3Pyha3PBSj5LRczLip/ie4QkKx5OHvX2L3sNv/JIUHse5HSbjZ1c/4oGCYMVTYCykWiczrxBUOlcr8RwnZLOm4n2bCt5ZhAgMBAAECggEAVkePwfzmr7zR7tTpxeGNeXHtDUAdJm3RWwUSASPXgb5qKyXVsm5nAPX4lXDE3E1i/nzSkzNS5PgIoxNVU10cMxZs6JW0okFx7oYaAwgAddN6lxQtjD7EuGaixN6zZ1k/G6vT98iS6i3uNCAlRZ9HVBmjsOF8GtYolZqLvfZ5izEVFlLVq/BCs7Y5OrDrbGmn3XupfitVWYExV0BrHpobDjsx2fYdTZkmPpSSvXNcm4Iq2AXVQzoqAfGo7+qsuLCZtVlyTfVKQjMvE2ffzN1dQunxixOvev/fz4WSjGnRpC6QLn6Oqps9+VxQKqKuXXqUJC+U45DuvA94Of9MvZfAAQKBgQD7xmXueXRBMr2+0WftybAV024ap0cXFrCAu+KWC1SUddCfkiV7e5w+kRJx6RH1cg4cyyCL8yhHZ99Z5V0Mxa/b/usuHMadXPyX5szVI7dOGgIC9q8IijN7B7GMFAXc8+qC7kivehJzjQghpRRAqvRzjDls4gmbNPhbH1jUiU124QKBgQDtOaW5/fOEtOq0yWbDLkLdjImct6oKMLhENL6yeIKjMYgifzHb2adk7rWG3qcMrdgaFtDVfqv8UmMEkzk7bSkovMVj3SkLzMz84ii1SkSfyaCXgt/UOzDkqAUYB0cXMppYA7jxHa2OY8oEHdBgmyJXdLdzJxCp851AoTlRUSePgQKBgQCQgKgUHOUaXnMEx88sbOuBO14gMg3dNIqM+Ejt8QbURmI8k3arzqA4UK8Tbb9+7b0nzXWanS5q/TT1tWyYXgW28DIuvxlHTA01aaP6WItmagrphIelERzG6f1+9ib/T4czKmvROvDIHROjq8lZ7ERs5Pg4g+sbh2VbdzxWj49EQQKBgFEna36ZVfmMOs7mJ3WWGeHY9ira2hzqVd9fe+1qNKbHhx7mDJR9fTqWPxuIh/Vac5dZPtAKqaOEO8OQ6f9edLou+ggT3LrgsS/B3tNGOPvA6mNqrk/Yf/15TWTO+I8DDLIXc+lokbsogC+wU1z5NWJd13RZZOX/JUi63vTmonYBAoGBAIpglLCH2sPXfmguO6p8QcQcv4RjAU1c0GP4P5PNN3Wzo0ItydVd2LHJb6MdmL6ypeiwNklzPFwTeRlKTPmVxJ+QPg1ct/3tAURN/D40GYw9ojDhqmdSl4HW4d6gHS2lYzSFeU5jkG49y5nirOOoEgHy95wghkh6BfpwHujYJGw4",
|
||||
"secret": "2588b80d5cb05374fa142aed6cbb047d1f4ef8ef15e37eba68c65b9d30df67ed",
|
||||
"leave_on_shutdown": true,
|
||||
"connection_manager": {
|
||||
"high_water": 501,
|
||||
"low_water": 500,
|
||||
"grace_period": "100m0s"
|
||||
},
|
||||
"listen_multiaddress": "/ip4/127.0.0.1/tcp/10000",
|
||||
"state_sync_interval": "1m0s",
|
||||
"ipfs_sync_interval": "2m10s",
|
||||
|
@ -24,13 +28,13 @@ var ccfgTestJSON = []byte(`
|
|||
`)
|
||||
|
||||
func TestLoadJSON(t *testing.T) {
|
||||
loadJSON := func(t *testing.T) (*Config, error) {
|
||||
loadJSON := func(t *testing.T) *Config {
|
||||
cfg := &Config{}
|
||||
err := cfg.LoadJSON(ccfgTestJSON)
|
||||
if err != nil {
|
||||
return cfg, err
|
||||
t.Fatal(err)
|
||||
}
|
||||
return cfg, nil
|
||||
return cfg
|
||||
}
|
||||
|
||||
t.Run("basic", func(t *testing.T) {
|
||||
|
@ -42,35 +46,39 @@ func TestLoadJSON(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("peername", func(t *testing.T) {
|
||||
cfg, err := loadJSON(t)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
cfg := loadJSON(t)
|
||||
if cfg.Peername != "testpeer" {
|
||||
t.Error("expected peername 'testpeer'")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("expected replication factor", func(t *testing.T) {
|
||||
cfg, err := loadJSON(t)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
cfg := loadJSON(t)
|
||||
if cfg.ReplicationFactorMin != 5 {
|
||||
t.Error("expected replication factor min == 5")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("expected disable_repinning", func(t *testing.T) {
|
||||
cfg, err := loadJSON(t)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
cfg := loadJSON(t)
|
||||
if !cfg.DisableRepinning {
|
||||
t.Error("expected disable_repinning to be true")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("expected connection_manager", func(t *testing.T) {
|
||||
cfg := loadJSON(t)
|
||||
if cfg.ConnMgr.LowWater != 500 {
|
||||
t.Error("expected low_water to be 500")
|
||||
}
|
||||
if cfg.ConnMgr.HighWater != 501 {
|
||||
t.Error("expected high_water to be 501")
|
||||
}
|
||||
if cfg.ConnMgr.GracePeriod != 100*time.Minute {
|
||||
t.Error("expected grace_period to be 100m")
|
||||
}
|
||||
})
|
||||
|
||||
loadJSON2 := func(t *testing.T, f func(j *configJSON)) (*Config, error) {
|
||||
cfg := &Config{}
|
||||
j := &configJSON{}
|
||||
|
@ -162,6 +170,21 @@ func TestLoadJSON(t *testing.T) {
|
|||
t.Error("expected default replication factors")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("conn manager default", func(t *testing.T) {
|
||||
cfg, err := loadJSON2(
|
||||
t,
|
||||
func(j *configJSON) {
|
||||
j.ConnectionManager = nil
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if cfg.ConnMgr.LowWater != DefaultConnMgrLowWater {
|
||||
t.Error("default conn manager values not set")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestToJSON(t *testing.T) {
|
||||
|
@ -217,4 +240,10 @@ func TestValidate(t *testing.T) {
|
|||
if cfg.Validate() == nil {
|
||||
t.Fatal("expected error validating")
|
||||
}
|
||||
|
||||
cfg.Default()
|
||||
cfg.ConnMgr.GracePeriod = 0
|
||||
if cfg.Validate() == nil {
|
||||
t.Fatal("expected error validating")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
|
||||
"github.com/ipfs/ipfs-cluster/config"
|
||||
libp2p "github.com/libp2p/go-libp2p"
|
||||
connmgr "github.com/libp2p/go-libp2p-connmgr"
|
||||
crypto "github.com/libp2p/go-libp2p-crypto"
|
||||
host "github.com/libp2p/go-libp2p-host"
|
||||
ipnet "github.com/libp2p/go-libp2p-interface-pnet"
|
||||
|
@ -25,12 +26,15 @@ func NewClusterHost(
|
|||
cfg *Config,
|
||||
) (host.Host, *pubsub.PubSub, *dht.IpfsDHT, error) {
|
||||
|
||||
connman := connmgr.NewConnManager(cfg.ConnMgr.LowWater, cfg.ConnMgr.HighWater, cfg.ConnMgr.GracePeriod)
|
||||
|
||||
h, err := newHost(
|
||||
ctx,
|
||||
cfg.Secret,
|
||||
ident.PrivateKey,
|
||||
libp2p.ListenAddrs(cfg.ListenAddr),
|
||||
libp2p.NATPortMap(),
|
||||
libp2p.ConnectionManager(connman),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
|
|
|
@ -29,7 +29,7 @@ const programName = `ipfs-cluster-ctl`
|
|||
|
||||
// Version is the cluster-ctl tool version. It should match
|
||||
// the IPFS cluster's version
|
||||
const Version = "0.10.1"
|
||||
const Version = "0.11.0-rc1"
|
||||
|
||||
var (
|
||||
defaultHost = "/ip4/127.0.0.1/tcp/9094"
|
||||
|
|
|
@ -23,7 +23,6 @@ import (
|
|||
"github.com/ipfs/ipfs-cluster/observations"
|
||||
"github.com/ipfs/ipfs-cluster/pintracker/maptracker"
|
||||
"github.com/ipfs/ipfs-cluster/pintracker/stateless"
|
||||
"github.com/ipfs/ipfs-cluster/pstoremgr"
|
||||
"go.opencensus.io/tag"
|
||||
|
||||
ds "github.com/ipfs/go-datastore"
|
||||
|
@ -51,7 +50,6 @@ func daemon(c *cli.Context) error {
|
|||
logger.Info("Initializing. For verbose output run with \"-l debug\". Please wait...")
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
bootstraps := parseBootstraps(c.StringSlice("bootstrap"))
|
||||
|
||||
|
@ -81,7 +79,10 @@ func daemon(c *cli.Context) error {
|
|||
cfgs.clusterCfg.LeaveOnShutdown = true
|
||||
}
|
||||
|
||||
cluster, err := createCluster(ctx, c, ident, cfgs, raftStaging)
|
||||
host, pubsub, dht, err := ipfscluster.NewClusterHost(ctx, ident, cfgs.clusterCfg)
|
||||
checkErr("creating libp2p host", err)
|
||||
|
||||
cluster, err := createCluster(ctx, c, host, pubsub, dht, ident, cfgs, raftStaging)
|
||||
checkErr("starting cluster", err)
|
||||
|
||||
// noop if no bootstraps
|
||||
|
@ -91,7 +92,7 @@ func daemon(c *cli.Context) error {
|
|||
// will realize).
|
||||
go bootstrap(ctx, cluster, bootstraps)
|
||||
|
||||
return handleSignals(ctx, cluster)
|
||||
return handleSignals(ctx, cancel, cluster, host, dht)
|
||||
}
|
||||
|
||||
// createCluster creates all the necessary things to produce the cluster
|
||||
|
@ -100,24 +101,17 @@ func daemon(c *cli.Context) error {
|
|||
func createCluster(
|
||||
ctx context.Context,
|
||||
c *cli.Context,
|
||||
host host.Host,
|
||||
pubsub *pubsub.PubSub,
|
||||
dht *dht.IpfsDHT,
|
||||
ident *config.Identity,
|
||||
cfgs *cfgs,
|
||||
raftStaging bool,
|
||||
) (*ipfscluster.Cluster, error) {
|
||||
|
||||
host, pubsub, dht, err := ipfscluster.NewClusterHost(ctx, ident, cfgs.clusterCfg)
|
||||
checkErr("creating libP2P Host", err)
|
||||
|
||||
ctx, err = tag.New(ctx, tag.Upsert(observations.HostKey, host.ID().Pretty()))
|
||||
ctx, err := tag.New(ctx, tag.Upsert(observations.HostKey, host.ID().Pretty()))
|
||||
checkErr("tag context with host id", err)
|
||||
|
||||
peerstoreMgr := pstoremgr.New(host, cfgs.clusterCfg.GetPeerstorePath())
|
||||
// Import peers but do not connect. We cannot connect to peers until
|
||||
// everything has been created (dht, pubsub, bitswap). Otherwise things
|
||||
// fail.
|
||||
// Connections will happen as needed during bootstrap, rpc etc.
|
||||
peerstoreMgr.ImportPeersFromPeerstore(false)
|
||||
|
||||
api, err := rest.NewAPIWithHost(ctx, cfgs.apiCfg, host)
|
||||
checkErr("creating REST API component", err)
|
||||
|
||||
|
@ -207,7 +201,13 @@ func bootstrap(ctx context.Context, cluster *ipfscluster.Cluster, bootstraps []m
|
|||
}
|
||||
}
|
||||
|
||||
func handleSignals(ctx context.Context, cluster *ipfscluster.Cluster) error {
|
||||
func handleSignals(
|
||||
ctx context.Context,
|
||||
cancel context.CancelFunc,
|
||||
cluster *ipfscluster.Cluster,
|
||||
host host.Host,
|
||||
dht *dht.IpfsDHT,
|
||||
) error {
|
||||
signalChan := make(chan os.Signal, 20)
|
||||
signal.Notify(
|
||||
signalChan,
|
||||
|
@ -223,6 +223,9 @@ func handleSignals(ctx context.Context, cluster *ipfscluster.Cluster) error {
|
|||
ctrlcCount++
|
||||
handleCtrlC(ctx, cluster, ctrlcCount)
|
||||
case <-cluster.Done():
|
||||
cancel()
|
||||
dht.Close()
|
||||
host.Close()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ func (raftsm *raftStateManager) ImportState(r io.Reader) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pm := pstoremgr.New(nil, raftsm.cfgs.clusterCfg.GetPeerstorePath())
|
||||
pm := pstoremgr.New(context.Background(), nil, raftsm.cfgs.clusterCfg.GetPeerstorePath())
|
||||
raftPeers := append(
|
||||
ipfscluster.PeersFromMultiaddrs(pm.LoadPeerstore()),
|
||||
raftsm.ident.ID,
|
||||
|
|
|
@ -26,6 +26,11 @@ var testingClusterCfg = []byte(`{
|
|||
"secret": "2588b80d5cb05374fa142aed6cbb047d1f4ef8ef15e37eba68c65b9d30df67ed",
|
||||
"leave_on_shutdown": false,
|
||||
"listen_multiaddress": "/ip4/127.0.0.1/tcp/10000",
|
||||
"connection_manager": {
|
||||
"high_water": 400,
|
||||
"low_water": 200,
|
||||
"grace_period": "2m0s"
|
||||
},
|
||||
"state_sync_interval": "1m0s",
|
||||
"ipfs_sync_interval": "2m10s",
|
||||
"replication_factor": -1,
|
||||
|
|
|
@ -6,29 +6,36 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
ipfslite "github.com/hsanjuan/ipfs-lite"
|
||||
dshelp "github.com/ipfs/go-ipfs-ds-help"
|
||||
"github.com/ipfs/ipfs-cluster/api"
|
||||
"github.com/ipfs/ipfs-cluster/pstoremgr"
|
||||
"github.com/ipfs/ipfs-cluster/state"
|
||||
"github.com/ipfs/ipfs-cluster/state/dsstate"
|
||||
multihash "github.com/multiformats/go-multihash"
|
||||
|
||||
ds "github.com/ipfs/go-datastore"
|
||||
"github.com/ipfs/go-datastore/namespace"
|
||||
query "github.com/ipfs/go-datastore/query"
|
||||
crdt "github.com/ipfs/go-ds-crdt"
|
||||
dshelp "github.com/ipfs/go-ipfs-ds-help"
|
||||
logging "github.com/ipfs/go-log"
|
||||
|
||||
rpc "github.com/libp2p/go-libp2p-gorpc"
|
||||
host "github.com/libp2p/go-libp2p-host"
|
||||
dht "github.com/libp2p/go-libp2p-kad-dht"
|
||||
peer "github.com/libp2p/go-libp2p-peer"
|
||||
peerstore "github.com/libp2p/go-libp2p-peerstore"
|
||||
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
||||
|
||||
multihash "github.com/multiformats/go-multihash"
|
||||
|
||||
ipfslite "github.com/hsanjuan/ipfs-lite"
|
||||
"go.opencensus.io/trace"
|
||||
)
|
||||
|
||||
var logger = logging.Logger("crdt")
|
||||
|
||||
var (
|
||||
blocksNs = "b" // blockstore namespace
|
||||
blocksNs = "b" // blockstore namespace
|
||||
connMgrTag = "crdt"
|
||||
)
|
||||
|
||||
// Common variables for the module.
|
||||
|
@ -48,7 +55,8 @@ type Consensus struct {
|
|||
|
||||
trustedPeers sync.Map
|
||||
|
||||
host host.Host
|
||||
host host.Host
|
||||
peerManager *pstoremgr.Manager
|
||||
|
||||
store ds.Datastore
|
||||
namespace ds.Key
|
||||
|
@ -85,21 +93,17 @@ func New(
|
|||
ctx, cancel := context.WithCancel(context.Background())
|
||||
|
||||
css := &Consensus{
|
||||
ctx: ctx,
|
||||
cancel: cancel,
|
||||
config: cfg,
|
||||
host: host,
|
||||
dht: dht,
|
||||
store: store,
|
||||
namespace: ds.NewKey(cfg.DatastoreNamespace),
|
||||
pubsub: pubsub,
|
||||
rpcReady: make(chan struct{}, 1),
|
||||
readyCh: make(chan struct{}, 1),
|
||||
}
|
||||
|
||||
// Set up a fast-lookup trusted peers cache.
|
||||
for _, p := range css.config.TrustedPeers {
|
||||
css.Trust(ctx, p)
|
||||
ctx: ctx,
|
||||
cancel: cancel,
|
||||
config: cfg,
|
||||
host: host,
|
||||
peerManager: pstoremgr.New(ctx, host, ""),
|
||||
dht: dht,
|
||||
store: store,
|
||||
namespace: ds.NewKey(cfg.DatastoreNamespace),
|
||||
pubsub: pubsub,
|
||||
rpcReady: make(chan struct{}, 1),
|
||||
readyCh: make(chan struct{}, 1),
|
||||
}
|
||||
|
||||
go css.setup()
|
||||
|
@ -113,6 +117,12 @@ func (css *Consensus) setup() {
|
|||
case <-css.rpcReady:
|
||||
}
|
||||
|
||||
// Set up a fast-lookup trusted peers cache.
|
||||
// Protect these peers in the ConnMgr
|
||||
for _, p := range css.config.TrustedPeers {
|
||||
css.Trust(css.ctx, p)
|
||||
}
|
||||
|
||||
// Hash the cluster name and produce the topic name from there
|
||||
// as a way to avoid pubsub topic collisions with other
|
||||
// pubsub applications potentially when both potentially use
|
||||
|
@ -171,6 +181,9 @@ func (css *Consensus) setup() {
|
|||
opts.DAGSyncerTimeout = time.Minute
|
||||
opts.Logger = logger
|
||||
opts.PutHook = func(k ds.Key, v []byte) {
|
||||
ctx, span := trace.StartSpan(css.ctx, "crdt/PutHook")
|
||||
defer span.End()
|
||||
|
||||
pin := &api.Pin{}
|
||||
err := pin.ProtoUnmarshal(v)
|
||||
if err != nil {
|
||||
|
@ -180,7 +193,7 @@ func (css *Consensus) setup() {
|
|||
|
||||
// TODO: tracing for this context
|
||||
err = css.rpcClient.CallContext(
|
||||
css.ctx,
|
||||
ctx,
|
||||
"",
|
||||
"PinTracker",
|
||||
"Track",
|
||||
|
@ -193,6 +206,9 @@ func (css *Consensus) setup() {
|
|||
logger.Infof("new pin added: %s", pin.Cid)
|
||||
}
|
||||
opts.DeleteHook = func(k ds.Key) {
|
||||
ctx, span := trace.StartSpan(css.ctx, "crdt/DeleteHook")
|
||||
defer span.End()
|
||||
|
||||
c, err := dshelp.DsKeyToCid(k)
|
||||
if err != nil {
|
||||
logger.Error(err, k)
|
||||
|
@ -201,7 +217,7 @@ func (css *Consensus) setup() {
|
|||
pin := api.PinCid(c)
|
||||
|
||||
err = css.rpcClient.CallContext(
|
||||
css.ctx,
|
||||
ctx,
|
||||
"",
|
||||
"PinTracker",
|
||||
"Untrack",
|
||||
|
@ -289,6 +305,9 @@ func (css *Consensus) Ready(ctx context.Context) <-chan struct{} {
|
|||
// IsTrustedPeer returns whether the given peer is taken into account
|
||||
// when submitting updates to the consensus state.
|
||||
func (css *Consensus) IsTrustedPeer(ctx context.Context, pid peer.ID) bool {
|
||||
ctx, span := trace.StartSpan(ctx, "consensus/IsTrustedPeer")
|
||||
defer span.End()
|
||||
|
||||
if pid == css.host.ID() {
|
||||
return true
|
||||
}
|
||||
|
@ -296,25 +315,46 @@ func (css *Consensus) IsTrustedPeer(ctx context.Context, pid peer.ID) bool {
|
|||
return ok
|
||||
}
|
||||
|
||||
// Trust marks a peer as "trusted".
|
||||
// Trust marks a peer as "trusted". It makes sure it is trusted as issuer
|
||||
// for pubsub updates, it is protected in the connection manager, it
|
||||
// has the highest priority when the peerstore is saved, and it's addresses
|
||||
// are always remembered.
|
||||
func (css *Consensus) Trust(ctx context.Context, pid peer.ID) error {
|
||||
ctx, span := trace.StartSpan(ctx, "consensus/Trust")
|
||||
defer span.End()
|
||||
|
||||
css.trustedPeers.Store(pid, struct{}{})
|
||||
if conman := css.host.ConnManager(); conman != nil {
|
||||
conman.Protect(pid, connMgrTag)
|
||||
}
|
||||
css.peerManager.SetPriority(pid, 0)
|
||||
addrs := css.host.Peerstore().Addrs(pid)
|
||||
css.host.Peerstore().SetAddrs(pid, addrs, peerstore.PermanentAddrTTL)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Distrust removes a peer from the "trusted" set.
|
||||
func (css *Consensus) Distrust(ctx context.Context, pid peer.ID) error {
|
||||
ctx, span := trace.StartSpan(ctx, "consensus/Distrust")
|
||||
defer span.End()
|
||||
|
||||
css.trustedPeers.Delete(pid)
|
||||
return nil
|
||||
}
|
||||
|
||||
// LogPin adds a new pin to the shared state.
|
||||
func (css *Consensus) LogPin(ctx context.Context, pin *api.Pin) error {
|
||||
ctx, span := trace.StartSpan(ctx, "consensus/LogPin")
|
||||
defer span.End()
|
||||
|
||||
return css.state.Add(ctx, pin)
|
||||
}
|
||||
|
||||
// LogUnpin removes a pin from the shared state.
|
||||
func (css *Consensus) LogUnpin(ctx context.Context, pin *api.Pin) error {
|
||||
ctx, span := trace.StartSpan(ctx, "consensus/LogUnpin")
|
||||
defer span.End()
|
||||
|
||||
return css.state.Rm(ctx, pin.Cid)
|
||||
}
|
||||
|
||||
|
@ -322,6 +362,9 @@ func (css *Consensus) LogUnpin(ctx context.Context, pin *api.Pin) error {
|
|||
// the monitor component and considers every peer with
|
||||
// valid known metrics a member.
|
||||
func (css *Consensus) Peers(ctx context.Context) ([]peer.ID, error) {
|
||||
ctx, span := trace.StartSpan(ctx, "consensus/Peers")
|
||||
defer span.End()
|
||||
|
||||
var metrics []*api.Metric
|
||||
|
||||
err := css.rpcClient.CallContext(
|
||||
|
|
|
@ -288,7 +288,7 @@ func (cfg *Config) Default() error {
|
|||
|
||||
// Set up logging
|
||||
cfg.RaftConfig.LogOutput = ioutil.Discard
|
||||
cfg.RaftConfig.Logger = raftStdLogger // see logging.go
|
||||
cfg.RaftConfig.Logger = &hcLogToLogger{}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
package raft
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
hclog "github.com/hashicorp/go-hclog"
|
||||
logging "github.com/ipfs/go-log"
|
||||
)
|
||||
|
||||
|
@ -15,6 +18,102 @@ const (
|
|||
err
|
||||
)
|
||||
|
||||
var raftLogger = logging.Logger("raftlib")
|
||||
|
||||
// this implements github.com/hashicorp/go-hclog
|
||||
type hcLogToLogger struct {
|
||||
extraArgs []interface{}
|
||||
name string
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) formatArgs(args []interface{}) string {
|
||||
result := ""
|
||||
args = append(args, log.extraArgs)
|
||||
for i := 0; i < len(args); i = i + 2 {
|
||||
key, ok := args[i].(string)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
val := args[i+1]
|
||||
result += fmt.Sprintf(" %s=%s.", key, val)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) format(msg string, args []interface{}) string {
|
||||
argstr := log.formatArgs(args)
|
||||
if len(argstr) > 0 {
|
||||
argstr = ". Args: " + argstr
|
||||
}
|
||||
name := log.name
|
||||
if len(name) > 0 {
|
||||
name += ": "
|
||||
}
|
||||
return name + msg + argstr
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) Trace(msg string, args ...interface{}) {
|
||||
raftLogger.Debug(log.format(msg, args))
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) Debug(msg string, args ...interface{}) {
|
||||
raftLogger.Debug(log.format(msg, args))
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) Info(msg string, args ...interface{}) {
|
||||
raftLogger.Info(log.format(msg, args))
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) Warn(msg string, args ...interface{}) {
|
||||
raftLogger.Warning(log.format(msg, args))
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) Error(msg string, args ...interface{}) {
|
||||
raftLogger.Error(log.format(msg, args))
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) IsTrace() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) IsDebug() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) IsInfo() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) IsWarn() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) IsError() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) With(args ...interface{}) hclog.Logger {
|
||||
return &hcLogToLogger{extraArgs: args}
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) Named(name string) hclog.Logger {
|
||||
return &hcLogToLogger{name: log.name + ": " + name}
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) ResetNamed(name string) hclog.Logger {
|
||||
return &hcLogToLogger{name: name}
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) SetLevel(level hclog.Level) {}
|
||||
|
||||
func (log *hcLogToLogger) StandardLogger(opts *hclog.StandardLoggerOptions) *log.Logger {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (log *hcLogToLogger) StandardWriter(opts *hclog.StandardLoggerOptions) io.Writer {
|
||||
return nil
|
||||
}
|
||||
|
||||
const repeatPoolSize = 10
|
||||
const repeatReset = time.Minute
|
||||
|
||||
|
@ -26,7 +125,6 @@ type logForwarder struct {
|
|||
}
|
||||
|
||||
var raftStdLogger = log.New(&logForwarder{}, "", 0)
|
||||
var raftLogger = logging.Logger("raftlib")
|
||||
|
||||
// Write forwards to our go-log logger.
|
||||
// According to https://golang.org/pkg/log/#Logger.Output
|
||||
|
|
53
go.mod
53
go.mod
|
@ -3,30 +3,28 @@ module github.com/ipfs/ipfs-cluster
|
|||
require (
|
||||
contrib.go.opencensus.io/exporter/jaeger v0.1.0
|
||||
contrib.go.opencensus.io/exporter/prometheus v0.1.0
|
||||
github.com/ajstarks/svgo v0.0.0-20181006003313-6ce6a3bcf6cd // indirect
|
||||
github.com/blang/semver v3.5.1+incompatible
|
||||
github.com/boltdb/bolt v1.3.1 // indirect
|
||||
github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17 // indirect
|
||||
github.com/coreos/go-semver v0.3.0 // indirect
|
||||
github.com/dgraph-io/badger v2.0.0-rc.2+incompatible
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect
|
||||
github.com/dustin/go-humanize v1.0.0
|
||||
github.com/fogleman/gg v1.3.0 // indirect
|
||||
github.com/gogo/protobuf v1.2.1
|
||||
github.com/golang/protobuf v1.3.1
|
||||
github.com/google/uuid v1.1.1
|
||||
github.com/gorilla/mux v1.7.2
|
||||
github.com/hashicorp/raft v1.0.1
|
||||
github.com/hashicorp/go-hclog v0.9.1
|
||||
github.com/hashicorp/go-immutable-radix v1.1.0 // indirect
|
||||
github.com/hashicorp/raft v1.1.0
|
||||
github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea
|
||||
github.com/hsanjuan/go-libp2p-gostream v0.0.32
|
||||
github.com/hsanjuan/go-libp2p-http v0.0.3
|
||||
github.com/hsanjuan/ipfs-lite v0.0.4
|
||||
github.com/hsanjuan/go-libp2p-gostream v0.0.34
|
||||
github.com/hsanjuan/go-libp2p-http v0.0.5
|
||||
github.com/hsanjuan/ipfs-lite v0.0.8
|
||||
github.com/imdario/mergo v0.3.7
|
||||
github.com/ipfs/go-block-format v0.0.2
|
||||
github.com/ipfs/go-cid v0.0.2
|
||||
github.com/ipfs/go-datastore v0.0.5
|
||||
github.com/ipfs/go-ds-badger v0.0.3
|
||||
github.com/ipfs/go-ds-crdt v0.0.10
|
||||
github.com/ipfs/go-ds-crdt v0.0.14
|
||||
github.com/ipfs/go-fs-lock v0.0.1
|
||||
github.com/ipfs/go-ipfs-api v0.0.1
|
||||
github.com/ipfs/go-ipfs-blockstore v0.0.1
|
||||
|
@ -38,27 +36,27 @@ require (
|
|||
github.com/ipfs/go-ipld-cbor v0.0.2
|
||||
github.com/ipfs/go-ipld-format v0.0.2
|
||||
github.com/ipfs/go-log v0.0.1
|
||||
github.com/ipfs/go-merkledag v0.0.3
|
||||
github.com/ipfs/go-mfs v0.0.7
|
||||
github.com/ipfs/go-path v0.0.4
|
||||
github.com/ipfs/go-unixfs v0.0.6
|
||||
github.com/jung-kurt/gofpdf v1.4.1 // indirect
|
||||
github.com/ipfs/go-merkledag v0.0.6
|
||||
github.com/ipfs/go-mfs v0.0.11
|
||||
github.com/ipfs/go-path v0.0.7
|
||||
github.com/ipfs/go-unixfs v0.0.8
|
||||
github.com/kelseyhightower/envconfig v1.3.0
|
||||
github.com/lanzafame/go-libp2p-ocgorpc v0.0.3
|
||||
github.com/libp2p/go-libp2p v0.0.25
|
||||
github.com/lanzafame/go-libp2p-ocgorpc v0.0.4
|
||||
github.com/libp2p/go-libp2p v0.0.30
|
||||
github.com/libp2p/go-libp2p-connmgr v0.0.6
|
||||
github.com/libp2p/go-libp2p-consensus v0.0.1
|
||||
github.com/libp2p/go-libp2p-crypto v0.0.2
|
||||
github.com/libp2p/go-libp2p-gorpc v0.0.3
|
||||
github.com/libp2p/go-libp2p-crypto v0.1.0
|
||||
github.com/libp2p/go-libp2p-gorpc v0.0.5
|
||||
github.com/libp2p/go-libp2p-host v0.0.3
|
||||
github.com/libp2p/go-libp2p-interface-pnet v0.0.1
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.0.11
|
||||
github.com/libp2p/go-libp2p-peer v0.1.1
|
||||
github.com/libp2p/go-libp2p-peerstore v0.0.6
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.0.14
|
||||
github.com/libp2p/go-libp2p-peer v0.2.0
|
||||
github.com/libp2p/go-libp2p-peerstore v0.1.0
|
||||
github.com/libp2p/go-libp2p-pnet v0.0.1
|
||||
github.com/libp2p/go-libp2p-protocol v0.0.1
|
||||
github.com/libp2p/go-libp2p-pubsub v0.0.3
|
||||
github.com/libp2p/go-libp2p-protocol v0.1.0
|
||||
github.com/libp2p/go-libp2p-pubsub v0.0.6
|
||||
github.com/libp2p/go-libp2p-raft v0.0.3
|
||||
github.com/libp2p/go-ws-transport v0.0.2
|
||||
github.com/libp2p/go-ws-transport v0.0.5
|
||||
github.com/multiformats/go-multiaddr v0.0.4
|
||||
github.com/multiformats/go-multiaddr-dns v0.0.2
|
||||
github.com/multiformats/go-multiaddr-net v0.0.1
|
||||
|
@ -66,18 +64,11 @@ require (
|
|||
github.com/multiformats/go-multihash v0.0.5
|
||||
github.com/pkg/errors v0.8.1
|
||||
github.com/prometheus/client_golang v0.9.3
|
||||
github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d // indirect
|
||||
github.com/rs/cors v1.6.0
|
||||
github.com/ugorji/go v1.1.4
|
||||
github.com/urfave/cli v1.20.0
|
||||
github.com/zenground0/go-dot v0.0.0-20180912213407-94a425d4984e
|
||||
go.opencensus.io v0.21.0
|
||||
go4.org v0.0.0-20190313082347-94abd6928b1d // indirect
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522 // indirect
|
||||
golang.org/x/image v0.0.0-20190516052701-61b8692d9a5c // indirect
|
||||
gonum.org/v1/gonum v0.0.0-20190520094443-a5f8f3a4840b
|
||||
gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e // indirect
|
||||
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b
|
||||
google.golang.org/api v0.5.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20190516172635-bb713bdc0e52 // indirect
|
||||
)
|
||||
|
|
260
go.sum
260
go.sum
|
@ -6,32 +6,25 @@ contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE
|
|||
contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A=
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 h1:PqzgE6kAMi81xWQA2QIVxjWkFHptGgC547vchpUbtFo=
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4=
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||
github.com/Kubuxu/go-os-helper v0.0.1 h1:EJiD2VUQyh5A9hWJLmc6iWg6yIcJ7jpBcwC8GMGXfDk=
|
||||
github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e h1:2Z+EBRrOJsA3psnUPcEWMIH2EIga1xHflQcr/EZslx8=
|
||||
github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e/go.mod h1:3oM7gXIttpYDAJXpVNnSCiUMYBLIZ6cb1t+Ip982MRo=
|
||||
github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo=
|
||||
github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s=
|
||||
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
|
||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af h1:wVe6/Ea46ZMeNkQjjBW6xcqyQA/j5e0D6GytH95g0gQ=
|
||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
github.com/ajstarks/svgo v0.0.0-20181006003313-6ce6a3bcf6cd h1:JdtityihAc6A+gVfYh6vGXfZQg+XOLyBvla/7NbXFCg=
|
||||
github.com/ajstarks/svgo v0.0.0-20181006003313-6ce6a3bcf6cd/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/apache/thrift v0.12.0 h1:pODnxUFNcjP9UTLZGTdeh+j16A8lJbRvD3rOtrk/7bs=
|
||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM=
|
||||
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
|
||||
github.com/awalterschulze/gographviz v0.0.0-20190221210632-1e9ccb565bca/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs=
|
||||
github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
|
||||
|
@ -40,11 +33,11 @@ github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdn
|
|||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||
github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
|
||||
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
|
||||
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||
github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78=
|
||||
github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
|
||||
github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17 h1:m0N5Vg5nP3zEz8TREZpwX3gt4Biw3/8fbIf4A3hO96g=
|
||||
github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
|
||||
github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q=
|
||||
github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
|
||||
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
|
||||
github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
|
||||
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
|
||||
|
@ -81,8 +74,6 @@ github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f h1:dDxpBYafY/GYpcl
|
|||
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dgryski/go-farm v0.0.0-20190416075124-e1214b5e05dc h1:VxEJYcOh1LMAdhIiHkofa6UC0PZvCmielUgJXgAAWFU=
|
||||
github.com/dgryski/go-farm v0.0.0-20190416075124-e1214b5e05dc/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
|
@ -93,8 +84,6 @@ github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:Jp
|
|||
github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E=
|
||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90 h1:WXb3TSNmHp2vHoCroCIB1foO/yQ36swABL8aOVeDpgg=
|
||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
|
||||
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI=
|
||||
|
@ -126,8 +115,6 @@ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
|||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
|
||||
|
@ -138,16 +125,16 @@ github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyF
|
|||
github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
|
||||
github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc=
|
||||
github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
|
||||
github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824 h1:TF4mX7zXpeyz/xintezebSa7ZDxAGBnqDwcoobvaz2o=
|
||||
github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE=
|
||||
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-hclog v0.9.1 h1:9PZfAcVEvez4yhLH2TBU64/h/z4xlFI80cWXRrxuKuM=
|
||||
github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
||||
github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
|
||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc=
|
||||
github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=
|
||||
github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||
github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
|
||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
||||
github.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM=
|
||||
|
@ -157,20 +144,20 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
|
|||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/raft v1.0.1 h1:94uRdS11oEneUkxmXq6Vg9shNhBILh2UTb9crQjJWl0=
|
||||
github.com/hashicorp/raft v1.0.1/go.mod h1:DVSAWItjLjTOkVbSpWQ0j0kUADIvDaCtBxIcbNAQLkI=
|
||||
github.com/hashicorp/raft v1.1.0 h1:qPMePEczgbkiQsqCsRfuHRqvDUO+zmAInDaD5ptXlq0=
|
||||
github.com/hashicorp/raft v1.1.0/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM=
|
||||
github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea h1:xykPFhrBAS2J0VBzVa5e80b5ZtYuNQtgXjN40qBZlD4=
|
||||
github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk=
|
||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/hsanjuan/go-libp2p-gostream v0.0.31 h1:9dIgHQPR0VWxhOyTZrbgLzTx0xvZ5rTpmhG9huGEPjY=
|
||||
github.com/hsanjuan/go-libp2p-gostream v0.0.31/go.mod h1:cWvV5/NQ5XWi0eQZnX/svsAk6NLc4U26pItvj0eDeRk=
|
||||
github.com/hsanjuan/go-libp2p-gostream v0.0.32 h1:RmiGS9YkvTg9TudV7I4NYh7qaqNTM0XWKxGaIlS1waI=
|
||||
github.com/hsanjuan/go-libp2p-gostream v0.0.32/go.mod h1:PwOAjhf7lbKsDF0ovjqxgQJpt/ZF5KwU+iA3V500A9Y=
|
||||
github.com/hsanjuan/go-libp2p-http v0.0.3 h1:qoMwiw8c/rN7VmkwwU6EJkgkPfgUidd8w9ddNC3KzJU=
|
||||
github.com/hsanjuan/go-libp2p-http v0.0.3/go.mod h1:JiH9TZMPJGeUONuxcI07G0oXIc6Al8EiUFXET214E7Y=
|
||||
github.com/hsanjuan/ipfs-lite v0.0.4 h1:kNG/riEDSb2uqXFxQ/AMKzR45lI2O1zj8tU1CbpFJEk=
|
||||
github.com/hsanjuan/ipfs-lite v0.0.4/go.mod h1:tH8pW33dNrEBLLN5E0hQoXYXJ9TeYq9fWbYpGDwTmeo=
|
||||
github.com/hsanjuan/go-libp2p-gostream v0.0.34 h1:OKqOIo6fQNVeOCAjGsYVb8qon1WAipUofO87BBfqwxs=
|
||||
github.com/hsanjuan/go-libp2p-gostream v0.0.34/go.mod h1:kCzaCrXaCU/uf62woAls6CyubdjKxTLwkLxK/mvzrHA=
|
||||
github.com/hsanjuan/go-libp2p-http v0.0.5 h1:Sbhgple3OfPzwokVn18cvACpWoVBeyW6+aCD93vX19E=
|
||||
github.com/hsanjuan/go-libp2p-http v0.0.5/go.mod h1:i26Upd/cMufAoruO/wkrmL09sDS6QB/INhpu7otW1/U=
|
||||
github.com/hsanjuan/ipfs-lite v0.0.8 h1:ueBk9f8NEdkV0JEL4mSsBq8fq2Z2uUNfCeIHcDDzu3A=
|
||||
github.com/hsanjuan/ipfs-lite v0.0.8/go.mod h1:JY8+Fb2leVCDVSJxSe6HwDzHfITjs/8CKATw3j0vCnQ=
|
||||
github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag=
|
||||
github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo=
|
||||
github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc=
|
||||
|
@ -179,15 +166,13 @@ github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI=
|
|||
github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||
github.com/ipfs/bbloom v0.0.1 h1:s7KkiBPfxCeDVo47KySjK0ACPc5GJRUxFpdyWEuDjhw=
|
||||
github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI=
|
||||
github.com/ipfs/go-bitswap v0.0.3 h1:uFcSI9dkjUn67S7IM60vr2wA27aAvn8o9xYjaQCug3o=
|
||||
github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg=
|
||||
github.com/ipfs/go-bitswap v0.0.6 h1:2/ewr90DqM8fCbBrvB7oOxdl5RTF/+ePDfdxvnrjHfs=
|
||||
github.com/ipfs/go-bitswap v0.0.6/go.mod h1:9XmyRkWVSVw5ZSRhN5B+gjQVpgIUzOXjd9Pq7dHDuK8=
|
||||
github.com/ipfs/go-bitswap v0.0.9 h1:Dy0qvYlaOd2E2FOL2gApJ21qVjepJsGNNfstLrGf+0I=
|
||||
github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis=
|
||||
github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc=
|
||||
github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE=
|
||||
github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
|
||||
github.com/ipfs/go-blockservice v0.0.3 h1:40OvwrxeudTAlUGUAKNYnNPcwQeLtXedjzTWecnUinQ=
|
||||
github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI=
|
||||
github.com/ipfs/go-blockservice v0.0.7 h1:VRRVjgahs7r//MdO7yY5DJ2/i2fmkKOnxfSyfuPjTm0=
|
||||
github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So=
|
||||
github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE=
|
||||
github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
|
||||
github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8=
|
||||
|
@ -202,8 +187,8 @@ github.com/ipfs/go-ds-badger v0.0.2 h1:7ToQt7QByBhOTuZF2USMv+PGlMcBC7FW7FdgQ4FCs
|
|||
github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8=
|
||||
github.com/ipfs/go-ds-badger v0.0.3 h1:sVYE2YlCzltznTZeAP1S+bp3qipz7VzogfZDtf6tGq0=
|
||||
github.com/ipfs/go-ds-badger v0.0.3/go.mod h1:7AzMKCsGav0u46HpdLiAEAOqizR1H6AZsjpHpQSPYCQ=
|
||||
github.com/ipfs/go-ds-crdt v0.0.10 h1:uKuT0VNeGKnFdvuL/I1Cql22CCrINof1rqOgq/tD8Wc=
|
||||
github.com/ipfs/go-ds-crdt v0.0.10/go.mod h1:X11b5AQj63jQLSZUDKv6AaSNq8s+XRdGRxTFdqxGJqs=
|
||||
github.com/ipfs/go-ds-crdt v0.0.14 h1:+/S+jc1sHPipIwldyeS60p6GeNK7Nykpmx4Cnxotn3w=
|
||||
github.com/ipfs/go-ds-crdt v0.0.14/go.mod h1:ioLVScdQ2TNRPqrrB1su+Pck+gceuAlyhRMUD6TNHx4=
|
||||
github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc=
|
||||
github.com/ipfs/go-fs-lock v0.0.1 h1:XHX8uW4jQBYWHj59XXcjg7BHlHxV9ZOYs6Y43yb7/l0=
|
||||
github.com/ipfs/go-fs-lock v0.0.1/go.mod h1:DNBekbboPKcxs1aukPSaOtFA3QfSdi5C855v0i9XJ8Y=
|
||||
|
@ -230,12 +215,8 @@ github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C
|
|||
github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0=
|
||||
github.com/ipfs/go-ipfs-files v0.0.1 h1:OroTsI58plHGX70HPLKy6LQhPR3HZJ5ip61fYlo6POM=
|
||||
github.com/ipfs/go-ipfs-files v0.0.1/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4=
|
||||
github.com/ipfs/go-ipfs-files v0.0.2 h1:fEEjF4H+1t8SFOHqUGp0KqcwgIRlbD2bu8CAS2sIggE=
|
||||
github.com/ipfs/go-ipfs-files v0.0.2/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4=
|
||||
github.com/ipfs/go-ipfs-files v0.0.3 h1:ME+QnC3uOyla1ciRPezDW0ynQYK2ikOh9OCKAEg4uUA=
|
||||
github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4=
|
||||
github.com/ipfs/go-ipfs-flags v0.0.1 h1:OH5cEkJYL0QgA+bvD55TNG9ud8HA2Nqaav47b2c/UJk=
|
||||
github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA=
|
||||
github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs=
|
||||
github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A=
|
||||
github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU=
|
||||
|
@ -244,8 +225,6 @@ github.com/ipfs/go-ipfs-routing v0.0.1 h1:394mZeTLcbM/LDO12PneBYvkZAUA+nRnmC0lAz
|
|||
github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs=
|
||||
github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50=
|
||||
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
|
||||
github.com/ipfs/go-ipld-cbor v0.0.1 h1:g7yh27SznWP4CUbkFgjR+WQRjEeyxCpTR4iKVmXx1wA=
|
||||
github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rhS5NjfKzY8=
|
||||
github.com/ipfs/go-ipld-cbor v0.0.2 h1:amzFztBQQQ69UA5+f7JRfoXF/z2l//MGfEDHVkS20+s=
|
||||
github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc=
|
||||
github.com/ipfs/go-ipld-format v0.0.1 h1:HCu4eB/Gh+KD/Q0M8u888RFkorTWNIL3da4oc5dwc80=
|
||||
|
@ -254,24 +233,20 @@ github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2
|
|||
github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k=
|
||||
github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc=
|
||||
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
|
||||
github.com/ipfs/go-merkledag v0.0.3 h1:A5DlOMzqTRDVmdgkf3dzCKCFmVWH4Zqwb0cbYXUs+Ro=
|
||||
github.com/ipfs/go-merkledag v0.0.3/go.mod h1:Oc5kIXLHokkE1hWGMBHw+oxehkAaTOqtEb7Zbh6BhLA=
|
||||
github.com/ipfs/go-merkledag v0.0.6 h1:rYZc0yzhO7y1cKi3Rw425a2HhEJDdLvNOWsqtmO3PF0=
|
||||
github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto=
|
||||
github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg=
|
||||
github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
|
||||
github.com/ipfs/go-mfs v0.0.7 h1:Xjqk0jAhgwhMHO39oH4jqP1QkeAGqDelxa814voygN0=
|
||||
github.com/ipfs/go-mfs v0.0.7/go.mod h1:10Hdow7wUbSlIamnOduxeP6MEp58TozZmdnAhugOKz8=
|
||||
github.com/ipfs/go-path v0.0.3 h1:G/VFcCMXtp36JUPPyytYQ1I3UsBUBf47M//uSdTLnFg=
|
||||
github.com/ipfs/go-path v0.0.3/go.mod h1:zIRQUez3LuQIU25zFjC2hpBTHimWx7VK5bjZgRLbbdo=
|
||||
github.com/ipfs/go-path v0.0.4 h1:zG/id80tV51XAfvCsRJIEGQSHGuTDBi8RWrtr3EfcfY=
|
||||
github.com/ipfs/go-path v0.0.4/go.mod h1:zIRQUez3LuQIU25zFjC2hpBTHimWx7VK5bjZgRLbbdo=
|
||||
github.com/ipfs/go-peertaskqueue v0.0.3 h1:CDzQB4J6bHmSM7rIjR3gMoCjubdWy7Be2bUw6a7T3O0=
|
||||
github.com/ipfs/go-peertaskqueue v0.0.3/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ=
|
||||
github.com/ipfs/go-mfs v0.0.11 h1:LMrmLt1NfB88ddjIfU+onuIhWB3W/bhfBbXC8HSnONk=
|
||||
github.com/ipfs/go-mfs v0.0.11/go.mod h1:bMtma2uwUUkl0RMB0oMAHH01RwA8yrqsT48rPn1c3RA=
|
||||
github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho=
|
||||
github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno=
|
||||
github.com/ipfs/go-peertaskqueue v0.0.4 h1:i0JprfjjILYcWM1xguO/1MCS8XKVxLSl+ECEVr6i8nw=
|
||||
github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ=
|
||||
github.com/ipfs/go-todocounter v0.0.1 h1:kITWA5ZcQZfrUnDNkRn04Xzh0YFaDFXsoO2A81Eb6Lw=
|
||||
github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4=
|
||||
github.com/ipfs/go-unixfs v0.0.4 h1:IApzQ+SnY0tfjqM7aU2b80CFYLZNHvhLmEZDIWr4e/E=
|
||||
github.com/ipfs/go-unixfs v0.0.4/go.mod h1:eIo/p9ADu/MFOuyxzwU+Th8D6xoxU//r590vUpWyfz8=
|
||||
github.com/ipfs/go-unixfs v0.0.6 h1:mQ6KS3NK4GA9hyUpGdGItqt5llzyIx0Qy2UxC/A7bEo=
|
||||
github.com/ipfs/go-unixfs v0.0.6/go.mod h1:g41FlHFM/qacA3jzMPOYKIwNwbgTQEKJH2hQiq19Zrc=
|
||||
github.com/ipfs/go-unixfs v0.0.8 h1:AHahQ+gdNZd9BhKVLf8XP1EWeKa78eTzYgCygp7N/Pg=
|
||||
github.com/ipfs/go-unixfs v0.0.8/go.mod h1:cK2vDJ7L4YnWB6oLefpVNesgx0x/zPTRVDw6B4Y+03U=
|
||||
github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E=
|
||||
github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0=
|
||||
github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA=
|
||||
|
@ -295,14 +270,9 @@ github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M
|
|||
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
|
||||
github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
|
||||
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0=
|
||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
github.com/jung-kurt/gofpdf v1.4.1 h1:RijSEd5RVSbkBr7iHdpNLyYlxtHvrbiC9FqffN5hVb4=
|
||||
github.com/jung-kurt/gofpdf v1.4.1/go.mod h1:rZsO0wEsunjT/L9stF3fJjYbAHgqNYuQB4B8FWvBck0=
|
||||
github.com/kelseyhightower/envconfig v1.3.0 h1:IvRS4f2VcIQy6j4ORGIf9145T/AsUB+oY8LyvN8BXNM=
|
||||
github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
|
@ -318,48 +288,53 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
|||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/lanzafame/go-libp2p-ocgorpc v0.0.3 h1:FgkIIGJKk60rsMQUPFK60KHSFQ/imz+PkPFajgxoyrE=
|
||||
github.com/lanzafame/go-libp2p-ocgorpc v0.0.3/go.mod h1:0wvFivLLxfsv/MureKA1ilAyCgnHfpY8EYhUxnNQbPI=
|
||||
github.com/lanzafame/go-libp2p-ocgorpc v0.0.4 h1:u2i1BITAGxsj5hZEDmh+wsOQOWmDJF0L9fM6qli6CYA=
|
||||
github.com/lanzafame/go-libp2p-ocgorpc v0.0.4/go.mod h1:1qLNfL/1VgwWa2dvwo81tyEjGm3vo2556ZLdyyTGZiw=
|
||||
github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88=
|
||||
github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ=
|
||||
github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg=
|
||||
github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
|
||||
github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs=
|
||||
github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
|
||||
github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs=
|
||||
github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk=
|
||||
github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU=
|
||||
github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE=
|
||||
github.com/libp2p/go-conn-security-multistream v0.0.2 h1:Ykz0lnNjxk+0SdslUmlLNyrleqdpS1S/VW+dxFdt74Y=
|
||||
github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE=
|
||||
github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s=
|
||||
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
|
||||
github.com/libp2p/go-libp2p v0.0.2 h1:+jvgi0Zy3y4TKXJKApchCk3pCBPZf1T54z3+vKie3gw=
|
||||
github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE=
|
||||
github.com/libp2p/go-libp2p v0.0.24 h1:72B9/OrdGLNfzrM8ap9A9WnLx3Wfj1/GQshIerK2Ogw=
|
||||
github.com/libp2p/go-libp2p v0.0.24/go.mod h1:Tud6jI4LYXihNWiVMoG7YMwVO2XUwoP9vd40i5/B2EA=
|
||||
github.com/libp2p/go-libp2p v0.0.25 h1:81DL5qmCjR9GdJqzB1FDLOxwL/oR+ADksRfgohxKBLI=
|
||||
github.com/libp2p/go-libp2p v0.0.25/go.mod h1:37g8bAoyqrg7CL+t5/LHnXU0SytNN9lVLjktuBe36ko=
|
||||
github.com/libp2p/go-libp2p v0.0.30 h1:mwCWAusLhRGUzZ/VaCatsrEQTsuWExmXqVcvGBV72EQ=
|
||||
github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A=
|
||||
github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4=
|
||||
github.com/libp2p/go-libp2p-autonat v0.0.4 h1:cZzdB9KW1ZkHnSjLCB6aFNw47XS4r+SecCVMuVB1xgo=
|
||||
github.com/libp2p/go-libp2p-autonat v0.0.4/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4=
|
||||
github.com/libp2p/go-libp2p-autonat v0.0.6 h1:OCStANLLpeyQeWFUuqZJ7aS9+Bx0/uoVb1PtLA9fGTQ=
|
||||
github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE=
|
||||
github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk=
|
||||
github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc=
|
||||
github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE=
|
||||
github.com/libp2p/go-libp2p-circuit v0.0.6 h1:egD2CKFVdqnHgIHzPkM6J7m3MKZpFqoTPDfxBqQ7kRQ=
|
||||
github.com/libp2p/go-libp2p-circuit v0.0.6/go.mod h1:W34ISBRpoCPUeOR26xzTbLo+s3hDO9153hJCfvHzBlg=
|
||||
github.com/libp2p/go-libp2p-circuit v0.0.9 h1:tjdgP9hv8+Pa/xsprBpEFngq4t8aLvjfibBYoDjO9i4=
|
||||
github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU=
|
||||
github.com/libp2p/go-libp2p-connmgr v0.0.6 h1:oEUriPO/qWTvfHRPEU4HdNlNhYigdueOs2X3UZCdbYM=
|
||||
github.com/libp2p/go-libp2p-connmgr v0.0.6/go.mod h1:uwDfgdgqB5248sQYib1xo603cSsMg9PgAKu0Z+Y65Qk=
|
||||
github.com/libp2p/go-libp2p-consensus v0.0.1 h1:jcVbHRZLwTXU9iT/mPi+Lx4/OrIzq3bU1TbZNhYFCV8=
|
||||
github.com/libp2p/go-libp2p-consensus v0.0.1/go.mod h1:+9Wrfhc5QOqWB0gXI0m6ARlkHfdJpcFXmRU0WoHz4Mo=
|
||||
github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I=
|
||||
github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco=
|
||||
github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw=
|
||||
github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE=
|
||||
github.com/libp2p/go-libp2p-crypto v0.0.2 h1:TTdJ4y6Uoa6NxQcuEaVkQfFRcQeCE2ReDk8Ok4I0Fyw=
|
||||
github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I=
|
||||
github.com/libp2p/go-libp2p-discovery v0.0.1 h1:VkjCKmJQMwpDUwtA8Qc1z3TQAHJgQ5nGQ6cdN0wQXOw=
|
||||
github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ=
|
||||
github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
|
||||
github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI=
|
||||
github.com/libp2p/go-libp2p-discovery v0.0.2 h1:Rf+20nsFcCnHo4Kxvf8ofAft75+fW+cXy9FonNVyU/g=
|
||||
github.com/libp2p/go-libp2p-discovery v0.0.2/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI=
|
||||
github.com/libp2p/go-libp2p-discovery v0.0.3 h1:/41EY87ErU1yQLoPoTfJXV3xomDwx7Ti1Ae66DuDk9U=
|
||||
github.com/libp2p/go-libp2p-discovery v0.0.3/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI=
|
||||
github.com/libp2p/go-libp2p-gorpc v0.0.3 h1:Vk2HeMMDmMwinX38DJ96U5eQAkCe4ilWdjZf+tZxDYU=
|
||||
github.com/libp2p/go-libp2p-gorpc v0.0.3/go.mod h1:SCX1FxFYPJYeVRYJqbQIPEFSdQLHjQUW3SaYIS9X3YY=
|
||||
github.com/libp2p/go-libp2p-discovery v0.0.5 h1:VpPd7u2odnrrRcW+gVdjLDcXsc35k0Tjxqgbzlre6Uo=
|
||||
github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I=
|
||||
github.com/libp2p/go-libp2p-gorpc v0.0.5 h1:VOtQYdXYsdkrtk5vD5H9+4i1pqHPJw8JUv4Quu00WUw=
|
||||
github.com/libp2p/go-libp2p-gorpc v0.0.5/go.mod h1:thS8W4/wEbm+BIi078wNAsJI2Sh8tEuyugij6tBmzRE=
|
||||
github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ=
|
||||
github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go=
|
||||
github.com/libp2p/go-libp2p-host v0.0.3 h1:BB/1Z+4X0rjKP5lbQTmjEjLbDVbrcmLOlA6QDsN5/j4=
|
||||
|
@ -368,16 +343,20 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/f
|
|||
github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
|
||||
github.com/libp2p/go-libp2p-interface-connmgr v0.0.4 h1:/LngXETpII5qOD7YjAcQiIxhVtdAk/NQe5t9sC6BR0E=
|
||||
github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
|
||||
github.com/libp2p/go-libp2p-interface-connmgr v0.0.5 h1:KG/KNYL2tYzXAfMvQN5K1aAGTYSYUMJ1prgYa2/JI1E=
|
||||
github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
|
||||
github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8=
|
||||
github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.0.11 h1:3s6Me8i0vmuQM++HmVgRb9dC6y33/jmcxKPMExx7oJg=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.0.11/go.mod h1:UB+9NMT+gDVWnPfna+LlE1zeMY+fHbKrEeyu95QR1NQ=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.0.14 h1:ooAmThM+sCYDSygh+ynU3N++BZ0rXxee4tRbBX1a18k=
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.0.14/go.mod h1:IETCKDE8BxDoyt2phfwJZRs+qrCHJ8KNo2HVth7+D8Y=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.1.1 h1:ZrvW3qCM+lAuv7nrNts/zfEiClq+GZe8OIzX4Vb3Dwo=
|
||||
github.com/libp2p/go-libp2p-kbucket v0.1.1/go.mod h1:Y0iQDHRTk/ZgM8PC4jExoF+E4j+yXWwRkdldkMa5Xm4=
|
||||
github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps=
|
||||
github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg=
|
||||
github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU=
|
||||
github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08=
|
||||
github.com/libp2p/go-libp2p-mplex v0.1.1 h1:lSPS1VJ36P01gGO//KgcsmSah5uoC3X9r7WY5j+iP4c=
|
||||
github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I=
|
||||
github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ=
|
||||
github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw=
|
||||
github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY=
|
||||
|
@ -391,49 +370,59 @@ github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4
|
|||
github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo=
|
||||
github.com/libp2p/go-libp2p-peer v0.1.1 h1:qGCWD1a+PyZcna6htMPo26jAtqirVnJ5NvBQIKV7rRY=
|
||||
github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es=
|
||||
github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY=
|
||||
github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.0.5 h1:/qc3asc93924TaqVulOnY/+c4tpzomSE/ijT7LWF09M=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.0.5/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.0.6 h1:RgX/djPFXqZGktW0j2eF4NAX0pzDsCot45jO2GewC+g=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E=
|
||||
github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY=
|
||||
github.com/libp2p/go-libp2p-pnet v0.0.1 h1:2e5d15M8XplUKsU4Fqrll5eDfqGg/7mHUufLkhbfKHM=
|
||||
github.com/libp2p/go-libp2p-pnet v0.0.1/go.mod h1:bWN8HqdpgCdKnXSCsJhbWjiU3UZFa/tIe4no5jCmHVw=
|
||||
github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM=
|
||||
github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s=
|
||||
github.com/libp2p/go-libp2p-pubsub v0.0.3 h1:DKVoDac2u1Dr8gX7B1HFjCrXkMxr8tfbnt0Fk1mmkgk=
|
||||
github.com/libp2p/go-libp2p-pubsub v0.0.3/go.mod h1:fYKlZBOF2yrJzYlgeEVFSbYWfbS+E8Zix6gMZ0A6WgE=
|
||||
github.com/libp2p/go-libp2p-protocol v0.1.0 h1:HdqhEyhg0ToCaxgMhnOmUO8snQtt/kQlcjVk3UoJU3c=
|
||||
github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk=
|
||||
github.com/libp2p/go-libp2p-pubsub v0.0.6 h1:nr54YJwRJf8QfpekLVW+XmmAOUG3UnHRm4f/VRNNrLg=
|
||||
github.com/libp2p/go-libp2p-pubsub v0.0.6/go.mod h1:rB9nqkoA/Coxh68OynvQE9UZbhl1aOt3xuBEfCzPW1E=
|
||||
github.com/libp2p/go-libp2p-raft v0.0.3 h1:KSu+8TnG/D+BN4jwySEghf6uYVlJfF1egYGzBlNWPiM=
|
||||
github.com/libp2p/go-libp2p-raft v0.0.3/go.mod h1:G9FXHHvlJuNY4t1CIzy+JeaIH15jPD0kATBcGoD4kWg=
|
||||
github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw=
|
||||
github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q=
|
||||
github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc=
|
||||
github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys=
|
||||
github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI=
|
||||
github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs=
|
||||
github.com/libp2p/go-libp2p-secio v0.0.3 h1:h3fPeDrej7bvvARnC2oSjAfcLZOaS4REZKgWCRQNpE4=
|
||||
github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0=
|
||||
github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4=
|
||||
github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs=
|
||||
github.com/libp2p/go-libp2p-swarm v0.0.2 h1:cpHHXTeU2IgUu8LPemF7vaLPGtVC6VxMoll2EwqlC+E=
|
||||
github.com/libp2p/go-libp2p-swarm v0.0.2/go.mod h1:n0cAAcKyndIrJWctQwjqXlAdIPBZzfdpBjx1SSvz30g=
|
||||
github.com/libp2p/go-libp2p-swarm v0.0.3 h1:gF11uO1WCbFtTjKLQ+gZ/UdbYScZq8PfqA53XdbiK8Q=
|
||||
github.com/libp2p/go-libp2p-swarm v0.0.3/go.mod h1:/2HbOacAKDYT1g0UEZjUPlzD+SBtvqkg4TaYeoBA2TY=
|
||||
github.com/libp2p/go-libp2p-swarm v0.0.6 h1:gE0P/v2h+KEXtAi9YTw2UBOSODJ4m9VuuJ+ktc2LVUo=
|
||||
github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8=
|
||||
github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
||||
github.com/libp2p/go-libp2p-testing v0.0.2 h1:p9ySW7MFvGGs83hAAe0MPGnjy/tPjl5KyxpMkojdZ+g=
|
||||
github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
||||
github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk=
|
||||
github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw=
|
||||
github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k=
|
||||
github.com/libp2p/go-libp2p-transport v0.0.5 h1:pV6+UlRxyDpASSGD+60vMvdifSCby6JkJDfi+yUMHac=
|
||||
github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.0.2 h1:VygEEnAyTPZxVkEOVsmLp0vGLGBEn4W1UBHcy9cEywg=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.0.2/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.0.4 h1:uGMOd14BL1oFlfb/cGfOxPjiTKBhzWV4aMjjoCF1Z1o=
|
||||
github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc=
|
||||
github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8=
|
||||
github.com/libp2p/go-libp2p-yamux v0.1.3 h1:HmKvv2jWJ4GEm3iP7cEKjuw0POa6rK+Hcsu1FBKzpLc=
|
||||
github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4=
|
||||
github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I=
|
||||
github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
|
||||
github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs=
|
||||
github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
|
||||
github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc=
|
||||
github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
|
||||
github.com/libp2p/go-mplex v0.0.2 h1:tNHgiEvcAXNASiX+SOYO32dkI57rFUHdWWLSmsoO9QQ=
|
||||
github.com/libp2p/go-mplex v0.0.2/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
|
||||
github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
|
||||
github.com/libp2p/go-mplex v0.0.4 h1:043XJ3Zr7/Oz5cfyUaJwxUZyP02TngTpt4oq8R5UizQ=
|
||||
github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
|
||||
github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw=
|
||||
github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
|
||||
github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0=
|
||||
|
@ -442,40 +431,55 @@ github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI=
|
|||
github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI=
|
||||
github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw=
|
||||
github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA=
|
||||
github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E=
|
||||
github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs=
|
||||
github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4=
|
||||
github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs=
|
||||
github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw=
|
||||
github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14=
|
||||
github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM=
|
||||
github.com/libp2p/go-stream-muxer v0.1.0 h1:3ToDXUzx8pDC6RfuOzGsUYP5roMDthbUKRdMRRhqAqY=
|
||||
github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ=
|
||||
github.com/libp2p/go-stream-muxer-multistream v0.1.1 h1:DhHqb4nu1fQv/vQKeLAaZGmhLsUA4SF77IdYJiWE1d4=
|
||||
github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw=
|
||||
github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs=
|
||||
github.com/libp2p/go-tcp-transport v0.0.2 h1:EzOSRaHpyrGpJ5qe+9SaxJM1mrWlkSLFfNTufUkq0lg=
|
||||
github.com/libp2p/go-tcp-transport v0.0.2/go.mod h1:VjZFHasNJ0QiJQNNwiFDy25qyGWTXQWs8GM5DR4/L1k=
|
||||
github.com/libp2p/go-tcp-transport v0.0.4 h1:2iRu994wCT/iEz62F+c60FUoSkijNEQ0q2Itc+79XlQ=
|
||||
github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o=
|
||||
github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk=
|
||||
github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I=
|
||||
github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww=
|
||||
github.com/libp2p/go-ws-transport v0.0.2 h1:PtK1AoM16nm96FwPBQoq+4T4t9LdDwOhkB+mdXuGSlg=
|
||||
github.com/libp2p/go-ws-transport v0.0.2/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww=
|
||||
github.com/libp2p/go-ws-transport v0.0.5 h1:IHeR0X9nvE5hOdOD8X/FDQ6jIapdohToQseItwvpixU=
|
||||
github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU=
|
||||
github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
|
||||
github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
|
||||
github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI=
|
||||
github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
|
||||
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
|
||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
|
||||
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
|
||||
github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ=
|
||||
github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||
github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg=
|
||||
github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||
github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM=
|
||||
github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ=
|
||||
github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
|
||||
github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
|
||||
github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78=
|
||||
github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||
github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI=
|
||||
|
@ -501,10 +505,11 @@ github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs
|
|||
github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po=
|
||||
github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU=
|
||||
github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
||||
github.com/multiformats/go-multistream v0.0.3 h1:sRTU9QWosQWXteaM0PHCFVWSIHWxOyjdwL4MF7Lsdfg=
|
||||
github.com/multiformats/go-multistream v0.0.3/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
||||
github.com/multiformats/go-multistream v0.0.4 h1:rNgWgFyzRSTI9L+xISrz7kN5MdNXoEcoIeeCH05wLKA=
|
||||
github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
||||
github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ=
|
||||
github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
|
@ -531,8 +536,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
|||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992 h1:bzMe+2coZJYHnhGgVlcQKuRy4FSny4ds8dLQjw5P1XE=
|
||||
github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
|
||||
github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14 h1:2m16U/rLwVaRdz7ANkHtHTodP3zTP3N451MADg64x5k=
|
||||
github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 h1:D+CiwcpGTW6pL6bv6KI3KbyEyCKyS+1JWS2h8PNDnGA=
|
||||
|
@ -556,23 +559,15 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 h1:/K3IL0Z1quvmJ
|
|||
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d h1:Z5QMcUKnQw7ouB1wDuyZM6TL/rm+brJcNk6Ai8ut3zM=
|
||||
github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
|
||||
github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI=
|
||||
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||
github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/assertions v0.0.0-20190401211740-f487f9de1cd3 h1:hBSHahWMEgzwRyS6dRpxY0XyjZsHyQ61s084wo5PJe0=
|
||||
github.com/smartystreets/assertions v0.0.0-20190401211740-f487f9de1cd3/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek=
|
||||
github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0=
|
||||
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU=
|
||||
|
@ -588,15 +583,12 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
|
|||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||
github.com/ugorji/go v0.0.0-20171015030454-f26fc641ec9d/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
|
||||
github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436 h1:qOpVTI+BrstcjTZLm2Yz/3sOnqkzj3FQoh0g+E5s3Gc=
|
||||
github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
|
||||
github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0=
|
||||
github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
|
||||
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4=
|
||||
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM=
|
||||
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0=
|
||||
|
@ -609,12 +601,9 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6
|
|||
github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM=
|
||||
github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg=
|
||||
github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8=
|
||||
github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o=
|
||||
github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4=
|
||||
github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo=
|
||||
github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ=
|
||||
github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI=
|
||||
github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible h1:nVkExQ7pYlN9e45LcqTCOiDD0904fjtm0flnHZGbXkw=
|
||||
github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI=
|
||||
github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA=
|
||||
github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA=
|
||||
|
@ -625,7 +614,6 @@ github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c h1:GGsyl0d
|
|||
github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c/go.mod h1:xxcJeBb7SIUl/Wzkz1eVKJE/CB34YNrqX2TQI6jY9zs=
|
||||
github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow=
|
||||
github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg=
|
||||
github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE=
|
||||
github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8=
|
||||
github.com/zenground0/go-dot v0.0.0-20180912213407-94a425d4984e h1:GN1PUQ/MNDdtiZZhCAnZ4PwTcslUM8qWVz8q2bLkDeM=
|
||||
github.com/zenground0/go-dot v0.0.0-20180912213407-94a425d4984e/go.mod h1:T00FaxHq4SlnicuZFole4yRAgcjWtqbMcUXBfXAYvaI=
|
||||
|
@ -634,8 +622,6 @@ go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
|
|||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go4.org v0.0.0-20190218023631-ce4c26f7be8e h1:m9LfARr2VIOW0vsV19kEKp/sWQvZnGobA8JHui/XJoY=
|
||||
go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
|
||||
go4.org v0.0.0-20190313082347-94abd6928b1d h1:JkRdGP3zvTtTbabWSAC6n67ka30y7gOzWAah4XYJSfw=
|
||||
go4.org v0.0.0-20190313082347-94abd6928b1d/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
|
||||
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
|
@ -646,7 +632,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90Pveol
|
|||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo=
|
||||
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo=
|
||||
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
|
@ -654,20 +639,12 @@ golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL
|
|||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2 h1:y102fOLFqhV41b+4GPiJoa0k/x+pJcEi2/HB1Y5T6fU=
|
||||
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522 h1:OeRHuibLsmZkFj773W4LcfAGsSxJgfPONhr8cmO+eLA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81 h1:00VmoueYNlNz/aHIilyyQz/MHSqGoWJzpFv/HW8xpzI=
|
||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190507092727-e4e5bf290fec/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190516052701-61b8692d9a5c h1:VgWXv7ME0Tq2L5CBzVvhTMrfcKfvGs7ifTV9PBYTP3I=
|
||||
golang.org/x/image v0.0.0-20190516052701-61b8692d9a5c/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
@ -683,9 +660,9 @@ golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73r
|
|||
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190520210107-018c4d40a106 h1:EZofHp/BzEf3j39/+7CX1JvH0WaPG+ikBrqAdAPf+GM=
|
||||
golang.org/x/net v0.0.0-20190520210107-018c4d40a106/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco=
|
||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -694,8 +671,6 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FY
|
|||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
|
@ -708,11 +683,13 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||
golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190302025703-b6889370fb10 h1:xQJI9OEiErEQ++DoXOHqEpzsGMrAv2Q2jyCpi7DmfpQ=
|
||||
golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190509141414-a5b02f93d862/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190520201301-c432e742b0af h1:NXfmMfXz6JqGfG3ikSxcz2N93j6DgScr19Oo2uwFu88=
|
||||
golang.org/x/sys v0.0.0-20190520201301-c432e742b0af/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190524122548-abf6ff778158 h1:v73Zw0Y1htnV0qaOAYSNiuIAviPSBkNtdy1tPi1+zpY=
|
||||
golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4 h1:VSJ45BzqrVgR4clSx415y1rHH7QAGhGt71J0ZmhLYrc=
|
||||
golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
|
@ -726,42 +703,32 @@ golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGm
|
|||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c h1:vamGzbGri8IKo20MQncCuljcQ5uAO6kaCeawQPVblAI=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190509153222-73554e0f7805/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522 h1:bhOzK9QyoD0ogCnFro1m2mz41+Ib0oOhfJnBp5MR4K4=
|
||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
|
||||
gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0=
|
||||
gonum.org/v1/gonum v0.0.0-20190520094443-a5f8f3a4840b h1:6TIR0pAaLZhSQXUKh+yxFO4qaPuWt+ZlC8cEVzeME5I=
|
||||
gonum.org/v1/gonum v0.0.0-20190520094443-a5f8f3a4840b/go.mod h1:zXcK6UmEkbNk22MqyPrZPx3T6fsE/O56XzkDfeYUF+Y=
|
||||
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc=
|
||||
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
|
||||
gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e h1:jRyg0XfpwWlhEV8mDfdNGBeSJM2fuyh9Yjrnd8kF2Ts=
|
||||
gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=
|
||||
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b h1:Qh4dB5D/WpoUUp3lSod7qgoyEHbDGPUWjIbnqdqqe1k=
|
||||
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
|
||||
google.golang.org/api v0.3.1 h1:oJra/lMfmtm13/rgY/8i3MzjFWYXvQIAKjQ3HqofMk8=
|
||||
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||
google.golang.org/api v0.3.2 h1:iTp+3yyl/KOtxa/d1/JUE0GGSoR6FuW5udver22iwpw=
|
||||
google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||
google.golang.org/api v0.5.0 h1:lj9SyhMzyoa38fgFF0oO2T6pjs5IzkLPKfVtxpyCRMM=
|
||||
google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190516172635-bb713bdc0e52 h1:LHc/6x2dMeCKkSsrVgo4DY+Z566T1OeoMwLtdfoy8LE=
|
||||
google.golang.org/genproto v0.0.0-20190516172635-bb713bdc0e52/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
|
||||
google.golang.org/grpc v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk=
|
||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0=
|
||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
|
@ -775,10 +742,5 @@ gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
|||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
|
||||
modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
|
||||
modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
|
||||
modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
|
||||
modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
|
||||
rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||
|
|
|
@ -392,6 +392,8 @@ func shutdownClusters(t *testing.T, clusters []*Cluster, m []*test.IpfsMock) {
|
|||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
c.dht.Close()
|
||||
c.host.Close()
|
||||
m[i].Close()
|
||||
}
|
||||
os.RemoveAll(testsFolder)
|
||||
|
@ -703,6 +705,7 @@ func TestClustersStatusAllWithErrors(t *testing.T) {
|
|||
|
||||
// shutdown 1 cluster peer
|
||||
clusters[1].Shutdown(ctx)
|
||||
clusters[1].host.Close()
|
||||
delay()
|
||||
|
||||
f := func(t *testing.T, c *Cluster) {
|
||||
|
@ -738,7 +741,7 @@ func TestClustersStatusAllWithErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
if errst.Status != api.TrackerStatusClusterError {
|
||||
t.Error("erroring status should be set to ClusterError")
|
||||
t.Error("erroring status should be set to ClusterError:", errst.Status)
|
||||
}
|
||||
|
||||
// now check with Cid status
|
||||
|
@ -750,7 +753,7 @@ func TestClustersStatusAllWithErrors(t *testing.T) {
|
|||
pinfo := status.PeerMap[pid]
|
||||
|
||||
if pinfo.Status != api.TrackerStatusClusterError {
|
||||
t.Error("erroring status should be ClusterError")
|
||||
t.Error("erroring status should be ClusterError:", pinfo.Status)
|
||||
}
|
||||
|
||||
if !pinfo.Cid.Equals(h) {
|
||||
|
@ -1815,7 +1818,9 @@ func TestClustersGraphUnhealthy(t *testing.T) {
|
|||
}
|
||||
|
||||
clusters[discon1].Shutdown(ctx)
|
||||
clusters[discon1].host.Close()
|
||||
clusters[discon2].Shutdown(ctx)
|
||||
clusters[discon2].host.Close()
|
||||
|
||||
waitForLeaderAndMetrics(t, clusters)
|
||||
|
||||
|
|
|
@ -155,11 +155,11 @@ func TestClustersPeerAdd(t *testing.T) {
|
|||
addrs := c.peerManager.LoadPeerstore()
|
||||
peerMap := make(map[peer.ID]struct{})
|
||||
for _, a := range addrs {
|
||||
pid, _, err := api.Libp2pMultiaddrSplit(a)
|
||||
pinfo, err := peerstore.InfoFromP2pAddr(a)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
peerMap[pid] = struct{}{}
|
||||
peerMap[pinfo.ID] = struct{}{}
|
||||
}
|
||||
|
||||
if len(peerMap) == 0 {
|
||||
|
|
|
@ -10,11 +10,10 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"sort"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/ipfs/ipfs-cluster/api"
|
||||
|
||||
logging "github.com/ipfs/go-log"
|
||||
host "github.com/libp2p/go-libp2p-host"
|
||||
peer "github.com/libp2p/go-libp2p-peer"
|
||||
|
@ -25,10 +24,14 @@ import (
|
|||
|
||||
var logger = logging.Logger("pstoremgr")
|
||||
|
||||
// Timeouts for network operations triggered by the Manager
|
||||
// PriorityTag is used to attach metadata to peers in the peerstore
|
||||
// so they can be sorted.
|
||||
var PriorityTag = "cluster"
|
||||
|
||||
// Timeouts for network operations triggered by the Manager.
|
||||
var (
|
||||
DNSTimeout = 5 * time.Second
|
||||
ConnectTimeout = 10 * time.Second
|
||||
ConnectTimeout = 5 * time.Second
|
||||
)
|
||||
|
||||
// Manager provides utilities for handling cluster peer addresses
|
||||
|
@ -43,9 +46,9 @@ type Manager struct {
|
|||
// New creates a Manager with the given libp2p Host and peerstorePath.
|
||||
// The path indicates the place to persist and read peer addresses from.
|
||||
// If empty, these operations (LoadPeerstore, SavePeerstore) will no-op.
|
||||
func New(h host.Host, peerstorePath string) *Manager {
|
||||
func New(ctx context.Context, h host.Host, peerstorePath string) *Manager {
|
||||
return &Manager{
|
||||
ctx: context.Background(),
|
||||
ctx: ctx,
|
||||
host: h,
|
||||
peerstorePath: peerstorePath,
|
||||
}
|
||||
|
@ -54,38 +57,33 @@ func New(h host.Host, peerstorePath string) *Manager {
|
|||
// ImportPeer adds a new peer address to the host's peerstore, optionally
|
||||
// dialing to it. It will resolve any DNS multiaddresses before adding them.
|
||||
// The address is expected to include the /ipfs/<peerID> protocol part.
|
||||
func (pm *Manager) ImportPeer(addr ma.Multiaddr, connect bool) error {
|
||||
// Peers are added with the given ttl
|
||||
func (pm *Manager) ImportPeer(addr ma.Multiaddr, connect bool, ttl time.Duration) (peer.ID, error) {
|
||||
if pm.host == nil {
|
||||
return nil
|
||||
return "", nil
|
||||
}
|
||||
|
||||
logger.Debugf("adding peer address %s", addr)
|
||||
pid, decapAddr, err := api.Libp2pMultiaddrSplit(addr)
|
||||
pinfo, err := peerstore.InfoFromP2pAddr(addr)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
pm.host.Peerstore().AddAddr(pid, decapAddr, peerstore.PermanentAddrTTL)
|
||||
|
||||
// dns multiaddresses need to be resolved because libp2p only does that
|
||||
// on explicit bhost.Connect().
|
||||
if madns.Matches(addr) {
|
||||
ctx, cancel := context.WithTimeout(pm.ctx, DNSTimeout)
|
||||
defer cancel()
|
||||
resolvedAddrs, err := madns.Resolve(ctx, addr)
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
return err
|
||||
}
|
||||
pm.ImportPeers(resolvedAddrs, connect)
|
||||
// Do not add ourselves
|
||||
if pinfo.ID == pm.host.ID() {
|
||||
return pinfo.ID, nil
|
||||
}
|
||||
|
||||
pm.host.Peerstore().AddAddrs(pinfo.ID, pinfo.Addrs, ttl)
|
||||
|
||||
if connect {
|
||||
go func() {
|
||||
ctx, cancel := context.WithTimeout(pm.ctx, ConnectTimeout)
|
||||
defer cancel()
|
||||
pm.host.Network().DialPeer(ctx, pid)
|
||||
pm.host.Connect(ctx, *pinfo)
|
||||
}()
|
||||
}
|
||||
return nil
|
||||
return pinfo.ID, nil
|
||||
}
|
||||
|
||||
// RmPeer clear all addresses for a given peer ID from the host's peerstore.
|
||||
|
@ -100,19 +98,17 @@ func (pm *Manager) RmPeer(pid peer.ID) error {
|
|||
}
|
||||
|
||||
// if the peer has dns addresses, return only those, otherwise
|
||||
// return all. In all cases, encapsulate the peer ID.
|
||||
func (pm *Manager) filteredPeerAddrs(p peer.ID) []api.Multiaddr {
|
||||
// return all.
|
||||
func (pm *Manager) filteredPeerAddrs(p peer.ID) []ma.Multiaddr {
|
||||
all := pm.host.Peerstore().Addrs(p)
|
||||
peerAddrs := []api.Multiaddr{}
|
||||
peerDNSAddrs := []api.Multiaddr{}
|
||||
peerPart, _ := ma.NewMultiaddr(fmt.Sprintf("/ipfs/%s", peer.IDB58Encode(p)))
|
||||
peerAddrs := []ma.Multiaddr{}
|
||||
peerDNSAddrs := []ma.Multiaddr{}
|
||||
|
||||
for _, a := range all {
|
||||
encAddr := a.Encapsulate(peerPart)
|
||||
if madns.Matches(encAddr) {
|
||||
peerDNSAddrs = append(peerDNSAddrs, api.NewMultiaddrWithValue(encAddr))
|
||||
if madns.Matches(a) {
|
||||
peerDNSAddrs = append(peerDNSAddrs, a)
|
||||
} else {
|
||||
peerAddrs = append(peerAddrs, api.NewMultiaddrWithValue(encAddr))
|
||||
peerAddrs = append(peerAddrs, a)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -123,11 +119,12 @@ func (pm *Manager) filteredPeerAddrs(p peer.ID) []api.Multiaddr {
|
|||
return peerAddrs
|
||||
}
|
||||
|
||||
// PeersAddresses returns the list of multiaddresses (encapsulating the
|
||||
// /ipfs/<peerID> part) for the given set of peers. For peers for which
|
||||
// we know DNS multiaddresses, we only return those. Otherwise, we return
|
||||
// all the multiaddresses known for that peer.
|
||||
func (pm *Manager) PeersAddresses(peers []peer.ID) []api.Multiaddr {
|
||||
// PeerInfos returns a slice of peerinfos for the given set of peers in order
|
||||
// of priority. For peers for which we know DNS
|
||||
// multiaddresses, we only include those. Otherwise, the PeerInfo includes all
|
||||
// the multiaddresses known for that peer. Peers without addresses are not
|
||||
// included.
|
||||
func (pm *Manager) PeerInfos(peers []peer.ID) []peerstore.PeerInfo {
|
||||
if pm.host == nil {
|
||||
return nil
|
||||
}
|
||||
|
@ -136,29 +133,47 @@ func (pm *Manager) PeersAddresses(peers []peer.ID) []api.Multiaddr {
|
|||
return nil
|
||||
}
|
||||
|
||||
var addrs []api.Multiaddr
|
||||
var pinfos []peerstore.PeerInfo
|
||||
for _, p := range peers {
|
||||
if p == pm.host.ID() {
|
||||
continue
|
||||
}
|
||||
addrs = append(addrs, pm.filteredPeerAddrs(p)...)
|
||||
pinfo := peerstore.PeerInfo{
|
||||
ID: p,
|
||||
Addrs: pm.filteredPeerAddrs(p),
|
||||
}
|
||||
if len(pinfo.Addrs) > 0 {
|
||||
pinfos = append(pinfos, pinfo)
|
||||
}
|
||||
}
|
||||
return addrs
|
||||
|
||||
toSort := &peerSort{
|
||||
pinfos: pinfos,
|
||||
pstore: pm.host.Peerstore(),
|
||||
}
|
||||
// Sort from highest to lowest priority
|
||||
sort.Sort(toSort)
|
||||
|
||||
return toSort.pinfos
|
||||
}
|
||||
|
||||
// ImportPeers calls ImportPeer for every address in the given slice, using the
|
||||
// given connect parameter.
|
||||
func (pm *Manager) ImportPeers(addrs []ma.Multiaddr, connect bool) error {
|
||||
for _, a := range addrs {
|
||||
pm.ImportPeer(a, connect)
|
||||
// given connect parameter. Peers are tagged with priority as given
|
||||
// by their position in the list.
|
||||
func (pm *Manager) ImportPeers(addrs []ma.Multiaddr, connect bool, ttl time.Duration) error {
|
||||
for i, a := range addrs {
|
||||
pid, err := pm.ImportPeer(a, connect, ttl)
|
||||
if err == nil {
|
||||
pm.SetPriority(pid, i)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ImportPeersFromPeerstore reads the peerstore file and calls ImportPeers with
|
||||
// the addresses obtained from it.
|
||||
func (pm *Manager) ImportPeersFromPeerstore(connect bool) error {
|
||||
return pm.ImportPeers(pm.LoadPeerstore(), connect)
|
||||
func (pm *Manager) ImportPeersFromPeerstore(connect bool, ttl time.Duration) error {
|
||||
return pm.ImportPeers(pm.LoadPeerstore(), connect, ttl)
|
||||
}
|
||||
|
||||
// LoadPeerstore parses the peerstore file and returns the list
|
||||
|
@ -202,7 +217,7 @@ func (pm *Manager) LoadPeerstore() (addrs []ma.Multiaddr) {
|
|||
|
||||
// SavePeerstore stores a slice of multiaddresses in the peerstore file, one
|
||||
// per line.
|
||||
func (pm *Manager) SavePeerstore(addrs []api.Multiaddr) {
|
||||
func (pm *Manager) SavePeerstore(pinfos []peerstore.PeerInfo) {
|
||||
if pm.peerstorePath == "" {
|
||||
return
|
||||
}
|
||||
|
@ -221,13 +236,100 @@ func (pm *Manager) SavePeerstore(addrs []api.Multiaddr) {
|
|||
}
|
||||
defer f.Close()
|
||||
|
||||
for _, a := range addrs {
|
||||
f.Write([]byte(fmt.Sprintf("%s\n", a.Value().String())))
|
||||
for _, pinfo := range pinfos {
|
||||
addrs, err := peerstore.InfoToP2pAddrs(&pinfo)
|
||||
if err != nil {
|
||||
logger.Warning(err)
|
||||
continue
|
||||
}
|
||||
for _, a := range addrs {
|
||||
f.Write([]byte(fmt.Sprintf("%s\n", a.String())))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SavePeerstoreForPeers calls PeersAddresses and then saves the peerstore
|
||||
// SavePeerstoreForPeers calls PeerInfos and then saves the peerstore
|
||||
// file using the result.
|
||||
func (pm *Manager) SavePeerstoreForPeers(peers []peer.ID) {
|
||||
pm.SavePeerstore(pm.PeersAddresses(peers))
|
||||
pm.SavePeerstore(pm.PeerInfos(peers))
|
||||
}
|
||||
|
||||
// Bootstrap attempts to get as much as count connected peers by selecting
|
||||
// randomly from those in the libp2p host peerstore. It returns the number
|
||||
// of peers it successfully connected to.
|
||||
func (pm *Manager) Bootstrap(count int) int {
|
||||
knownPeers := pm.host.Peerstore().PeersWithAddrs()
|
||||
toSort := &peerSort{
|
||||
pinfos: peerstore.PeerInfos(pm.host.Peerstore(), knownPeers),
|
||||
pstore: pm.host.Peerstore(),
|
||||
}
|
||||
|
||||
// Sort from highest to lowest priority
|
||||
sort.Sort(toSort)
|
||||
|
||||
pinfos := toSort.pinfos
|
||||
lenKnown := len(pinfos)
|
||||
totalConns := 0
|
||||
|
||||
// keep conecting while we have peers in the store
|
||||
// and we have not reached count.
|
||||
for i := 0; i < lenKnown && totalConns < count; i++ {
|
||||
pinfo := pinfos[i]
|
||||
ctx, cancel := context.WithTimeout(pm.ctx, ConnectTimeout)
|
||||
defer cancel()
|
||||
|
||||
logger.Infof("connecting to %s", pinfo.ID)
|
||||
err := pm.host.Connect(ctx, pinfo)
|
||||
if err != nil {
|
||||
logger.Warning(err)
|
||||
pm.SetPriority(pinfo.ID, 9999)
|
||||
continue
|
||||
}
|
||||
totalConns++
|
||||
}
|
||||
return totalConns
|
||||
}
|
||||
|
||||
// SetPriority attaches a priority to a peer. 0 means more priority than
|
||||
// 1. 1 means more priority than 2 etc.
|
||||
func (pm *Manager) SetPriority(pid peer.ID, prio int) error {
|
||||
return pm.host.Peerstore().Put(pid, PriorityTag, prio)
|
||||
}
|
||||
|
||||
// peerSort is used to sort a slice of PinInfos given the PriorityTag in the
|
||||
// peerstore, from the lowest tag value (0 is the highest priority) to the
|
||||
// highest, Peers without a valid priority tag are considered as having a tag
|
||||
// with value 0, so they will be among the first elements in the resulting
|
||||
// slice.
|
||||
type peerSort struct {
|
||||
pinfos []peerstore.PeerInfo
|
||||
pstore peerstore.Peerstore
|
||||
}
|
||||
|
||||
func (ps *peerSort) Len() int {
|
||||
return len(ps.pinfos)
|
||||
}
|
||||
|
||||
func (ps *peerSort) Less(i, j int) bool {
|
||||
pinfo1 := ps.pinfos[i]
|
||||
pinfo2 := ps.pinfos[j]
|
||||
|
||||
var prio1, prio2 int
|
||||
|
||||
prio1iface, err := ps.pstore.Get(pinfo1.ID, PriorityTag)
|
||||
if err == nil {
|
||||
prio1 = prio1iface.(int)
|
||||
}
|
||||
prio2iface, err := ps.pstore.Get(pinfo2.ID, PriorityTag)
|
||||
if err == nil {
|
||||
prio2 = prio2iface.(int)
|
||||
}
|
||||
return prio1 < prio2
|
||||
}
|
||||
|
||||
func (ps *peerSort) Swap(i, j int) {
|
||||
pinfo1 := ps.pinfos[i]
|
||||
pinfo2 := ps.pinfos[j]
|
||||
ps.pinfos[i] = pinfo2
|
||||
ps.pinfos[j] = pinfo1
|
||||
}
|
||||
|
|
|
@ -4,21 +4,21 @@ import (
|
|||
"context"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/ipfs/ipfs-cluster/api"
|
||||
"github.com/ipfs/ipfs-cluster/test"
|
||||
|
||||
libp2p "github.com/libp2p/go-libp2p"
|
||||
peer "github.com/libp2p/go-libp2p-peer"
|
||||
ma "github.com/multiformats/go-multiaddr"
|
||||
)
|
||||
|
||||
var pid = "QmXZrtE5jQwXNqCJMfHUTQkvhQ4ZAnqMnmzFMJfLewuabc"
|
||||
|
||||
func makeMgr(t *testing.T) *Manager {
|
||||
h, err := libp2p.New(context.Background())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
return New(h, "peerstore")
|
||||
return New(context.Background(), h, "peerstore")
|
||||
}
|
||||
|
||||
func clean(pm *Manager) {
|
||||
|
@ -27,31 +27,45 @@ func clean(pm *Manager) {
|
|||
}
|
||||
}
|
||||
|
||||
func testAddr(loc string, pid peer.ID) ma.Multiaddr {
|
||||
m, _ := ma.NewMultiaddr(loc + "/ipfs/" + peer.IDB58Encode(pid))
|
||||
return m
|
||||
}
|
||||
|
||||
func TestManager(t *testing.T) {
|
||||
pm := makeMgr(t)
|
||||
defer clean(pm)
|
||||
|
||||
testPeer, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234/ipfs/" + pid)
|
||||
loc := "/ip4/127.0.0.1/tcp/1234"
|
||||
testAddr := testAddr(loc, test.PeerID1)
|
||||
|
||||
err := pm.ImportPeer(testPeer, false)
|
||||
_, err := pm.ImportPeer(testAddr, false, time.Minute)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
peers := api.StringsToPeers([]string{pid, pm.host.ID().Pretty()})
|
||||
addrs := pm.PeersAddresses(peers)
|
||||
if len(addrs) != 1 {
|
||||
t.Fatal("expected 1 address")
|
||||
peers := []peer.ID{test.PeerID1, pm.host.ID()}
|
||||
pinfos := pm.PeerInfos(peers)
|
||||
if len(pinfos) != 1 {
|
||||
t.Fatal("expected 1 peerinfo")
|
||||
}
|
||||
|
||||
if !addrs[0].Equal(testPeer) {
|
||||
if pinfos[0].ID != test.PeerID1 {
|
||||
t.Error("expected same peer as added")
|
||||
}
|
||||
|
||||
if len(pinfos[0].Addrs) != 1 {
|
||||
t.Fatal("expected an address")
|
||||
}
|
||||
|
||||
if pinfos[0].Addrs[0].String() != loc {
|
||||
t.Error("expected same address as added")
|
||||
}
|
||||
|
||||
pm.RmPeer(peers[0])
|
||||
addrs = pm.PeersAddresses(peers)
|
||||
if len(addrs) != 0 {
|
||||
t.Fatal("expected 0 addresses")
|
||||
pinfos = pm.PeerInfos(peers)
|
||||
if len(pinfos) != 0 {
|
||||
t.Fatal("expected 0 pinfos")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -59,21 +73,27 @@ func TestManagerDNS(t *testing.T) {
|
|||
pm := makeMgr(t)
|
||||
defer clean(pm)
|
||||
|
||||
testPeer, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234/ipfs/" + pid)
|
||||
testPeer2, _ := ma.NewMultiaddr("/dns4/localhost/tcp/1235/ipfs/" + pid)
|
||||
loc1 := "/ip4/127.0.0.1/tcp/1234"
|
||||
testAddr1 := testAddr(loc1, test.PeerID1)
|
||||
loc2 := "/dns4/localhost/tcp/1235"
|
||||
testAddr2 := testAddr(loc2, test.PeerID1)
|
||||
|
||||
err := pm.ImportPeers([]ma.Multiaddr{testPeer, testPeer2}, false)
|
||||
err := pm.ImportPeers([]ma.Multiaddr{testAddr1, testAddr2}, false, time.Minute)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
addrs := pm.PeersAddresses(api.StringsToPeers([]string{pid}))
|
||||
if len(addrs) != 1 {
|
||||
t.Fatal("expected 1 address")
|
||||
pinfos := pm.PeerInfos([]peer.ID{test.PeerID1})
|
||||
if len(pinfos) != 1 {
|
||||
t.Fatal("expected 1 pinfo")
|
||||
}
|
||||
|
||||
if !addrs[0].Equal(testPeer2) {
|
||||
t.Error("expected only the dns address")
|
||||
if len(pinfos[0].Addrs) != 1 {
|
||||
t.Error("expected a single address")
|
||||
}
|
||||
|
||||
if pinfos[0].Addrs[0].String() != "/dns4/localhost/tcp/1235" {
|
||||
t.Error("expected the dns address")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -81,25 +101,95 @@ func TestPeerstore(t *testing.T) {
|
|||
pm := makeMgr(t)
|
||||
defer clean(pm)
|
||||
|
||||
testPeer, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234/ipfs/" + pid)
|
||||
testPeer2, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235/ipfs/" + pid)
|
||||
loc1 := "/ip4/127.0.0.1/tcp/1234"
|
||||
testAddr1 := testAddr(loc1, test.PeerID1)
|
||||
loc2 := "/ip4/127.0.0.1/tcp/1235"
|
||||
testAddr2 := testAddr(loc2, test.PeerID1)
|
||||
|
||||
err := pm.ImportPeers([]ma.Multiaddr{testPeer, testPeer2}, false)
|
||||
err := pm.ImportPeers([]ma.Multiaddr{testAddr1, testAddr2}, false, time.Minute)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
pm.SavePeerstoreForPeers(api.StringsToPeers([]string{pid}))
|
||||
pm.SavePeerstoreForPeers([]peer.ID{test.PeerID1})
|
||||
|
||||
pm2 := makeMgr(t)
|
||||
defer clean(pm2)
|
||||
|
||||
err = pm2.ImportPeersFromPeerstore(false)
|
||||
err = pm2.ImportPeersFromPeerstore(false, time.Minute)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(pm2.PeersAddresses(api.StringsToPeers([]string{pid}))) != 2 {
|
||||
t.Error("expected 2 addresses from the peerstore")
|
||||
pinfos := pm2.PeerInfos([]peer.ID{test.PeerID1})
|
||||
if len(pinfos) != 1 {
|
||||
t.Fatal("expected 1 peer in the peerstore")
|
||||
}
|
||||
|
||||
if len(pinfos[0].Addrs) != 2 {
|
||||
t.Error("expected 2 addresses")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPriority(t *testing.T) {
|
||||
pm := makeMgr(t)
|
||||
defer clean(pm)
|
||||
|
||||
loc1 := "/ip4/127.0.0.1/tcp/1234"
|
||||
testAddr1 := testAddr(loc1, test.PeerID1)
|
||||
loc2 := "/ip4/127.0.0.2/tcp/1235"
|
||||
testAddr2 := testAddr(loc2, test.PeerID2)
|
||||
loc3 := "/ip4/127.0.0.3/tcp/1234"
|
||||
testAddr3 := testAddr(loc3, test.PeerID3)
|
||||
loc4 := "/ip4/127.0.0.4/tcp/1235"
|
||||
testAddr4 := testAddr(loc4, test.PeerID4)
|
||||
|
||||
err := pm.ImportPeers([]ma.Multiaddr{testAddr1, testAddr2, testAddr3, testAddr4}, false, time.Minute)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
pinfos := pm.PeerInfos([]peer.ID{test.PeerID4, test.PeerID2, test.PeerID3, test.PeerID1})
|
||||
if len(pinfos) != 4 {
|
||||
t.Fatal("expected 4 pinfos")
|
||||
}
|
||||
|
||||
if pinfos[0].ID != test.PeerID1 ||
|
||||
pinfos[1].ID != test.PeerID2 ||
|
||||
pinfos[2].ID != test.PeerID3 ||
|
||||
pinfos[3].ID != test.PeerID4 {
|
||||
t.Error("wrong order of peerinfos")
|
||||
}
|
||||
|
||||
pm.SetPriority(test.PeerID1, 100)
|
||||
|
||||
pinfos = pm.PeerInfos([]peer.ID{test.PeerID4, test.PeerID2, test.PeerID3, test.PeerID1})
|
||||
if len(pinfos) != 4 {
|
||||
t.Fatal("expected 4 pinfos")
|
||||
}
|
||||
|
||||
if pinfos[3].ID != test.PeerID1 {
|
||||
t.Fatal("PeerID1 should be last in the list")
|
||||
}
|
||||
|
||||
pm.SavePeerstoreForPeers([]peer.ID{test.PeerID4, test.PeerID2, test.PeerID3, test.PeerID1})
|
||||
|
||||
pm2 := makeMgr(t)
|
||||
defer clean(pm2)
|
||||
|
||||
err = pm2.ImportPeersFromPeerstore(false, time.Minute)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
pinfos = pm2.PeerInfos([]peer.ID{test.PeerID4, test.PeerID2, test.PeerID3, test.PeerID1})
|
||||
if len(pinfos) != 4 {
|
||||
t.Fatal("expected 4 pinfos")
|
||||
}
|
||||
|
||||
if pinfos[0].ID != test.PeerID2 ||
|
||||
pinfos[1].ID != test.PeerID3 ||
|
||||
pinfos[2].ID != test.PeerID4 ||
|
||||
pinfos[3].ID != test.PeerID1 {
|
||||
t.Error("wrong order of peerinfos")
|
||||
}
|
||||
}
|
||||
|
|
11
util.go
11
util.go
|
@ -4,10 +4,9 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/ipfs/ipfs-cluster/api"
|
||||
|
||||
cid "github.com/ipfs/go-cid"
|
||||
peer "github.com/libp2p/go-libp2p-peer"
|
||||
peerstore "github.com/libp2p/go-libp2p-peerstore"
|
||||
ma "github.com/multiformats/go-multiaddr"
|
||||
)
|
||||
|
||||
|
@ -18,14 +17,14 @@ func PeersFromMultiaddrs(addrs []ma.Multiaddr) []peer.ID {
|
|||
var pids []peer.ID
|
||||
pm := make(map[peer.ID]struct{})
|
||||
for _, addr := range addrs {
|
||||
pid, _, err := api.Libp2pMultiaddrSplit(addr)
|
||||
pinfo, err := peerstore.InfoFromP2pAddr(addr)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
_, ok := pm[pid]
|
||||
_, ok := pm[pinfo.ID]
|
||||
if !ok {
|
||||
pm[pid] = struct{}{}
|
||||
pids = append(pids, pid)
|
||||
pm[pinfo.ID] = struct{}{}
|
||||
pids = append(pids, pinfo.ID)
|
||||
}
|
||||
}
|
||||
return pids
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
|
||||
// Version is the current cluster version. Version alignment between
|
||||
// components, apis and tools ensures compatibility among them.
|
||||
var Version = semver.MustParse("0.10.1")
|
||||
var Version = semver.MustParse("0.11.0-rc1")
|
||||
|
||||
// RPCProtocol is used to send libp2p messages between cluster peers
|
||||
var RPCProtocol = protocol.ID(
|
||||
|
|
Loading…
Reference in New Issue
Block a user