From ba5e423f5888dfed825fbd0aeea1a4b90a21bedf Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 23 May 2019 00:34:47 +0200 Subject: [PATCH 01/15] Feat: introduce a ConnectionManager for the libp2p host As follow up to #787, this uses the default libp2p connection manager for the cluster libp2p host. The connection manager settings can be set in the main configuration section (but it should be compatible with previous configurations which have it unset). This PR is just introducing the connection manager. Peer connection protection etc will come in additional PRs. --- cluster_config.go | 89 +++++++++++++++++++++++++++++++++++------- cluster_config_test.go | 63 ++++++++++++++++++++++-------- clusterhost.go | 4 ++ config_test.go | 5 +++ go.mod | 1 + go.sum | 4 ++ 6 files changed, 135 insertions(+), 31 deletions(-) diff --git a/cluster_config.go b/cluster_config.go index b5e7c389..0644ba99 100644 --- a/cluster_config.go +++ b/cluster_config.go @@ -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() diff --git a/cluster_config_test.go b/cluster_config_test.go index 1ba3c103..bbc5747b 100644 --- a/cluster_config_test.go +++ b/cluster_config_test.go @@ -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") + } } diff --git a/clusterhost.go b/clusterhost.go index 623203bd..034ef0f0 100644 --- a/clusterhost.go +++ b/clusterhost.go @@ -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 diff --git a/config_test.go b/config_test.go index 95c274b3..4f3ca90b 100644 --- a/config_test.go +++ b/config_test.go @@ -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, diff --git a/go.mod b/go.mod index d72f2bc1..83bbc003 100644 --- a/go.mod +++ b/go.mod @@ -41,6 +41,7 @@ require ( 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/libp2p/go-libp2p-connmgr v0.0.5 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 diff --git a/go.sum b/go.sum index a7b901c3..675da061 100644 --- a/go.sum +++ b/go.sum @@ -342,6 +342,8 @@ github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv 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-connmgr v0.0.5 h1:EzgFolZ1RHUiuRj22zZRcGu8TJuBkfjeuH9TazbcmP4= +github.com/libp2p/go-libp2p-connmgr v0.0.5/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-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= @@ -364,6 +366,8 @@ 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= From 96edbc1ea6591affd6b79f3edce30c6d0330fb72 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Sat, 25 May 2019 00:23:46 +0200 Subject: [PATCH 02/15] Daemon: handle host and DHT lifecycle outside Cluster The Host and DHT are created outside of cluster and should be shutdown outside of it, not inside. --- cluster.go | 1 - cmd/ipfs-cluster-service/daemon.go | 27 +++++++++++++++++++-------- ipfscluster_test.go | 2 ++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/cluster.go b/cluster.go index 4d416592..65fda785 100644 --- a/cluster.go +++ b/cluster.go @@ -582,7 +582,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 diff --git a/cmd/ipfs-cluster-service/daemon.go b/cmd/ipfs-cluster-service/daemon.go index d411a05c..dd9bc346 100644 --- a/cmd/ipfs-cluster-service/daemon.go +++ b/cmd/ipfs-cluster-service/daemon.go @@ -51,7 +51,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 +80,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 +93,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,15 +102,15 @@ 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()) @@ -207,7 +209,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 +231,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 } } diff --git a/ipfscluster_test.go b/ipfscluster_test.go index 65245d0e..77512054 100644 --- a/ipfscluster_test.go +++ b/ipfscluster_test.go @@ -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) From b46f0228847f077f818fdefb8454c499cd6fad8e Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Sat, 25 May 2019 00:24:30 +0200 Subject: [PATCH 03/15] Raft: rewrite logger New Raft update has changed the type of the logger --- consensus/raft/config.go | 2 +- consensus/raft/logging.go | 100 +++++++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/consensus/raft/config.go b/consensus/raft/config.go index 8f6ad151..8ab8e275 100644 --- a/consensus/raft/config.go +++ b/consensus/raft/config.go @@ -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 } diff --git a/consensus/raft/logging.go b/consensus/raft/logging.go index cb394869..3273d21d 100644 --- a/consensus/raft/logging.go +++ b/consensus/raft/logging.go @@ -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 From ab46f233e7b2d031163513e31c5901fc53e59135 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Sat, 25 May 2019 00:30:25 +0200 Subject: [PATCH 04/15] Dependency update and cleanup to libp2p-0.0.30 This has been horrible and won't even last, but the fixes in libp2p required it. --- go.mod | 52 +++++------- go.sum | 259 ++++++++++++++++++++++++--------------------------------- 2 files changed, 131 insertions(+), 180 deletions(-) diff --git a/go.mod b/go.mod index 83bbc003..f0497845 100644 --- a/go.mod +++ b/go.mod @@ -3,25 +3,25 @@ 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/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/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 @@ -33,28 +33,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/libp2p/go-libp2p-connmgr v0.0.5 + 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 @@ -62,18 +61,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 ) diff --git a/go.sum b/go.sum index 675da061..398de0ed 100644 --- a/go.sum +++ b/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= @@ -79,8 +72,6 @@ github.com/dgraph-io/badger v2.0.0-rc.2+incompatible h1:7KPp6xv5+wymkVUbkAnZZXvm github.com/dgraph-io/badger v2.0.0-rc.2+incompatible/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f h1:dDxpBYafY/GYpcl+LS4Bn3ziLPuEdGRkRjYAbSlWxSA= 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-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= @@ -91,8 +82,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= @@ -124,8 +113,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= @@ -136,16 +123,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= @@ -155,35 +142,33 @@ 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= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= 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= @@ -198,8 +183,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= @@ -226,12 +211,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= @@ -240,8 +221,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= @@ -250,24 +229,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= @@ -291,14 +266,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= @@ -314,50 +284,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-connmgr v0.0.5 h1:EzgFolZ1RHUiuRj22zZRcGu8TJuBkfjeuH9TazbcmP4= -github.com/libp2p/go-libp2p-connmgr v0.0.5/go.mod h1:uwDfgdgqB5248sQYib1xo603cSsMg9PgAKu0Z+Y65Qk= +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= @@ -370,14 +343,16 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.5 h1:KG/KNYL2tYzXAfMvQN5K1aAG 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 +366,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 +427,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 +501,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 +532,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 +555,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= @@ -594,8 +585,6 @@ 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= @@ -608,12 +597,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= @@ -624,7 +610,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= @@ -633,8 +618,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= @@ -645,7 +628,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= @@ -653,20 +635,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= @@ -682,9 +656,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= @@ -693,8 +667,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= @@ -707,11 +679,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= @@ -725,42 +699,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= @@ -774,10 +738,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= From a1d95f56378b7e0863538a045d273eaf1cecd310 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Sat, 25 May 2019 00:53:43 +0200 Subject: [PATCH 05/15] Fix tests with new host lifecycle handling --- ipfscluster_test.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ipfscluster_test.go b/ipfscluster_test.go index 77512054..6a66bae5 100644 --- a/ipfscluster_test.go +++ b/ipfscluster_test.go @@ -705,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) { @@ -740,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 @@ -752,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) { @@ -1817,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) From 196aa23f341458afe5f32e630b5161a302635f34 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 23 May 2019 18:41:33 +0200 Subject: [PATCH 06/15] Fix #787: Connectivity fixes Currently, unless doing Join() (--bootstrap), we do not connect to any peers on startup. We however loaded up the peerstore file and Raft will automatically connect older peers to figure out who is the leader etc. DHT bootstrap, after Raft was working, did the rest. For CRDTs we need to connect to people on a normal boot as otherwise, unless bootstrapping, this does not happen, even if the peerstore contains known peers. This introduces a number of changes: * Move peerstore file management back inside the Cluster component, which was already in charge of saving the peerstore file. * We keep saving all "known addresses" but we load them with a non permanent TTL, so that there will be clean up of peers we're not connected to for long. * "Bootstrap" (connect) to a small number of peers during Cluster component creation. * Bootstrap the DHT asap after this, so that other cluster components can initialize with a working peer discovery mechanism. * CRDT Trust() method will now: * Protect the trusted Peer ID in the conn manager * Give top priority in the PeerManager to that Peer (see below) * Mark addresses as permanent in the Peerstore The PeerManager now attaches priorities to peers when importing them and is able to order them according to that priority. The result is that peers with high priority are saved first in the peerstore file. When we load the peerstore file, the first entries in it are given the highest priority. This means that during startup we will connect to "trusted peers" first (because they have been tagged with priority in the previous run and saved at the top of the list). Once connected to a small number of peers, we let the DHT bootstrap process in the background do the rest and discover the network. All this makes the peerstore file a "bootstrap" list for CRDTs and we will attempt to connect to peers on that list until some of those connections succeed. --- api/rest/client/transports.go | 15 ++- api/util.go | 25 ---- cluster.go | 48 ++++--- cmd/ipfs-cluster-service/daemon.go | 8 -- cmd/ipfs-cluster-service/state.go | 2 +- consensus/crdt/consensus.go | 41 ++++-- peer_manager_test.go | 4 +- pstoremgr/pstoremgr.go | 201 +++++++++++++++++++++-------- pstoremgr/pstoremgr_test.go | 148 ++++++++++++++++----- util.go | 11 +- 10 files changed, 346 insertions(+), 157 deletions(-) diff --git a/api/rest/client/transports.go b/api/rest/client/transports.go index ea38a8d7..92ac7ded 100644 --- a/api/rest/client/transports.go +++ b/api/rest/client/transports.go @@ -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 } diff --git a/api/util.go b/api/util.go index 3031d93b..da24250c 100644 --- a/api/util.go +++ b/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 (//ipfs/) -// 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/ address. It will panic if the given // peer ID is bad. diff --git a/cluster.go b/cluster.go index 65fda785..4619b13b 100644 --- a/cluster.go +++ b/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) @@ -632,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, @@ -720,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). diff --git a/cmd/ipfs-cluster-service/daemon.go b/cmd/ipfs-cluster-service/daemon.go index dd9bc346..59c488b2 100644 --- a/cmd/ipfs-cluster-service/daemon.go +++ b/cmd/ipfs-cluster-service/daemon.go @@ -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" @@ -113,13 +112,6 @@ func createCluster( 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) diff --git a/cmd/ipfs-cluster-service/state.go b/cmd/ipfs-cluster-service/state.go index 4d0cca58..c15ed798 100644 --- a/cmd/ipfs-cluster-service/state.go +++ b/cmd/ipfs-cluster-service/state.go @@ -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, diff --git a/consensus/crdt/consensus.go b/consensus/crdt/consensus.go index 61f5d167..798a2b89 100644 --- a/consensus/crdt/consensus.go +++ b/consensus/crdt/consensus.go @@ -9,6 +9,7 @@ import ( 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" @@ -22,13 +23,15 @@ 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" pubsub "github.com/libp2p/go-libp2p-pubsub" ) var logger = logging.Logger("crdt") var ( - blocksNs = "b" // blockstore namespace + blocksNs = "b" // blockstore namespace + connMgrTag = "crdt" ) // Common variables for the module. @@ -48,7 +51,8 @@ type Consensus struct { trustedPeers sync.Map - host host.Host + host host.Host + peerManager *pstoremgr.Manager store ds.Datastore namespace ds.Key @@ -85,19 +89,21 @@ 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), + 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), } // Set up a fast-lookup trusted peers cache. + // Protect these peers in the ConnMgr for _, p := range css.config.TrustedPeers { css.Trust(ctx, p) } @@ -296,9 +302,18 @@ 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 { 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 } diff --git a/peer_manager_test.go b/peer_manager_test.go index 839d2d24..7596dbe9 100644 --- a/peer_manager_test.go +++ b/peer_manager_test.go @@ -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 { diff --git a/pstoremgr/pstoremgr.go b/pstoremgr/pstoremgr.go index d6c102c7..4b4e26df 100644 --- a/pstoremgr/pstoremgr.go +++ b/pstoremgr/pstoremgr.go @@ -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/ 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/ 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,95 @@ 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 +// if peers it sucessfully 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) +} + +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 } diff --git a/pstoremgr/pstoremgr_test.go b/pstoremgr/pstoremgr_test.go index 40bd764b..017b910d 100644 --- a/pstoremgr/pstoremgr_test.go +++ b/pstoremgr/pstoremgr_test.go @@ -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") } } diff --git a/util.go b/util.go index e856f5f3..41e09a88 100644 --- a/util.go +++ b/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 From 99be0785483aed530a75629e620455b88c230620 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 23 May 2019 18:58:47 +0200 Subject: [PATCH 07/15] Fix: ipfsproxy: fix test failing with empty multiaddresses This is a recent change in the multiaddress library to disallow empty addresses. --- api/ipfsproxy/config.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/api/ipfsproxy/config.go b/api/ipfsproxy/config.go index 0ef1e72e..cacfce57 100644 --- a/api/ipfsproxy/config.go +++ b/api/ipfsproxy/config.go @@ -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"}, From 2a2f8c03094139653e4fbe93bdf8c8c0906c7f5b Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 May 2019 13:59:01 +0200 Subject: [PATCH 08/15] CRDT: Fix protecting of nodes before loading the peerstore Addresses comments from review #792 --- consensus/crdt/consensus.go | 12 ++++++------ pstoremgr/pstoremgr.go | 7 ++++++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/consensus/crdt/consensus.go b/consensus/crdt/consensus.go index 798a2b89..fe447298 100644 --- a/consensus/crdt/consensus.go +++ b/consensus/crdt/consensus.go @@ -102,12 +102,6 @@ func New( readyCh: make(chan struct{}, 1), } - // Set up a fast-lookup trusted peers cache. - // Protect these peers in the ConnMgr - for _, p := range css.config.TrustedPeers { - css.Trust(ctx, p) - } - go css.setup() return css, nil } @@ -119,6 +113,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 diff --git a/pstoremgr/pstoremgr.go b/pstoremgr/pstoremgr.go index 4b4e26df..81ee2cda 100644 --- a/pstoremgr/pstoremgr.go +++ b/pstoremgr/pstoremgr.go @@ -256,7 +256,7 @@ func (pm *Manager) SavePeerstoreForPeers(peers []peer.ID) { // Bootstrap attempts to get as much as count connected peers by selecting // randomly from those in the libp2p host peerstore. It returns the number -// if peers it sucessfully connected to. +// of peers it successfully connected to. func (pm *Manager) Bootstrap(count int) int { knownPeers := pm.host.Peerstore().PeersWithAddrs() toSort := &peerSort{ @@ -296,6 +296,11 @@ 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 From d5cef9d518da652c209302a690af086bf7812834 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 May 2019 14:19:32 +0200 Subject: [PATCH 09/15] Fix: sharness: do not use latest master latest master breaks (see #797) --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 670d0518..4211e47d 100644 --- a/Makefile +++ b/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: From 4cc5182502e2ab2b7a38b87f503dfd69e70ff2d8 Mon Sep 17 00:00:00 2001 From: Adrian Lanzafame Date: Fri, 31 May 2019 12:56:33 +1000 Subject: [PATCH 10/15] add tracing to crdt hooks License: MIT Signed-off-by: Adrian Lanzafame --- consensus/crdt/consensus.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/consensus/crdt/consensus.go b/consensus/crdt/consensus.go index fe447298..e96be824 100644 --- a/consensus/crdt/consensus.go +++ b/consensus/crdt/consensus.go @@ -13,6 +13,7 @@ import ( "github.com/ipfs/ipfs-cluster/state" "github.com/ipfs/ipfs-cluster/state/dsstate" multihash "github.com/multiformats/go-multihash" + "go.opencensus.io/trace" ds "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" @@ -177,6 +178,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 { @@ -186,7 +190,7 @@ func (css *Consensus) setup() { // TODO: tracing for this context err = css.rpcClient.CallContext( - css.ctx, + ctx, "", "PinTracker", "Track", @@ -199,6 +203,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) @@ -207,7 +214,7 @@ func (css *Consensus) setup() { pin := api.PinCid(c) err = css.rpcClient.CallContext( - css.ctx, + ctx, "", "PinTracker", "Untrack", @@ -325,6 +332,9 @@ func (css *Consensus) Distrust(ctx context.Context, pid peer.ID) error { // 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) } From 21c2b6fbdd9384f35cc6a43bc517181f19edb1d5 Mon Sep 17 00:00:00 2001 From: Adrian Lanzafame Date: Fri, 31 May 2019 12:58:26 +1000 Subject: [PATCH 11/15] add tracing to all crdt methods License: MIT Signed-off-by: Adrian Lanzafame --- consensus/crdt/consensus.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/consensus/crdt/consensus.go b/consensus/crdt/consensus.go index e96be824..5d791bbd 100644 --- a/consensus/crdt/consensus.go +++ b/consensus/crdt/consensus.go @@ -302,6 +302,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 } @@ -314,6 +317,9 @@ func (css *Consensus) IsTrustedPeer(ctx context.Context, pid peer.ID) bool { // 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) @@ -326,6 +332,9 @@ func (css *Consensus) Trust(ctx context.Context, pid peer.ID) error { // 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 } @@ -340,6 +349,9 @@ func (css *Consensus) LogPin(ctx context.Context, pin *api.Pin) error { // 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) } @@ -347,6 +359,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( From 5515bdd7d74eefc98bb4bcb547ce819f91749a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Tue, 4 Jun 2019 20:12:33 +0200 Subject: [PATCH 12/15] Fix: api: replace two regex with strings.HasPrefix() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Those regex were compiled with each call to the function. As it's called by PinLs, this resulted in a significant amount of memory used, 500MB in my case after a single call. License: MIT Signed-off-by: Michael Muré --- api/types.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/api/types.go b/api/types.go index 664b1d22..addf2d6a 100644 --- a/api/types.go +++ b/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 ", - // 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 " + // 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": From 5a61d5bef8a37b1b78b004be3253ff68442e7ca8 Mon Sep 17 00:00:00 2001 From: Adrian Lanzafame Date: Wed, 5 Jun 2019 11:48:34 +1000 Subject: [PATCH 13/15] add IPFSPinStatusFromString benchmark License: MIT Signed-off-by: Adrian Lanzafame --- api/types_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api/types_test.go b/api/types_test.go index 87e02bbd..8cbf01d7 100644 --- a/api/types_test.go +++ b/api/types_test.go @@ -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", From 16a2a3611f3c0092a5c9bb8a336f6d2965758d77 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 5 Jun 2019 19:31:51 +0200 Subject: [PATCH 14/15] Reorder imports --- consensus/crdt/consensus.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/consensus/crdt/consensus.go b/consensus/crdt/consensus.go index 5d791bbd..fbfb614a 100644 --- a/consensus/crdt/consensus.go +++ b/consensus/crdt/consensus.go @@ -6,26 +6,29 @@ 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" - "go.opencensus.io/trace" 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") From 445e48445e8ad0bd2aed57dd27515668db113882 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 7 Jun 2019 19:16:15 +0200 Subject: [PATCH 15/15] Release 0.11.0-rc1 --- cmd/ipfs-cluster-ctl/main.go | 2 +- version/version.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/ipfs-cluster-ctl/main.go b/cmd/ipfs-cluster-ctl/main.go index d091d396..c4cc6826 100644 --- a/cmd/ipfs-cluster-ctl/main.go +++ b/cmd/ipfs-cluster-ctl/main.go @@ -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" diff --git a/version/version.go b/version/version.go index 89aeeabd..cde9a26d 100644 --- a/version/version.go +++ b/version/version.go @@ -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(