From 81e6fc27f63d9a5e243ca2fa2f3b0bb82c8b123c Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 9 May 2019 19:08:46 -0700 Subject: [PATCH 1/2] refactor(decision): use external peer task queue Uses shared external package peer task queue in place of peer request queue. Shared by graphsync. --- decision/bench_test.go | 30 --- decision/engine.go | 38 +-- decision/peer_request_queue.go | 356 ---------------------------- decision/peer_request_queue_test.go | 162 ------------- go.mod | 2 +- go.sum | 18 ++ 6 files changed, 41 insertions(+), 565 deletions(-) delete mode 100644 decision/bench_test.go delete mode 100644 decision/peer_request_queue.go delete mode 100644 decision/peer_request_queue_test.go diff --git a/decision/bench_test.go b/decision/bench_test.go deleted file mode 100644 index 4ef862a3..00000000 --- a/decision/bench_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package decision - -import ( - "fmt" - "math" - "testing" - - "github.com/ipfs/go-bitswap/wantlist" - cid "github.com/ipfs/go-cid" - u "github.com/ipfs/go-ipfs-util" - "github.com/libp2p/go-libp2p-peer" - "github.com/libp2p/go-testutil" -) - -// FWIW: At the time of this commit, including a timestamp in task increases -// time cost of Push by 3%. -func BenchmarkTaskQueuePush(b *testing.B) { - q := newPRQ() - peers := []peer.ID{ - testutil.RandPeerIDFatal(b), - testutil.RandPeerIDFatal(b), - testutil.RandPeerIDFatal(b), - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - c := cid.NewCidV0(u.Hash([]byte(fmt.Sprint(i)))) - - q.Push(peers[i%len(peers)], wantlist.Entry{Cid: c, Priority: math.MaxInt32}) - } -} diff --git a/decision/engine.go b/decision/engine.go index c2de9299..a7901567 100644 --- a/decision/engine.go +++ b/decision/engine.go @@ -8,6 +8,9 @@ import ( bsmsg "github.com/ipfs/go-bitswap/message" wl "github.com/ipfs/go-bitswap/wantlist" + cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-peertaskqueue" + "github.com/ipfs/go-peertaskqueue/peertask" blocks "github.com/ipfs/go-block-format" bstore "github.com/ipfs/go-ipfs-blockstore" @@ -73,7 +76,7 @@ type Engine struct { // peerRequestQueue is a priority queue of requests received from peers. // Requests are popped from the queue, packaged up, and placed in the // outbox. - peerRequestQueue *prq + peerRequestQueue *peertaskqueue.PeerTaskQueue // FIXME it's a bit odd for the client and the worker to both share memory // (both modify the peerRequestQueue) and also to communicate over the @@ -100,7 +103,7 @@ func NewEngine(ctx context.Context, bs bstore.Blockstore) *Engine { e := &Engine{ ledgerMap: make(map[peer.ID]*ledger), bs: bs, - peerRequestQueue: newPRQ(), + peerRequestQueue: peertaskqueue.New(), outbox: make(chan (<-chan *Envelope), outboxChanBuffer), workSignal: make(chan struct{}, 1), ticker: time.NewTicker(time.Millisecond * 100), @@ -159,23 +162,23 @@ func (e *Engine) taskWorker(ctx context.Context) { // context is cancelled before the next Envelope can be created. func (e *Engine) nextEnvelope(ctx context.Context) (*Envelope, error) { for { - nextTask := e.peerRequestQueue.Pop() + nextTask := e.peerRequestQueue.PopBlock() for nextTask == nil { select { case <-ctx.Done(): return nil, ctx.Err() case <-e.workSignal: - nextTask = e.peerRequestQueue.Pop() + nextTask = e.peerRequestQueue.PopBlock() case <-e.ticker.C: - e.peerRequestQueue.thawRound() - nextTask = e.peerRequestQueue.Pop() + e.peerRequestQueue.ThawRound() + nextTask = e.peerRequestQueue.PopBlock() } } // with a task in hand, we're ready to prepare the envelope... msg := bsmsg.New(true) - for _, entry := range nextTask.Entries { - block, err := e.bs.Get(entry.Cid) + for _, entry := range nextTask.Tasks { + block, err := e.bs.Get(entry.Identifier.(cid.Cid)) if err != nil { log.Errorf("tried to execute a task and errored fetching block: %s", err) continue @@ -186,7 +189,7 @@ func (e *Engine) nextEnvelope(ctx context.Context) (*Envelope, error) { if msg.Empty() { // If we don't have the block, don't hold that against the peer // make sure to update that the task has been 'completed' - nextTask.Done(nextTask.Entries) + nextTask.Done(nextTask.Tasks) continue } @@ -194,7 +197,7 @@ func (e *Engine) nextEnvelope(ctx context.Context) (*Envelope, error) { Peer: nextTask.Target, Message: msg, Sent: func() { - nextTask.Done(nextTask.Entries) + nextTask.Done(nextTask.Tasks) select { case e.workSignal <- struct{}{}: // work completing may mean that our queue will provide new @@ -246,7 +249,7 @@ func (e *Engine) MessageReceived(p peer.ID, m bsmsg.BitSwapMessage) { } var msgSize int - var activeEntries []wl.Entry + var activeEntries []peertask.Task for _, entry := range m.Wantlist() { if entry.Cancel { log.Debugf("%s cancel %s", p, entry.Cid) @@ -265,17 +268,17 @@ func (e *Engine) MessageReceived(p peer.ID, m bsmsg.BitSwapMessage) { // we have the block newWorkExists = true if msgSize+blockSize > maxMessageSize { - e.peerRequestQueue.Push(p, activeEntries...) - activeEntries = []wl.Entry{} + e.peerRequestQueue.PushBlock(p, activeEntries...) + activeEntries = []peertask.Task{} msgSize = 0 } - activeEntries = append(activeEntries, entry.Entry) + activeEntries = append(activeEntries, peertask.Task{Identifier: entry.Cid, Priority: entry.Priority}) msgSize += blockSize } } } if len(activeEntries) > 0 { - e.peerRequestQueue.Push(p, activeEntries...) + e.peerRequestQueue.PushBlock(p, activeEntries...) } for _, block := range m.Blocks() { log.Debugf("got block %s %d bytes", block, len(block.RawData())) @@ -289,7 +292,10 @@ func (e *Engine) addBlock(block blocks.Block) { for _, l := range e.ledgerMap { l.lk.Lock() if entry, ok := l.WantListContains(block.Cid()); ok { - e.peerRequestQueue.Push(l.Partner, entry) + e.peerRequestQueue.PushBlock(l.Partner, peertask.Task{ + Identifier: entry.Cid, + Priority: entry.Priority, + }) work = true } l.lk.Unlock() diff --git a/decision/peer_request_queue.go b/decision/peer_request_queue.go deleted file mode 100644 index 5cb95c78..00000000 --- a/decision/peer_request_queue.go +++ /dev/null @@ -1,356 +0,0 @@ -package decision - -import ( - "sync" - "time" - - wantlist "github.com/ipfs/go-bitswap/wantlist" - - cid "github.com/ipfs/go-cid" - pq "github.com/ipfs/go-ipfs-pq" - peer "github.com/libp2p/go-libp2p-peer" -) - -type peerRequestQueue interface { - // Pop returns the next peerRequestTask. Returns nil if the peerRequestQueue is empty. - Pop() *peerRequestTask - Push(to peer.ID, entries ...wantlist.Entry) - Remove(k cid.Cid, p peer.ID) - - // NB: cannot expose simply expose taskQueue.Len because trashed elements - // may exist. These trashed elements should not contribute to the count. -} - -func newPRQ() *prq { - return &prq{ - taskMap: make(map[taskEntryKey]*peerRequestTask), - partners: make(map[peer.ID]*activePartner), - frozen: make(map[peer.ID]*activePartner), - pQueue: pq.New(partnerCompare), - } -} - -// verify interface implementation -var _ peerRequestQueue = &prq{} - -// TODO: at some point, the strategy needs to plug in here -// to help decide how to sort tasks (on add) and how to select -// tasks (on getnext). For now, we are assuming a dumb/nice strategy. -type prq struct { - lock sync.Mutex - pQueue pq.PQ - taskMap map[taskEntryKey]*peerRequestTask - partners map[peer.ID]*activePartner - - frozen map[peer.ID]*activePartner -} - -// Push currently adds a new peerRequestTask to the end of the list. -func (tl *prq) Push(to peer.ID, entries ...wantlist.Entry) { - tl.lock.Lock() - defer tl.lock.Unlock() - partner, ok := tl.partners[to] - if !ok { - partner = newActivePartner(to) - tl.pQueue.Push(partner) - tl.partners[to] = partner - } - - partner.activelk.Lock() - defer partner.activelk.Unlock() - - var priority int - newEntries := make([]peerRequestTaskEntry, 0, len(entries)) - for _, entry := range entries { - if partner.activeBlocks.Has(entry.Cid) { - continue - } - if task, ok := tl.taskMap[taskEntryKey{to, entry.Cid}]; ok { - if entry.Priority > task.Priority { - task.Priority = entry.Priority - partner.taskQueue.Update(task.index) - } - continue - } - if entry.Priority > priority { - priority = entry.Priority - } - newEntries = append(newEntries, peerRequestTaskEntry{entry, false}) - } - - if len(newEntries) == 0 { - return - } - - task := &peerRequestTask{ - Entries: newEntries, - Target: to, - created: time.Now(), - Done: func(e []peerRequestTaskEntry) { - tl.lock.Lock() - for _, entry := range e { - partner.TaskDone(entry.Cid) - } - tl.pQueue.Update(partner.Index()) - tl.lock.Unlock() - }, - } - task.Priority = priority - partner.taskQueue.Push(task) - for _, entry := range newEntries { - tl.taskMap[taskEntryKey{to, entry.Cid}] = task - } - partner.requests += len(newEntries) - tl.pQueue.Update(partner.Index()) -} - -// Pop 'pops' the next task to be performed. Returns nil if no task exists. -func (tl *prq) Pop() *peerRequestTask { - tl.lock.Lock() - defer tl.lock.Unlock() - if tl.pQueue.Len() == 0 { - return nil - } - partner := tl.pQueue.Pop().(*activePartner) - - var out *peerRequestTask - for partner.taskQueue.Len() > 0 && partner.freezeVal == 0 { - out = partner.taskQueue.Pop().(*peerRequestTask) - - newEntries := make([]peerRequestTaskEntry, 0, len(out.Entries)) - for _, entry := range out.Entries { - delete(tl.taskMap, taskEntryKey{out.Target, entry.Cid}) - if entry.trash { - continue - } - partner.requests-- - partner.StartTask(entry.Cid) - newEntries = append(newEntries, entry) - } - if len(newEntries) > 0 { - out.Entries = newEntries - } else { - out = nil // discarding tasks that have been removed - continue - } - break // and return |out| - } - - if partner.IsIdle() { - target := partner.target - delete(tl.partners, target) - delete(tl.frozen, target) - } else { - tl.pQueue.Push(partner) - } - return out -} - -// Remove removes a task from the queue. -func (tl *prq) Remove(k cid.Cid, p peer.ID) { - tl.lock.Lock() - t, ok := tl.taskMap[taskEntryKey{p, k}] - if ok { - for i := range t.Entries { - if t.Entries[i].Cid.Equals(k) { - // remove the task "lazily" - // simply mark it as trash, so it'll be dropped when popped off the - // queue. - t.Entries[i].trash = true - break - } - } - - // having canceled a block, we now account for that in the given partner - partner := tl.partners[p] - partner.requests-- - - // we now also 'freeze' that partner. If they sent us a cancel for a - // block we were about to send them, we should wait a short period of time - // to make sure we receive any other in-flight cancels before sending - // them a block they already potentially have - if partner.freezeVal == 0 { - tl.frozen[p] = partner - } - - partner.freezeVal++ - tl.pQueue.Update(partner.index) - } - tl.lock.Unlock() -} - -func (tl *prq) fullThaw() { - tl.lock.Lock() - defer tl.lock.Unlock() - - for id, partner := range tl.frozen { - partner.freezeVal = 0 - delete(tl.frozen, id) - tl.pQueue.Update(partner.index) - } -} - -func (tl *prq) thawRound() { - tl.lock.Lock() - defer tl.lock.Unlock() - - for id, partner := range tl.frozen { - partner.freezeVal -= (partner.freezeVal + 1) / 2 - if partner.freezeVal <= 0 { - delete(tl.frozen, id) - } - tl.pQueue.Update(partner.index) - } -} - -type peerRequestTaskEntry struct { - wantlist.Entry - // trash in a book-keeping field - trash bool -} -type peerRequestTask struct { - Entries []peerRequestTaskEntry - Priority int - Target peer.ID - - // A callback to signal that this task has been completed - Done func([]peerRequestTaskEntry) - - // created marks the time that the task was added to the queue - created time.Time - index int // book-keeping field used by the pq container -} - -// Index implements pq.Elem. -func (t *peerRequestTask) Index() int { - return t.index -} - -// SetIndex implements pq.Elem. -func (t *peerRequestTask) SetIndex(i int) { - t.index = i -} - -// taskEntryKey is a key identifying a task. -type taskEntryKey struct { - p peer.ID - k cid.Cid -} - -// FIFO is a basic task comparator that returns tasks in the order created. -var FIFO = func(a, b *peerRequestTask) bool { - return a.created.Before(b.created) -} - -// V1 respects the target peer's wantlist priority. For tasks involving -// different peers, the oldest task is prioritized. -var V1 = func(a, b *peerRequestTask) bool { - if a.Target == b.Target { - return a.Priority > b.Priority - } - return FIFO(a, b) -} - -func wrapCmp(f func(a, b *peerRequestTask) bool) func(a, b pq.Elem) bool { - return func(a, b pq.Elem) bool { - return f(a.(*peerRequestTask), b.(*peerRequestTask)) - } -} - -type activePartner struct { - target peer.ID - // Active is the number of blocks this peer is currently being sent - // active must be locked around as it will be updated externally - activelk sync.Mutex - active int - - activeBlocks *cid.Set - - // requests is the number of blocks this peer is currently requesting - // request need not be locked around as it will only be modified under - // the peerRequestQueue's locks - requests int - - // for the PQ interface - index int - - freezeVal int - - // priority queue of tasks belonging to this peer - taskQueue pq.PQ -} - -func newActivePartner(target peer.ID) *activePartner { - return &activePartner{ - target: target, - taskQueue: pq.New(wrapCmp(V1)), - activeBlocks: cid.NewSet(), - } -} - -// partnerCompare implements pq.ElemComparator -// returns true if peer 'a' has higher priority than peer 'b' -func partnerCompare(a, b pq.Elem) bool { - pa := a.(*activePartner) - pb := b.(*activePartner) - - // having no blocks in their wantlist means lowest priority - // having both of these checks ensures stability of the sort - if pa.requests == 0 { - return false - } - if pb.requests == 0 { - return true - } - - if pa.freezeVal > pb.freezeVal { - return false - } - if pa.freezeVal < pb.freezeVal { - return true - } - - if pa.active == pb.active { - // sorting by taskQueue.Len() aids in cleaning out trash entries faster - // if we sorted instead by requests, one peer could potentially build up - // a huge number of cancelled entries in the queue resulting in a memory leak - return pa.taskQueue.Len() > pb.taskQueue.Len() - } - return pa.active < pb.active -} - -// StartTask signals that a task was started for this partner. -func (p *activePartner) StartTask(k cid.Cid) { - p.activelk.Lock() - p.activeBlocks.Add(k) - p.active++ - p.activelk.Unlock() -} - -// TaskDone signals that a task was completed for this partner. -func (p *activePartner) TaskDone(k cid.Cid) { - p.activelk.Lock() - - p.activeBlocks.Remove(k) - p.active-- - if p.active < 0 { - panic("more tasks finished than started!") - } - p.activelk.Unlock() -} - -func (p *activePartner) IsIdle() bool { - p.activelk.Lock() - defer p.activelk.Unlock() - return p.requests == 0 && p.active == 0 -} - -// Index implements pq.Elem. -func (p *activePartner) Index() int { - return p.index -} - -// SetIndex implements pq.Elem. -func (p *activePartner) SetIndex(i int) { - p.index = i -} diff --git a/decision/peer_request_queue_test.go b/decision/peer_request_queue_test.go deleted file mode 100644 index 33b111a5..00000000 --- a/decision/peer_request_queue_test.go +++ /dev/null @@ -1,162 +0,0 @@ -package decision - -import ( - "fmt" - "math" - "math/rand" - "sort" - "strings" - "testing" - - "github.com/ipfs/go-bitswap/wantlist" - cid "github.com/ipfs/go-cid" - u "github.com/ipfs/go-ipfs-util" - "github.com/libp2p/go-testutil" -) - -func TestPushPop(t *testing.T) { - prq := newPRQ() - partner := testutil.RandPeerIDFatal(t) - alphabet := strings.Split("abcdefghijklmnopqrstuvwxyz", "") - vowels := strings.Split("aeiou", "") - consonants := func() []string { - var out []string - for _, letter := range alphabet { - skip := false - for _, vowel := range vowels { - if letter == vowel { - skip = true - } - } - if !skip { - out = append(out, letter) - } - } - return out - }() - sort.Strings(alphabet) - sort.Strings(vowels) - sort.Strings(consonants) - - // add a bunch of blocks. cancel some. drain the queue. the queue should only have the kept entries - - for _, index := range rand.Perm(len(alphabet)) { // add blocks for all letters - letter := alphabet[index] - t.Log(partner.String()) - - c := cid.NewCidV0(u.Hash([]byte(letter))) - prq.Push(partner, wantlist.Entry{Cid: c, Priority: math.MaxInt32 - index}) - } - for _, consonant := range consonants { - c := cid.NewCidV0(u.Hash([]byte(consonant))) - prq.Remove(c, partner) - } - - prq.fullThaw() - - var out []string - for { - received := prq.Pop() - if received == nil { - break - } - - for _, entry := range received.Entries { - out = append(out, entry.Cid.String()) - } - } - - // Entries popped should already be in correct order - for i, expected := range vowels { - exp := cid.NewCidV0(u.Hash([]byte(expected))).String() - if out[i] != exp { - t.Fatal("received", out[i], "expected", expected) - } - } -} - -// This test checks that peers wont starve out other peers -func TestPeerRepeats(t *testing.T) { - prq := newPRQ() - a := testutil.RandPeerIDFatal(t) - b := testutil.RandPeerIDFatal(t) - c := testutil.RandPeerIDFatal(t) - d := testutil.RandPeerIDFatal(t) - - // Have each push some blocks - - for i := 0; i < 5; i++ { - elcid := cid.NewCidV0(u.Hash([]byte(fmt.Sprint(i)))) - prq.Push(a, wantlist.Entry{Cid: elcid}) - prq.Push(b, wantlist.Entry{Cid: elcid}) - prq.Push(c, wantlist.Entry{Cid: elcid}) - prq.Push(d, wantlist.Entry{Cid: elcid}) - } - - // now, pop off four entries, there should be one from each - var targets []string - var tasks []*peerRequestTask - for i := 0; i < 4; i++ { - t := prq.Pop() - targets = append(targets, t.Target.Pretty()) - tasks = append(tasks, t) - } - - expected := []string{a.Pretty(), b.Pretty(), c.Pretty(), d.Pretty()} - sort.Strings(expected) - sort.Strings(targets) - - t.Log(targets) - t.Log(expected) - for i, s := range targets { - if expected[i] != s { - t.Fatal("unexpected peer", s, expected[i]) - } - } - - // Now, if one of the tasks gets finished, the next task off the queue should - // be for the same peer - for blockI := 0; blockI < 4; blockI++ { - for i := 0; i < 4; i++ { - // its okay to mark the same task done multiple times here (JUST FOR TESTING) - tasks[i].Done(tasks[i].Entries) - - ntask := prq.Pop() - if ntask.Target != tasks[i].Target { - t.Fatal("Expected task from peer with lowest active count") - } - } - } -} - -func TestCleaningUpQueues(t *testing.T) { - partner := testutil.RandPeerIDFatal(t) - var entries []wantlist.Entry - for i := 0; i < 5; i++ { - entries = append(entries, wantlist.Entry{Cid: cid.NewCidV0(u.Hash([]byte(fmt.Sprint(i))))}) - } - - prq := newPRQ() - - // push a block, pop a block, complete everything, should be removed - prq.Push(partner, entries...) - task := prq.Pop() - task.Done(task.Entries) - task = prq.Pop() - - if task != nil || len(prq.partners) > 0 || prq.pQueue.Len() > 0 { - t.Fatal("Partner should have been removed because it's idle") - } - - // push a block, remove each of its entries, should be removed - prq.Push(partner, entries...) - for _, entry := range entries { - prq.Remove(entry.Cid, partner) - } - task = prq.Pop() - - if task != nil || len(prq.partners) > 0 || prq.pQueue.Len() > 0 { - t.Fatal("Partner should have been removed because it's idle") - } - -} diff --git a/go.mod b/go.mod index 30629108..240923d0 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/libp2p/go-libp2p-loggables v0.0.1 github.com/libp2p/go-libp2p-net v0.0.1 github.com/libp2p/go-libp2p-netutil v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 + github.com/libp2p/go-libp2p-peer v0.1.1 github.com/libp2p/go-libp2p-peerstore v0.0.1 github.com/libp2p/go-libp2p-protocol v0.0.1 github.com/libp2p/go-libp2p-routing v0.0.1 diff --git a/go.sum b/go.sum index 8190b7bf..5ebe1877 100644 --- a/go.sum +++ b/go.sum @@ -80,6 +80,8 @@ 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-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-peertaskqueue v0.0.1 h1:6K9LYgpwaXV5xFI/iu8tkeGnrAPT6RnYo+qhSlnGqzc= +github.com/ipfs/go-peertaskqueue v0.0.1/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= @@ -120,6 +122,8 @@ github.com/libp2p/go-libp2p-circuit v0.0.1 h1:DYbjyQ5ZY3QVAVYZWG4uzBQ6Wmcd1C82Bk github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= 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-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= @@ -140,6 +144,8 @@ github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6 github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= 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-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-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= @@ -184,8 +190,12 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 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/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.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= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= @@ -199,6 +209,8 @@ github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmr github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -212,6 +224,10 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -242,6 +258,7 @@ golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284 h1:rlLehGeYg6jfoyz/eDqDU1iRXLKfR42nnNh57ytKEWo= golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -267,6 +284,7 @@ golang.org/x/sys v0.0.0-20190509141414-a5b02f93d862 h1:rM0ROo5vb9AdYJi1110yjWGMe golang.org/x/sys v0.0.0-20190509141414-a5b02f93d862/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= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From d2a4d88a55e7c9ccc0923257b424165586cd2a2b Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 9 May 2019 19:50:32 -0700 Subject: [PATCH 2/2] fix(modules): update package deps properly --- go.mod | 1 + go.sum | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/go.mod b/go.mod index 240923d0..12841f74 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-log v0.0.1 github.com/ipfs/go-metrics-interface v0.0.1 + github.com/ipfs/go-peertaskqueue v0.0.3 github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 github.com/libp2p/go-libp2p v0.0.2 github.com/libp2p/go-libp2p-host v0.0.1 diff --git a/go.sum b/go.sum index 5ebe1877..ef71f3ce 100644 --- a/go.sum +++ b/go.sum @@ -82,6 +82,10 @@ github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fG github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-peertaskqueue v0.0.1 h1:6K9LYgpwaXV5xFI/iu8tkeGnrAPT6RnYo+qhSlnGqzc= github.com/ipfs/go-peertaskqueue v0.0.1/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= +github.com/ipfs/go-peertaskqueue v0.0.2 h1:l5+A/SQ7ychaHlU0eeRUlhbq2m9XSBnENLwpRu3YXOU= +github.com/ipfs/go-peertaskqueue v0.0.2/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= +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/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA=