From b87142ec8ed1e3f1838cb81bec4ec85a4a1a401b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 15 Sep 2021 16:37:27 +0200 Subject: [PATCH 01/72] wip improve scheduling of ready work --- extern/sector-storage/sched.go | 3 +- extern/sector-storage/sched_resources.go | 14 ++- extern/sector-storage/sched_worker.go | 114 ++++++++++++++++++++++- 3 files changed, 123 insertions(+), 8 deletions(-) diff --git a/extern/sector-storage/sched.go b/extern/sector-storage/sched.go index 4b3940178..38e901bf2 100644 --- a/extern/sector-storage/sched.go +++ b/extern/sector-storage/sched.go @@ -117,7 +117,8 @@ type activeResources struct { gpuUsed bool cpuUse uint64 - cond *sync.Cond + cond *sync.Cond + waiting int } type workerRequest struct { diff --git a/extern/sector-storage/sched_resources.go b/extern/sector-storage/sched_resources.go index 96a1fa863..7c16120c2 100644 --- a/extern/sector-storage/sched_resources.go +++ b/extern/sector-storage/sched_resources.go @@ -11,7 +11,9 @@ func (a *activeResources) withResources(id WorkerID, wr storiface.WorkerInfo, r if a.cond == nil { a.cond = sync.NewCond(locker) } + a.waiting++ a.cond.Wait() + a.waiting-- } a.add(wr.Resources, r) @@ -19,13 +21,15 @@ func (a *activeResources) withResources(id WorkerID, wr storiface.WorkerInfo, r err := cb() a.free(wr.Resources, r) - if a.cond != nil { - a.cond.Broadcast() - } return err } +// must be called with the same lock as the one passed to withResources +func (a *activeResources) hasWorkWaiting() bool { + return a.waiting > 0 +} + func (a *activeResources) add(wr storiface.WorkerResources, r Resources) { if r.CanGPU { a.gpuUsed = true @@ -42,6 +46,10 @@ func (a *activeResources) free(wr storiface.WorkerResources, r Resources) { a.cpuUse -= r.Threads(wr.CPUs) a.memUsedMin -= r.MinMemory a.memUsedMax -= r.MaxMemory + + if a.cond != nil { + a.cond.Broadcast() + } } // canHandleRequest evaluates if the worker has enough available resources to diff --git a/extern/sector-storage/sched_worker.go b/extern/sector-storage/sched_worker.go index cca2a56c5..ad74e01ee 100644 --- a/extern/sector-storage/sched_worker.go +++ b/extern/sector-storage/sched_worker.go @@ -4,6 +4,7 @@ import ( "context" "time" + "github.com/filecoin-project/lotus/extern/sector-storage/sealtasks" "golang.org/x/xerrors" "github.com/filecoin-project/lotus/extern/sector-storage/stores" @@ -338,6 +339,11 @@ func (sw *schedWorker) workerCompactWindows() { } func (sw *schedWorker) processAssignedWindows() { + sw.assignReadyWork() + sw.assignPreparingWork() +} + +func (sw *schedWorker) assignPreparingWork() { worker := sw.worker assignLoop: @@ -366,7 +372,7 @@ assignLoop: todo := firstWindow.todo[tidx] log.Debugf("assign worker sector %d", todo.sector.ID.Number) - err := sw.startProcessingTask(sw.taskDone, todo) + err := sw.startProcessingTask(todo) if err != nil { log.Errorf("startProcessingTask error: %+v", err) @@ -387,7 +393,67 @@ assignLoop: } } -func (sw *schedWorker) startProcessingTask(taskDone chan struct{}, req *workerRequest) error { +func (sw *schedWorker) assignReadyWork() { + worker := sw.worker + + worker.lk.Lock() + defer worker.lk.Unlock() + + if worker.active.hasWorkWaiting() { + // prepared tasks have priority + return + } + +assignLoop: + // process windows in order + for len(worker.activeWindows) > 0 { + firstWindow := worker.activeWindows[0] + + // process tasks within a window, preferring tasks at lower indexes + for len(firstWindow.todo) > 0 { + tidx := -1 + + for t, todo := range firstWindow.todo { + if todo.taskType != sealtasks.TTCommit1 && todo.taskType != sealtasks.TTCommit2 { // todo put in task + continue + } + + needRes := ResourceTable[todo.taskType][todo.sector.ProofType] + if worker.active.canHandleRequest(needRes, sw.wid, "startPreparing", worker.info) { + tidx = t + break + } + } + + if tidx == -1 { + break assignLoop + } + + todo := firstWindow.todo[tidx] + + log.Debugf("assign worker sector %d (ready)", todo.sector.ID.Number) + err := sw.startProcessingReadyTask(todo) + + if err != nil { + log.Errorf("startProcessingTask error: %+v", err) + go todo.respond(xerrors.Errorf("startProcessingTask error: %w", err)) + } + + // Note: we're not freeing window.allocated resources here very much on purpose + copy(firstWindow.todo[tidx:], firstWindow.todo[tidx+1:]) + firstWindow.todo[len(firstWindow.todo)-1] = nil + firstWindow.todo = firstWindow.todo[:len(firstWindow.todo)-1] + } + + copy(worker.activeWindows, worker.activeWindows[1:]) + worker.activeWindows[len(worker.activeWindows)-1] = nil + worker.activeWindows = worker.activeWindows[:len(worker.activeWindows)-1] + + sw.windowsRequested-- + } +} + +func (sw *schedWorker) startProcessingTask(req *workerRequest) error { w, sh := sw.worker, sw.sched needRes := ResourceTable[req.taskType][req.sector.ProofType] @@ -406,7 +472,7 @@ func (sw *schedWorker) startProcessingTask(taskDone chan struct{}, req *workerRe w.lk.Unlock() select { - case taskDone <- struct{}{}: + case sw.taskDone <- struct{}{}: case <-sh.closing: log.Warnf("scheduler closed while sending response (prepare error: %+v)", err) } @@ -428,7 +494,7 @@ func (sw *schedWorker) startProcessingTask(taskDone chan struct{}, req *workerRe defer w.lk.Lock() // we MUST return locked from this function select { - case taskDone <- struct{}{}: + case sw.taskDone <- struct{}{}: case <-sh.closing: } @@ -457,6 +523,46 @@ func (sw *schedWorker) startProcessingTask(taskDone chan struct{}, req *workerRe return nil } +func (sw *schedWorker) startProcessingReadyTask(req *workerRequest) error { + w, sh := sw.worker, sw.sched + + needRes := ResourceTable[req.taskType][req.sector.ProofType] + + w.active.add(w.info.Resources, needRes) + + go func() { + // Do the work! + err := req.work(req.ctx, sh.workTracker.worker(sw.wid, w.info, w.workerRpc)) + + select { + case req.ret <- workerResponse{err: err}: + case <-req.ctx.Done(): + log.Warnf("request got cancelled before we could respond") + case <-sh.closing: + log.Warnf("scheduler closed while sending response") + } + + w.lk.Lock() + + w.active.free(w.info.Resources, needRes) + + select { + case sw.taskDone <- struct{}{}: + case <-sh.closing: + log.Warnf("scheduler closed while sending response (prepare error: %+v)", err) + } + + w.lk.Unlock() + + // This error should always be nil, since nothing is setting it, but just to be safe: + if err != nil { + log.Errorf("error executing worker (ready): %+v", err) + } + }() + + return nil +} + func (sh *scheduler) workerCleanup(wid WorkerID, w *workerHandle) { select { case <-w.closingMgr: From 9af82f2d68a9f34906034bd2c9a42b064f6093c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 3 Oct 2021 17:09:43 +0200 Subject: [PATCH 02/72] sched: Fix taskDone chan deadlock --- extern/sector-storage/sched_worker.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extern/sector-storage/sched_worker.go b/extern/sector-storage/sched_worker.go index ad74e01ee..42bba2ee5 100644 --- a/extern/sector-storage/sched_worker.go +++ b/extern/sector-storage/sched_worker.go @@ -475,6 +475,7 @@ func (sw *schedWorker) startProcessingTask(req *workerRequest) error { case sw.taskDone <- struct{}{}: case <-sh.closing: log.Warnf("scheduler closed while sending response (prepare error: %+v)", err) + default: // there is a notification pending already } select { @@ -496,6 +497,7 @@ func (sw *schedWorker) startProcessingTask(req *workerRequest) error { select { case sw.taskDone <- struct{}{}: case <-sh.closing: + default: // there is a notification pending already } // Do the work! @@ -550,6 +552,7 @@ func (sw *schedWorker) startProcessingReadyTask(req *workerRequest) error { case sw.taskDone <- struct{}{}: case <-sh.closing: log.Warnf("scheduler closed while sending response (prepare error: %+v)", err) + default: // there is a notification pending already } w.lk.Unlock() From cadbd00ac4b103a4d878745ba55d1ba0915ec579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 4 Oct 2021 20:00:07 +0200 Subject: [PATCH 03/72] sealing: Recover sectors after failed AddPiece --- extern/storage-sealing/fsm.go | 8 +++++++- extern/storage-sealing/fsm_events.go | 4 ++++ extern/storage-sealing/input.go | 4 +--- extern/storage-sealing/sector_state.go | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 290aba53b..00e38694d 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -135,7 +135,11 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto // Sealing errors - AddPieceFailed: planOne(), + AddPieceFailed: planOne( + on(SectorRetryWaitDeals{}, WaitDeals), + apply(SectorStartPacking{}), + apply(SectorAddPiece{}), + ), SealPreCommit1Failed: planOne( on(SectorRetrySealPreCommit1{}, PreCommit1), ), @@ -400,6 +404,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta return m.handleFinalizeSector, processed, nil // Handled failure modes + case AddPieceFailed: + return m.handleAddPieceFailed, processed, nil case SealPreCommit1Failed: return m.handleSealPrecommit1Failed, processed, nil case SealPreCommit2Failed: diff --git a/extern/storage-sealing/fsm_events.go b/extern/storage-sealing/fsm_events.go index 3dab6d403..650a81799 100644 --- a/extern/storage-sealing/fsm_events.go +++ b/extern/storage-sealing/fsm_events.go @@ -98,6 +98,10 @@ type SectorAddPieceFailed struct{ error } func (evt SectorAddPieceFailed) FormatError(xerrors.Printer) (next error) { return evt.error } func (evt SectorAddPieceFailed) apply(si *SectorInfo) {} +type SectorRetryWaitDeals struct{} + +func (evt SectorRetryWaitDeals) apply(si *SectorInfo) {} + type SectorStartPacking struct{} func (evt SectorStartPacking) apply(*SectorInfo) {} diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 361907b27..b69cf8c19 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -245,9 +245,7 @@ func (m *Sealing) handleAddPiece(ctx statemachine.Context, sector SectorInfo) er } func (m *Sealing) handleAddPieceFailed(ctx statemachine.Context, sector SectorInfo) error { - log.Errorf("No recovery plan for AddPiece failing") - // todo: cleanup sector / just go retry (requires adding offset param to AddPiece in sector-storage for this to be safe) - return nil + return ctx.Send(SectorRetryWaitDeals{}) } func (m *Sealing) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPieceSize, data storage.Data, deal api.PieceDealInfo) (api.SectorOffset, error) { diff --git a/extern/storage-sealing/sector_state.go b/extern/storage-sealing/sector_state.go index 34a0c6bbe..b606de5ae 100644 --- a/extern/storage-sealing/sector_state.go +++ b/extern/storage-sealing/sector_state.go @@ -108,7 +108,7 @@ const ( func toStatState(st SectorState, finEarly bool) statSectorState { switch st { - case UndefinedSectorState, Empty, WaitDeals, AddPiece: + case UndefinedSectorState, Empty, WaitDeals, AddPiece, AddPieceFailed: return sstStaging case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector: return sstSealing From 4221461edea62618c1f21285dc67922cca527647 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 6 Oct 2021 00:31:41 -0400 Subject: [PATCH 04/72] bump master to v1.13.1-dev --- build/openrpc/full.json.gz | Bin 25455 -> 25455 bytes build/openrpc/miner.json.gz | Bin 10424 -> 10424 bytes build/openrpc/worker.json.gz | Bin 2711 -> 2710 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index d830d2d4f43afb0f385d57d27b01de2eda301818..f4e71402de0d790f115cc471e2e9953746df3ea9 100644 GIT binary patch delta 24 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 Q1pom5|LSQQmRWiL07ySJ#sB~S literal 2711 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 Date: Wed, 6 Oct 2021 13:40:44 -0700 Subject: [PATCH 05/72] restore filters for the build-macos job --- .circleci/config.yml | 9 ++++++++- .circleci/template.yml | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 49da7e48b..58cbd9b7c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -962,7 +962,14 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-lotus-soup - - build-macos + - build-macos: + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-appimage: filters: branches: diff --git a/.circleci/template.yml b/.circleci/template.yml index 131b6382c..ad19e397f 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -812,7 +812,14 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-lotus-soup - - build-macos + - build-macos: + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-appimage: filters: branches: From 89db4235ced34ea46edd649f86a2fc8e6cc0a957 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 6 Oct 2021 19:11:14 -0400 Subject: [PATCH 06/72] Shed: Add a util to find the most recent null tipset --- cmd/lotus-shed/chain.go | 49 +++++++++++++++++++++++++++++++++++++++++ cmd/lotus-shed/main.go | 1 + 2 files changed, 50 insertions(+) create mode 100644 cmd/lotus-shed/chain.go diff --git a/cmd/lotus-shed/chain.go b/cmd/lotus-shed/chain.go new file mode 100644 index 000000000..05abeff8f --- /dev/null +++ b/cmd/lotus-shed/chain.go @@ -0,0 +1,49 @@ +package main + +import ( + "fmt" + + lcli "github.com/filecoin-project/lotus/cli" + "github.com/urfave/cli/v2" +) + +var chainCmd = &cli.Command{ + Name: "chain", + Usage: "chain-related utilities", + Subcommands: []*cli.Command{ + chainNullTsCmd, + }, +} + +var chainNullTsCmd = &cli.Command{ + Name: "latest-null", + Usage: "finds the most recent null tipset", + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + + defer closer() + ctx := lcli.ReqContext(cctx) + + ts, err := lcli.LoadTipSet(ctx, cctx, api) + if err != nil { + return err + } + + for { + pts, err := api.ChainGetTipSet(ctx, ts.Parents()) + if err != nil { + return err + } + + if ts.Height() != pts.Height()+1 { + fmt.Println("null tipset at height ", ts.Height()-1) + return nil + } + + ts = pts + } + }, +} diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index 074fad92a..21971a628 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -62,6 +62,7 @@ func main() { minerMultisigsCmd, splitstoreCmd, fr32Cmd, + chainCmd, } app := &cli.App{ From 7e6c3a330a53c758c4bedeef51fd1f3af7417185 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Wed, 6 Oct 2021 17:21:38 -0700 Subject: [PATCH 07/72] feat(deps): update go-graphsync v0.10.1 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 431aad90c..6dd22cab5 100644 --- a/go.mod +++ b/go.mod @@ -79,7 +79,7 @@ require ( github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-filestore v1.0.0 github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.10.0 + github.com/ipfs/go-graphsync v0.10.1 github.com/ipfs/go-ipfs-blockstore v1.0.4 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 diff --git a/go.sum b/go.sum index 9d7b4162a..947648d8a 100644 --- a/go.sum +++ b/go.sum @@ -689,8 +689,9 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.10.0 h1:VXljS1ETYp1GmAJ6N45hlcKO+tlvPFUzz3xzEQ0jMbM= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= +github.com/ipfs/go-graphsync v0.10.1 h1:m6nNwiRFE2FVBTCxHWVTRApjH0snIjFy7fkDbOlMa/I= +github.com/ipfs/go-graphsync v0.10.1/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= From 9e76aba3d1784bf1b38e985537bc24d3d5e3deeb Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Thu, 7 Oct 2021 17:34:07 +1100 Subject: [PATCH 08/72] chore(deps): use tagged github.com/ipld/go-ipld-selector-text-lite Ref: https://github.com/filecoin-project/lotus/pull/6393#discussion_r722866111 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6dd22cab5..2362c0dbd 100644 --- a/go.mod +++ b/go.mod @@ -103,7 +103,7 @@ require ( github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.12.3 - github.com/ipld/go-ipld-selector-text-lite v0.0.0-20210817134355-4c190a2bb825 + github.com/ipld/go-ipld-selector-text-lite v0.0.0 github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 diff --git a/go.sum b/go.sum index 947648d8a..12bc9cdd3 100644 --- a/go.sum +++ b/go.sum @@ -825,8 +825,8 @@ github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1 github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= -github.com/ipld/go-ipld-selector-text-lite v0.0.0-20210817134355-4c190a2bb825 h1:sGlmVUuWEhuJpVsErFqCHWy9XTsIy511hZWRWI/Lc4I= -github.com/ipld/go-ipld-selector-text-lite v0.0.0-20210817134355-4c190a2bb825/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= +github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= From c4a7de9d378f8da6ec08e3fbf1925a61c9d7ea2a Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Thu, 7 Oct 2021 09:44:50 +0200 Subject: [PATCH 09/72] Remove dead example code + dep --- api/docgen/docgen.go | 6 ++---- go.mod | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 5fb90dbe7..25b9ac8c9 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -15,7 +15,6 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/google/uuid" "github.com/ipfs/go-cid" - "github.com/ipfs/go-filestore" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" @@ -24,7 +23,7 @@ import ( "github.com/multiformats/go-multiaddr" datatransfer "github.com/filecoin-project/go-data-transfer" - filestore2 "github.com/filecoin-project/go-fil-markets/filestore" + filestore "github.com/filecoin-project/go-fil-markets/filestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-jsonrpc/auth" textselector "github.com/ipld/go-ipld-selector-text-lite" @@ -110,7 +109,6 @@ func init() { addExample(abi.UnpaddedPieceSize(1024)) addExample(abi.UnpaddedPieceSize(1024).Padded()) addExample(abi.DealID(5432)) - addExample(filestore.StatusFileChanged) addExample(abi.SectorNumber(9)) addExample(abi.SectorSize(32 * 1024 * 1024 * 1024)) addExample(api.MpoolChange(0)) @@ -178,7 +176,7 @@ func init() { ExampleValues[reflect.TypeOf(struct{ A multiaddr.Multiaddr }{}).Field(0).Type] = maddr // miner specific - addExample(filestore2.Path(".lotusminer/fstmp123")) + addExample(filestore.Path(".lotusminer/fstmp123")) si := uint64(12) addExample(&si) addExample(retrievalmarket.DealID(5)) diff --git a/go.mod b/go.mod index 6dd22cab5..5e5a939de 100644 --- a/go.mod +++ b/go.mod @@ -77,7 +77,6 @@ require ( github.com/ipfs/go-ds-leveldb v0.4.2 github.com/ipfs/go-ds-measure v0.1.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 - github.com/ipfs/go-filestore v1.0.0 github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.10.1 github.com/ipfs/go-ipfs-blockstore v1.0.4 From a40aa9f90b08df60949758e8e131953523e78b1c Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Thu, 7 Oct 2021 10:47:51 +0200 Subject: [PATCH 10/72] Normlize selector use within lotus --- node/impl/client/client.go | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/node/impl/client/client.go b/node/impl/client/client.go index b3bbda36f..199a2122d 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -32,6 +32,7 @@ import ( "github.com/ipld/go-ipld-prime/traversal" "github.com/ipld/go-ipld-prime/traversal/selector" "github.com/ipld/go-ipld-prime/traversal/selector/builder" + selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" textselector "github.com/ipld/go-ipld-selector-text-lite" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" @@ -47,7 +48,6 @@ import ( "github.com/filecoin-project/go-fil-markets/discovery" rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-fil-markets/shared" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-fil-markets/storagemarket/network" "github.com/filecoin-project/go-fil-markets/stores" @@ -842,7 +842,7 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref } } - sel := shared.AllSelector() + sel := selectorparse.CommonSelector_ExploreAllRecursively if order.DatamodelPathSelector != nil { ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any) @@ -1299,21 +1299,23 @@ func (a *API) ClientGenCar(ctx context.Context, ref api.FileRef, outputPath stri } defer fs.Close() //nolint:errcheck - // build a dense deterministic CAR (dense = containing filled leaves) - ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any) - allSelector := ssb.ExploreRecursive( - selector.RecursionLimitNone(), - ssb.ExploreAll(ssb.ExploreRecursiveEdge())).Node() - sc := car.NewSelectiveCar(ctx, - fs, - []car.Dag{{Root: root, Selector: allSelector}}, - car.MaxTraversalLinks(config.MaxTraversalLinks), - ) f, err := os.Create(outputPath) if err != nil { return err } - if err = sc.Write(f); err != nil { + + // build a dense deterministic CAR (dense = containing filled leaves) + if err := car.NewSelectiveCar( + ctx, + fs, + []car.Dag{{ + Root: root, + Selector: selectorparse.CommonSelector_ExploreAllRecursively, + }}, + car.MaxTraversalLinks(config.MaxTraversalLinks), + ).Write( + f, + ); err != nil { return xerrors.Errorf("failed to write CAR to output file: %w", err) } From 778483166fbc77ba8568256c758f3e17ffaa0c7d Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Thu, 7 Oct 2021 12:23:43 +0200 Subject: [PATCH 11/72] Remove obsolete GS testplan - it now lives in go-graphsync --- .circleci/config.yml | 6 +- .circleci/template.yml | 6 +- .../graphsync/_compositions/stress-k8s.toml | 35 - testplans/graphsync/_compositions/stress.toml | 23 - .../_compositions/version_compat.toml | 34 - testplans/graphsync/go.mod | 33 - testplans/graphsync/go.sum | 972 ------------------ testplans/graphsync/main.go | 388 ------- testplans/graphsync/manifest.toml | 24 - 9 files changed, 2 insertions(+), 1519 deletions(-) delete mode 100644 testplans/graphsync/_compositions/stress-k8s.toml delete mode 100644 testplans/graphsync/_compositions/stress.toml delete mode 100644 testplans/graphsync/_compositions/version_compat.toml delete mode 100644 testplans/graphsync/go.mod delete mode 100644 testplans/graphsync/go.sum delete mode 100644 testplans/graphsync/main.go delete mode 100644 testplans/graphsync/manifest.toml diff --git a/.circleci/config.yml b/.circleci/config.yml index 58cbd9b7c..222f14d50 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -318,7 +318,7 @@ jobs: command: pushd testplans/lotus-soup && mkdir -p $HOME/testground && cp env-ci.toml $HOME/testground/.env.toml && echo 'endpoint="https://ci.testground.ipfs.team"' >> $HOME/testground/.env.toml && echo 'user="circleci"' >> $HOME/testground/.env.toml - run: name: "prepare testground home dir and link test plans" - command: mkdir -p $HOME/testground/plans && ln -s $(pwd)/testplans/lotus-soup $HOME/testground/plans/lotus-soup && ln -s $(pwd)/testplans/graphsync $HOME/testground/plans/graphsync + command: mkdir -p $HOME/testground/plans && ln -s $(pwd)/testplans/lotus-soup $HOME/testground/plans/lotus-soup - run: name: "go get lotus@master" command: cd testplans/lotus-soup && go get github.com/filecoin-project/lotus@master @@ -328,10 +328,6 @@ jobs: - run: name: "trigger payment channel stress testplan on taas" command: ~/testground-cli run composition -f $HOME/testground/plans/lotus-soup/_compositions/paych-stress-k8s.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH - - run: - name: "trigger graphsync testplan on taas" - command: ~/testground-cli run composition -f $HOME/testground/plans/graphsync/_compositions/stress-k8s.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH - build-macos: description: build darwin lotus binary diff --git a/.circleci/template.yml b/.circleci/template.yml index ad19e397f..4b954391b 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -318,7 +318,7 @@ jobs: command: pushd testplans/lotus-soup && mkdir -p $HOME/testground && cp env-ci.toml $HOME/testground/.env.toml && echo 'endpoint="https://ci.testground.ipfs.team"' >> $HOME/testground/.env.toml && echo 'user="circleci"' >> $HOME/testground/.env.toml - run: name: "prepare testground home dir and link test plans" - command: mkdir -p $HOME/testground/plans && ln -s $(pwd)/testplans/lotus-soup $HOME/testground/plans/lotus-soup && ln -s $(pwd)/testplans/graphsync $HOME/testground/plans/graphsync + command: mkdir -p $HOME/testground/plans && ln -s $(pwd)/testplans/lotus-soup $HOME/testground/plans/lotus-soup - run: name: "go get lotus@master" command: cd testplans/lotus-soup && go get github.com/filecoin-project/lotus@master @@ -328,10 +328,6 @@ jobs: - run: name: "trigger payment channel stress testplan on taas" command: ~/testground-cli run composition -f $HOME/testground/plans/lotus-soup/_compositions/paych-stress-k8s.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH - - run: - name: "trigger graphsync testplan on taas" - command: ~/testground-cli run composition -f $HOME/testground/plans/graphsync/_compositions/stress-k8s.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH - build-macos: description: build darwin lotus binary diff --git a/testplans/graphsync/_compositions/stress-k8s.toml b/testplans/graphsync/_compositions/stress-k8s.toml deleted file mode 100644 index bfc854bcc..000000000 --- a/testplans/graphsync/_compositions/stress-k8s.toml +++ /dev/null @@ -1,35 +0,0 @@ -[metadata] - name = "stress" - -[global] - plan = "graphsync" - case = "stress" - total_instances = 2 - builder = "docker:go" - runner = "cluster:k8s" - -[global.build_config] - push_registry=true - go_proxy_mode="remote" - go_proxy_url="http://localhost:8081" - registry_type="aws" - -[global.run.test_params] -size = "10MB" -latencies = '["50ms", "100ms", "200ms"]' -bandwidths = '["32MiB", "16MiB", "8MiB", "4MiB", "1MiB"]' -concurrency = "10" - -[[groups]] - id = "providers" - instances = { count = 1 } - [groups.resources] - memory = "4096Mi" - cpu = "1000m" - -[[groups]] - id = "requestors" - instances = { count = 1 } - [groups.resources] - memory = "4096Mi" - cpu = "1000m" diff --git a/testplans/graphsync/_compositions/stress.toml b/testplans/graphsync/_compositions/stress.toml deleted file mode 100644 index 4920f6ff3..000000000 --- a/testplans/graphsync/_compositions/stress.toml +++ /dev/null @@ -1,23 +0,0 @@ -[metadata] - name = "stress" - -[global] - plan = "graphsync" - case = "stress" - total_instances = 2 - builder = "docker:go" - runner = "local:docker" - -[global.run.test_params] -size = "10MB" -latencies = '["50ms", "100ms", "200ms"]' -bandwidths = '["32MiB", "16MiB", "8MiB", "4MiB", "1MiB"]' -concurrency = "10" - -[[groups]] - id = "providers" - instances = { count = 1 } - -[[groups]] - id = "requestors" - instances = { count = 1 } diff --git a/testplans/graphsync/_compositions/version_compat.toml b/testplans/graphsync/_compositions/version_compat.toml deleted file mode 100644 index b7e89a97f..000000000 --- a/testplans/graphsync/_compositions/version_compat.toml +++ /dev/null @@ -1,34 +0,0 @@ -[metadata] - name = "version_compat" - -[global] - plan = "graphsync" - case = "stress" - total_instances = 2 - builder = "docker:go" - runner = "local:docker" - -[global.run.test_params] -size = "10MB" -latencies = '["50ms"]' -bandwidths = '["4MiB"]' -concurrency = "1" - -[[groups]] - id = "providers" - instances = { count = 1 } - [groups.build] - [[groups.build.dependencies]] - module = "github.com/ipfs/go-graphsync" - version = "v0.2.1" - [[groups.build.dependencies]] - module = "github.com/hannahhoward/all-selector" - version = "v0.2.0" - -[[groups]] - id = "requestors" - instances = { count = 1 } - [groups.build] - [[groups.build.dependencies]] - module = "github.com/ipfs/go-graphsync" - version = "v0.1.2" \ No newline at end of file diff --git a/testplans/graphsync/go.mod b/testplans/graphsync/go.mod deleted file mode 100644 index ffd131f83..000000000 --- a/testplans/graphsync/go.mod +++ /dev/null @@ -1,33 +0,0 @@ -module github.com/filecoin-project/lotus/testplans/graphsync - -go 1.14 - -require ( - github.com/dustin/go-humanize v1.0.0 - github.com/hannahhoward/all-selector v0.1.0 - github.com/ipfs/go-blockservice v0.1.3 - github.com/ipfs/go-cid v0.0.6 - github.com/ipfs/go-datastore v0.4.4 - github.com/ipfs/go-graphsync v0.1.2 - github.com/ipfs/go-ipfs-blockstore v0.1.4 - github.com/ipfs/go-ipfs-chunker v0.0.5 - github.com/ipfs/go-ipfs-exchange-offline v0.0.1 - github.com/ipfs/go-ipfs-files v0.0.8 - github.com/ipfs/go-ipld-format v0.2.0 - github.com/ipfs/go-merkledag v0.3.1 - github.com/ipfs/go-unixfs v0.2.4 - github.com/ipld/go-ipld-prime v0.4.0 - github.com/kr/text v0.2.0 // indirect - github.com/libp2p/go-libp2p v0.10.0 - github.com/libp2p/go-libp2p-core v0.6.0 - github.com/libp2p/go-libp2p-noise v0.1.1 - github.com/libp2p/go-libp2p-secio v0.2.2 - github.com/libp2p/go-libp2p-tls v0.1.3 - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/testground/sdk-go v0.2.7-0.20201112151952-8ee00c80c3ec - golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 - golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect - google.golang.org/protobuf v1.25.0 // indirect - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect - gopkg.in/yaml.v2 v2.2.8 // indirect -) diff --git a/testplans/graphsync/go.sum b/testplans/graphsync/go.sum deleted file mode 100644 index e80038c38..000000000 --- a/testplans/graphsync/go.sum +++ /dev/null @@ -1,972 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -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 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -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/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/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/avast/retry-go v2.6.0+incompatible h1:FelcMrm7Bxacr1/RM8+/eqkDkmVN7tjlsy51dOzB3LI= -github.com/avast/retry-go v2.6.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -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= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= -github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= -github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f h1:BOaYiTvg8p9vBUXpklC22XSK/mifLF7lG9jtmYYi3Tc= -github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.1 h1:w9pSFNSdq/JPM1N12Fz/F/bzo993Is1W+Q7HjPzi7yg= -github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= -github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= -github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6 h1:u/UEqS66A5ckRmS4yNpjmVH56sVtS/RfclBAYocb4as= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= -github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= -github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.4.0 h1:Rd1kQnQu0Hq3qvJppYSG0HtP+f5LPPUiDswTLiEegLg= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.17 h1:rMrlX2ZY2UbvT+sdz3+6J+pp2z+msCq9MxTU6ymxbBY= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -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/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hannahhoward/all-selector v0.1.0 h1:B+hMG/8Vb0+XB3eHK2Cz6hYpSZWVZuSz401ebRvfGtk= -github.com/hannahhoward/all-selector v0.1.0/go.mod h1:2wbwlpJCyAaTfpSYqKqqA5Xe0YPvJmyjylxKs6+PIvA= -github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= -github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= -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-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -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/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3 h1:k3/6a1Shi7GGCp9QpyYuXsMM6ncTOjCzOE9Fd6CDA+Q= -github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= -github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= -github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.8 h1:38X1mKXkiU6Nzw4TOSWD8eTVY5eX3slQunv3QEWfXKg= -github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -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.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.3 h1:9XgsPMwwWJSC9uVr2pMDsW2qFTBSkxpGMhmna8mIjPM= -github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= -github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= -github.com/ipfs/go-cid v0.0.6 h1:go0y+GcDOGeJIV01FeBsta4FHngoA4Wz7KMeLkXAhMs= -github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.4 h1:rjvQ9+muFaJ+QZ7dN5B1MSDNQ0JVZKkkES/rMZmA8X8= -github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= -github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= -github.com/ipfs/go-ds-badger v0.2.3 h1:J27YvAcpuA5IvZUbeBxOcQgqnYHUPxoygc6QxxkodZ4= -github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-graphsync v0.1.2 h1:25Ll9kIXCE+DY0dicvfS3KMw+U5sd01b/FJbA7KAbhg= -github.com/ipfs/go-graphsync v0.1.2/go.mod h1:sLXVXm1OxtE2XYPw62MuXCdAuNwkAdsbnfrmos5odbA= -github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= -github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.1.4 h1:2SGI6U1B44aODevza8Rde3+dY30Pb+lbcObe1LETxOQ= -github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= -github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= -github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= -github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= -github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= -github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= -github.com/ipfs/go-ipfs-ds-help v0.1.1 h1:IW/bXGeaAZV2VH0Kuok+Ohva/zHkHmeLFBxC1k7mNPc= -github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= -github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= -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/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= -github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= -github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= -github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= -github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= -github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= -github.com/ipfs/go-ipld-cbor v0.0.4 h1:Aw3KPOKXjvrm6VjwJvFf1F1ekR/BH3jdof3Bk7OTiSA= -github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= -github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= -github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= -github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= -github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= -github.com/ipfs/go-log v1.0.4 h1:6nLQdX4W8P9yZZFH7mO+X/PzjN8Laozm/lMJ6esdgzY= -github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.5 h1:fL4YI+1g5V/b1Yxr1qAiXTMg1H8z9vx/VmJxBuQMHvU= -github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.1 h1:3UqWINBEr3/N+r6OwgFXAddDP/8zpQX/8J7IGVOCqRQ= -github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -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.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= -github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= -github.com/ipfs/go-unixfs v0.2.4 h1:6NwppOXefWIyysZ4LR/qUBPvXd5//8J3jiMdvpbw6Lo= -github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -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/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.0.4-0.20200828224805-5ff8c8b0b6ef h1:/yPelt/0CuzZsmRkYzBBnJ499JnAOGaIaAXHujx96ic= -github.com/ipld/go-ipld-prime v0.0.4-0.20200828224805-5ff8c8b0b6ef/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.4.0 h1:ySDtWeWl+TDMokXlwGANSMeD5TN618cZp9NnxqZ452M= -github.com/ipld/go-ipld-prime v0.4.0/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200828231332-ae0aea07222b h1:ZtlW6pubN17TDaStlxgrwEXXwwUfJaXu9RobwczXato= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200828231332-ae0aea07222b/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= -github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= -github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= -github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= -github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -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/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/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/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-addr-util v0.0.2 h1:7cWK5cdA5x72jX0g8iLrQWm5TRJZ6CzGdPEhWj7plWU= -github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -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-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= -github.com/libp2p/go-conn-security-multistream v0.2.0 h1:uNiDjS58vrvJTg9jO6bySd1rMKejieG7v45ekqHbZ1M= -github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= -github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= -github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= -github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= -github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= -github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= -github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= -github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= -github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= -github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.10.0 h1:7ooOvK1wi8eLpyTppy8TeH43UHy5uI75GAHGJxenUi0= -github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= -github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= -github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= -github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= -github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.2.3 h1:w46bKK3KTOUWDe5mDYMRjJu1uryqBp8HCNDp/TWMqKw= -github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.1.6 h1:CkPp1/zaCrCnBo0AdsQA0O1VkUYoUOtyHOnoa8gKIcE= -github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= -github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-circuit v0.2.3 h1:3Uw1fPHWrp1tgIhBz0vSOxRUmnKL8L/NGUyEd5WfSGM= -github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= -github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= -github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= -github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= -github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= -github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= -github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= -github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= -github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= -github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.2/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= -github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.6.0 h1:u03qofNYTBN+yVg08PuAKylZogVf0xcTEeM8skGf+ak= -github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= -github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= -github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.4.0 h1:dK78UhopBk48mlHtRCzbdLm3q/81g77FahEBTjcqQT8= -github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= -github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= -github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= -github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= -github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= -github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= -github.com/libp2p/go-libp2p-mplex v0.2.3 h1:2zijwaJvpdesST2MXpI5w9wWFRgYtMcpRX7rrw0jmOo= -github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= -github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= -github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= -github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= -github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1 h1:vqYQWvnIcHpIoWJKC7Al4D6Hgj0H012TuXRhPwSMGpQ= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= -github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= -github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= -github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= -github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw= -github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.6 h1:2ACefBX23iMdJU9Ke+dcXt3w86MIryes9v7In4+Qq3U= -github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= -github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-quic-transport v0.5.0 h1:BUN1lgYNUrtv4WLLQ5rQmC9MCJ6uEXusezGvYRNoJXE= -github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= -github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= -github.com/libp2p/go-libp2p-record v0.1.1 h1:ZJK2bHXYUBqObHX+rHLSNrM3M8fmJUlUHrodDPPATmY= -github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= -github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= -github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= -github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= -github.com/libp2p/go-libp2p-secio v0.2.2 h1:rLLPvShPQAcY6eNurKNZq3eZjPWfU9kXF2eI9jIYdrg= -github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= -github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= -github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= -github.com/libp2p/go-libp2p-swarm v0.2.7 h1:4lV/sf7f0NuVqunOpt1I11+Z54+xp+m0eeAvxj/LyRc= -github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= -github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.1 h1:U03z3HnGI7Ni8Xx6ONVZvUFOAzWYmolWf5W5jAOPNmU= -github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-tls v0.1.3 h1:twKMhMu44jQO+HgQK9X8NHO5HkeJu2QbhLzLJpa8oNM= -github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= -github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= -github.com/libp2p/go-libp2p-transport-upgrader v0.3.0 h1:q3ULhsknEQ34eVDhv4YwKS8iet69ffs9+Fir6a7weN4= -github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= -github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= -github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= -github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= -github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= -github.com/libp2p/go-libp2p-yamux v0.2.8 h1:0s3ELSLu2O7hWKfX1YjzudBKCP0kZ+m9e2+0veXzkn4= -github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= -github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= -github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= -github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.1.2 h1:qOg1s+WdGLlpkrczDqmhYzyk3vCfsQ8+RxRTQjOZWwI= -github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA= -github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= -github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= -github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= -github.com/libp2p/go-netroute v0.1.2 h1:UHhB35chwgvcRI392znJA3RCBtZ3MpE3ahNCN5MR4Xg= -github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= -github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.5 h1:pQkejVhF0xp08D4CQUcw8t+BFJeXowja6RVcb5p++EA= -github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -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.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-reuseport-transport v0.0.3 h1:zzOeXnTooCkRvoH+bSXEfXhn76+LAiwoneM0gnXjF2M= -github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= -github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.0 h1:Y4s3/jNoryVRKEBrkJ576F17CPOaMIzUeCsg7dlTDj0= -github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-stream-muxer-multistream v0.3.0 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= -github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= -github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= -github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= -github.com/libp2p/go-tcp-transport v0.2.0 h1:YoThc549fzmNJIh7XjHVtMIFaEDRtIrtWciG5LyYAPo= -github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= -github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= -github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= -github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.3.1 h1:ZX5rWB8nhRRJVaPO6tmkGI/Xx8XNboYX20PW5hXIscw= -github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.7 h1:v40A1eSPJDIZwz2AvrV3cxpTZEGDP11QJbukmEhYyQI= -github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/lucas-clemente/quic-go v0.16.0 h1:jJw36wfzGJhmOhAOaOC2lS36WgeqXQszH47A7spo1LI= -github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= -github.com/marten-seemann/qtls v0.9.1 h1:O0YKQxNVPaiFgMng0suWEOY2Sb4LT2sRn9Qimq3Z1IQ= -github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -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/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -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/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -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/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.1.3 h1:v+sk57XuaCKGXpWtVBX8YJzO7hMGx4Aajh4TQbdEFdc= -github.com/mr-tron/base58 v1.1.3/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-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= -github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= -github.com/multiformats/go-multiaddr v0.2.2 h1:XZLDTszBIJe6m0zF6ITBrEcZR73OPUhCBBS9rYAuUzI= -github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.2.0 h1:YWJoIDwLePniH7OU5hBnDZV6SWuvJqJ0YtN6pLeH9zA= -github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= -github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= -github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= -github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.5 h1:QoRKvu0xHN1FCFJcMQLbG/yQE2z441L5urvG3+qyz7g= -github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= -github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.13 h1:06x+mk/zj1FoMsgNejLpy6QTvJqlSt/BhLEy87zidlc= -github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.1.1 h1:JlAdpIFhBhGRLxe9W6Om0w++Gd6KMWoFPZL/dEnm9nI= -github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.5 h1:XVZwSo04Cs3j/jS0uAEPpT3JY6DzMcVLLoWOSnCxOjg= -github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.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/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/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a h1:hjZfReYVLbqFkAtr2us7vdy04YWz3LVAirzP7reh8+M= -github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= -github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= -github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -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/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= -github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -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= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/testground/sdk-go v0.2.7-0.20201112151952-8ee00c80c3ec h1:ZigYjS91IfPRStWGEZuI8/QDes9vPKpwnmLmc3AVQns= -github.com/testground/sdk-go v0.2.7-0.20201112151952-8ee00c80c3ec/go.mod h1:Q4dnWsUBH+dZ1u7aEGDBHWGUaLfhitjUq3UJQqxeTmk= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= -github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105 h1:Sh6UG5dW5xW8Ek2CtRGq4ipdEvvx9hOyBJjEGyTYDl0= -github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= -github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/goleak v1.0.0 h1:qsup4IcBdlmsnGfqyLl4Ntn3C2XCCuKAE7DwHpScyUo= -go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -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-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5 h1:Q7tZBpemrlsc2I7IyODzhtallWRSm4Q0d09pL6XbQtU= -golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -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= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425 h1:VvQyQJN0tSuecqgcIxMWnnfG5kSmgy9KZR9sW3W5QeA= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3 h1:r3P/5xOq/dK1991B65Oy6E1fRF/2d/fSYZJ/fXGVfJc= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -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-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= -gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -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= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/testplans/graphsync/main.go b/testplans/graphsync/main.go deleted file mode 100644 index 1567d0290..000000000 --- a/testplans/graphsync/main.go +++ /dev/null @@ -1,388 +0,0 @@ -package main - -import ( - "context" - "crypto/rand" - "fmt" - "io" - goruntime "runtime" - "strings" - "time" - - "github.com/dustin/go-humanize" - allselector "github.com/hannahhoward/all-selector" - "github.com/ipfs/go-blockservice" - "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - dss "github.com/ipfs/go-datastore/sync" - "github.com/ipfs/go-graphsync/storeutil" - blockstore "github.com/ipfs/go-ipfs-blockstore" - chunk "github.com/ipfs/go-ipfs-chunker" - offline "github.com/ipfs/go-ipfs-exchange-offline" - files "github.com/ipfs/go-ipfs-files" - format "github.com/ipfs/go-ipld-format" - "github.com/ipfs/go-merkledag" - "github.com/ipfs/go-unixfs/importer/balanced" - ihelper "github.com/ipfs/go-unixfs/importer/helpers" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/libp2p/go-libp2p-core/metrics" - "github.com/testground/sdk-go/network" - "golang.org/x/sync/errgroup" - - gs "github.com/ipfs/go-graphsync" - gsi "github.com/ipfs/go-graphsync/impl" - gsnet "github.com/ipfs/go-graphsync/network" - - "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" - noise "github.com/libp2p/go-libp2p-noise" - secio "github.com/libp2p/go-libp2p-secio" - tls "github.com/libp2p/go-libp2p-tls" - - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" - "github.com/testground/sdk-go/sync" -) - -var testcases = map[string]interface{}{ - "stress": run.InitializedTestCaseFn(runStress), -} - -func main() { - run.InvokeMap(testcases) -} - -type networkParams struct { - latency time.Duration - bandwidth uint64 -} - -func (p networkParams) String() string { - return fmt.Sprintf("", p.latency, p.bandwidth) -} - -func runStress(runenv *runtime.RunEnv, initCtx *run.InitContext) error { - var ( - size = runenv.SizeParam("size") - concurrency = runenv.IntParam("concurrency") - - networkParams = parseNetworkConfig(runenv) - ) - runenv.RecordMessage("started test instance") - runenv.RecordMessage("network params: %v", networkParams) - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) - defer cancel() - - initCtx.MustWaitAllInstancesInitialized(ctx) - - host, peers, _ := makeHost(ctx, runenv, initCtx) - defer host.Close() - - var ( - // make datastore, blockstore, dag service, graphsync - bs = blockstore.NewBlockstore(dss.MutexWrap(ds.NewMapDatastore())) - dagsrv = merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs))) - gsync = gsi.New(ctx, - gsnet.NewFromLibp2pHost(host), - storeutil.LoaderForBlockstore(bs), - storeutil.StorerForBlockstore(bs), - ) - ) - - defer initCtx.SyncClient.MustSignalAndWait(ctx, "done", runenv.TestInstanceCount) - - switch runenv.TestGroupID { - case "providers": - if runenv.TestGroupInstanceCount > 1 { - panic("test case only supports one provider") - } - - runenv.RecordMessage("we are the provider") - defer runenv.RecordMessage("done provider") - - gsync.RegisterIncomingRequestHook(func(p peer.ID, request gs.RequestData, hookActions gs.IncomingRequestHookActions) { - hookActions.ValidateRequest() - }) - - return runProvider(ctx, runenv, initCtx, dagsrv, size, networkParams, concurrency) - - case "requestors": - runenv.RecordMessage("we are the requestor") - defer runenv.RecordMessage("done requestor") - - p := *peers[0] - if err := host.Connect(ctx, p); err != nil { - return err - } - runenv.RecordMessage("done dialling provider") - return runRequestor(ctx, runenv, initCtx, gsync, p, dagsrv, networkParams, concurrency, size) - - default: - panic("unsupported group ID") - } -} - -func parseNetworkConfig(runenv *runtime.RunEnv) []networkParams { - var ( - bandwidths = runenv.SizeArrayParam("bandwidths") - latencies []time.Duration - ) - - lats := runenv.StringArrayParam("latencies") - for _, l := range lats { - d, err := time.ParseDuration(l) - if err != nil { - panic(err) - } - latencies = append(latencies, d) - } - - // prepend bandwidth=0 and latency=0 zero values; the first iteration will - // be a control iteration. The sidecar interprets zero values as no - // limitation on that attribute. - bandwidths = append([]uint64{0}, bandwidths...) - latencies = append([]time.Duration{0}, latencies...) - - var ret []networkParams - for _, bandwidth := range bandwidths { - for _, latency := range latencies { - ret = append(ret, networkParams{ - latency: latency, - bandwidth: bandwidth, - }) - } - } - return ret -} - -func runRequestor(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext, gsync gs.GraphExchange, p peer.AddrInfo, dagsrv format.DAGService, networkParams []networkParams, concurrency int, size uint64) error { - var ( - cids []cid.Cid - // create a selector for the whole UnixFS dag - sel = allselector.AllSelector - ) - - for round, np := range networkParams { - var ( - topicCid = sync.NewTopic(fmt.Sprintf("cid-%d", round), []cid.Cid{}) - stateNext = sync.State(fmt.Sprintf("next-%d", round)) - stateNet = sync.State(fmt.Sprintf("network-configured-%d", round)) - ) - - // wait for all instances to be ready for the next state. - initCtx.SyncClient.MustSignalAndWait(ctx, stateNext, runenv.TestInstanceCount) - - // clean up previous CIDs to attempt to free memory - // TODO does this work? - _ = dagsrv.RemoveMany(ctx, cids) - - runenv.RecordMessage("===== ROUND %d: latency=%s, bandwidth=%d =====", round, np.latency, np.bandwidth) - - sctx, scancel := context.WithCancel(ctx) - cidCh := make(chan []cid.Cid, 1) - initCtx.SyncClient.MustSubscribe(sctx, topicCid, cidCh) - cids = <-cidCh - scancel() - - // run GC to get accurate-ish stats. - goruntime.GC() - goruntime.GC() - - <-initCtx.SyncClient.MustBarrier(ctx, stateNet, 1).C - - errgrp, grpctx := errgroup.WithContext(ctx) - for _, c := range cids { - c := c // capture - np := np // capture - - errgrp.Go(func() error { - // make a go-ipld-prime link for the root UnixFS node - clink := cidlink.Link{Cid: c} - - // execute the traversal. - runenv.RecordMessage("\t>>> requesting CID %s", c) - - start := time.Now() - _, errCh := gsync.Request(grpctx, p.ID, clink, sel) - for err := range errCh { - return err - } - dur := time.Since(start) - - runenv.RecordMessage("\t<<< request complete with no errors") - runenv.RecordMessage("***** ROUND %d observed duration (lat=%s,bw=%d): %s", round, np.latency, np.bandwidth, dur) - - measurement := fmt.Sprintf("duration.sec,lat=%s,bw=%s,concurrency=%d,size=%s", np.latency, humanize.IBytes(np.bandwidth), concurrency, humanize.Bytes(size)) - measurement = strings.Replace(measurement, " ", "", -1) - runenv.R().RecordPoint(measurement, float64(dur)/float64(time.Second)) - - // verify that we have the CID now. - if node, err := dagsrv.Get(grpctx, c); err != nil { - return err - } else if node == nil { - return fmt.Errorf("finished graphsync request, but CID not in store") - } - - return nil - }) - } - - if err := errgrp.Wait(); err != nil { - return err - } - } - - return nil -} - -func runProvider(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext, dagsrv format.DAGService, size uint64, networkParams []networkParams, concurrency int) error { - var ( - cids []cid.Cid - bufferedDS = format.NewBufferedDAG(ctx, dagsrv) - ) - - for round, np := range networkParams { - var ( - topicCid = sync.NewTopic(fmt.Sprintf("cid-%d", round), []cid.Cid{}) - stateNext = sync.State(fmt.Sprintf("next-%d", round)) - stateNet = sync.State(fmt.Sprintf("network-configured-%d", round)) - ) - - // wait for all instances to be ready for the next state. - initCtx.SyncClient.MustSignalAndWait(ctx, stateNext, runenv.TestInstanceCount) - - // remove the previous CIDs from the dag service; hopefully this - // will delete them from the store and free up memory. - for _, c := range cids { - _ = dagsrv.Remove(ctx, c) - } - cids = cids[:0] - - runenv.RecordMessage("===== ROUND %d: latency=%s, bandwidth=%d =====", round, np.latency, np.bandwidth) - - // generate as many random files as the concurrency level. - for i := 0; i < concurrency; i++ { - // file with random data - file := files.NewReaderFile(io.LimitReader(rand.Reader, int64(size))) - - const unixfsChunkSize uint64 = 1 << 20 - const unixfsLinksPerLevel = 1024 - - params := ihelper.DagBuilderParams{ - Maxlinks: unixfsLinksPerLevel, - RawLeaves: true, - CidBuilder: nil, - Dagserv: bufferedDS, - } - - db, err := params.New(chunk.NewSizeSplitter(file, int64(unixfsChunkSize))) - if err != nil { - return fmt.Errorf("unable to setup dag builder: %w", err) - } - - node, err := balanced.Layout(db) - if err != nil { - return fmt.Errorf("unable to create unix fs node: %w", err) - } - - cids = append(cids, node.Cid()) - } - - if err := bufferedDS.Commit(); err != nil { - return fmt.Errorf("unable to commit unix fs node: %w", err) - } - - // run GC to get accurate-ish stats. - goruntime.GC() - goruntime.GC() - - runenv.RecordMessage("\tCIDs are: %v", cids) - initCtx.SyncClient.MustPublish(ctx, topicCid, cids) - - runenv.RecordMessage("\tconfiguring network for round %d", round) - initCtx.NetClient.MustConfigureNetwork(ctx, &network.Config{ - Network: "default", - Enable: true, - Default: network.LinkShape{ - Latency: np.latency, - Bandwidth: np.bandwidth * 8, // bps - }, - CallbackState: stateNet, - CallbackTarget: 1, - }) - runenv.RecordMessage("\tnetwork configured for round %d", round) - } - - return nil -} - -func makeHost(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) (host.Host, []*peer.AddrInfo, *metrics.BandwidthCounter) { - secureChannel := runenv.StringParam("secure_channel") - - var security libp2p.Option - switch secureChannel { - case "noise": - security = libp2p.Security(noise.ID, noise.New) - case "secio": - security = libp2p.Security(secio.ID, secio.New) - case "tls": - security = libp2p.Security(tls.ID, tls.New) - } - - // ☎️ Let's construct the libp2p node. - ip := initCtx.NetClient.MustGetDataNetworkIP() - listenAddr := fmt.Sprintf("/ip4/%s/tcp/0", ip) - bwcounter := metrics.NewBandwidthCounter() - host, err := libp2p.New(ctx, - security, - libp2p.ListenAddrStrings(listenAddr), - libp2p.BandwidthReporter(bwcounter), - ) - if err != nil { - panic(fmt.Sprintf("failed to instantiate libp2p instance: %s", err)) - } - - // Record our listen addrs. - runenv.RecordMessage("my listen addrs: %v", host.Addrs()) - - // Obtain our own address info, and use the sync service to publish it to a - // 'peersTopic' topic, where others will read from. - var ( - id = host.ID() - ai = &peer.AddrInfo{ID: id, Addrs: host.Addrs()} - - // the peers topic where all instances will advertise their AddrInfo. - peersTopic = sync.NewTopic("peers", new(peer.AddrInfo)) - - // initialize a slice to store the AddrInfos of all other peers in the run. - peers = make([]*peer.AddrInfo, 0, runenv.TestInstanceCount-1) - ) - - // Publish our own. - initCtx.SyncClient.MustPublish(ctx, peersTopic, ai) - - // Now subscribe to the peers topic and consume all addresses, storing them - // in the peers slice. - peersCh := make(chan *peer.AddrInfo) - sctx, scancel := context.WithCancel(ctx) - defer scancel() - - sub := initCtx.SyncClient.MustSubscribe(sctx, peersTopic, peersCh) - - // Receive the expected number of AddrInfos. - for len(peers) < cap(peers) { - select { - case ai := <-peersCh: - if ai.ID == id { - continue // skip over ourselves. - } - peers = append(peers, ai) - case err := <-sub.Done(): - panic(err) - } - } - - return host, peers, bwcounter -} diff --git a/testplans/graphsync/manifest.toml b/testplans/graphsync/manifest.toml deleted file mode 100644 index 87803474d..000000000 --- a/testplans/graphsync/manifest.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "graphsync" - -[builders] -"docker:go" = { enabled = true, enable_go_build_cache = true } -"exec:go" = { enabled = true } - -[runners] -"local:docker" = { enabled = true } -"local:exec" = { enabled = true } -"cluster:k8s" = { enabled = true } - -[global.build_config] - enable_go_build_cache = true - -[[testcases]] -name = "stress" -instances = { min = 2, max = 10000, default = 2 } - - [testcases.params] - size = { type = "int", desc = "size of file to transfer, in human-friendly form", default = "1MiB" } - secure_channel = { type = "enum", desc = "secure channel used", values = ["secio", "noise", "tls"], default = "noise" } - latencies = { type = "string", desc = "latencies to try with; comma-separated list of durations", default = '["100ms", "200ms", "300ms"]' } - bandwidths = { type = "string", desc = "bandwidths (egress bytes/s) to try with; comma-separated list of humanized sizes", default = '["10M", "1M", "512kb"]' } - concurrency = { type = "int", desc = "concurrency level", default = "1" } \ No newline at end of file From 2c10dc6c577cdf354c08690883aba5ff922d0b84 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Thu, 7 Oct 2021 18:21:48 +0200 Subject: [PATCH 12/72] Stop indirectly depending on deprecated github.com/prometheus/common parts --- go.mod | 2 +- go.sum | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 6dd22cab5..8b1896acc 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( contrib.go.opencensus.io/exporter/jaeger v0.1.0 - contrib.go.opencensus.io/exporter/prometheus v0.1.0 + contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/BurntSushi/toml v0.3.1 github.com/GeertJohan/go.rice v1.0.0 github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee diff --git a/go.sum b/go.sum index 947648d8a..728ea1e72 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= contrib.go.opencensus.io/exporter/jaeger v0.1.0 h1:WNc9HbA38xEQmsI40Tjd/MNU/g8byN2Of7lwIjv0Jdc= contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= -contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg= -contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= +contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= +contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -404,6 +404,7 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -456,8 +457,9 @@ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -1521,6 +1523,7 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= @@ -1539,6 +1542,8 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= +github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= github.com/raulk/go-watchdog v1.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= From cb39dd8ed0d8d8ce306aef6daa85c51133963d71 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Fri, 8 Oct 2021 10:15:20 +0200 Subject: [PATCH 13/72] Stop adding Jennifer's $HOME to lotus docs --- scripts/generate-lotus-cli.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/generate-lotus-cli.py b/scripts/generate-lotus-cli.py index 8018962e9..1d33687ae 100644 --- a/scripts/generate-lotus-cli.py +++ b/scripts/generate-lotus-cli.py @@ -46,6 +46,12 @@ def generate_lotus_cli(prog): if __name__ == "__main__": + # When --help is generated one needs to make sure none of the + # urfave-cli `EnvVars:` defaults get triggered + # Unset everything we can find via: grep -ho 'EnvVars:.*' -r * | sort -u + for e in [ "LOTUS_PATH", "LOTUS_MARKETS_PATH", "LOTUS_MINER_PATH", "LOTUS_STORAGE_PATH", "LOTUS_WORKER_PATH", "WORKER_PATH", "LOTUS_PANIC_REPORT_PATH", "WALLET_PATH" ]: + os.environ.pop(e, None) + os.putenv("LOTUS_VERSION_IGNORE_COMMIT", "1") generate_lotus_cli('lotus') generate_lotus_cli('lotus-miner') From 8b01725129bf005b826e7c238b2c1301748db814 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Fri, 8 Oct 2021 12:29:29 +0200 Subject: [PATCH 14/72] Dep upgrade pass Touching just the seemingly non-controversial ones --- cmd/lotus-health/main.go | 2 +- cmd/lotus-health/notify.go | 7 +- go.mod | 59 +++++---- go.sum | 251 ++++++++++++++++++++++++++++--------- 4 files changed, 228 insertions(+), 91 deletions(-) diff --git a/cmd/lotus-health/main.go b/cmd/lotus-health/main.go index da90242c8..73a0f711d 100644 --- a/cmd/lotus-health/main.go +++ b/cmd/lotus-health/main.go @@ -128,7 +128,7 @@ var watchHeadCmd = &cli.Command{ return }() - restart, err := notifyHandler(name, nCh, sCh) + restart, err := notifyHandler(ctx, name, nCh, sCh) if err != nil { return err } diff --git a/cmd/lotus-health/notify.go b/cmd/lotus-health/notify.go index 031f0fe2f..5626d7fd3 100644 --- a/cmd/lotus-health/notify.go +++ b/cmd/lotus-health/notify.go @@ -1,21 +1,22 @@ package main import ( + "context" "os" "github.com/coreos/go-systemd/v22/dbus" ) -func notifyHandler(n string, ch chan interface{}, sCh chan os.Signal) (string, error) { +func notifyHandler(ctx context.Context, n string, ch chan interface{}, sCh chan os.Signal) (string, error) { select { // alerts to restart systemd unit case <-ch: statusCh := make(chan string, 1) - c, err := dbus.New() + c, err := dbus.NewWithContext(ctx) if err != nil { return "", err } - _, err = c.TryRestartUnit(n, "fail", statusCh) + _, err = c.TryRestartUnitContext(ctx, n, "fail", statusCh) if err != nil { return "", err } diff --git a/go.mod b/go.mod index 3ccc456fd..add0c7f96 100644 --- a/go.mod +++ b/go.mod @@ -3,42 +3,42 @@ module github.com/filecoin-project/lotus go 1.16 require ( - contrib.go.opencensus.io/exporter/jaeger v0.1.0 + contrib.go.opencensus.io/exporter/jaeger v0.2.1 contrib.go.opencensus.io/exporter/prometheus v0.4.0 - github.com/BurntSushi/toml v0.3.1 - github.com/GeertJohan/go.rice v1.0.0 + github.com/BurntSushi/toml v0.4.1 + github.com/GeertJohan/go.rice v1.0.2 github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa - github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect + github.com/StackExchange/wmi v1.2.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 - github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 + github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 - github.com/coreos/go-systemd/v22 v22.1.0 + github.com/coreos/go-systemd/v22 v22.3.2 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/dgraph-io/badger/v2 v2.2007.2 github.com/docker/go-units v0.4.0 github.com/drand/drand v1.2.1 github.com/drand/kyber v1.1.4 github.com/dustin/go-humanize v1.0.0 - github.com/elastic/go-sysinfo v1.3.0 - github.com/elastic/gosigar v0.12.0 + github.com/elastic/go-sysinfo v1.7.0 + github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 - github.com/fatih/color v1.9.0 + github.com/fatih/color v1.13.0 github.com/filecoin-project/dagstore v0.4.3 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f - github.com/filecoin-project/go-address v0.0.5 + github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 - github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 - github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 - github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 + github.com/filecoin-project/go-cbor-util v0.0.1 + github.com/filecoin-project/go-commp-utils v0.1.2 + github.com/filecoin-project/go-crypto v0.0.1 github.com/filecoin-project/go-data-transfer v1.11.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.13.1 - github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec - github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 + github.com/filecoin-project/go-jsonrpc v0.1.5 + github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 github.com/filecoin-project/go-statemachine v1.0.1 @@ -52,10 +52,9 @@ require ( github.com/filecoin-project/specs-actors/v6 v6.0.0-20211001193936-c3afe7fa3c5c github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 - github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 + github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 - github.com/go-kit/kit v0.10.0 - github.com/go-ole/go-ole v1.2.4 // indirect + github.com/go-kit/kit v0.12.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.7.4 @@ -65,11 +64,11 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru v0.5.4 github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 - github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d + github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 github.com/ipfs/go-bitswap v0.3.4 github.com/ipfs/go-block-format v0.0.3 - github.com/ipfs/go-blockservice v0.1.5 + github.com/ipfs/go-blockservice v0.1.7 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 github.com/ipfs/go-datastore v0.4.6 @@ -85,14 +84,14 @@ require ( github.com/ipfs/go-ipfs-ds-help v1.0.0 github.com/ipfs/go-ipfs-exchange-interface v0.0.1 github.com/ipfs/go-ipfs-exchange-offline v0.0.1 - github.com/ipfs/go-ipfs-files v0.0.8 + github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipfs-http-client v0.0.6 github.com/ipfs/go-ipfs-routing v0.1.0 github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.5 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.3.0 - github.com/ipfs/go-merkledag v0.3.2 + github.com/ipfs/go-merkledag v0.4.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 github.com/ipfs/go-path v0.0.7 @@ -122,14 +121,14 @@ require ( github.com/libp2p/go-libp2p-tls v0.2.0 github.com/libp2p/go-libp2p-yamux v0.5.4 github.com/libp2p/go-maddr-filter v0.1.0 - github.com/mattn/go-isatty v0.0.13 + github.com/mattn/go-isatty v0.0.14 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 - github.com/multiformats/go-base32 v0.0.3 - github.com/multiformats/go-multiaddr v0.4.0 + github.com/multiformats/go-base32 v0.0.4 + github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 - github.com/multiformats/go-multihash v0.0.15 + github.com/multiformats/go-multihash v0.0.16 github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 @@ -151,11 +150,11 @@ require ( go.uber.org/dig v1.10.0 // indirect go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 - go.uber.org/zap v1.19.0 - golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d + go.uber.org/zap v1.19.1 + golang.org/x/net v0.0.0-20210917221730-978cfadd31cf golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 - golang.org/x/time v0.0.0-20191024005414-555d28b269f0 + golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 + golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/tools v0.1.5 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 gopkg.in/cheggaaa/pb.v1 v1.0.28 diff --git a/go.sum b/go.sum index 5aa1643c0..843436bac 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/jaeger v0.1.0 h1:WNc9HbA38xEQmsI40Tjd/MNU/g8byN2Of7lwIjv0Jdc= -contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= +contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -47,17 +47,21 @@ github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOv github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= -github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= -github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk= +github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa h1:1PPxEyGdIGVkX/kqMvLJ95a1dGS1Sz7tpNEgehEYYt0= @@ -73,8 +77,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 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/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= 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/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -82,6 +86,7 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpH github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 h1:T3+cD5fYvuH36h7EZq+TDpm+d8a6FSD4pQsbmuGGQ8o= @@ -94,18 +99,23 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= @@ -141,10 +151,11 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4= -github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= +github.com/buger/goterm v1.0.3 h1:7V/HeAQHrzPk/U4BvyH2g9u+xbUW9nr4yRPyG59W4fM= +github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -152,8 +163,9 @@ github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894 h1:JLaf/iINcLyjw github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= @@ -163,6 +175,9 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -193,8 +208,9 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0 h1:kq/SbG2BCKLkDKkjQf5OWwKWUKj1lgs3lFI4PxnR5lg= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= @@ -205,6 +221,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= @@ -256,18 +273,20 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/go-sysinfo v1.3.0 h1:eb2XFGTMlSwG/yyU9Y8jVAYLIzU2sFzWXwo2gmetyrE= -github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= +github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg= +github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= -github.com/elastic/gosigar v0.12.0 h1:AsdhYCJlTudhfOYQyFNgx+fIVTfrDO0V1ST0vHgiapU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.1 h1:T0aQ7n/n2ZA9W7DmAnj60v+qzqKERdBgJBO1CG2W6rc= +github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etclabscore/go-jsonschema-walk v0.0.6 h1:DrNzoKWKd8f8XB5nFGBY00IcjakRE22OTI12k+2LkyY= @@ -278,14 +297,17 @@ github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= +github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= @@ -295,12 +317,15 @@ github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= -github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:av5fw6wmm58FYMgJeoB/lK9XXrgdugYiTqkdxjTy9k8= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= +github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= +github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= +github.com/filecoin-project/go-commp-utils v0.1.2 h1:SKLRuGdx/6WlolaWKaUzzUYWGGePuARyO4guxOPxvt4= +github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= +github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= github.com/filecoin-project/go-data-transfer v1.11.1 h1:fiw2FHDVSDrt427cGp7+Ax3TTZk0e6HvF9Odcl2etBM= github.com/filecoin-project/go-data-transfer v1.11.1/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= @@ -322,12 +347,13 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= +github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= -github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= +github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= +github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= @@ -375,17 +401,19 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 h1:EzDjxMg43q1tA2c0MV3tNbaontnHLplHyFF6M5KiVP0= -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= +github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= +github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= @@ -402,17 +430,20 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -430,14 +461,15 @@ github.com/go-openapi/swag v0.19.11 h1:RFTu/dlFySpyVvJDfp/7674JY4SDglYWKztbiIGFp github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= @@ -452,6 +484,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -490,8 +524,9 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf h1:gFVkHXmVAhEbxZVDln5V9GKrLaluNoFHDbrZwAWZgws= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -504,8 +539,9 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -570,17 +606,26 @@ github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= 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-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -595,11 +640,15 @@ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= @@ -614,8 +663,9 @@ github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1C github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= @@ -633,8 +683,9 @@ github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbR github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5 h1:euqZu96CCbToPyYVwVshu8ENURi8BhFd7FUFfTLi+fQ= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= +github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= +github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -698,6 +749,7 @@ github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJO github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= @@ -725,8 +777,9 @@ 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.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= +github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= +github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= @@ -750,6 +803,8 @@ github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dC github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= +github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= +github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -775,8 +830,9 @@ github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKy github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.3.2 h1:MRqj40QkrWkvPswXs4EfSslhZ4RVPRbxwX11js0t1xY= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= +github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= 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-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= @@ -818,6 +874,7 @@ github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVI github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= @@ -853,6 +910,8 @@ github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGAR github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -872,6 +931,7 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -879,6 +939,7 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 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/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= @@ -892,8 +953,10 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -912,8 +975,9 @@ github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/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/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= @@ -1246,6 +1310,8 @@ github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= +github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1273,16 +1339,20 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= @@ -1300,6 +1370,7 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= @@ -1313,6 +1384,8 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdn github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= 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/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= 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/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -1321,6 +1394,7 @@ github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -1329,18 +1403,21 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 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/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/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-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= +github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1354,8 +1431,9 @@ github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.4.0 h1:hL/K4ZJhJ5PTw3nwylq9lGU5yArzcAroZmex1ghSEkQ= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= +github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= +github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1390,8 +1468,9 @@ github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= +github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1409,18 +1488,25 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= +github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -1468,11 +1554,14 @@ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= @@ -1491,6 +1580,7 @@ github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 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= @@ -1498,6 +1588,7 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -1637,7 +1728,9 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 h1:7z3LSn867ex6VSaahyKadf4WtSsJIgne6A1WLOAGM8A= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1664,9 +1757,11 @@ github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhV github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-client-go v2.23.1+incompatible h1:uArBYHQR0HqLFFAypI7RsWTzPSj/bDpmZZuQjMLSg1A= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= @@ -1714,6 +1809,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= @@ -1766,6 +1862,10 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1796,8 +1896,9 @@ go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -1811,9 +1912,11 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= @@ -1838,12 +1941,14 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1852,14 +1957,20 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e h1:VvfwVmMH40bpMeizC9/K7ipM5Qjucuu16RWfneFPyhQ= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= @@ -1875,6 +1986,7 @@ golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJS golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +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-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1887,8 +1999,9 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= @@ -1964,8 +2077,10 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2000,6 +2115,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2025,6 +2141,7 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2074,6 +2191,8 @@ golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2082,8 +2201,9 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2093,21 +2213,26 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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= @@ -2120,7 +2245,9 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2164,6 +2291,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2171,11 +2299,14 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/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.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2237,8 +2368,10 @@ google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= @@ -2264,6 +2397,7 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -2284,6 +2418,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= @@ -2341,9 +2476,11 @@ modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From bfcfb199a09321d1893738f4a0243a54539f9abe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 8 Oct 2021 14:54:02 +0200 Subject: [PATCH 15/72] Add storage-id flag to proving check --- cmd/lotus-miner/proving.go | 36 +++++++++++++++++++++++++---- documentation/en/cli-lotus-miner.md | 7 +++--- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index 5dfe5d4ce..ee15785fe 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" + "github.com/filecoin-project/lotus/extern/sector-storage/stores" "github.com/filecoin-project/specs-storage/storage" ) @@ -360,6 +361,10 @@ var provingCheckProvableCmd = &cli.Command{ Name: "slow", Usage: "run slower checks", }, + &cli.StringFlag{ + Name: "storage-id", + Usage: "filter sectors by storage path (path id)", + }, }, Action: func(cctx *cli.Context) error { if cctx.Args().Len() != 1 { @@ -408,6 +413,21 @@ var provingCheckProvableCmd = &cli.Command{ tw := tabwriter.NewWriter(os.Stdout, 2, 4, 2, ' ', 0) _, _ = fmt.Fprintln(tw, "deadline\tpartition\tsector\tstatus") + var filter map[abi.SectorID]struct{} + + if cctx.IsSet("storage-id") { + sl, err := sapi.StorageList(ctx) + if err != nil { + return err + } + decls := sl[stores.ID(cctx.String("storage-id"))] + + filter = map[abi.SectorID]struct{}{} + for _, decl := range decls { + filter[decl.SectorID] = struct{}{} + } + } + for parIdx, par := range partitions { sectors := make(map[abi.SectorNumber]struct{}) @@ -418,13 +438,21 @@ var provingCheckProvableCmd = &cli.Command{ var tocheck []storage.SectorRef for _, info := range sectorInfos { + si := abi.SectorID{ + Miner: abi.ActorID(mid), + Number: info.SectorNumber, + } + + if filter != nil { + if _, found := filter[si]; !found { + continue + } + } + sectors[info.SectorNumber] = struct{}{} tocheck = append(tocheck, storage.SectorRef{ ProofType: info.SealProof, - ID: abi.SectorID{ - Miner: abi.ActorID(mid), - Number: info.SectorNumber, - }, + ID: si, }) } diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 5a0888621..df1e702d9 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1899,9 +1899,10 @@ USAGE: lotus-miner proving check [command options] OPTIONS: - --only-bad print only bad sectors (default: false) - --slow run slower checks (default: false) - --help, -h show help (default: false) + --only-bad print only bad sectors (default: false) + --slow run slower checks (default: false) + --storage-id value filter sectors by storage path (path id) + --help, -h show help (default: false) ``` From 6184e8a94395fa365e0d492cb137f583ebcc5bf3 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Fri, 8 Oct 2021 22:45:16 +0200 Subject: [PATCH 16/72] peerstore@v0.2.9 was withdrawn, let's not depend on it directly --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index add0c7f96..b310b76fe 100644 --- a/go.mod +++ b/go.mod @@ -112,7 +112,7 @@ require ( github.com/libp2p/go-libp2p-kad-dht v0.13.0 github.com/libp2p/go-libp2p-mplex v0.4.1 github.com/libp2p/go-libp2p-noise v0.2.2 - github.com/libp2p/go-libp2p-peerstore v0.2.9 + github.com/libp2p/go-libp2p-peerstore v0.3.0 github.com/libp2p/go-libp2p-pubsub v0.5.4 github.com/libp2p/go-libp2p-quic-transport v0.11.2 github.com/libp2p/go-libp2p-record v0.1.3 diff --git a/go.sum b/go.sum index 843436bac..57cb969af 100644 --- a/go.sum +++ b/go.sum @@ -1150,8 +1150,8 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.2.9 h1:tVa7siDymmzOl3b3+SxPYpQUCnicmK13y6Re1PqWK+g= -github.com/libp2p/go-libp2p-peerstore v0.2.9/go.mod h1:zhBaLzxiWpNGQ3+uI17G/OIjmOD8GxKyFuHbrZbgs0w= +github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= +github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= From e158b1d1e457e1bdbe949d30b231e6c0ff3ea479 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 9 Oct 2021 20:11:49 -0400 Subject: [PATCH 17/72] Bugfix: actor withdraw CLI should depend on network version --- cli/wallet.go | 19 ++++++++++++++----- cmd/lotus-miner/actor.go | 20 +++++++++++++++----- cmd/lotus-shed/actor.go | 19 ++++++++++++++----- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/cli/wallet.go b/cli/wallet.go index f0f4e11f9..df526dc03 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -10,6 +10,8 @@ import ( "os" "strings" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/build" "github.com/urfave/cli/v2" @@ -634,14 +636,21 @@ var walletMarketWithdraw = &cli.Command{ return err } - var withdrawn abi.TokenAmount - if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { + nv, err := api.StateNetworkVersion(ctx, wait.TipSet) + if err != nil { return err } - fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) - if withdrawn != amt { - fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amt) + if nv >= network.Version14 { + var withdrawn abi.TokenAmount + if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { + return err + } + + fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) + if withdrawn != amt { + fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amt) + } } return nil diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index 29c5a4bf4..f15352e6d 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -6,6 +6,8 @@ import ( "os" "strings" + "github.com/filecoin-project/go-state-types/network" + rlepluslazy "github.com/filecoin-project/go-bitfield/rle" cbor "github.com/ipfs/go-ipld-cbor" @@ -280,6 +282,7 @@ var actorWithdrawCmd = &cli.Command{ fmt.Printf("Requested rewards withdrawal in message %s\n", smsg.Cid()) // wait for it to get mined into a block + fmt.Println("using ", uint64(cctx.Int("confidence"))) wait, err := api.StateWaitMsg(ctx, smsg.Cid(), uint64(cctx.Int("confidence"))) if err != nil { return err @@ -291,14 +294,21 @@ var actorWithdrawCmd = &cli.Command{ return err } - var withdrawn abi.TokenAmount - if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { + nv, err := api.StateNetworkVersion(ctx, wait.TipSet) + if err != nil { return err } - fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) - if withdrawn != amount { - fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amount) + if nv >= network.Version14 { + var withdrawn abi.TokenAmount + if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { + return err + } + + fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) + if withdrawn != amount { + fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amount) + } } return nil diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index fd7410c24..91a23a4ee 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -5,6 +5,8 @@ import ( "fmt" "os" + "github.com/filecoin-project/go-state-types/network" + "github.com/fatih/color" "github.com/urfave/cli/v2" "golang.org/x/xerrors" @@ -138,14 +140,21 @@ var actorWithdrawCmd = &cli.Command{ return err } - var withdrawn abi.TokenAmount - if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { + nv, err := nodeAPI.StateNetworkVersion(ctx, wait.TipSet) + if err != nil { return err } - fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) - if withdrawn != amount { - fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amount) + if nv >= network.Version14 { + var withdrawn abi.TokenAmount + if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { + return err + } + + fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) + if withdrawn != amount { + fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amount) + } } return nil From be774f55ce42c938c2b404fdfa8e5ed2aeab2622 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sun, 10 Oct 2021 10:40:22 -0400 Subject: [PATCH 18/72] Update cmd/lotus-miner/actor.go Co-authored-by: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> --- cmd/lotus-miner/actor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index f15352e6d..5b3368138 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -282,7 +282,7 @@ var actorWithdrawCmd = &cli.Command{ fmt.Printf("Requested rewards withdrawal in message %s\n", smsg.Cid()) // wait for it to get mined into a block - fmt.Println("using ", uint64(cctx.Int("confidence"))) + fmt.Printf("waiting for %x epochs for confirmation..\n", uint64(cctx.Int("confidence"))) wait, err := api.StateWaitMsg(ctx, smsg.Cid(), uint64(cctx.Int("confidence"))) if err != nil { return err From 1723793c35130021cb5b48ca82c95cb48b6fdcf5 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sun, 10 Oct 2021 11:24:57 -0400 Subject: [PATCH 19/72] Bugfix: Use current startup network versions --- build/openrpc/full.json.gz | Bin 25455 -> 25455 bytes build/params_shared_vals.go | 2 +- chain/stmgr/stmgr.go | 3 --- documentation/en/api-v0-methods.md | 2 +- documentation/en/api-v1-unstable-methods.md | 2 +- 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index f4e71402de0d790f115cc471e2e9953746df3ea9..8837c745b4e46ae201270a2de36dbb74a3113df1 100644 GIT binary patch literal 25455 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 literal 25455 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 diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go index 5b6197d9b..22d1c30e3 100644 --- a/build/params_shared_vals.go +++ b/build/params_shared_vals.go @@ -28,7 +28,7 @@ const UnixfsLinksPerLevel = 1024 const AllowableClockDriftSecs = uint64(1) // TODO: This is still terrible...What's the impact of updating this before mainnet actually upgrades -const NewestNetworkVersion = network.Version13 +const NewestNetworkVersion = network.Version14 // Epochs const ForkLengthThreshold = Finality diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index a3f17cd41..67c0bdb6a 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -134,9 +134,6 @@ func NewStateManager(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, }) lastVersion = upgrade.Network } - } else { - // Otherwise, go directly to the latest version. - lastVersion = build.NewestNetworkVersion } return &StateManager{ diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index f177c6008..4d9530821 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -4698,7 +4698,7 @@ Inputs: ] ``` -Response: `13` +Response: `14` ### StateReadState StateReadState returns the indicated actor's state. diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 397ff3c6f..b03f75e9d 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -4948,7 +4948,7 @@ Inputs: ] ``` -Response: `13` +Response: `14` ### StateReadState StateReadState returns the indicated actor's state. From 90ff1d3ccf152d87b403633c2c68012434bf1d9c Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 11 Oct 2021 14:03:21 +0200 Subject: [PATCH 20/72] Fix withdrawn amount equiality check Co-authored-by: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> --- cmd/lotus-shed/actor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index 91a23a4ee..04c137444 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -152,7 +152,7 @@ var actorWithdrawCmd = &cli.Command{ } fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) - if withdrawn != amount { + if withdrawn.LessThan(amount) { fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amount) } } From 8533ae0032c7199f412d1dafc9bea9a027ab4ede Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 11 Oct 2021 14:03:28 +0200 Subject: [PATCH 21/72] Fix withdrawn amount equiality check Co-authored-by: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> --- cmd/lotus-miner/actor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index 5b3368138..43af395b1 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -306,7 +306,7 @@ var actorWithdrawCmd = &cli.Command{ } fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) - if withdrawn != amount { + if withdrawn.LessThan(amount) { fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amount) } } From 4853762763447f78e336436f637d8ee63e43860a Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 11 Oct 2021 14:03:37 +0200 Subject: [PATCH 22/72] Fix withdrawn amount equiality check Co-authored-by: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> --- cli/wallet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/wallet.go b/cli/wallet.go index df526dc03..5f3053293 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -648,7 +648,7 @@ var walletMarketWithdraw = &cli.Command{ } fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) - if withdrawn != amt { + if withdrawn.LessThan(amount) { fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amt) } } From 6e5ccc87cfa9ccf75eddadaeefc654c3de1e8d2d Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 6 Oct 2021 13:43:38 +0200 Subject: [PATCH 23/72] cli: add retry for deals stuck in Publish with no funds --- .circleci/config.yml | 5 ++ api/api_storage.go | 1 + api/proxy_gen.go | 13 +++ build/openrpc/full.json.gz | Bin 25455 -> 25453 bytes build/openrpc/miner.json.gz | Bin 10424 -> 10467 bytes build/openrpc/worker.json.gz | Bin 2710 -> 2713 bytes cmd/lotus-miner/market.go | 29 ++++++ documentation/en/api-v0-methods-miner.md | 17 ++++ documentation/en/cli-lotus-miner.md | 15 ++++ go.mod | 2 +- go.sum | 4 +- itests/deals_retry_deal_no_funds_test.go | 107 +++++++++++++++++++++++ node/impl/storminer.go | 4 + 13 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 itests/deals_retry_deal_no_funds_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 222f14d50..30f2d5c01 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -825,6 +825,11 @@ workflows: suite: itest-deals_publish target: "./itests/deals_publish_test.go" + - test: + name: test-itest-deals_retry_deal_no_funds + suite: itest-deals_retry_deal_no_funds + target: "./itests/deals_retry_deal_no_funds_test.go" + - test: name: test-itest-deals suite: itest-deals diff --git a/api/api_storage.go b/api/api_storage.go index 6ebee9908..8cca2aa5b 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -166,6 +166,7 @@ type StorageMiner interface { MarketCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write MarketPendingDeals(ctx context.Context) (PendingDealInfo, error) //perm:write MarketPublishPendingDeals(ctx context.Context) error //perm:admin + MarketRetryPublishDeal(ctx context.Context, propcid cid.Cid) error //perm:admin // DagstoreListShards returns information about all shards known to the // DAG store. Only available on nodes running the markets subsystem. diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 7a504cf77..b36f19a7e 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -683,6 +683,8 @@ type StorageMinerStruct struct { MarketRestartDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + MarketRetryPublishDeal func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + MarketSetAsk func(p0 context.Context, p1 types.BigInt, p2 types.BigInt, p3 abi.ChainEpoch, p4 abi.PaddedPieceSize, p5 abi.PaddedPieceSize) error `perm:"admin"` MarketSetRetrievalAsk func(p0 context.Context, p1 *retrievalmarket.Ask) error `perm:"admin"` @@ -4020,6 +4022,17 @@ func (s *StorageMinerStub) MarketRestartDataTransfer(p0 context.Context, p1 data return ErrNotSupported } +func (s *StorageMinerStruct) MarketRetryPublishDeal(p0 context.Context, p1 cid.Cid) error { + if s.Internal.MarketRetryPublishDeal == nil { + return ErrNotSupported + } + return s.Internal.MarketRetryPublishDeal(p0, p1) +} + +func (s *StorageMinerStub) MarketRetryPublishDeal(p0 context.Context, p1 cid.Cid) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) MarketSetAsk(p0 context.Context, p1 types.BigInt, p2 types.BigInt, p3 abi.ChainEpoch, p4 abi.PaddedPieceSize, p5 abi.PaddedPieceSize) error { if s.Internal.MarketSetAsk == nil { return ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8837c745b4e46ae201270a2de36dbb74a3113df1..1c5765efe0dbcb07a8690e6da243d9459b5ef039 100644 GIT binary patch delta 17539 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 delta 17516 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�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 H1Na00TbW&U diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 6727576ef066258e858b05e796483b6e81cc6fd5..5bdcf035c3be915b1e1292c2d10c38c3472013f4 100644 GIT binary patch literal 10467 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 literal 2710 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 Q1pom5|LSQQmRWiL07ySJ#sB~S diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go index c32f44b6a..2e4db79ce 100644 --- a/cmd/lotus-miner/market.go +++ b/cmd/lotus-miner/market.go @@ -352,6 +352,7 @@ var storageDealsCmd = &cli.Command{ resetBlocklistCmd, setSealDurationCmd, dealsPendingPublish, + dealsRetryPublish, }, } @@ -910,6 +911,34 @@ var dealsPendingPublish = &cli.Command{ }, } +var dealsRetryPublish = &cli.Command{ + Name: "retry-publish", + Usage: "retry publishing a deal", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "proposal-cid", + }, + }, + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetMarketsAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + cid, err := cid.Decode(cctx.String("proposal-cid")) + if err != nil { + return err + } + if err := api.MarketRetryPublishDeal(ctx, cid); err != nil { + return xerrors.Errorf("retrying publishing deal: %w", err) + } + fmt.Println("retried to publish deal") + return nil + }, +} + func listDealsWithJSON(cctx *cli.Context) error { node, closer, err := lcli.GetMarketsAPI(cctx) if err != nil { diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index dd7a1f88e..4d14bcb0e 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -61,6 +61,7 @@ * [MarketPendingDeals](#MarketPendingDeals) * [MarketPublishPendingDeals](#MarketPublishPendingDeals) * [MarketRestartDataTransfer](#MarketRestartDataTransfer) + * [MarketRetryPublishDeal](#MarketRetryPublishDeal) * [MarketSetAsk](#MarketSetAsk) * [MarketSetRetrievalAsk](#MarketSetRetrievalAsk) * [Mining](#Mining) @@ -949,6 +950,22 @@ Inputs: Response: `{}` +### MarketRetryPublishDeal + + +Perms: admin + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `{}` + ### MarketSetAsk diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 5a0888621..7823e886f 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -629,6 +629,7 @@ COMMANDS: reset-blocklist Remove all entries from the miner's piece CID blocklist set-seal-duration Set the expected time, in minutes, that you expect sealing sectors to take. Deals that start before this duration will be rejected. pending-publish list deals waiting in publish queue + retry-publish retry publishing a deal help, h Shows a list of commands or help for one command OPTIONS: @@ -825,6 +826,20 @@ OPTIONS: ``` +### lotus-miner storage-deals retry-publish +``` +NAME: + lotus-miner storage-deals retry-publish - retry publishing a deal + +USAGE: + lotus-miner storage-deals retry-publish [command options] [arguments...] + +OPTIONS: + --proposal-cid value + --help, -h show help (default: false) + +``` + ## lotus-miner retrieval-deals ``` NAME: diff --git a/go.mod b/go.mod index add0c7f96..bebae0528 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.11.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.1 + github.com/filecoin-project/go-fil-markets v1.13.2-0.20211007101645-eebce51848eb github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index 843436bac..fc22b4a2d 100644 --- a/go.sum +++ b/go.sum @@ -338,8 +338,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.1 h1:KjarxgKp/RN4iYXT2pMcMq6veIa1guGJMoVtnwru4BQ= -github.com/filecoin-project/go-fil-markets v1.13.1/go.mod h1:58OjtsWtDt3xlN1QLmgDQxtfCDtDS4RIyHepIUbqXhM= +github.com/filecoin-project/go-fil-markets v1.13.2-0.20211007101645-eebce51848eb h1:8e9XhhvYCUS91GeP4HXj6rH2ySShLuWRDkwff1CFha0= +github.com/filecoin-project/go-fil-markets v1.13.2-0.20211007101645-eebce51848eb/go.mod h1:58OjtsWtDt3xlN1QLmgDQxtfCDtDS4RIyHepIUbqXhM= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go new file mode 100644 index 000000000..e851d3df7 --- /dev/null +++ b/itests/deals_retry_deal_no_funds_test.go @@ -0,0 +1,107 @@ +package itests + +import ( + "context" + "testing" + "time" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/wallet" + "github.com/filecoin-project/lotus/itests/kit" + "github.com/filecoin-project/lotus/markets/storageadapter" + "github.com/filecoin-project/lotus/node" + "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/modules" + "github.com/filecoin-project/lotus/storage" + "github.com/stretchr/testify/require" +) + +var ( + publishPeriod = 1 * time.Second + maxDealsPerMsg = uint64(2) // Set max deals per publish deals message to 2 + + blockTime = 10 * time.Millisecond +) + +func TestDealsRetryLackOfFunds(t *testing.T) { + ctx := context.Background() + oldDelay := policy.GetPreCommitChallengeDelay() + policy.SetPreCommitChallengeDelay(5) + + t.Cleanup(func() { + policy.SetPreCommitChallengeDelay(oldDelay) + }) + + policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg8MiBV1) + kit.QuietMiningLogs() + + // Allow 8MB sectors + eightMBSectorsOpt := kit.SectorSize(8 << 20) + + publishStorageDealKey, err := wallet.GenerateKey(types.KTSecp256k1) + require.NoError(t, err) + + opts := node.Options( + node.Override(new(*storageadapter.DealPublisher), + storageadapter.NewDealPublisher(nil, storageadapter.PublishMsgConfig{ + Period: publishPeriod, + MaxDealsPerMsg: maxDealsPerMsg, + }), + ), + node.Override(new(*storage.AddressSelector), modules.AddressSelector(&config.MinerAddressConfig{ + DealPublishControl: []string{ + publishStorageDealKey.Address.String(), + }, + DisableOwnerFallback: true, + DisableWorkerFallback: true, + })), + ) + + minerFullNode, clientFullNode, miner, ens := kit.EnsembleTwoOne(t, kit.Account(publishStorageDealKey, types.NewInt(1020000000000)), kit.ConstructorOpts(opts), kit.MockProofs(), eightMBSectorsOpt) + + //TODO: this fails slightly differently - handle this case as well + //minerFullNode, clientFullNode, miner, ens := kit.EnsembleTwoOne(t, kit.Account(publishStorageDealKey, types.NewInt(1)), kit.ConstructorOpts(opts), kit.MockProofs(), eightMBSectorsOpt) + + kit.QuietMiningLogs() + + ens. + Start(). + InterconnectAll(). + BeginMining(blockTime) + + _, err = minerFullNode.WalletImport(ctx, &publishStorageDealKey.KeyInfo) + require.NoError(t, err) + + miner.SetControlAddresses(publishStorageDealKey.Address) + + dh := kit.NewDealHarness(t, clientFullNode, miner, miner) + + res, _ := clientFullNode.CreateImportFile(ctx, 0, 4<<20) // 4MiB file. + list, err := clientFullNode.ClientListImports(ctx) + require.NoError(t, err) + require.Len(t, list, 1) + require.Equal(t, res.Root, *list[0].Root) + + dp := dh.DefaultStartDealParams() + dp.Data.Root = res.Root + dp.FastRetrieval = true + dp.EpochPrice = abi.NewTokenAmount(62500000) // minimum asking price. + deal := dh.StartDeal(ctx, dp) + + propcid := *deal + + go func() { + time.Sleep(20 * time.Second) + + kit.SendFunds(ctx, t, minerFullNode, publishStorageDealKey.Address, types.FromFil(1)) + + err := miner.MarketRetryPublishDeal(ctx, propcid) + if err != nil { + panic(err) + } + }() + + dh.WaitDealSealed(ctx, deal, false, false, nil) +} diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 4e970343e..39baa97bf 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -557,6 +557,10 @@ func (sm *StorageMinerAPI) MarketPendingDeals(ctx context.Context) (api.PendingD return sm.DealPublisher.PendingDeals(), nil } +func (sm *StorageMinerAPI) MarketRetryPublishDeal(ctx context.Context, propcid cid.Cid) error { + return sm.StorageProvider.RetryDealPublishing(propcid) +} + func (sm *StorageMinerAPI) MarketPublishPendingDeals(ctx context.Context) error { sm.DealPublisher.ForcePublishPendingDeals() return nil From 1acb6b43280e5ecd2f933d6898752a61d9757101 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 8 Oct 2021 11:54:37 +0200 Subject: [PATCH 24/72] update CLI command to take arg; reduce time for itest --- cmd/lotus-miner/market.go | 18 ++++++++++-------- documentation/en/cli-lotus-miner.md | 5 ++--- itests/deals_retry_deal_no_funds_test.go | 4 ++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go index 2e4db79ce..d3da6f9b3 100644 --- a/cmd/lotus-miner/market.go +++ b/cmd/lotus-miner/market.go @@ -912,14 +912,13 @@ var dealsPendingPublish = &cli.Command{ } var dealsRetryPublish = &cli.Command{ - Name: "retry-publish", - Usage: "retry publishing a deal", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "proposal-cid", - }, - }, + Name: "retry-publish", + Usage: "retry publishing a deal", + ArgsUsage: "", Action: func(cctx *cli.Context) error { + if !cctx.Args().Present() { + return cli.ShowCommandHelp(cctx, cctx.Command.Name) + } api, closer, err := lcli.GetMarketsAPI(cctx) if err != nil { return err @@ -927,7 +926,10 @@ var dealsRetryPublish = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - cid, err := cid.Decode(cctx.String("proposal-cid")) + propcid := cctx.Args().First() + fmt.Printf("retrying deal with proposal-cid: %s\n", propcid) + + cid, err := cid.Decode(propcid) if err != nil { return err } diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 7823e886f..b77daf800 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -832,11 +832,10 @@ NAME: lotus-miner storage-deals retry-publish - retry publishing a deal USAGE: - lotus-miner storage-deals retry-publish [command options] [arguments...] + lotus-miner storage-deals retry-publish [command options] OPTIONS: - --proposal-cid value - --help, -h show help (default: false) + --help, -h show help (default: false) ``` diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go index e851d3df7..839359c2f 100644 --- a/itests/deals_retry_deal_no_funds_test.go +++ b/itests/deals_retry_deal_no_funds_test.go @@ -22,7 +22,7 @@ var ( publishPeriod = 1 * time.Second maxDealsPerMsg = uint64(2) // Set max deals per publish deals message to 2 - blockTime = 10 * time.Millisecond + blockTime = 3 * time.Millisecond ) func TestDealsRetryLackOfFunds(t *testing.T) { @@ -93,7 +93,7 @@ func TestDealsRetryLackOfFunds(t *testing.T) { propcid := *deal go func() { - time.Sleep(20 * time.Second) + time.Sleep(3 * time.Second) kit.SendFunds(ctx, t, minerFullNode, publishStorageDealKey.Address, types.FromFil(1)) From 6a3bb184b7eedf8acee8c090c3bb50b7ac9cd229 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 8 Oct 2021 12:44:20 +0200 Subject: [PATCH 25/72] more tests for deals when provider has no funds in control addr --- itests/deals_retry_deal_no_funds_test.go | 151 ++++++++++++++++++++++- 1 file changed, 147 insertions(+), 4 deletions(-) diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go index 839359c2f..3bb95d148 100644 --- a/itests/deals_retry_deal_no_funds_test.go +++ b/itests/deals_retry_deal_no_funds_test.go @@ -59,10 +59,8 @@ func TestDealsRetryLackOfFunds(t *testing.T) { })), ) - minerFullNode, clientFullNode, miner, ens := kit.EnsembleTwoOne(t, kit.Account(publishStorageDealKey, types.NewInt(1020000000000)), kit.ConstructorOpts(opts), kit.MockProofs(), eightMBSectorsOpt) - - //TODO: this fails slightly differently - handle this case as well - //minerFullNode, clientFullNode, miner, ens := kit.EnsembleTwoOne(t, kit.Account(publishStorageDealKey, types.NewInt(1)), kit.ConstructorOpts(opts), kit.MockProofs(), eightMBSectorsOpt) + publishStorageAccountFunds := types.NewInt(1020000000000) + minerFullNode, clientFullNode, miner, ens := kit.EnsembleTwoOne(t, kit.Account(publishStorageDealKey, publishStorageAccountFunds), kit.ConstructorOpts(opts), kit.MockProofs(), eightMBSectorsOpt) kit.QuietMiningLogs() @@ -105,3 +103,148 @@ func TestDealsRetryLackOfFunds(t *testing.T) { dh.WaitDealSealed(ctx, deal, false, false, nil) } + +func TestDealsRetryLackOfFunds_blockInPublishDeal(t *testing.T) { + ctx := context.Background() + oldDelay := policy.GetPreCommitChallengeDelay() + policy.SetPreCommitChallengeDelay(5) + + t.Cleanup(func() { + policy.SetPreCommitChallengeDelay(oldDelay) + }) + + policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg8MiBV1) + kit.QuietMiningLogs() + + // Allow 8MB sectors + eightMBSectorsOpt := kit.SectorSize(8 << 20) + + publishStorageDealKey, err := wallet.GenerateKey(types.KTSecp256k1) + require.NoError(t, err) + + opts := node.Options( + node.Override(new(*storageadapter.DealPublisher), + storageadapter.NewDealPublisher(nil, storageadapter.PublishMsgConfig{ + Period: publishPeriod, + MaxDealsPerMsg: maxDealsPerMsg, + }), + ), + node.Override(new(*storage.AddressSelector), modules.AddressSelector(&config.MinerAddressConfig{ + DealPublishControl: []string{ + publishStorageDealKey.Address.String(), + }, + DisableOwnerFallback: true, + DisableWorkerFallback: true, + })), + ) + + publishStorageAccountFunds := types.NewInt(1020000000000) + minerFullNode, clientFullNode, miner, ens := kit.EnsembleTwoOne(t, kit.Account(publishStorageDealKey, publishStorageAccountFunds), kit.ConstructorOpts(opts), kit.MockProofs(), eightMBSectorsOpt) + + kit.QuietMiningLogs() + + ens. + Start(). + InterconnectAll(). + BeginMining(blockTime) + + _, err = minerFullNode.WalletImport(ctx, &publishStorageDealKey.KeyInfo) + require.NoError(t, err) + + miner.SetControlAddresses(publishStorageDealKey.Address) + + dh := kit.NewDealHarness(t, clientFullNode, miner, miner) + + res, _ := clientFullNode.CreateImportFile(ctx, 0, 4<<20) // 4MiB file. + list, err := clientFullNode.ClientListImports(ctx) + require.NoError(t, err) + require.Len(t, list, 1) + require.Equal(t, res.Root, *list[0].Root) + + dp := dh.DefaultStartDealParams() + dp.Data.Root = res.Root + dp.FastRetrieval = true + dp.EpochPrice = abi.NewTokenAmount(62500000) // minimum asking price. + deal := dh.StartDeal(ctx, dp) + + dealSealed := make(chan struct{}) + go func() { + dh.WaitDealSealed(ctx, deal, false, false, nil) + dealSealed <- struct{}{} + }() + + select { + case <-dealSealed: + t.Fatal("deal shouldn't have sealed") + case <-time.After(time.Second * 15): + } +} + +func TestDealsRetryLackOfFunds_belowLimit(t *testing.T) { + ctx := context.Background() + oldDelay := policy.GetPreCommitChallengeDelay() + policy.SetPreCommitChallengeDelay(5) + + t.Cleanup(func() { + policy.SetPreCommitChallengeDelay(oldDelay) + }) + + policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg8MiBV1) + kit.QuietMiningLogs() + + // Allow 8MB sectors + eightMBSectorsOpt := kit.SectorSize(8 << 20) + + publishStorageDealKey, err := wallet.GenerateKey(types.KTSecp256k1) + require.NoError(t, err) + + opts := node.Options( + node.Override(new(*storageadapter.DealPublisher), + storageadapter.NewDealPublisher(nil, storageadapter.PublishMsgConfig{ + Period: publishPeriod, + MaxDealsPerMsg: maxDealsPerMsg, + }), + ), + node.Override(new(*storage.AddressSelector), modules.AddressSelector(&config.MinerAddressConfig{ + DealPublishControl: []string{ + publishStorageDealKey.Address.String(), + }, + DisableOwnerFallback: true, + DisableWorkerFallback: true, + })), + ) + + publishStorageAccountFunds := types.NewInt(1) + minerFullNode, clientFullNode, miner, ens := kit.EnsembleTwoOne(t, kit.Account(publishStorageDealKey, publishStorageAccountFunds), kit.ConstructorOpts(opts), kit.MockProofs(), eightMBSectorsOpt) + + kit.QuietMiningLogs() + + ens. + Start(). + InterconnectAll(). + BeginMining(blockTime) + + _, err = minerFullNode.WalletImport(ctx, &publishStorageDealKey.KeyInfo) + require.NoError(t, err) + + miner.SetControlAddresses(publishStorageDealKey.Address) + + dh := kit.NewDealHarness(t, clientFullNode, miner, miner) + + res, _ := clientFullNode.CreateImportFile(ctx, 0, 4<<20) // 4MiB file. + list, err := clientFullNode.ClientListImports(ctx) + require.NoError(t, err) + require.Len(t, list, 1) + require.Equal(t, res.Root, *list[0].Root) + + dp := dh.DefaultStartDealParams() + dp.Data.Root = res.Root + dp.FastRetrieval = true + dp.EpochPrice = abi.NewTokenAmount(62500000) // minimum asking price. + deal := dh.StartDeal(ctx, dp) + + err = dh.ExpectDealFailure(ctx, deal, "actor balance less than needed") + if err != nil { + t.Fatal(err) + } +} From a19dbb8c913ef99a90f7ff0a995fd049707ebe9d Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 8 Oct 2021 12:52:56 +0200 Subject: [PATCH 26/72] remove log --- itests/deals_retry_deal_no_funds_test.go | 2 +- itests/kit/deals.go | 35 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go index 3bb95d148..202d86b9f 100644 --- a/itests/deals_retry_deal_no_funds_test.go +++ b/itests/deals_retry_deal_no_funds_test.go @@ -169,7 +169,7 @@ func TestDealsRetryLackOfFunds_blockInPublishDeal(t *testing.T) { dealSealed := make(chan struct{}) go func() { - dh.WaitDealSealed(ctx, deal, false, false, nil) + dh.WaitDealSealedQuiet(ctx, deal, false, false, nil) dealSealed <- struct{}{} }() diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 1b1daa5e4..4a9af69e6 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -177,6 +177,41 @@ loop: } } +// WaitDealSealedQuiet waits until the deal is sealed, without logging anything. +func (dh *DealHarness) WaitDealSealedQuiet(ctx context.Context, deal *cid.Cid, noseal, noSealStart bool, cb func()) { +loop: + for { + di, err := dh.client.ClientGetDealInfo(ctx, *deal) + require.NoError(dh.t, err) + + switch di.State { + case storagemarket.StorageDealAwaitingPreCommit, storagemarket.StorageDealSealing: + if noseal { + return + } + if !noSealStart { + dh.StartSealingWaiting(ctx) + } + case storagemarket.StorageDealProposalRejected: + dh.t.Fatal("deal rejected") + case storagemarket.StorageDealFailing: + dh.t.Fatal("deal failed") + case storagemarket.StorageDealError: + dh.t.Fatal("deal errored", di.Message) + case storagemarket.StorageDealActive: + break loop + } + + _, err = dh.market.MarketListIncompleteDeals(ctx) + require.NoError(dh.t, err) + + time.Sleep(time.Second / 2) + if cb != nil { + cb() + } + } +} + func (dh *DealHarness) ExpectDealFailure(ctx context.Context, deal *cid.Cid, errs string) error { for { di, err := dh.client.ClientGetDealInfo(ctx, *deal) From 35291983a1ab55ef472a8b08aaf4c11bf74911f7 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 11 Oct 2021 14:06:21 +0200 Subject: [PATCH 27/72] Fix missnamed variable Signed-off-by: Jakub Sztandera --- cli/wallet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/wallet.go b/cli/wallet.go index 5f3053293..f7ad79e77 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -648,7 +648,7 @@ var walletMarketWithdraw = &cli.Command{ } fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) - if withdrawn.LessThan(amount) { + if withdrawn.LessThan(amt) { fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amt) } } From 5abba9ca9f7018f1e6e723a287b48347934dcad6 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 11 Oct 2021 14:10:06 +0200 Subject: [PATCH 28/72] gofmt Signed-off-by: Jakub Sztandera --- cmd/lotus-shed/actor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index 04c137444..822159bb4 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -152,7 +152,7 @@ var actorWithdrawCmd = &cli.Command{ } fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) - if withdrawn.LessThan(amount) { + if withdrawn.LessThan(amount) { fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amount) } } From 8957213c5647931686911f7593ef25ed5312751c Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 11 Oct 2021 15:29:59 +0200 Subject: [PATCH 29/72] feat: update to go-fil-markets v1.13.2 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0f352fd82..66eedb88e 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.11.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.2-0.20211007101645-eebce51848eb + github.com/filecoin-project/go-fil-markets v1.13.2 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index 89770ce95..b6dd30d8f 100644 --- a/go.sum +++ b/go.sum @@ -338,8 +338,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.2-0.20211007101645-eebce51848eb h1:8e9XhhvYCUS91GeP4HXj6rH2ySShLuWRDkwff1CFha0= -github.com/filecoin-project/go-fil-markets v1.13.2-0.20211007101645-eebce51848eb/go.mod h1:58OjtsWtDt3xlN1QLmgDQxtfCDtDS4RIyHepIUbqXhM= +github.com/filecoin-project/go-fil-markets v1.13.2 h1:cKSfVWWwnvG1rHZauJyyOpWxH75KazILyZ295FWmDPA= +github.com/filecoin-project/go-fil-markets v1.13.2/go.mod h1:58OjtsWtDt3xlN1QLmgDQxtfCDtDS4RIyHepIUbqXhM= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From f352c18290c6ed861a166a113b46766abb2305a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 11 Oct 2021 21:05:05 +0200 Subject: [PATCH 30/72] Don't remove sector data when moving data into a shared path --- extern/sector-storage/manager.go | 6 +- extern/sector-storage/piece_provider_test.go | 2 +- extern/sector-storage/stores/http_handler.go | 8 +- .../stores/http_handler_test.go | 14 +- extern/sector-storage/stores/index.go | 2 + extern/sector-storage/stores/interface.go | 8 +- extern/sector-storage/stores/local.go | 9 +- extern/sector-storage/stores/mocks/index.go | 58 ++--- extern/sector-storage/stores/mocks/pf.go | 97 ++++++++ extern/sector-storage/stores/mocks/store.go | 128 +++++++++++ extern/sector-storage/stores/mocks/stores.go | 212 ------------------ extern/sector-storage/stores/remote.go | 25 ++- extern/sector-storage/stores/remote_test.go | 180 ++++++++++++--- extern/sector-storage/worker_local.go | 12 +- 14 files changed, 464 insertions(+), 297 deletions(-) create mode 100644 extern/sector-storage/stores/mocks/pf.go create mode 100644 extern/sector-storage/stores/mocks/store.go delete mode 100644 extern/sector-storage/stores/mocks/stores.go diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index a8de586e1..430313730 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -588,13 +588,13 @@ func (m *Manager) Remove(ctx context.Context, sector storage.SectorRef) error { var err error - if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTSealed, true); rerr != nil { + if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTSealed, true, nil); rerr != nil { err = multierror.Append(err, xerrors.Errorf("removing sector (sealed): %w", rerr)) } - if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTCache, true); rerr != nil { + if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTCache, true, nil); rerr != nil { err = multierror.Append(err, xerrors.Errorf("removing sector (cache): %w", rerr)) } - if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTUnsealed, true); rerr != nil { + if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTUnsealed, true, nil); rerr != nil { err = multierror.Append(err, xerrors.Errorf("removing sector (unsealed): %w", rerr)) } diff --git a/extern/sector-storage/piece_provider_test.go b/extern/sector-storage/piece_provider_test.go index d6fa14574..eb3ffa7c3 100644 --- a/extern/sector-storage/piece_provider_test.go +++ b/extern/sector-storage/piece_provider_test.go @@ -298,7 +298,7 @@ func (p *pieceProviderTestHarness) addRemoteWorker(t *testing.T, tasks []sealtas func (p *pieceProviderTestHarness) removeAllUnsealedSectorFiles(t *testing.T) { for i := range p.localStores { ls := p.localStores[i] - require.NoError(t, ls.Remove(p.ctx, p.sector.ID, storiface.FTUnsealed, false)) + require.NoError(t, ls.Remove(p.ctx, p.sector.ID, storiface.FTUnsealed, false, nil)) } } diff --git a/extern/sector-storage/stores/http_handler.go b/extern/sector-storage/stores/http_handler.go index 5b8477fc8..845bfdd7b 100644 --- a/extern/sector-storage/stores/http_handler.go +++ b/extern/sector-storage/stores/http_handler.go @@ -21,9 +21,9 @@ import ( var log = logging.Logger("stores") -var _ partialFileHandler = &DefaultPartialFileHandler{} +var _ PartialFileHandler = &DefaultPartialFileHandler{} -// DefaultPartialFileHandler is the default implementation of the partialFileHandler interface. +// DefaultPartialFileHandler is the default implementation of the PartialFileHandler interface. // This is probably the only implementation we'll ever use because the purpose of the // interface to is to mock out partial file related functionality during testing. type DefaultPartialFileHandler struct{} @@ -46,7 +46,7 @@ func (d *DefaultPartialFileHandler) Close(pf *partialfile.PartialFile) error { type FetchHandler struct { Local Store - PfHandler partialFileHandler + PfHandler PartialFileHandler } func (handler *FetchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // /remote/ @@ -179,7 +179,7 @@ func (handler *FetchHandler) remoteDeleteSector(w http.ResponseWriter, r *http.R return } - if err := handler.Local.Remove(r.Context(), id, ft, false); err != nil { + if err := handler.Local.Remove(r.Context(), id, ft, false, []ID{ID(r.FormValue("keep"))}); err != nil { log.Errorf("%+v", err) w.WriteHeader(500) return diff --git a/extern/sector-storage/stores/http_handler_test.go b/extern/sector-storage/stores/http_handler_test.go index 1258d8530..673aba55d 100644 --- a/extern/sector-storage/stores/http_handler_test.go +++ b/extern/sector-storage/stores/http_handler_test.go @@ -63,7 +63,7 @@ func TestRemoteGetAllocated(t *testing.T) { tcs := map[string]struct { piFnc func(pi *pieceInfo) storeFnc func(s *mocks.MockStore) - pfFunc func(s *mocks.MockpartialFileHandler) + pfFunc func(s *mocks.MockPartialFileHandler) // expectation expectedStatusCode int @@ -129,7 +129,7 @@ func TestRemoteGetAllocated(t *testing.T) { storiface.SectorPaths{}, nil).Times(1) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { pf.EXPECT().OpenPartialFile(abi.PaddedPieceSize(sectorSize), pfPath).Return(&partialfile.PartialFile{}, xerrors.New("some error")).Times(1) }, @@ -146,7 +146,7 @@ func TestRemoteGetAllocated(t *testing.T) { storiface.SectorPaths{}, nil).Times(1) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { pf.EXPECT().OpenPartialFile(abi.PaddedPieceSize(sectorSize), pfPath).Return(emptyPartialFile, nil).Times(1) @@ -165,7 +165,7 @@ func TestRemoteGetAllocated(t *testing.T) { storiface.SectorPaths{}, nil).Times(1) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { pf.EXPECT().OpenPartialFile(abi.PaddedPieceSize(sectorSize), pfPath).Return(emptyPartialFile, nil).Times(1) @@ -184,7 +184,7 @@ func TestRemoteGetAllocated(t *testing.T) { storiface.SectorPaths{}, nil).Times(1) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { pf.EXPECT().OpenPartialFile(abi.PaddedPieceSize(sectorSize), pfPath).Return(emptyPartialFile, nil).Times(1) @@ -203,7 +203,7 @@ func TestRemoteGetAllocated(t *testing.T) { defer mockCtrl.Finish() lstore := mocks.NewMockStore(mockCtrl) - pfhandler := mocks.NewMockpartialFileHandler(mockCtrl) + pfhandler := mocks.NewMockPartialFileHandler(mockCtrl) handler := &stores.FetchHandler{ lstore, @@ -371,7 +371,7 @@ func TestRemoteGetSector(t *testing.T) { // when test is done, assert expectations on all mock objects. defer mockCtrl.Finish() lstore := mocks.NewMockStore(mockCtrl) - pfhandler := mocks.NewMockpartialFileHandler(mockCtrl) + pfhandler := mocks.NewMockPartialFileHandler(mockCtrl) var path string diff --git a/extern/sector-storage/stores/index.go b/extern/sector-storage/stores/index.go index 1d3d972e0..2a37e653a 100644 --- a/extern/sector-storage/stores/index.go +++ b/extern/sector-storage/stores/index.go @@ -55,6 +55,8 @@ type SectorStorageInfo struct { Primary bool } +//go:generate go run github.com/golang/mock/mockgen -destination=mocks/index.go -package=mocks . SectorIndex + type SectorIndex interface { // part of storage-miner api StorageAttach(context.Context, StorageInfo, fsutil.FsStat) error StorageInfo(context.Context, ID) (StorageInfo, error) diff --git a/extern/sector-storage/stores/interface.go b/extern/sector-storage/stores/interface.go index 4986e6c80..32157366c 100644 --- a/extern/sector-storage/stores/interface.go +++ b/extern/sector-storage/stores/interface.go @@ -13,8 +13,10 @@ import ( "github.com/filecoin-project/lotus/extern/sector-storage/storiface" ) +//go:generate go run github.com/golang/mock/mockgen -destination=mocks/pf.go -package=mocks . PartialFileHandler + // PartialFileHandler helps mock out the partial file functionality during testing. -type partialFileHandler interface { +type PartialFileHandler interface { // OpenPartialFile opens and returns a partial file at the given path and also verifies it has the given // size OpenPartialFile(maxPieceSize abi.PaddedPieceSize, path string) (*partialfile.PartialFile, error) @@ -30,9 +32,11 @@ type partialFileHandler interface { Close(pf *partialfile.PartialFile) error } +//go:generate go run github.com/golang/mock/mockgen -destination=mocks/store.go -package=mocks . Store + type Store interface { AcquireSector(ctx context.Context, s storage.SectorRef, existing storiface.SectorFileType, allocate storiface.SectorFileType, sealing storiface.PathType, op storiface.AcquireMode) (paths storiface.SectorPaths, stores storiface.SectorPaths, err error) - Remove(ctx context.Context, s abi.SectorID, types storiface.SectorFileType, force bool) error + Remove(ctx context.Context, s abi.SectorID, types storiface.SectorFileType, force bool, keepIn []ID) error // like remove, but doesn't remove the primary sector copy, nor the last // non-primary copy if there no primary copies diff --git a/extern/sector-storage/stores/local.go b/extern/sector-storage/stores/local.go index 6f37f4f7a..c2e8e3df6 100644 --- a/extern/sector-storage/stores/local.go +++ b/extern/sector-storage/stores/local.go @@ -544,7 +544,7 @@ func (st *Local) Local(ctx context.Context) ([]StoragePath, error) { return out, nil } -func (st *Local) Remove(ctx context.Context, sid abi.SectorID, typ storiface.SectorFileType, force bool) error { +func (st *Local) Remove(ctx context.Context, sid abi.SectorID, typ storiface.SectorFileType, force bool, keepIn []ID) error { if bits.OnesCount(uint(typ)) != 1 { return xerrors.New("delete expects one file type") } @@ -558,7 +558,14 @@ func (st *Local) Remove(ctx context.Context, sid abi.SectorID, typ storiface.Sec return xerrors.Errorf("can't delete sector %v(%d), not found", sid, typ) } +storeLoop: for _, info := range si { + for _, id := range keepIn { + if id == info.ID { + continue storeLoop + } + } + if err := st.removeSector(ctx, sid, typ, info.ID); err != nil { return err } diff --git a/extern/sector-storage/stores/mocks/index.go b/extern/sector-storage/stores/mocks/index.go index 59a6017b5..be0eaf967 100644 --- a/extern/sector-storage/stores/mocks/index.go +++ b/extern/sector-storage/stores/mocks/index.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: index.go +// Source: github.com/filecoin-project/lotus/extern/sector-storage/stores (interfaces: SectorIndex) // Package mocks is a generated GoMock package. package mocks @@ -53,61 +53,61 @@ func (mr *MockSectorIndexMockRecorder) StorageAttach(arg0, arg1, arg2 interface{ } // StorageBestAlloc mocks base method. -func (m *MockSectorIndex) StorageBestAlloc(ctx context.Context, allocate storiface.SectorFileType, ssize abi.SectorSize, pathType storiface.PathType) ([]stores.StorageInfo, error) { +func (m *MockSectorIndex) StorageBestAlloc(arg0 context.Context, arg1 storiface.SectorFileType, arg2 abi.SectorSize, arg3 storiface.PathType) ([]stores.StorageInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorageBestAlloc", ctx, allocate, ssize, pathType) + ret := m.ctrl.Call(m, "StorageBestAlloc", arg0, arg1, arg2, arg3) ret0, _ := ret[0].([]stores.StorageInfo) ret1, _ := ret[1].(error) return ret0, ret1 } // StorageBestAlloc indicates an expected call of StorageBestAlloc. -func (mr *MockSectorIndexMockRecorder) StorageBestAlloc(ctx, allocate, ssize, pathType interface{}) *gomock.Call { +func (mr *MockSectorIndexMockRecorder) StorageBestAlloc(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageBestAlloc", reflect.TypeOf((*MockSectorIndex)(nil).StorageBestAlloc), ctx, allocate, ssize, pathType) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageBestAlloc", reflect.TypeOf((*MockSectorIndex)(nil).StorageBestAlloc), arg0, arg1, arg2, arg3) } // StorageDeclareSector mocks base method. -func (m *MockSectorIndex) StorageDeclareSector(ctx context.Context, storageID stores.ID, s abi.SectorID, ft storiface.SectorFileType, primary bool) error { +func (m *MockSectorIndex) StorageDeclareSector(arg0 context.Context, arg1 stores.ID, arg2 abi.SectorID, arg3 storiface.SectorFileType, arg4 bool) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorageDeclareSector", ctx, storageID, s, ft, primary) + ret := m.ctrl.Call(m, "StorageDeclareSector", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(error) return ret0 } // StorageDeclareSector indicates an expected call of StorageDeclareSector. -func (mr *MockSectorIndexMockRecorder) StorageDeclareSector(ctx, storageID, s, ft, primary interface{}) *gomock.Call { +func (mr *MockSectorIndexMockRecorder) StorageDeclareSector(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageDeclareSector", reflect.TypeOf((*MockSectorIndex)(nil).StorageDeclareSector), ctx, storageID, s, ft, primary) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageDeclareSector", reflect.TypeOf((*MockSectorIndex)(nil).StorageDeclareSector), arg0, arg1, arg2, arg3, arg4) } // StorageDropSector mocks base method. -func (m *MockSectorIndex) StorageDropSector(ctx context.Context, storageID stores.ID, s abi.SectorID, ft storiface.SectorFileType) error { +func (m *MockSectorIndex) StorageDropSector(arg0 context.Context, arg1 stores.ID, arg2 abi.SectorID, arg3 storiface.SectorFileType) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorageDropSector", ctx, storageID, s, ft) + ret := m.ctrl.Call(m, "StorageDropSector", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(error) return ret0 } // StorageDropSector indicates an expected call of StorageDropSector. -func (mr *MockSectorIndexMockRecorder) StorageDropSector(ctx, storageID, s, ft interface{}) *gomock.Call { +func (mr *MockSectorIndexMockRecorder) StorageDropSector(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageDropSector", reflect.TypeOf((*MockSectorIndex)(nil).StorageDropSector), ctx, storageID, s, ft) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageDropSector", reflect.TypeOf((*MockSectorIndex)(nil).StorageDropSector), arg0, arg1, arg2, arg3) } // StorageFindSector mocks base method. -func (m *MockSectorIndex) StorageFindSector(ctx context.Context, sector abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]stores.SectorStorageInfo, error) { +func (m *MockSectorIndex) StorageFindSector(arg0 context.Context, arg1 abi.SectorID, arg2 storiface.SectorFileType, arg3 abi.SectorSize, arg4 bool) ([]stores.SectorStorageInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorageFindSector", ctx, sector, ft, ssize, allowFetch) + ret := m.ctrl.Call(m, "StorageFindSector", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].([]stores.SectorStorageInfo) ret1, _ := ret[1].(error) return ret0, ret1 } // StorageFindSector indicates an expected call of StorageFindSector. -func (mr *MockSectorIndexMockRecorder) StorageFindSector(ctx, sector, ft, ssize, allowFetch interface{}) *gomock.Call { +func (mr *MockSectorIndexMockRecorder) StorageFindSector(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageFindSector", reflect.TypeOf((*MockSectorIndex)(nil).StorageFindSector), ctx, sector, ft, ssize, allowFetch) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageFindSector", reflect.TypeOf((*MockSectorIndex)(nil).StorageFindSector), arg0, arg1, arg2, arg3, arg4) } // StorageInfo mocks base method. @@ -126,32 +126,32 @@ func (mr *MockSectorIndexMockRecorder) StorageInfo(arg0, arg1 interface{}) *gomo } // StorageList mocks base method. -func (m *MockSectorIndex) StorageList(ctx context.Context) (map[stores.ID][]stores.Decl, error) { +func (m *MockSectorIndex) StorageList(arg0 context.Context) (map[stores.ID][]stores.Decl, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorageList", ctx) + ret := m.ctrl.Call(m, "StorageList", arg0) ret0, _ := ret[0].(map[stores.ID][]stores.Decl) ret1, _ := ret[1].(error) return ret0, ret1 } // StorageList indicates an expected call of StorageList. -func (mr *MockSectorIndexMockRecorder) StorageList(ctx interface{}) *gomock.Call { +func (mr *MockSectorIndexMockRecorder) StorageList(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageList", reflect.TypeOf((*MockSectorIndex)(nil).StorageList), ctx) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageList", reflect.TypeOf((*MockSectorIndex)(nil).StorageList), arg0) } // StorageLock mocks base method. -func (m *MockSectorIndex) StorageLock(ctx context.Context, sector abi.SectorID, read, write storiface.SectorFileType) error { +func (m *MockSectorIndex) StorageLock(arg0 context.Context, arg1 abi.SectorID, arg2, arg3 storiface.SectorFileType) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorageLock", ctx, sector, read, write) + ret := m.ctrl.Call(m, "StorageLock", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(error) return ret0 } // StorageLock indicates an expected call of StorageLock. -func (mr *MockSectorIndexMockRecorder) StorageLock(ctx, sector, read, write interface{}) *gomock.Call { +func (mr *MockSectorIndexMockRecorder) StorageLock(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageLock", reflect.TypeOf((*MockSectorIndex)(nil).StorageLock), ctx, sector, read, write) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageLock", reflect.TypeOf((*MockSectorIndex)(nil).StorageLock), arg0, arg1, arg2, arg3) } // StorageReportHealth mocks base method. @@ -169,16 +169,16 @@ func (mr *MockSectorIndexMockRecorder) StorageReportHealth(arg0, arg1, arg2 inte } // StorageTryLock mocks base method. -func (m *MockSectorIndex) StorageTryLock(ctx context.Context, sector abi.SectorID, read, write storiface.SectorFileType) (bool, error) { +func (m *MockSectorIndex) StorageTryLock(arg0 context.Context, arg1 abi.SectorID, arg2, arg3 storiface.SectorFileType) (bool, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorageTryLock", ctx, sector, read, write) + ret := m.ctrl.Call(m, "StorageTryLock", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(bool) ret1, _ := ret[1].(error) return ret0, ret1 } // StorageTryLock indicates an expected call of StorageTryLock. -func (mr *MockSectorIndexMockRecorder) StorageTryLock(ctx, sector, read, write interface{}) *gomock.Call { +func (mr *MockSectorIndexMockRecorder) StorageTryLock(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageTryLock", reflect.TypeOf((*MockSectorIndex)(nil).StorageTryLock), ctx, sector, read, write) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageTryLock", reflect.TypeOf((*MockSectorIndex)(nil).StorageTryLock), arg0, arg1, arg2, arg3) } diff --git a/extern/sector-storage/stores/mocks/pf.go b/extern/sector-storage/stores/mocks/pf.go new file mode 100644 index 000000000..175e3c119 --- /dev/null +++ b/extern/sector-storage/stores/mocks/pf.go @@ -0,0 +1,97 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/filecoin-project/lotus/extern/sector-storage/stores (interfaces: PartialFileHandler) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + os "os" + reflect "reflect" + + abi "github.com/filecoin-project/go-state-types/abi" + partialfile "github.com/filecoin-project/lotus/extern/sector-storage/partialfile" + storiface "github.com/filecoin-project/lotus/extern/sector-storage/storiface" + gomock "github.com/golang/mock/gomock" +) + +// MockPartialFileHandler is a mock of PartialFileHandler interface. +type MockPartialFileHandler struct { + ctrl *gomock.Controller + recorder *MockPartialFileHandlerMockRecorder +} + +// MockPartialFileHandlerMockRecorder is the mock recorder for MockPartialFileHandler. +type MockPartialFileHandlerMockRecorder struct { + mock *MockPartialFileHandler +} + +// NewMockPartialFileHandler creates a new mock instance. +func NewMockPartialFileHandler(ctrl *gomock.Controller) *MockPartialFileHandler { + mock := &MockPartialFileHandler{ctrl: ctrl} + mock.recorder = &MockPartialFileHandlerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockPartialFileHandler) EXPECT() *MockPartialFileHandlerMockRecorder { + return m.recorder +} + +// Close mocks base method. +func (m *MockPartialFileHandler) Close(arg0 *partialfile.PartialFile) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close. +func (mr *MockPartialFileHandlerMockRecorder) Close(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockPartialFileHandler)(nil).Close), arg0) +} + +// HasAllocated mocks base method. +func (m *MockPartialFileHandler) HasAllocated(arg0 *partialfile.PartialFile, arg1 storiface.UnpaddedByteIndex, arg2 abi.UnpaddedPieceSize) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HasAllocated", arg0, arg1, arg2) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HasAllocated indicates an expected call of HasAllocated. +func (mr *MockPartialFileHandlerMockRecorder) HasAllocated(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasAllocated", reflect.TypeOf((*MockPartialFileHandler)(nil).HasAllocated), arg0, arg1, arg2) +} + +// OpenPartialFile mocks base method. +func (m *MockPartialFileHandler) OpenPartialFile(arg0 abi.PaddedPieceSize, arg1 string) (*partialfile.PartialFile, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OpenPartialFile", arg0, arg1) + ret0, _ := ret[0].(*partialfile.PartialFile) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// OpenPartialFile indicates an expected call of OpenPartialFile. +func (mr *MockPartialFileHandlerMockRecorder) OpenPartialFile(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenPartialFile", reflect.TypeOf((*MockPartialFileHandler)(nil).OpenPartialFile), arg0, arg1) +} + +// Reader mocks base method. +func (m *MockPartialFileHandler) Reader(arg0 *partialfile.PartialFile, arg1 storiface.PaddedByteIndex, arg2 abi.PaddedPieceSize) (*os.File, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reader", arg0, arg1, arg2) + ret0, _ := ret[0].(*os.File) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Reader indicates an expected call of Reader. +func (mr *MockPartialFileHandlerMockRecorder) Reader(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reader", reflect.TypeOf((*MockPartialFileHandler)(nil).Reader), arg0, arg1, arg2) +} diff --git a/extern/sector-storage/stores/mocks/store.go b/extern/sector-storage/stores/mocks/store.go new file mode 100644 index 000000000..15ca9aae5 --- /dev/null +++ b/extern/sector-storage/stores/mocks/store.go @@ -0,0 +1,128 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/filecoin-project/lotus/extern/sector-storage/stores (interfaces: Store) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + abi "github.com/filecoin-project/go-state-types/abi" + fsutil "github.com/filecoin-project/lotus/extern/sector-storage/fsutil" + stores "github.com/filecoin-project/lotus/extern/sector-storage/stores" + storiface "github.com/filecoin-project/lotus/extern/sector-storage/storiface" + storage "github.com/filecoin-project/specs-storage/storage" + gomock "github.com/golang/mock/gomock" +) + +// MockStore is a mock of Store interface. +type MockStore struct { + ctrl *gomock.Controller + recorder *MockStoreMockRecorder +} + +// MockStoreMockRecorder is the mock recorder for MockStore. +type MockStoreMockRecorder struct { + mock *MockStore +} + +// NewMockStore creates a new mock instance. +func NewMockStore(ctrl *gomock.Controller) *MockStore { + mock := &MockStore{ctrl: ctrl} + mock.recorder = &MockStoreMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockStore) EXPECT() *MockStoreMockRecorder { + return m.recorder +} + +// AcquireSector mocks base method. +func (m *MockStore) AcquireSector(arg0 context.Context, arg1 storage.SectorRef, arg2, arg3 storiface.SectorFileType, arg4 storiface.PathType, arg5 storiface.AcquireMode) (storiface.SectorPaths, storiface.SectorPaths, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AcquireSector", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(storiface.SectorPaths) + ret1, _ := ret[1].(storiface.SectorPaths) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// AcquireSector indicates an expected call of AcquireSector. +func (mr *MockStoreMockRecorder) AcquireSector(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AcquireSector", reflect.TypeOf((*MockStore)(nil).AcquireSector), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// FsStat mocks base method. +func (m *MockStore) FsStat(arg0 context.Context, arg1 stores.ID) (fsutil.FsStat, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FsStat", arg0, arg1) + ret0, _ := ret[0].(fsutil.FsStat) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FsStat indicates an expected call of FsStat. +func (mr *MockStoreMockRecorder) FsStat(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FsStat", reflect.TypeOf((*MockStore)(nil).FsStat), arg0, arg1) +} + +// MoveStorage mocks base method. +func (m *MockStore) MoveStorage(arg0 context.Context, arg1 storage.SectorRef, arg2 storiface.SectorFileType) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MoveStorage", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// MoveStorage indicates an expected call of MoveStorage. +func (mr *MockStoreMockRecorder) MoveStorage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MoveStorage", reflect.TypeOf((*MockStore)(nil).MoveStorage), arg0, arg1, arg2) +} + +// Remove mocks base method. +func (m *MockStore) Remove(arg0 context.Context, arg1 abi.SectorID, arg2 storiface.SectorFileType, arg3 bool, arg4 []stores.ID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Remove", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(error) + return ret0 +} + +// Remove indicates an expected call of Remove. +func (mr *MockStoreMockRecorder) Remove(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remove", reflect.TypeOf((*MockStore)(nil).Remove), arg0, arg1, arg2, arg3, arg4) +} + +// RemoveCopies mocks base method. +func (m *MockStore) RemoveCopies(arg0 context.Context, arg1 abi.SectorID, arg2 storiface.SectorFileType) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveCopies", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// RemoveCopies indicates an expected call of RemoveCopies. +func (mr *MockStoreMockRecorder) RemoveCopies(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveCopies", reflect.TypeOf((*MockStore)(nil).RemoveCopies), arg0, arg1, arg2) +} + +// Reserve mocks base method. +func (m *MockStore) Reserve(arg0 context.Context, arg1 storage.SectorRef, arg2 storiface.SectorFileType, arg3 storiface.SectorPaths, arg4 map[storiface.SectorFileType]int) (func(), error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reserve", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(func()) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Reserve indicates an expected call of Reserve. +func (mr *MockStoreMockRecorder) Reserve(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reserve", reflect.TypeOf((*MockStore)(nil).Reserve), arg0, arg1, arg2, arg3, arg4) +} diff --git a/extern/sector-storage/stores/mocks/stores.go b/extern/sector-storage/stores/mocks/stores.go deleted file mode 100644 index fdfd73a07..000000000 --- a/extern/sector-storage/stores/mocks/stores.go +++ /dev/null @@ -1,212 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: interface.go - -// Package mocks is a generated GoMock package. -package mocks - -import ( - context "context" - os "os" - reflect "reflect" - - abi "github.com/filecoin-project/go-state-types/abi" - fsutil "github.com/filecoin-project/lotus/extern/sector-storage/fsutil" - partialfile "github.com/filecoin-project/lotus/extern/sector-storage/partialfile" - stores "github.com/filecoin-project/lotus/extern/sector-storage/stores" - storiface "github.com/filecoin-project/lotus/extern/sector-storage/storiface" - storage "github.com/filecoin-project/specs-storage/storage" - gomock "github.com/golang/mock/gomock" -) - -// MockpartialFileHandler is a mock of partialFileHandler interface. -type MockpartialFileHandler struct { - ctrl *gomock.Controller - recorder *MockpartialFileHandlerMockRecorder -} - -// MockpartialFileHandlerMockRecorder is the mock recorder for MockpartialFileHandler. -type MockpartialFileHandlerMockRecorder struct { - mock *MockpartialFileHandler -} - -// NewMockpartialFileHandler creates a new mock instance. -func NewMockpartialFileHandler(ctrl *gomock.Controller) *MockpartialFileHandler { - mock := &MockpartialFileHandler{ctrl: ctrl} - mock.recorder = &MockpartialFileHandlerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockpartialFileHandler) EXPECT() *MockpartialFileHandlerMockRecorder { - return m.recorder -} - -// Close mocks base method. -func (m *MockpartialFileHandler) Close(pf *partialfile.PartialFile) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Close", pf) - ret0, _ := ret[0].(error) - return ret0 -} - -// Close indicates an expected call of Close. -func (mr *MockpartialFileHandlerMockRecorder) Close(pf interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockpartialFileHandler)(nil).Close), pf) -} - -// HasAllocated mocks base method. -func (m *MockpartialFileHandler) HasAllocated(pf *partialfile.PartialFile, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (bool, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HasAllocated", pf, offset, size) - ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// HasAllocated indicates an expected call of HasAllocated. -func (mr *MockpartialFileHandlerMockRecorder) HasAllocated(pf, offset, size interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasAllocated", reflect.TypeOf((*MockpartialFileHandler)(nil).HasAllocated), pf, offset, size) -} - -// OpenPartialFile mocks base method. -func (m *MockpartialFileHandler) OpenPartialFile(maxPieceSize abi.PaddedPieceSize, path string) (*partialfile.PartialFile, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "OpenPartialFile", maxPieceSize, path) - ret0, _ := ret[0].(*partialfile.PartialFile) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// OpenPartialFile indicates an expected call of OpenPartialFile. -func (mr *MockpartialFileHandlerMockRecorder) OpenPartialFile(maxPieceSize, path interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenPartialFile", reflect.TypeOf((*MockpartialFileHandler)(nil).OpenPartialFile), maxPieceSize, path) -} - -// Reader mocks base method. -func (m *MockpartialFileHandler) Reader(pf *partialfile.PartialFile, offset storiface.PaddedByteIndex, size abi.PaddedPieceSize) (*os.File, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Reader", pf, offset, size) - ret0, _ := ret[0].(*os.File) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Reader indicates an expected call of Reader. -func (mr *MockpartialFileHandlerMockRecorder) Reader(pf, offset, size interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reader", reflect.TypeOf((*MockpartialFileHandler)(nil).Reader), pf, offset, size) -} - -// MockStore is a mock of Store interface. -type MockStore struct { - ctrl *gomock.Controller - recorder *MockStoreMockRecorder -} - -// MockStoreMockRecorder is the mock recorder for MockStore. -type MockStoreMockRecorder struct { - mock *MockStore -} - -// NewMockStore creates a new mock instance. -func NewMockStore(ctrl *gomock.Controller) *MockStore { - mock := &MockStore{ctrl: ctrl} - mock.recorder = &MockStoreMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockStore) EXPECT() *MockStoreMockRecorder { - return m.recorder -} - -// AcquireSector mocks base method. -func (m *MockStore) AcquireSector(ctx context.Context, s storage.SectorRef, existing, allocate storiface.SectorFileType, sealing storiface.PathType, op storiface.AcquireMode) (storiface.SectorPaths, storiface.SectorPaths, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AcquireSector", ctx, s, existing, allocate, sealing, op) - ret0, _ := ret[0].(storiface.SectorPaths) - ret1, _ := ret[1].(storiface.SectorPaths) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// AcquireSector indicates an expected call of AcquireSector. -func (mr *MockStoreMockRecorder) AcquireSector(ctx, s, existing, allocate, sealing, op interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AcquireSector", reflect.TypeOf((*MockStore)(nil).AcquireSector), ctx, s, existing, allocate, sealing, op) -} - -// FsStat mocks base method. -func (m *MockStore) FsStat(ctx context.Context, id stores.ID) (fsutil.FsStat, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FsStat", ctx, id) - ret0, _ := ret[0].(fsutil.FsStat) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FsStat indicates an expected call of FsStat. -func (mr *MockStoreMockRecorder) FsStat(ctx, id interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FsStat", reflect.TypeOf((*MockStore)(nil).FsStat), ctx, id) -} - -// MoveStorage mocks base method. -func (m *MockStore) MoveStorage(ctx context.Context, s storage.SectorRef, types storiface.SectorFileType) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "MoveStorage", ctx, s, types) - ret0, _ := ret[0].(error) - return ret0 -} - -// MoveStorage indicates an expected call of MoveStorage. -func (mr *MockStoreMockRecorder) MoveStorage(ctx, s, types interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MoveStorage", reflect.TypeOf((*MockStore)(nil).MoveStorage), ctx, s, types) -} - -// Remove mocks base method. -func (m *MockStore) Remove(ctx context.Context, s abi.SectorID, types storiface.SectorFileType, force bool) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Remove", ctx, s, types, force) - ret0, _ := ret[0].(error) - return ret0 -} - -// Remove indicates an expected call of Remove. -func (mr *MockStoreMockRecorder) Remove(ctx, s, types, force interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remove", reflect.TypeOf((*MockStore)(nil).Remove), ctx, s, types, force) -} - -// RemoveCopies mocks base method. -func (m *MockStore) RemoveCopies(ctx context.Context, s abi.SectorID, types storiface.SectorFileType) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RemoveCopies", ctx, s, types) - ret0, _ := ret[0].(error) - return ret0 -} - -// RemoveCopies indicates an expected call of RemoveCopies. -func (mr *MockStoreMockRecorder) RemoveCopies(ctx, s, types interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveCopies", reflect.TypeOf((*MockStore)(nil).RemoveCopies), ctx, s, types) -} - -// Reserve mocks base method. -func (m *MockStore) Reserve(ctx context.Context, sid storage.SectorRef, ft storiface.SectorFileType, storageIDs storiface.SectorPaths, overheadTab map[storiface.SectorFileType]int) (func(), error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Reserve", ctx, sid, ft, storageIDs, overheadTab) - ret0, _ := ret[0].(func()) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Reserve indicates an expected call of Reserve. -func (mr *MockStoreMockRecorder) Reserve(ctx, sid, ft, storageIDs, overheadTab interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reserve", reflect.TypeOf((*MockStore)(nil).Reserve), ctx, sid, ft, storageIDs, overheadTab) -} diff --git a/extern/sector-storage/stores/remote.go b/extern/sector-storage/stores/remote.go index 6f8efc03e..aa6075e62 100644 --- a/extern/sector-storage/stores/remote.go +++ b/extern/sector-storage/stores/remote.go @@ -41,7 +41,7 @@ type Remote struct { fetchLk sync.Mutex fetching map[abi.SectorID]chan struct{} - pfHandler partialFileHandler + pfHandler PartialFileHandler } func (r *Remote) RemoveCopies(ctx context.Context, s abi.SectorID, types storiface.SectorFileType) error { @@ -52,7 +52,7 @@ func (r *Remote) RemoveCopies(ctx context.Context, s abi.SectorID, types storifa return r.local.RemoveCopies(ctx, s, types) } -func NewRemote(local Store, index SectorIndex, auth http.Header, fetchLimit int, pfHandler partialFileHandler) *Remote { +func NewRemote(local Store, index SectorIndex, auth http.Header, fetchLimit int, pfHandler PartialFileHandler) *Remote { return &Remote{ local: local, index: index, @@ -155,7 +155,8 @@ func (r *Remote) AcquireSector(ctx context.Context, s storage.SectorRef, existin } if op == storiface.AcquireMove { - if err := r.deleteFromRemote(ctx, url); err != nil { + id := ID(storageID) + if err := r.deleteFromRemote(ctx, url, &id); err != nil { log.Warnf("deleting sector %v from %s (delete %s): %+v", s, storageID, url, err) } } @@ -333,12 +334,12 @@ func (r *Remote) MoveStorage(ctx context.Context, s storage.SectorRef, types sto return r.local.MoveStorage(ctx, s, types) } -func (r *Remote) Remove(ctx context.Context, sid abi.SectorID, typ storiface.SectorFileType, force bool) error { +func (r *Remote) Remove(ctx context.Context, sid abi.SectorID, typ storiface.SectorFileType, force bool, keepIn []ID) error { if bits.OnesCount(uint(typ)) != 1 { return xerrors.New("delete expects one file type") } - if err := r.local.Remove(ctx, sid, typ, force); err != nil { + if err := r.local.Remove(ctx, sid, typ, force, keepIn); err != nil { return xerrors.Errorf("remove from local: %w", err) } @@ -347,9 +348,15 @@ func (r *Remote) Remove(ctx context.Context, sid abi.SectorID, typ storiface.Sec return xerrors.Errorf("finding existing sector %d(t:%d) failed: %w", sid, typ, err) } +storeLoop: for _, info := range si { + for _, id := range keepIn { + if id == info.ID { + continue storeLoop + } + } for _, url := range info.URLs { - if err := r.deleteFromRemote(ctx, url); err != nil { + if err := r.deleteFromRemote(ctx, url, nil); err != nil { log.Warnf("remove %s: %+v", url, err) continue } @@ -360,7 +367,11 @@ func (r *Remote) Remove(ctx context.Context, sid abi.SectorID, typ storiface.Sec return nil } -func (r *Remote) deleteFromRemote(ctx context.Context, url string) error { +func (r *Remote) deleteFromRemote(ctx context.Context, url string, keepIn *ID) error { + if keepIn != nil { + url = url + "?keep=" + string(*keepIn) + } + log.Infof("Delete %s", url) req, err := http.NewRequest("DELETE", url, nil) diff --git a/extern/sector-storage/stores/remote_test.go b/extern/sector-storage/stores/remote_test.go index b708bb68f..ea9179655 100644 --- a/extern/sector-storage/stores/remote_test.go +++ b/extern/sector-storage/stores/remote_test.go @@ -2,26 +2,156 @@ package stores_test import ( "context" + "encoding/json" "fmt" "io/ioutil" "net/http" "net/http/httptest" "os" + "path/filepath" "testing" + "github.com/golang/mock/gomock" + "github.com/google/uuid" + "github.com/gorilla/mux" + logging "github.com/ipfs/go-log/v2" + "github.com/stretchr/testify/require" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/extern/sector-storage/partialfile" "github.com/filecoin-project/lotus/extern/sector-storage/stores" "github.com/filecoin-project/lotus/extern/sector-storage/stores/mocks" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" + "github.com/filecoin-project/lotus/node/repo" "github.com/filecoin-project/specs-storage/storage" - "github.com/golang/mock/gomock" - "github.com/gorilla/mux" - logging "github.com/ipfs/go-log/v2" - "github.com/stretchr/testify/require" - "golang.org/x/xerrors" ) +const metaFile = "sectorstore.json" + +func createTestStorage(t *testing.T, p string, seal bool, att ...*stores.Local) stores.ID { + if err := os.MkdirAll(p, 0755); err != nil { + if !os.IsExist(err) { + require.NoError(t, err) + } + } + + cfg := &stores.LocalStorageMeta{ + ID: stores.ID(uuid.New().String()), + Weight: 10, + CanSeal: seal, + CanStore: !seal, + } + + b, err := json.MarshalIndent(cfg, "", " ") + require.NoError(t, err) + + require.NoError(t, ioutil.WriteFile(filepath.Join(p, metaFile), b, 0644)) + + for _, s := range att { + require.NoError(t, s.OpenPath(context.Background(), p)) + } + + return cfg.ID +} + +func TestMoveShared(t *testing.T) { + logging.SetAllLoggers(logging.LevelDebug) + + index := stores.NewIndex() + + ctx := context.Background() + + dir, err := ioutil.TempDir("", "stores-remote-test-") + require.NoError(t, err) + t.Cleanup(func() { + _ = os.RemoveAll(dir) + }) + + openRepo := func(dir string) repo.LockedRepo { + r, err := repo.NewFS(dir) + require.NoError(t, err) + require.NoError(t, r.Init(repo.Worker)) + lr, err := r.Lock(repo.Worker) + require.NoError(t, err) + + t.Cleanup(func() { + _ = lr.Close() + }) + + err = lr.SetStorage(func(config *stores.StorageConfig) { + *config = stores.StorageConfig{} + }) + require.NoError(t, err) + + return lr + } + + // setup two repos with two storage paths: + // repo 1 with both paths + // repo 2 with one path (shared) + + lr1 := openRepo(filepath.Join(dir, "l1")) + lr2 := openRepo(filepath.Join(dir, "l2")) + + mux1 := mux.NewRouter() + mux2 := mux.NewRouter() + hs1 := httptest.NewServer(mux1) + hs2 := httptest.NewServer(mux2) + + ls1, err := stores.NewLocal(ctx, lr1, index, []string{hs1.URL + "/remote"}) + require.NoError(t, err) + ls2, err := stores.NewLocal(ctx, lr2, index, []string{hs2.URL + "/remote"}) + require.NoError(t, err) + + dirStor := filepath.Join(dir, "stor") + dirSeal := filepath.Join(dir, "seal") + + id1 := createTestStorage(t, dirStor, false, ls1, ls2) + id2 := createTestStorage(t, dirSeal, true, ls1) + + rs1 := stores.NewRemote(ls1, index, nil, 20, &stores.DefaultPartialFileHandler{}) + rs2 := stores.NewRemote(ls2, index, nil, 20, &stores.DefaultPartialFileHandler{}) + _ = rs2 + mux1.PathPrefix("/").Handler(&stores.FetchHandler{Local: ls1, PfHandler: &stores.DefaultPartialFileHandler{}}) + mux2.PathPrefix("/").Handler(&stores.FetchHandler{Local: ls2, PfHandler: &stores.DefaultPartialFileHandler{}}) + + // add a sealed replica file to the sealing (non-shared) path + + s1ref := storage.SectorRef{ + ID: abi.SectorID{ + Miner: 12, + Number: 1, + }, + ProofType: abi.RegisteredSealProof_StackedDrg2KiBV1, + } + + sp, sid, err := rs1.AcquireSector(ctx, s1ref, storiface.FTNone, storiface.FTSealed, storiface.PathSealing, storiface.AcquireMove) + require.NoError(t, err) + require.Equal(t, id2, stores.ID(sid.Sealed)) + + data := make([]byte, 2032) + data[1] = 54 + require.NoError(t, ioutil.WriteFile(sp.Sealed, data, 0666)) + fmt.Println("write to ", sp.Sealed) + + require.NoError(t, index.StorageDeclareSector(ctx, stores.ID(sid.Sealed), s1ref.ID, storiface.FTSealed, true)) + + // move to the shared path from the second node (remote move / delete) + + require.NoError(t, rs2.MoveStorage(ctx, s1ref, storiface.FTSealed)) + + // check that the file still exists + sp, sid, err = rs2.AcquireSector(ctx, s1ref, storiface.FTSealed, storiface.FTNone, storiface.PathStorage, storiface.AcquireMove) + require.NoError(t, err) + require.Equal(t, id1, stores.ID(sid.Sealed)) + fmt.Println("read from ", sp.Sealed) + + read, err := ioutil.ReadFile(sp.Sealed) + require.NoError(t, err) + require.EqualValues(t, data, read) +} + func TestReader(t *testing.T) { logging.SetAllLoggers(logging.LevelDebug) bz := []byte("Hello World") @@ -46,7 +176,7 @@ func TestReader(t *testing.T) { tcs := map[string]struct { storeFnc func(s *mocks.MockStore) - pfFunc func(s *mocks.MockpartialFileHandler) + pfFunc func(s *mocks.MockPartialFileHandler) indexFnc func(s *mocks.MockSectorIndex, serverURL string) needHttpServer bool @@ -76,7 +206,7 @@ func TestReader(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, xerrors.New("pf open error")) }, errStr: "pf open error", @@ -87,7 +217,7 @@ func TestReader(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, true, xerrors.New("piece check error")) @@ -101,7 +231,7 @@ func TestReader(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, false, nil) @@ -115,7 +245,7 @@ func TestReader(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, true, nil) @@ -157,7 +287,7 @@ func TestReader(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, false, nil) @@ -223,7 +353,7 @@ func TestReader(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, true, nil) @@ -251,7 +381,7 @@ func TestReader(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, false, nil) @@ -308,7 +438,7 @@ func TestReader(t *testing.T) { // create them mocks lstore := mocks.NewMockStore(mockCtrl) - pfhandler := mocks.NewMockpartialFileHandler(mockCtrl) + pfhandler := mocks.NewMockPartialFileHandler(mockCtrl) index := mocks.NewMockSectorIndex(mockCtrl) if tc.storeFnc != nil { @@ -393,7 +523,7 @@ func TestCheckIsUnsealed(t *testing.T) { tcs := map[string]struct { storeFnc func(s *mocks.MockStore) - pfFunc func(s *mocks.MockpartialFileHandler) + pfFunc func(s *mocks.MockPartialFileHandler) indexFnc func(s *mocks.MockSectorIndex, serverURL string) needHttpServer bool @@ -421,7 +551,7 @@ func TestCheckIsUnsealed(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, xerrors.New("pf open error")) }, errStr: "pf open error", @@ -432,7 +562,7 @@ func TestCheckIsUnsealed(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, true, xerrors.New("piece check error")) @@ -446,7 +576,7 @@ func TestCheckIsUnsealed(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, @@ -488,7 +618,7 @@ func TestCheckIsUnsealed(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, false, nil) @@ -533,7 +663,7 @@ func TestCheckIsUnsealed(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, true, nil) @@ -569,7 +699,7 @@ func TestCheckIsUnsealed(t *testing.T) { mockSectorAcquire(l, sectorRef, pfPath, nil) }, - pfFunc: func(pf *mocks.MockpartialFileHandler) { + pfFunc: func(pf *mocks.MockPartialFileHandler) { mockPartialFileOpen(pf, sectorSize, pfPath, nil) mockCheckAllocation(pf, offset, size, emptyPartialFile, false, nil) @@ -602,7 +732,7 @@ func TestCheckIsUnsealed(t *testing.T) { // create them mocks lstore := mocks.NewMockStore(mockCtrl) - pfhandler := mocks.NewMockpartialFileHandler(mockCtrl) + pfhandler := mocks.NewMockPartialFileHandler(mockCtrl) index := mocks.NewMockSectorIndex(mockCtrl) if tc.storeFnc != nil { @@ -656,18 +786,18 @@ func mockSectorAcquire(l *mocks.MockStore, sectorRef storage.SectorRef, pfPath s storiface.SectorPaths{}, err).Times(1) } -func mockPartialFileOpen(pf *mocks.MockpartialFileHandler, sectorSize abi.SectorSize, pfPath string, err error) { +func mockPartialFileOpen(pf *mocks.MockPartialFileHandler, sectorSize abi.SectorSize, pfPath string, err error) { pf.EXPECT().OpenPartialFile(abi.PaddedPieceSize(sectorSize), pfPath).Return(&partialfile.PartialFile{}, err).Times(1) } -func mockCheckAllocation(pf *mocks.MockpartialFileHandler, offset, size abi.PaddedPieceSize, file *partialfile.PartialFile, +func mockCheckAllocation(pf *mocks.MockPartialFileHandler, offset, size abi.PaddedPieceSize, file *partialfile.PartialFile, out bool, err error) { pf.EXPECT().HasAllocated(file, storiface.UnpaddedByteIndex(offset.Unpadded()), size.Unpadded()).Return(out, err).Times(1) } -func mockPfReader(pf *mocks.MockpartialFileHandler, file *partialfile.PartialFile, offset, size abi.PaddedPieceSize, +func mockPfReader(pf *mocks.MockPartialFileHandler, file *partialfile.PartialFile, offset, size abi.PaddedPieceSize, outFile *os.File, err error) { pf.EXPECT().Reader(file, storiface.PaddedByteIndex(offset), size).Return(outFile, err) } diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index 3e63f8659..d45d140f8 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -331,11 +331,11 @@ func (l *LocalWorker) SealPreCommit1(ctx context.Context, sector storage.SectorR { // cleanup previous failed attempts if they exist - if err := l.storage.Remove(ctx, sector.ID, storiface.FTSealed, true); err != nil { + if err := l.storage.Remove(ctx, sector.ID, storiface.FTSealed, true, nil); err != nil { return nil, xerrors.Errorf("cleaning up sealed data: %w", err) } - if err := l.storage.Remove(ctx, sector.ID, storiface.FTCache, true); err != nil { + if err := l.storage.Remove(ctx, sector.ID, storiface.FTCache, true, nil); err != nil { return nil, xerrors.Errorf("cleaning up cache data: %w", err) } } @@ -394,7 +394,7 @@ func (l *LocalWorker) FinalizeSector(ctx context.Context, sector storage.SectorR } if len(keepUnsealed) == 0 { - if err := l.storage.Remove(ctx, sector.ID, storiface.FTUnsealed, true); err != nil { + if err := l.storage.Remove(ctx, sector.ID, storiface.FTUnsealed, true, nil); err != nil { return nil, xerrors.Errorf("removing unsealed data: %w", err) } } @@ -410,13 +410,13 @@ func (l *LocalWorker) ReleaseUnsealed(ctx context.Context, sector storage.Sector func (l *LocalWorker) Remove(ctx context.Context, sector abi.SectorID) error { var err error - if rerr := l.storage.Remove(ctx, sector, storiface.FTSealed, true); rerr != nil { + if rerr := l.storage.Remove(ctx, sector, storiface.FTSealed, true, nil); rerr != nil { err = multierror.Append(err, xerrors.Errorf("removing sector (sealed): %w", rerr)) } - if rerr := l.storage.Remove(ctx, sector, storiface.FTCache, true); rerr != nil { + if rerr := l.storage.Remove(ctx, sector, storiface.FTCache, true, nil); rerr != nil { err = multierror.Append(err, xerrors.Errorf("removing sector (cache): %w", rerr)) } - if rerr := l.storage.Remove(ctx, sector, storiface.FTUnsealed, true); rerr != nil { + if rerr := l.storage.Remove(ctx, sector, storiface.FTUnsealed, true, nil); rerr != nil { err = multierror.Append(err, xerrors.Errorf("removing sector (unsealed): %w", rerr)) } From ddef7081786ed746de47f6c50c5a8da6f5d68905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 11 Oct 2021 22:25:41 +0200 Subject: [PATCH 31/72] Basic inline codegen --- build/params_shared_vals.go | 8 ++++ gen/inline-gen/main.go | 95 +++++++++++++++++++++++++++++++++++++ gen/inlinegen-data.json | 7 +++ 3 files changed, 110 insertions(+) create mode 100644 gen/inline-gen/main.go create mode 100644 gen/inlinegen-data.json diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go index 22d1c30e3..f15cbc35c 100644 --- a/build/params_shared_vals.go +++ b/build/params_shared_vals.go @@ -28,8 +28,16 @@ const UnixfsLinksPerLevel = 1024 const AllowableClockDriftSecs = uint64(1) // TODO: This is still terrible...What's the impact of updating this before mainnet actually upgrades +/* inline-gen template + +const NewestNetworkVersion = network.Version{{.latestNetworkVersion}} + +inline-gen start */ + const NewestNetworkVersion = network.Version14 +//inline-gen end + // Epochs const ForkLengthThreshold = Finality diff --git a/gen/inline-gen/main.go b/gen/inline-gen/main.go new file mode 100644 index 000000000..4e669099f --- /dev/null +++ b/gen/inline-gen/main.go @@ -0,0 +1,95 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io/fs" + "io/ioutil" + "os" + "path/filepath" + "strings" + "text/template" +) + +const ( + stateGlobal = iota + stateTemplate + stateGen +) + +func main() { + db, err := ioutil.ReadFile(os.Args[2]) + if err != nil { + panic(err) + } + var data map[string]interface{} + if err := json.Unmarshal(db, &data); err != nil { + panic(err) + } + + err = filepath.WalkDir(os.Args[1], func(path string, d fs.DirEntry, err error) error { + if d.IsDir() { + return nil + } + if filepath.Ext(path) != ".go" { + return nil + } + fb, err := ioutil.ReadFile(path) + if err != nil { + return err + } + + lines := strings.Split(string(fb), "\n") + + outLines := make([]string, 0, len(lines)) + var templateLines []string + + state := stateGlobal + + for i, line := range lines { + ln := i+1 + switch state { + case stateGlobal: + outLines = append(outLines, line) + if line == `/* inline-gen template` { + state = stateTemplate + fmt.Printf("template section start %s:%d\n", path, ln) + } + case stateTemplate: + outLines = append(outLines, line) // output all template lines + + if line == `inline-gen start */` { + state = stateGen + fmt.Printf("generated section start %s:%d\n", path, ln) + continue + } + templateLines = append(templateLines, line) + case stateGen: + if line != `//inline-gen end` { + continue + } + state = stateGlobal + fmt.Printf("inline gen:\n") + fmt.Println(strings.Join(templateLines, "\n")) + + tpl, err := template.New("").Parse(strings.Join(templateLines, "\n")) + if err != nil { + fmt.Printf("%s:%d: parsing template: %s\n", path, ln, err) + os.Exit(1) + } + var b bytes.Buffer + err = tpl.Execute(&b, data) + + outLines = append(outLines, strings.Split(b.String(), "\n")...) + fmt.Println("inline gen-ed:\n", b.String()) + + outLines = append(outLines, line) + } + } + return nil + }) + if err != nil { + panic(err) + } +} diff --git a/gen/inlinegen-data.json b/gen/inlinegen-data.json new file mode 100644 index 000000000..1c8a4ecd8 --- /dev/null +++ b/gen/inlinegen-data.json @@ -0,0 +1,7 @@ +{ + "actorVersions": [0, 2, 3, 4, 5, 6], + "latestActorsVersion": 6, + + "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], + "latestNetworkVersion": 14 +} \ No newline at end of file From 5616dfb1bc50adcba69ee6618e77d2022dc64a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 11 Oct 2021 22:56:29 +0200 Subject: [PATCH 32/72] Some more inline codegen --- chain/consensus/filcns/compute_state.go | 15 +++++++ chain/vm/mkactor.go | 15 +++++++ .../misc/actors_version_checklist.md | 2 - gen/inline-gen/main.go | 42 ++++++++++++++----- gen/inlinegen-data.json | 2 +- 5 files changed, 63 insertions(+), 13 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 927562840..6089f227c 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -16,6 +16,12 @@ import ( "github.com/filecoin-project/go-state-types/big" blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" + /* inline-gen template + {{range .actorVersions}} + exported{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/exported"{{end}} + + inline-gen start */ + exported0 "github.com/filecoin-project/specs-actors/actors/builtin/exported" exported2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/exported" exported3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/exported" @@ -23,6 +29,8 @@ import ( exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" + //inline-gen end + "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -39,6 +47,11 @@ func NewActorRegistry() *vm.ActorRegistry { inv := vm.NewActorRegistry() // TODO: define all these properties on the actors themselves, in specs-actors. + /* inline-gen template + {{range .actorVersions}} + inv.Register(vm.ActorsVersionPredicate(actors.Version{{.}}), exported{{.}}.BuiltinActors()...){{end}} + + inline-gen start */ inv.Register(vm.ActorsVersionPredicate(actors.Version0), exported0.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version2), exported2.BuiltinActors()...) @@ -47,6 +60,8 @@ func NewActorRegistry() *vm.ActorRegistry { inv.Register(vm.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) + //inline-gen end + return inv } diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index b75f290dc..19702aa9c 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -14,6 +14,12 @@ import ( "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" + /* inline-gen template + {{range .actorVersions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"{{end}} + + inline-gen start */ + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" @@ -21,6 +27,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + //inline-gen end + "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/chain/actors/aerrors" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -104,6 +112,12 @@ func newAccountActor(ver actors.Version) *types.Actor { // TODO: ActorsUpgrade use a global actor registry? var code cid.Cid switch ver { + /* inline-gen template + {{range .actorVersions}} + case actors.Version{{.}}: + code = builtin{{.}}.AccountActorCodeID{{end}} + inline-gen start */ + case actors.Version0: code = builtin0.AccountActorCodeID case actors.Version2: @@ -116,6 +130,7 @@ func newAccountActor(ver actors.Version) *types.Actor { code = builtin5.AccountActorCodeID case actors.Version6: code = builtin6.AccountActorCodeID + //inline-gen end default: panic("unsupported actors version") } diff --git a/documentation/misc/actors_version_checklist.md b/documentation/misc/actors_version_checklist.md index 1fae4bd8a..92df0fa60 100644 --- a/documentation/misc/actors_version_checklist.md +++ b/documentation/misc/actors_version_checklist.md @@ -8,12 +8,10 @@ - [ ] Update `chain/actors/policy/policy.go` - [ ] Update `chain/actors/version.go` - [ ] Register in `chain/vm/invoker.go` -- [ ] Register in `chain/vm/mkactor.go` - [ ] Update `chain/types/state.go` - [ ] Update `chain/state/statetree.go` (New / Load) - [ ] Update `chain/stmgr/forks.go` - [ ] Schedule - [ ] Migration - [ ] Update upgrade schedule in `api/test/test.go` and `chain/sync_test.go` -- [ ] Update `NewestNetworkVersion` in `build/params_shared_vals.go` - [ ] Register in init in `chain/stmgr/utils.go` diff --git a/gen/inline-gen/main.go b/gen/inline-gen/main.go index 4e669099f..7fee43253 100644 --- a/gen/inline-gen/main.go +++ b/gen/inline-gen/main.go @@ -47,46 +47,68 @@ func main() { state := stateGlobal + rewrite := false + for i, line := range lines { - ln := i+1 + ln := i + 1 switch state { case stateGlobal: outLines = append(outLines, line) - if line == `/* inline-gen template` { + if strings.TrimSpace(line) == `/* inline-gen template` { state = stateTemplate fmt.Printf("template section start %s:%d\n", path, ln) } case stateTemplate: outLines = append(outLines, line) // output all template lines - if line == `inline-gen start */` { + if strings.TrimSpace(line) == `inline-gen start */` { state = stateGen fmt.Printf("generated section start %s:%d\n", path, ln) continue } templateLines = append(templateLines, line) case stateGen: - if line != `//inline-gen end` { + if strings.TrimSpace(line) != `//inline-gen end` { continue } - state = stateGlobal - fmt.Printf("inline gen:\n") - fmt.Println(strings.Join(templateLines, "\n")) + fmt.Printf("generated section end %s:%d\n", path, ln) - tpl, err := template.New("").Parse(strings.Join(templateLines, "\n")) + state = stateGlobal + rewrite = true + + tpl, err := template.New("").Funcs(template.FuncMap{ + "import": func(v float64) string { + if v == 0 { + return "/" + } + return fmt.Sprintf("/v%d/", int(v)) + }, + }).Parse(strings.Join(templateLines, "\n")) if err != nil { fmt.Printf("%s:%d: parsing template: %s\n", path, ln, err) os.Exit(1) } + var b bytes.Buffer err = tpl.Execute(&b, data) + if err != nil { + fmt.Printf("%s:%d: executing template: %s\n", path, ln, err) + os.Exit(1) + } outLines = append(outLines, strings.Split(b.String(), "\n")...) - fmt.Println("inline gen-ed:\n", b.String()) - outLines = append(outLines, line) + templateLines = nil } } + + if rewrite { + fmt.Printf("write %s\n", path) + if err := ioutil.WriteFile(path, []byte(strings.Join(outLines, "\n")), 0664); err != nil { + return err + } + } + return nil }) if err != nil { diff --git a/gen/inlinegen-data.json b/gen/inlinegen-data.json index 1c8a4ecd8..e26b1b28f 100644 --- a/gen/inlinegen-data.json +++ b/gen/inlinegen-data.json @@ -4,4 +4,4 @@ "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "latestNetworkVersion": 14 -} \ No newline at end of file +} From 8e168cb657f10ca69b67508437527d0ce7c5b1b4 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 12 Oct 2021 10:34:47 -0400 Subject: [PATCH 33/72] FilecoinEC: Improve a log message --- chain/consensus/filcns/filecoin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 7abd2cb77..883edd9a1 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -823,7 +823,7 @@ func (filec *FilecoinEC) checkPowerAndGetWorkerKey(ctx context.Context, bh *type key, err := stmgr.GetMinerWorkerRaw(ctx, filec.sm, lbst, bh.Miner) if err != nil { - log.Warnf("failed to resolve worker key for miner %s: %s", bh.Miner, err) + log.Warnf("failed to resolve worker key for miner %s and block height %d: %s", bh.Miner, bh.Height, err) return address.Undef, ErrSoftFailure } From 6cd67322257e36aa464ec57e402ba9140af93021 Mon Sep 17 00:00:00 2001 From: frrist Date: Wed, 13 Oct 2021 15:24:28 -0700 Subject: [PATCH 34/72] fix: support node instantiation in external packages - implement ChainGetPath on ChainModuleAPI --- node/builder.go | 7 +++++++ node/impl/full/chain.go | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/node/builder.go b/node/builder.go index 6c42aad2d..3f2e59503 100644 --- a/node/builder.go +++ b/node/builder.go @@ -374,6 +374,13 @@ func WithRepoType(repoType repo.RepoType) func(s *Settings) error { } } +func WithEnableLibp2pNode(enable bool) func(s *Settings) error { + return func(s *Settings) error { + s.enableLibp2pNode = enable + return nil + } +} + func WithInvokesKey(i invoke, resApi interface{}) func(s *Settings) error { return func(s *Settings) error { s.invokes[i] = fx.Populate(resApi) diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index e8d403337..4ffbe0e63 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -51,6 +51,7 @@ type ChainModuleAPI interface { ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) ChainGetTipSetAfterHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) + ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*api.HeadChange, error) } var _ ChainModuleAPI = *new(api.FullNode) @@ -105,6 +106,10 @@ func (m *ChainModule) ChainGetTipSet(ctx context.Context, key types.TipSetKey) ( return m.Chain.LoadTipSet(key) } +func (m *ChainModule) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*api.HeadChange, error) { + return m.Chain.GetPath(ctx, from, to) +} + func (m *ChainModule) ChainGetBlockMessages(ctx context.Context, msg cid.Cid) (*api.BlockMessages, error) { b, err := m.Chain.GetBlock(msg) if err != nil { From 63c8b8edd192b87a270475d348a7749806f934f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 18 Oct 2021 09:55:28 +0200 Subject: [PATCH 35/72] Fix used sectors space accounting after AddPieceFailed --- extern/storage-sealing/input.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index b69cf8c19..875c33cdf 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -60,6 +60,10 @@ func (m *Sealing) handleWaitDeals(ctx statemachine.Context, sector SectorInfo) e return ctx.Send(SectorAddPiece{}) }, } + } else { + // make sure we're only accounting for pieces which were correctly added + // (note that m.assignedPieces[sid] will always be empty here) + m.openSectors[sid].used = used } go func() { From 03806f70631d7f8c8b3ade0f56be09dd723e23d8 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 18 Oct 2021 16:29:01 +0200 Subject: [PATCH 36/72] add missing build constraint to statfs_unix.go --- extern/sector-storage/fsutil/statfs_unix.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extern/sector-storage/fsutil/statfs_unix.go b/extern/sector-storage/fsutil/statfs_unix.go index da09c5c60..da87c3364 100644 --- a/extern/sector-storage/fsutil/statfs_unix.go +++ b/extern/sector-storage/fsutil/statfs_unix.go @@ -1,3 +1,6 @@ +//go:build !windows +// +build !windows + package fsutil import ( From 9606dce425cf9bd357c1afb57fb9fbdd5fafe163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 18 Oct 2021 17:17:54 +0200 Subject: [PATCH 37/72] Add inline-gen to itests --- documentation/misc/actors_version_checklist.md | 2 +- gen/inline-gen/main.go | 3 +++ itests/kit/ensemble_opts_nv.go | 17 ++++++++++++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/documentation/misc/actors_version_checklist.md b/documentation/misc/actors_version_checklist.md index 92df0fa60..7a929a792 100644 --- a/documentation/misc/actors_version_checklist.md +++ b/documentation/misc/actors_version_checklist.md @@ -13,5 +13,5 @@ - [ ] Update `chain/stmgr/forks.go` - [ ] Schedule - [ ] Migration -- [ ] Update upgrade schedule in `api/test/test.go` and `chain/sync_test.go` +- [ ] Update upgrade schedule in `chain/sync_test.go` - [ ] Register in init in `chain/stmgr/utils.go` diff --git a/gen/inline-gen/main.go b/gen/inline-gen/main.go index 7fee43253..0084bc2f9 100644 --- a/gen/inline-gen/main.go +++ b/gen/inline-gen/main.go @@ -83,6 +83,9 @@ func main() { } return fmt.Sprintf("/v%d/", int(v)) }, + "add": func(a, b float64) float64 { + return a + b + }, }).Parse(strings.Join(templateLines, "\n")) if err != nil { fmt.Printf("%s:%d: parsing template: %s\n", path, ln, err) diff --git a/itests/kit/ensemble_opts_nv.go b/itests/kit/ensemble_opts_nv.go index a03e63f4a..7cdf082ee 100644 --- a/itests/kit/ensemble_opts_nv.go +++ b/itests/kit/ensemble_opts_nv.go @@ -38,14 +38,25 @@ func SDRUpgradeAt(calico, persian abi.ChainEpoch) EnsembleOpt { } func LatestActorsAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { + /* inline-gen template + return UpgradeSchedule(stmgr.Upgrade{ + Network: network.Version{{add .latestNetworkVersion -1}}, + Height: -1, + }, stmgr.Upgrade{ + Network: network.Version{{.latestNetworkVersion}}, + Height: upgradeHeight, + Migration: filcns.UpgradeActorsV{{.latestActorsVersion}}, + }) + inline-gen start */ return UpgradeSchedule(stmgr.Upgrade{ - Network: network.Version12, + Network: network.Version13, Height: -1, }, stmgr.Upgrade{ - Network: network.Version13, + Network: network.Version14, Height: upgradeHeight, - Migration: filcns.UpgradeActorsV5, + Migration: filcns.UpgradeActorsV6, }) + //inline-gen end } func TurboUpgradeAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { From 19f52b4541da717e82db0273c5b137c5bd64a545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 18 Oct 2021 17:21:53 +0200 Subject: [PATCH 38/72] inline-gen: Slightly nicer comment format --- build/params_shared_vals.go | 4 ++-- chain/consensus/filcns/compute_state.go | 8 ++++---- chain/vm/mkactor.go | 8 ++++---- gen/inline-gen/main.go | 4 ++-- itests/kit/ensemble_opts_nv.go | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go index f15cbc35c..0a242f6f2 100644 --- a/build/params_shared_vals.go +++ b/build/params_shared_vals.go @@ -32,11 +32,11 @@ const AllowableClockDriftSecs = uint64(1) const NewestNetworkVersion = network.Version{{.latestNetworkVersion}} -inline-gen start */ +/* inline-gen start */ const NewestNetworkVersion = network.Version14 -//inline-gen end +/* inline-gen end */ // Epochs const ForkLengthThreshold = Finality diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 6089f227c..3c333298e 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -20,7 +20,7 @@ import ( {{range .actorVersions}} exported{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/exported"{{end}} - inline-gen start */ + /* inline-gen start */ exported0 "github.com/filecoin-project/specs-actors/actors/builtin/exported" exported2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/exported" @@ -29,7 +29,7 @@ import ( exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" - //inline-gen end + /* inline-gen end */ "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" @@ -51,7 +51,7 @@ func NewActorRegistry() *vm.ActorRegistry { {{range .actorVersions}} inv.Register(vm.ActorsVersionPredicate(actors.Version{{.}}), exported{{.}}.BuiltinActors()...){{end}} - inline-gen start */ + /* inline-gen start */ inv.Register(vm.ActorsVersionPredicate(actors.Version0), exported0.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version2), exported2.BuiltinActors()...) @@ -60,7 +60,7 @@ func NewActorRegistry() *vm.ActorRegistry { inv.Register(vm.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) - //inline-gen end + /* inline-gen end */ return inv } diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index 19702aa9c..b0d6b454d 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -18,7 +18,7 @@ import ( {{range .actorVersions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"{{end}} - inline-gen start */ + /* inline-gen start */ builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" @@ -27,7 +27,7 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - //inline-gen end + /* inline-gen end */ "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/chain/actors/aerrors" @@ -116,7 +116,7 @@ func newAccountActor(ver actors.Version) *types.Actor { {{range .actorVersions}} case actors.Version{{.}}: code = builtin{{.}}.AccountActorCodeID{{end}} - inline-gen start */ + /* inline-gen start */ case actors.Version0: code = builtin0.AccountActorCodeID @@ -130,7 +130,7 @@ func newAccountActor(ver actors.Version) *types.Actor { code = builtin5.AccountActorCodeID case actors.Version6: code = builtin6.AccountActorCodeID - //inline-gen end + /* inline-gen end */ default: panic("unsupported actors version") } diff --git a/gen/inline-gen/main.go b/gen/inline-gen/main.go index 0084bc2f9..2f87afd79 100644 --- a/gen/inline-gen/main.go +++ b/gen/inline-gen/main.go @@ -61,14 +61,14 @@ func main() { case stateTemplate: outLines = append(outLines, line) // output all template lines - if strings.TrimSpace(line) == `inline-gen start */` { + if strings.TrimSpace(line) == `/* inline-gen start */` { state = stateGen fmt.Printf("generated section start %s:%d\n", path, ln) continue } templateLines = append(templateLines, line) case stateGen: - if strings.TrimSpace(line) != `//inline-gen end` { + if strings.TrimSpace(line) != `/* inline-gen end */` { continue } fmt.Printf("generated section end %s:%d\n", path, ln) diff --git a/itests/kit/ensemble_opts_nv.go b/itests/kit/ensemble_opts_nv.go index 7cdf082ee..0d7d87e6a 100644 --- a/itests/kit/ensemble_opts_nv.go +++ b/itests/kit/ensemble_opts_nv.go @@ -47,7 +47,7 @@ func LatestActorsAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { Height: upgradeHeight, Migration: filcns.UpgradeActorsV{{.latestActorsVersion}}, }) - inline-gen start */ + /* inline-gen start */ return UpgradeSchedule(stmgr.Upgrade{ Network: network.Version13, Height: -1, @@ -56,7 +56,7 @@ func LatestActorsAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { Height: upgradeHeight, Migration: filcns.UpgradeActorsV6, }) - //inline-gen end + /* inline-gen end */ } func TurboUpgradeAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { From e493d9e2e362864ada3fb6cb284a946bcccaf886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 18 Oct 2021 17:33:28 +0200 Subject: [PATCH 39/72] make: Run inline-gen --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 587c3c61c..f7b13cc18 100644 --- a/Makefile +++ b/Makefile @@ -291,6 +291,7 @@ method-gen: api-gen (cd ./lotuspond/front/src/chain && $(GOCC) run ./methodgen.go) actors-gen: + $(GOCC) run ./gen/inline-gen . gen/inlinegen-data.json $(GOCC) run ./chain/actors/agen $(GOCC) fmt ./... From 463f55ba13617504217eff468cdf6412628cbd41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 18 Oct 2021 17:46:50 +0200 Subject: [PATCH 40/72] Use more inline-gen --- chain/actors/version.go | 16 +++++++++++++++- chain/state/statetree.go | 9 +++++++++ documentation/misc/actors_version_checklist.md | 12 ++++-------- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/chain/actors/version.go b/chain/actors/version.go index 95dd09126..e42c563c1 100644 --- a/chain/actors/version.go +++ b/chain/actors/version.go @@ -8,9 +8,21 @@ import ( type Version int +/* inline-gen template + var LatestVersion = 6 -var Versions = []int{0, 2, 3, 4, 5, LatestVersion} +var Versions = []int{ {{range .actorVersions}} {{.}}, {{end}} } + +const ({{range .actorVersions}} + Version{{.}} Version = {{.}}{{end}} +) + +/* inline-gen start */ + +var LatestVersion = 6 + +var Versions = []int{0, 2, 3, 4, 5, 6} const ( Version0 Version = 0 @@ -21,6 +33,8 @@ const ( Version6 Version = 6 ) +/* inline-gen end */ + // Converts a network version into an actors adt version. func VersionForNetwork(version network.Version) (Version, error) { switch version { diff --git a/chain/state/statetree.go b/chain/state/statetree.go index b4323c04b..f230f7faa 100644 --- a/chain/state/statetree.go +++ b/chain/state/statetree.go @@ -152,7 +152,16 @@ func VersionForNetwork(ver network.Version) (types.StateTreeVersion, error) { return types.StateTreeVersion2, nil case network.Version12: return types.StateTreeVersion3, nil + + /* inline-gen template + {{$lastNv := .latestNetworkVersion}} + case{{range .networkVersions}} {{if (ge . 13.)}} network.Version{{.}}{{if (lt . $lastNv)}},{{end}}{{end}}{{end}}: + + /* inline-gen start */ + case network.Version13, network.Version14: + + /* inline-gen end */ return types.StateTreeVersion4, nil default: panic(fmt.Sprintf("unsupported network version %d", ver)) diff --git a/documentation/misc/actors_version_checklist.md b/documentation/misc/actors_version_checklist.md index 7a929a792..be7e2bd92 100644 --- a/documentation/misc/actors_version_checklist.md +++ b/documentation/misc/actors_version_checklist.md @@ -3,15 +3,11 @@ - [ ] Import new actors - [ ] Define upgrade heights in `build/params_` - [ ] Generate adapters - - [ ] Add the new version in `chain/actors/agen/main.go` + - [ ] Update `gen/inlinegen-data.json` + - [ ] Update adapter code in `chain/actors/version.go` if needed - [ ] Update adapter code in `chain/actors/builtin` if needed -- [ ] Update `chain/actors/policy/policy.go` -- [ ] Update `chain/actors/version.go` -- [ ] Register in `chain/vm/invoker.go` -- [ ] Update `chain/types/state.go` -- [ ] Update `chain/state/statetree.go` (New / Load) -- [ ] Update `chain/stmgr/forks.go` + - [ ] Run `make actors-gen` +- [ ] Update `chain/consensus/filcns/upgrades.go` - [ ] Schedule - [ ] Migration - [ ] Update upgrade schedule in `chain/sync_test.go` -- [ ] Register in init in `chain/stmgr/utils.go` From 3943c3ae6feeb254c74a4d1147ce8ed85220d21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 18 Oct 2021 17:50:31 +0200 Subject: [PATCH 41/72] inline-gen: Fix lint --- documentation/misc/actors_version_checklist.md | 2 +- gen/inline-gen/main.go | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/documentation/misc/actors_version_checklist.md b/documentation/misc/actors_version_checklist.md index be7e2bd92..5e6038c2b 100644 --- a/documentation/misc/actors_version_checklist.md +++ b/documentation/misc/actors_version_checklist.md @@ -4,7 +4,7 @@ - [ ] Define upgrade heights in `build/params_` - [ ] Generate adapters - [ ] Update `gen/inlinegen-data.json` - - [ ] Update adapter code in `chain/actors/version.go` if needed + - [ ] Update `chain/actors/version.go` - [ ] Update adapter code in `chain/actors/builtin` if needed - [ ] Run `make actors-gen` - [ ] Update `chain/consensus/filcns/upgrades.go` diff --git a/gen/inline-gen/main.go b/gen/inline-gen/main.go index 2f87afd79..d97134cdd 100644 --- a/gen/inline-gen/main.go +++ b/gen/inline-gen/main.go @@ -29,6 +29,9 @@ func main() { } err = filepath.WalkDir(os.Args[1], func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } if d.IsDir() { return nil } From 11d738eee07df80be0f0be73c85906f9ca131116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Oct 2021 21:04:03 +0200 Subject: [PATCH 42/72] Track prepared work --- extern/sector-storage/sched.go | 5 +- extern/sector-storage/sched_worker.go | 19 +++++- extern/sector-storage/stats.go | 2 +- extern/sector-storage/worker_tracked.go | 81 ++++++++++++++++++------- 4 files changed, 80 insertions(+), 27 deletions(-) diff --git a/extern/sector-storage/sched.go b/extern/sector-storage/sched.go index 38e901bf2..8f2eb5cf6 100644 --- a/extern/sector-storage/sched.go +++ b/extern/sector-storage/sched.go @@ -155,8 +155,9 @@ func newScheduler() *scheduler { schedQueue: &requestQueue{}, workTracker: &workTracker{ - done: map[storiface.CallID]struct{}{}, - running: map[storiface.CallID]trackedWork{}, + done: map[storiface.CallID]struct{}{}, + running: map[storiface.CallID]trackedWork{}, + prepared: map[storiface.CallID]trackedWork{}, }, info: make(chan func(interface{})), diff --git a/extern/sector-storage/sched_worker.go b/extern/sector-storage/sched_worker.go index 42bba2ee5..e717e58e2 100644 --- a/extern/sector-storage/sched_worker.go +++ b/extern/sector-storage/sched_worker.go @@ -464,7 +464,9 @@ func (sw *schedWorker) startProcessingTask(req *workerRequest) error { go func() { // first run the prepare step (e.g. fetching sector data from other worker) - err := req.prepare(req.ctx, sh.workTracker.worker(sw.wid, w.info, w.workerRpc)) + tw := sh.workTracker.worker(sw.wid, w.info, w.workerRpc) + tw.start() + err := req.prepare(req.ctx, tw) w.lk.Lock() if err != nil { @@ -488,6 +490,14 @@ func (sw *schedWorker) startProcessingTask(req *workerRequest) error { return } + tw = sh.workTracker.worker(sw.wid, w.info, w.workerRpc) + + // start tracking work first early in case we need to wait for resources + werr := make(chan error, 1) + go func() { + werr <- req.work(req.ctx, tw) + }() + // wait (if needed) for resources in the 'active' window err = w.active.withResources(sw.wid, w.info, needRes, &w.lk, func() error { w.preparing.free(w.info.Resources, needRes) @@ -501,7 +511,8 @@ func (sw *schedWorker) startProcessingTask(req *workerRequest) error { } // Do the work! - err = req.work(req.ctx, sh.workTracker.worker(sw.wid, w.info, w.workerRpc)) + tw.start() + err = <-werr select { case req.ret <- workerResponse{err: err}: @@ -534,7 +545,9 @@ func (sw *schedWorker) startProcessingReadyTask(req *workerRequest) error { go func() { // Do the work! - err := req.work(req.ctx, sh.workTracker.worker(sw.wid, w.info, w.workerRpc)) + tw := sh.workTracker.worker(sw.wid, w.info, w.workerRpc) + tw.start() + err := req.work(req.ctx, tw) select { case req.ret <- workerResponse{err: err}: diff --git a/extern/sector-storage/stats.go b/extern/sector-storage/stats.go index c5bc2fba1..7103e878c 100644 --- a/extern/sector-storage/stats.go +++ b/extern/sector-storage/stats.go @@ -50,7 +50,7 @@ func (m *Manager) WorkerJobs() map[uuid.UUID][]storiface.WorkerJob { ID: storiface.UndefCall, Sector: request.sector.ID, Task: request.taskType, - RunWait: wi + 1, + RunWait: wi + 2, Start: request.start, }) } diff --git a/extern/sector-storage/worker_tracked.go b/extern/sector-storage/worker_tracked.go index 2160dd8e6..8be1976fa 100644 --- a/extern/sector-storage/worker_tracked.go +++ b/extern/sector-storage/worker_tracked.go @@ -26,8 +26,9 @@ type trackedWork struct { type workTracker struct { lk sync.Mutex - done map[storiface.CallID]struct{} - running map[storiface.CallID]trackedWork + done map[storiface.CallID]struct{} + running map[storiface.CallID]trackedWork + prepared map[storiface.CallID]trackedWork // TODO: done, aggregate stats, queue stats, scheduler feedback } @@ -56,7 +57,7 @@ func (wt *workTracker) onDone(ctx context.Context, callID storiface.CallID) { delete(wt.running, callID) } -func (wt *workTracker) track(ctx context.Context, wid WorkerID, wi storiface.WorkerInfo, sid storage.SectorRef, task sealtasks.TaskType) func(storiface.CallID, error) (storiface.CallID, error) { +func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid WorkerID, wi storiface.WorkerInfo, sid storage.SectorRef, task sealtasks.TaskType) func(storiface.CallID, error) (storiface.CallID, error) { return func(callID storiface.CallID, err error) (storiface.CallID, error) { if err != nil { return callID, err @@ -71,17 +72,47 @@ func (wt *workTracker) track(ctx context.Context, wid WorkerID, wi storiface.Wor return callID, err } - wt.running[callID] = trackedWork{ - job: storiface.WorkerJob{ - ID: callID, - Sector: sid.ID, - Task: task, - Start: time.Now(), - }, - worker: wid, - workerHostname: wi.Hostname, + tracked := func() trackedWork { + return trackedWork{ + job: storiface.WorkerJob{ + ID: callID, + Sector: sid.ID, + Task: task, + Start: time.Now(), + }, + worker: wid, + workerHostname: wi.Hostname, + } } + select { + case <-ready: + case <-ctx.Done(): + return callID, ctx.Err() + default: + wt.prepared[callID] = tracked() + + wt.lk.Unlock() + select { + case <-ready: + case <-ctx.Done(): + delete(wt.prepared, callID) + wt.lk.Lock() // for the deferred unlock + return callID, ctx.Err() + } + + wt.lk.Lock() + _, done := wt.done[callID] + if done { + delete(wt.done, callID) + return callID, err + } + + delete(wt.prepared, callID) + } + + wt.running[callID] = tracked() + ctx, _ = tag.New( ctx, tag.Upsert(metrics.TaskType, string(task)), @@ -93,12 +124,14 @@ func (wt *workTracker) track(ctx context.Context, wid WorkerID, wi storiface.Wor } } -func (wt *workTracker) worker(wid WorkerID, wi storiface.WorkerInfo, w Worker) Worker { +func (wt *workTracker) worker(wid WorkerID, wi storiface.WorkerInfo, w Worker) *trackedWorker { return &trackedWorker{ Worker: w, wid: wid, workerInfo: wi, + execute: make(chan struct{}), + tracker: wt, } } @@ -120,39 +153,45 @@ type trackedWorker struct { wid WorkerID workerInfo storiface.WorkerInfo + execute chan struct{} // channel blocking execution in case we're waiting for resources but the task is ready to execute + tracker *workTracker } +func (t *trackedWorker) start() { + close(t.execute) +} + func (t *trackedWorker) SealPreCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, pieces []abi.PieceInfo) (storiface.CallID, error) { - return t.tracker.track(ctx, t.wid, t.workerInfo, sector, sealtasks.TTPreCommit1)(t.Worker.SealPreCommit1(ctx, sector, ticket, pieces)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTPreCommit1)(t.Worker.SealPreCommit1(ctx, sector, ticket, pieces)) } func (t *trackedWorker) SealPreCommit2(ctx context.Context, sector storage.SectorRef, pc1o storage.PreCommit1Out) (storiface.CallID, error) { - return t.tracker.track(ctx, t.wid, t.workerInfo, sector, sealtasks.TTPreCommit2)(t.Worker.SealPreCommit2(ctx, sector, pc1o)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTPreCommit2)(t.Worker.SealPreCommit2(ctx, sector, pc1o)) } func (t *trackedWorker) SealCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (storiface.CallID, error) { - return t.tracker.track(ctx, t.wid, t.workerInfo, sector, sealtasks.TTCommit1)(t.Worker.SealCommit1(ctx, sector, ticket, seed, pieces, cids)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTCommit1)(t.Worker.SealCommit1(ctx, sector, ticket, seed, pieces, cids)) } func (t *trackedWorker) SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (storiface.CallID, error) { - return t.tracker.track(ctx, t.wid, t.workerInfo, sector, sealtasks.TTCommit2)(t.Worker.SealCommit2(ctx, sector, c1o)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTCommit2)(t.Worker.SealCommit2(ctx, sector, c1o)) } func (t *trackedWorker) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { - return t.tracker.track(ctx, t.wid, t.workerInfo, sector, sealtasks.TTFinalize)(t.Worker.FinalizeSector(ctx, sector, keepUnsealed)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTFinalize)(t.Worker.FinalizeSector(ctx, sector, keepUnsealed)) } func (t *trackedWorker) AddPiece(ctx context.Context, sector storage.SectorRef, pieceSizes []abi.UnpaddedPieceSize, newPieceSize abi.UnpaddedPieceSize, pieceData storage.Data) (storiface.CallID, error) { - return t.tracker.track(ctx, t.wid, t.workerInfo, sector, sealtasks.TTAddPiece)(t.Worker.AddPiece(ctx, sector, pieceSizes, newPieceSize, pieceData)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTAddPiece)(t.Worker.AddPiece(ctx, sector, pieceSizes, newPieceSize, pieceData)) } func (t *trackedWorker) Fetch(ctx context.Context, s storage.SectorRef, ft storiface.SectorFileType, ptype storiface.PathType, am storiface.AcquireMode) (storiface.CallID, error) { - return t.tracker.track(ctx, t.wid, t.workerInfo, s, sealtasks.TTFetch)(t.Worker.Fetch(ctx, s, ft, ptype, am)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, s, sealtasks.TTFetch)(t.Worker.Fetch(ctx, s, ft, ptype, am)) } func (t *trackedWorker) UnsealPiece(ctx context.Context, id storage.SectorRef, index storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, randomness abi.SealRandomness, cid cid.Cid) (storiface.CallID, error) { - return t.tracker.track(ctx, t.wid, t.workerInfo, id, sealtasks.TTUnseal)(t.Worker.UnsealPiece(ctx, id, index, size, randomness, cid)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, id, sealtasks.TTUnseal)(t.Worker.UnsealPiece(ctx, id, index, size, randomness, cid)) } var _ Worker = &trackedWorker{} From 261238e157c1ec1fb662b6632aacfa117e498fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Oct 2021 21:26:35 +0200 Subject: [PATCH 43/72] Show prepared tasks in sealing jobs --- cmd/lotus-miner/sealing.go | 4 +++- extern/sector-storage/stats.go | 8 ++++++- extern/sector-storage/storiface/worker.go | 5 ++++- extern/sector-storage/worker_tracked.go | 27 ++++++++++++++--------- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/cmd/lotus-miner/sealing.go b/cmd/lotus-miner/sealing.go index a7e0a8de8..472af8da6 100644 --- a/cmd/lotus-miner/sealing.go +++ b/cmd/lotus-miner/sealing.go @@ -224,8 +224,10 @@ var sealingJobsCmd = &cli.Command{ for _, l := range lines { state := "running" switch { - case l.RunWait > 0: + case l.RunWait > 1: state = fmt.Sprintf("assigned(%d)", l.RunWait-1) + case l.RunWait == storiface.RWPrepared: + state = "prepared" case l.RunWait == storiface.RWRetDone: if !cctx.Bool("show-ret-done") { continue diff --git a/extern/sector-storage/stats.go b/extern/sector-storage/stats.go index 7103e878c..43828742a 100644 --- a/extern/sector-storage/stats.go +++ b/extern/sector-storage/stats.go @@ -35,7 +35,13 @@ func (m *Manager) WorkerJobs() map[uuid.UUID][]storiface.WorkerJob { out := map[uuid.UUID][]storiface.WorkerJob{} calls := map[storiface.CallID]struct{}{} - for _, t := range m.sched.workTracker.Running() { + running, preparing := m.sched.workTracker.Running() + + for _, t := range running { + out[uuid.UUID(t.worker)] = append(out[uuid.UUID(t.worker)], t.job) + calls[t.job.ID] = struct{}{} + } + for _, t := range preparing { out[uuid.UUID(t.worker)] = append(out[uuid.UUID(t.worker)], t.job) calls[t.job.ID] = struct{}{} } diff --git a/extern/sector-storage/storiface/worker.go b/extern/sector-storage/storiface/worker.go index d1373f4c5..e3374d6cf 100644 --- a/extern/sector-storage/storiface/worker.go +++ b/extern/sector-storage/storiface/worker.go @@ -47,6 +47,8 @@ type WorkerStats struct { } const ( + RWPrepared = 1 + RWRunning = 0 RWRetWait = -1 RWReturned = -2 RWRetDone = -3 @@ -57,7 +59,8 @@ type WorkerJob struct { Sector abi.SectorID Task sealtasks.TaskType - // 1+ - assigned + // 2+ - assigned + // 1 - prepared // 0 - running // -1 - ret-wait // -2 - returned diff --git a/extern/sector-storage/worker_tracked.go b/extern/sector-storage/worker_tracked.go index 8be1976fa..03ae29258 100644 --- a/extern/sector-storage/worker_tracked.go +++ b/extern/sector-storage/worker_tracked.go @@ -72,13 +72,14 @@ func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid Worke return callID, err } - tracked := func() trackedWork { + tracked := func(rw int) trackedWork { return trackedWork{ job: storiface.WorkerJob{ - ID: callID, - Sector: sid.ID, - Task: task, - Start: time.Now(), + ID: callID, + Sector: sid.ID, + Task: task, + Start: time.Now(), + RunWait: rw, }, worker: wid, workerHostname: wi.Hostname, @@ -90,7 +91,7 @@ func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid Worke case <-ctx.Done(): return callID, ctx.Err() default: - wt.prepared[callID] = tracked() + wt.prepared[callID] = tracked(storiface.RWPrepared) wt.lk.Unlock() select { @@ -111,7 +112,7 @@ func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid Worke delete(wt.prepared, callID) } - wt.running[callID] = tracked() + wt.running[callID] = tracked(storiface.RWRunning) ctx, _ = tag.New( ctx, @@ -136,16 +137,20 @@ func (wt *workTracker) worker(wid WorkerID, wi storiface.WorkerInfo, w Worker) * } } -func (wt *workTracker) Running() []trackedWork { +func (wt *workTracker) Running() ([]trackedWork, []trackedWork) { wt.lk.Lock() defer wt.lk.Unlock() - out := make([]trackedWork, 0, len(wt.running)) + running := make([]trackedWork, 0, len(wt.running)) for _, job := range wt.running { - out = append(out, job) + running = append(running, job) + } + prepared := make([]trackedWork, 0, len(wt.prepared)) + for _, job := range wt.prepared { + prepared = append(prepared, job) } - return out + return running, prepared } type trackedWorker struct { From 70589e440605c7bb99fa86315544a5ffa6c9b6ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 18 Oct 2021 16:27:25 +0200 Subject: [PATCH 44/72] Block work in tracked worker before it is started --- extern/sector-storage/sched.go | 2 +- extern/sector-storage/worker_tracked.go | 122 ++++++++++++------------ 2 files changed, 61 insertions(+), 63 deletions(-) diff --git a/extern/sector-storage/sched.go b/extern/sector-storage/sched.go index 8f2eb5cf6..1ffb15e5b 100644 --- a/extern/sector-storage/sched.go +++ b/extern/sector-storage/sched.go @@ -157,7 +157,7 @@ func newScheduler() *scheduler { workTracker: &workTracker{ done: map[storiface.CallID]struct{}{}, running: map[storiface.CallID]trackedWork{}, - prepared: map[storiface.CallID]trackedWork{}, + prepared: map[uuid.UUID]trackedWork{}, }, info: make(chan func(interface{})), diff --git a/extern/sector-storage/worker_tracked.go b/extern/sector-storage/worker_tracked.go index 03ae29258..2ebc5b620 100644 --- a/extern/sector-storage/worker_tracked.go +++ b/extern/sector-storage/worker_tracked.go @@ -5,6 +5,7 @@ import ( "sync" "time" + "github.com/google/uuid" "github.com/ipfs/go-cid" "go.opencensus.io/stats" "go.opencensus.io/tag" @@ -28,7 +29,7 @@ type workTracker struct { done map[storiface.CallID]struct{} running map[storiface.CallID]trackedWork - prepared map[storiface.CallID]trackedWork + prepared map[uuid.UUID]trackedWork // TODO: done, aggregate stats, queue stats, scheduler feedback } @@ -57,72 +58,67 @@ func (wt *workTracker) onDone(ctx context.Context, callID storiface.CallID) { delete(wt.running, callID) } -func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid WorkerID, wi storiface.WorkerInfo, sid storage.SectorRef, task sealtasks.TaskType) func(storiface.CallID, error) (storiface.CallID, error) { - return func(callID storiface.CallID, err error) (storiface.CallID, error) { - if err != nil { - return callID, err +func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid WorkerID, wi storiface.WorkerInfo, sid storage.SectorRef, task sealtasks.TaskType, cb func() (storiface.CallID, error)) (storiface.CallID, error) { + tracked := func(rw int, callID storiface.CallID) trackedWork { + return trackedWork{ + job: storiface.WorkerJob{ + ID: callID, + Sector: sid.ID, + Task: task, + Start: time.Now(), + RunWait: rw, + }, + worker: wid, + workerHostname: wi.Hostname, } + } - wt.lk.Lock() - defer wt.lk.Unlock() + select { + case <-ready: + case <-ctx.Done(): + return storiface.UndefCall, ctx.Err() + default: + prepID := uuid.New() - _, done := wt.done[callID] - if done { - delete(wt.done, callID) - return callID, err - } - - tracked := func(rw int) trackedWork { - return trackedWork{ - job: storiface.WorkerJob{ - ID: callID, - Sector: sid.ID, - Task: task, - Start: time.Now(), - RunWait: rw, - }, - worker: wid, - workerHostname: wi.Hostname, - } - } + wt.prepared[prepID] = tracked(storiface.RWPrepared, storiface.UndefCall) + wt.lk.Unlock() select { case <-ready: case <-ctx.Done(): - return callID, ctx.Err() - default: - wt.prepared[callID] = tracked(storiface.RWPrepared) - - wt.lk.Unlock() - select { - case <-ready: - case <-ctx.Done(): - delete(wt.prepared, callID) - wt.lk.Lock() // for the deferred unlock - return callID, ctx.Err() - } - wt.lk.Lock() - _, done := wt.done[callID] - if done { - delete(wt.done, callID) - return callID, err - } - - delete(wt.prepared, callID) + delete(wt.prepared, prepID) + return storiface.UndefCall, ctx.Err() } - wt.running[callID] = tracked(storiface.RWRunning) - - ctx, _ = tag.New( - ctx, - tag.Upsert(metrics.TaskType, string(task)), - tag.Upsert(metrics.WorkerHostname, wi.Hostname), - ) - stats.Record(ctx, metrics.WorkerCallsStarted.M(1)) + wt.lk.Lock() + delete(wt.prepared, prepID) + } + callID, err := cb() + if err != nil { return callID, err } + + wt.lk.Lock() + defer wt.lk.Unlock() + + _, done := wt.done[callID] + if done { + delete(wt.done, callID) + return callID, err + } + + wt.running[callID] = tracked(storiface.RWRunning, callID) + + ctx, _ = tag.New( + ctx, + tag.Upsert(metrics.TaskType, string(task)), + tag.Upsert(metrics.WorkerHostname, wi.Hostname), + ) + stats.Record(ctx, metrics.WorkerCallsStarted.M(1)) + + return callID, err } func (wt *workTracker) worker(wid WorkerID, wi storiface.WorkerInfo, w Worker) *trackedWorker { @@ -168,35 +164,37 @@ func (t *trackedWorker) start() { } func (t *trackedWorker) SealPreCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, pieces []abi.PieceInfo) (storiface.CallID, error) { - return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTPreCommit1)(t.Worker.SealPreCommit1(ctx, sector, ticket, pieces)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTPreCommit1, func() (storiface.CallID, error) { return t.Worker.SealPreCommit1(ctx, sector, ticket, pieces) }) } func (t *trackedWorker) SealPreCommit2(ctx context.Context, sector storage.SectorRef, pc1o storage.PreCommit1Out) (storiface.CallID, error) { - return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTPreCommit2)(t.Worker.SealPreCommit2(ctx, sector, pc1o)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTPreCommit2, func() (storiface.CallID, error) { return t.Worker.SealPreCommit2(ctx, sector, pc1o) }) } func (t *trackedWorker) SealCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (storiface.CallID, error) { - return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTCommit1)(t.Worker.SealCommit1(ctx, sector, ticket, seed, pieces, cids)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTCommit1, func() (storiface.CallID, error) { return t.Worker.SealCommit1(ctx, sector, ticket, seed, pieces, cids) }) } func (t *trackedWorker) SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (storiface.CallID, error) { - return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTCommit2)(t.Worker.SealCommit2(ctx, sector, c1o)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTCommit2, func() (storiface.CallID, error) { return t.Worker.SealCommit2(ctx, sector, c1o) }) } func (t *trackedWorker) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { - return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTFinalize)(t.Worker.FinalizeSector(ctx, sector, keepUnsealed)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTFinalize, func() (storiface.CallID, error) { return t.Worker.FinalizeSector(ctx, sector, keepUnsealed) }) } func (t *trackedWorker) AddPiece(ctx context.Context, sector storage.SectorRef, pieceSizes []abi.UnpaddedPieceSize, newPieceSize abi.UnpaddedPieceSize, pieceData storage.Data) (storiface.CallID, error) { - return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTAddPiece)(t.Worker.AddPiece(ctx, sector, pieceSizes, newPieceSize, pieceData)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTAddPiece, func() (storiface.CallID, error) { + return t.Worker.AddPiece(ctx, sector, pieceSizes, newPieceSize, pieceData) + }) } func (t *trackedWorker) Fetch(ctx context.Context, s storage.SectorRef, ft storiface.SectorFileType, ptype storiface.PathType, am storiface.AcquireMode) (storiface.CallID, error) { - return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, s, sealtasks.TTFetch)(t.Worker.Fetch(ctx, s, ft, ptype, am)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, s, sealtasks.TTFetch, func() (storiface.CallID, error) { return t.Worker.Fetch(ctx, s, ft, ptype, am) }) } func (t *trackedWorker) UnsealPiece(ctx context.Context, id storage.SectorRef, index storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, randomness abi.SealRandomness, cid cid.Cid) (storiface.CallID, error) { - return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, id, sealtasks.TTUnseal)(t.Worker.UnsealPiece(ctx, id, index, size, randomness, cid)) + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, id, sealtasks.TTUnseal, func() (storiface.CallID, error) { return t.Worker.UnsealPiece(ctx, id, index, size, randomness, cid) }) } var _ Worker = &trackedWorker{} From 3b2e8c439aaf9849650e414438b2ae2afcd4cfa8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 18 Oct 2021 10:41:33 -0700 Subject: [PATCH 45/72] unpin the yamux dependency This has been pinned for a while under suspicion that it was causing graphsync stalls. However, the libp2p team has been unable to reliably reproduce the issue and believes that it's likely a graphsync issue. Libp2p issue: https://github.com/libp2p/go-yamux/issues/61 --- go.mod | 2 -- go.sum | 28 +++++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 9322f1029..bc9f8dd23 100644 --- a/go.mod +++ b/go.mod @@ -161,8 +161,6 @@ require ( gotest.tools v2.2.0+incompatible ) -replace github.com/libp2p/go-libp2p-yamux => github.com/libp2p/go-libp2p-yamux v0.5.1 - replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors diff --git a/go.sum b/go.sum index 8f652475d..b1b12d1cf 100644 --- a/go.sum +++ b/go.sum @@ -1219,8 +1219,20 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZb github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= -github.com/libp2p/go-libp2p-yamux v0.5.1 h1:sX4WQPHMhRxJE5UZTfjEuBvlQWXB5Bo3A2JK9ZJ9EM0= +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/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= +github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= +github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= +github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= +github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= +github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= +github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= +github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= +github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= +github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1292,11 +1304,21 @@ github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1f github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= +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/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6 h1:O5qcBXRcfqecvQ/My9NqDNHB3/5t58yuJYqthcKhhgE= +github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux/v2 v2.0.0 h1:vSGhAy5u6iHBq11ZDcyHH4Blcf9xlBhT4WQDoOE90LU= +github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= +github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= +github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= +github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= From 080aa3356af67b1db863f991ec22f975c9a81c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 18 Oct 2021 20:19:21 +0200 Subject: [PATCH 46/72] Fix locks in worker-tracked --- extern/sector-storage/worker_tracked.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extern/sector-storage/worker_tracked.go b/extern/sector-storage/worker_tracked.go index 2ebc5b620..b45c4237c 100644 --- a/extern/sector-storage/worker_tracked.go +++ b/extern/sector-storage/worker_tracked.go @@ -73,6 +73,9 @@ func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid Worke } } + wt.lk.Lock() + defer wt.lk.Unlock() + select { case <-ready: case <-ctx.Done(): @@ -83,6 +86,7 @@ func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid Worke wt.prepared[prepID] = tracked(storiface.RWPrepared, storiface.UndefCall) wt.lk.Unlock() + select { case <-ready: case <-ctx.Done(): @@ -100,8 +104,7 @@ func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid Worke return callID, err } - wt.lk.Lock() - defer wt.lk.Unlock() + _, done := wt.done[callID] if done { From 116ed0119764e64e35cfda89d63263b944a6ab8d Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 19 Oct 2021 10:03:07 +0200 Subject: [PATCH 47/72] feat: update to go-fil-markets v1.13.3 --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 9322f1029..03e7a5fe2 100644 --- a/go.mod +++ b/go.mod @@ -33,10 +33,10 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.2 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.11.1 + github.com/filecoin-project/go-data-transfer v1.11.4 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.2 + github.com/filecoin-project/go-fil-markets v1.13.3 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index 8f652475d..1e6c85e45 100644 --- a/go.sum +++ b/go.sum @@ -327,8 +327,8 @@ github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.1 h1:fiw2FHDVSDrt427cGp7+Ax3TTZk0e6HvF9Odcl2etBM= -github.com/filecoin-project/go-data-transfer v1.11.1/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= +github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= +github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -338,8 +338,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.2 h1:cKSfVWWwnvG1rHZauJyyOpWxH75KazILyZ295FWmDPA= -github.com/filecoin-project/go-fil-markets v1.13.2/go.mod h1:58OjtsWtDt3xlN1QLmgDQxtfCDtDS4RIyHepIUbqXhM= +github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= +github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From 1d8a9c75d459ecf4c11787e3327869a3a570f8ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 11:05:14 +0200 Subject: [PATCH 48/72] Use .latestActorsVersion in actors/version.go --- chain/actors/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/actors/version.go b/chain/actors/version.go index e42c563c1..7b7a6393a 100644 --- a/chain/actors/version.go +++ b/chain/actors/version.go @@ -10,7 +10,7 @@ type Version int /* inline-gen template -var LatestVersion = 6 +var LatestVersion = {{.latestActorsVersion}} var Versions = []int{ {{range .actorVersions}} {{.}}, {{end}} } From e508055dc142948c71c6a33a936c39c1f543df14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 11:13:23 +0200 Subject: [PATCH 49/72] make gen --- extern/sector-storage/worker_tracked.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/extern/sector-storage/worker_tracked.go b/extern/sector-storage/worker_tracked.go index b45c4237c..5702426c3 100644 --- a/extern/sector-storage/worker_tracked.go +++ b/extern/sector-storage/worker_tracked.go @@ -104,8 +104,6 @@ func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid Worke return callID, err } - - _, done := wt.done[callID] if done { delete(wt.done, callID) From 852ac4c17854eb77f4ee3cd34c50ed945c7d78ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 18:52:54 +0200 Subject: [PATCH 50/72] Expose per-state sector counts on the prometheus endpoint --- extern/storage-sealing/fsm.go | 2 +- extern/storage-sealing/fsm_test.go | 21 ++++++++++++++------- extern/storage-sealing/input.go | 2 +- extern/storage-sealing/sealing.go | 3 ++- extern/storage-sealing/stats.go | 21 +++++++++++++++++---- metrics/metrics.go | 11 +++++++++++ 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 00e38694d..10bec7e0b 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -475,7 +475,7 @@ func (m *Sealing) onUpdateSector(ctx context.Context, state *SectorInfo) error { return xerrors.Errorf("getting config: %w", err) } - shouldUpdateInput := m.stats.updateSector(cfg, m.minerSectorID(state.SectorNumber), state.State) + shouldUpdateInput := m.stats.updateSector(ctx, cfg, m.minerSectorID(state.SectorNumber), state.State) // trigger more input processing when we've dipped below max sealing limits if shouldUpdateInput { diff --git a/extern/storage-sealing/fsm_test.go b/extern/storage-sealing/fsm_test.go index 5ddef0d53..10ee17c6b 100644 --- a/extern/storage-sealing/fsm_test.go +++ b/extern/storage-sealing/fsm_test.go @@ -33,7 +33,8 @@ func TestHappyPath(t *testing.T) { s: &Sealing{ maddr: ma, stats: SectorStats{ - bySector: map[abi.SectorID]statSectorState{}, + bySector: map[abi.SectorID]SectorState{}, + byState: map[SectorState]int64{}, }, notifee: func(before, after SectorInfo) { notif = append(notif, struct{ before, after SectorInfo }{before, after}) @@ -94,7 +95,8 @@ func TestHappyPathFinalizeEarly(t *testing.T) { s: &Sealing{ maddr: ma, stats: SectorStats{ - bySector: map[abi.SectorID]statSectorState{}, + bySector: map[abi.SectorID]SectorState{}, + byState: map[SectorState]int64{}, }, notifee: func(before, after SectorInfo) { notif = append(notif, struct{ before, after SectorInfo }{before, after}) @@ -161,7 +163,8 @@ func TestCommitFinalizeFailed(t *testing.T) { s: &Sealing{ maddr: ma, stats: SectorStats{ - bySector: map[abi.SectorID]statSectorState{}, + bySector: map[abi.SectorID]SectorState{}, + byState: map[SectorState]int64{}, }, notifee: func(before, after SectorInfo) { notif = append(notif, struct{ before, after SectorInfo }{before, after}) @@ -199,7 +202,8 @@ func TestSeedRevert(t *testing.T) { s: &Sealing{ maddr: ma, stats: SectorStats{ - bySector: map[abi.SectorID]statSectorState{}, + bySector: map[abi.SectorID]SectorState{}, + byState: map[SectorState]int64{}, }, }, t: t, @@ -252,7 +256,8 @@ func TestPlanCommittingHandlesSectorCommitFailed(t *testing.T) { s: &Sealing{ maddr: ma, stats: SectorStats{ - bySector: map[abi.SectorID]statSectorState{}, + bySector: map[abi.SectorID]SectorState{}, + byState: map[SectorState]int64{}, }, }, t: t, @@ -289,7 +294,8 @@ func TestBrokenState(t *testing.T) { s: &Sealing{ maddr: ma, stats: SectorStats{ - bySector: map[abi.SectorID]statSectorState{}, + bySector: map[abi.SectorID]SectorState{}, + byState: map[SectorState]int64{}, }, notifee: func(before, after SectorInfo) { notif = append(notif, struct{ before, after SectorInfo }{before, after}) @@ -324,7 +330,8 @@ func TestTicketExpired(t *testing.T) { s: &Sealing{ maddr: ma, stats: SectorStats{ - bySector: map[abi.SectorID]statSectorState{}, + bySector: map[abi.SectorID]SectorState{}, + byState: map[SectorState]int64{}, }, notifee: func(before, after SectorInfo) { notif = append(notif, struct{ before, after SectorInfo }{before, after}) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 875c33cdf..60c3a79e2 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -473,7 +473,7 @@ func (m *Sealing) createSector(ctx context.Context, cfg sealiface.Config, sp abi } // update stats early, fsm planner would do that async - m.stats.updateSector(cfg, m.minerSectorID(sid), UndefinedSectorState) + m.stats.updateSector(ctx, cfg, m.minerSectorID(sid), UndefinedSectorState) return sid, nil } diff --git a/extern/storage-sealing/sealing.go b/extern/storage-sealing/sealing.go index 165003bc9..583bed052 100644 --- a/extern/storage-sealing/sealing.go +++ b/extern/storage-sealing/sealing.go @@ -166,7 +166,8 @@ func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events getConfig: gc, stats: SectorStats{ - bySector: map[abi.SectorID]statSectorState{}, + bySector: map[abi.SectorID]SectorState{}, + byState: map[SectorState]int64{}, }, } s.startupWait.Add(1) diff --git a/extern/storage-sealing/stats.go b/extern/storage-sealing/stats.go index 28556866a..12d951ddb 100644 --- a/extern/storage-sealing/stats.go +++ b/extern/storage-sealing/stats.go @@ -1,6 +1,10 @@ package sealing import ( + "context" + "github.com/filecoin-project/lotus/metrics" + "go.opencensus.io/stats" + "go.opencensus.io/tag" "sync" "github.com/filecoin-project/go-state-types/abi" @@ -20,11 +24,12 @@ const ( type SectorStats struct { lk sync.Mutex - bySector map[abi.SectorID]statSectorState + bySector map[abi.SectorID]SectorState + byState map[SectorState]int64 totals [nsst]uint64 } -func (ss *SectorStats) updateSector(cfg sealiface.Config, id abi.SectorID, st SectorState) (updateInput bool) { +func (ss *SectorStats) updateSector(ctx context.Context, cfg sealiface.Config, id abi.SectorID, st SectorState) (updateInput bool) { ss.lk.Lock() defer ss.lk.Unlock() @@ -34,12 +39,20 @@ func (ss *SectorStats) updateSector(cfg sealiface.Config, id abi.SectorID, st Se // update totals oldst, found := ss.bySector[id] if found { - ss.totals[oldst]-- + ss.totals[toStatState(oldst, cfg.FinalizeEarly)]-- + ss.byState[oldst]-- + + mctx, _ := tag.New(ctx, tag.Upsert(metrics.SectorState, string(oldst))) + stats.Record(mctx, metrics.SectorStates.M(ss.byState[oldst])) } sst := toStatState(st, cfg.FinalizeEarly) - ss.bySector[id] = sst + ss.bySector[id] = st ss.totals[sst]++ + ss.byState[st]++ + + mctx, _ := tag.New(ctx, tag.Upsert(metrics.SectorState, string(st))) + stats.Record(mctx, metrics.SectorStates.M(ss.byState[st])) // check if we may need be able to process more deals sealing := ss.curSealingLocked() diff --git a/metrics/metrics.go b/metrics/metrics.go index fd538839d..63c0dede9 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -46,6 +46,7 @@ var ( TaskType, _ = tag.NewKey("task_type") WorkerHostname, _ = tag.NewKey("worker_hostname") StorageID, _ = tag.NewKey("storage_id") + SectorState, _ = tag.NewKey("sector_state") ) // Measures @@ -98,6 +99,8 @@ var ( WorkerCallsReturnedDuration = stats.Float64("sealing/worker_calls_returned_ms", "Counter of returned worker tasks", stats.UnitMilliseconds) WorkerUntrackedCallsReturned = stats.Int64("sealing/worker_untracked_calls_returned", "Counter of returned untracked worker tasks", stats.UnitDimensionless) + SectorStates = stats.Int64("sealing/states", "Number of sectors in each state", stats.UnitDimensionless) + StorageFSAvailable = stats.Float64("storage/path_fs_available_frac", "Fraction of filesystem available storage", stats.UnitDimensionless) StorageAvailable = stats.Float64("storage/path_available_frac", "Fraction of available storage", stats.UnitDimensionless) StorageReserved = stats.Float64("storage/path_reserved_frac", "Fraction of reserved storage", stats.UnitDimensionless) @@ -308,6 +311,11 @@ var ( Aggregation: workMillisecondsDistribution, TagKeys: []tag.Key{TaskType, WorkerHostname}, } + SectorStatesView = &view.View{ + Measure: SectorStates, + Aggregation: view.LastValue(), + TagKeys: []tag.Key{SectorState}, + } StorageFSAvailableView = &view.View{ Measure: StorageFSAvailable, Aggregation: view.LastValue(), @@ -441,14 +449,17 @@ var MinerNodeViews = append([]*view.View{ WorkerCallsReturnedCountView, WorkerUntrackedCallsReturnedView, WorkerCallsReturnedDurationView, + SectorStatesView, StorageFSAvailableView, StorageAvailableView, StorageReservedView, StorageLimitUsedView, + StorageCapacityBytesView, StorageFSAvailableBytesView, StorageAvailableBytesView, StorageReservedBytesView, StorageLimitUsedBytesView, + StorageLimitMaxBytesView, }, DefaultViews...) // SinceInMilliseconds returns the duration of time since the provide time as a float64. From 726d9b86ea191fd8b6aabda2fa921f578c5d0295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 18:56:30 +0200 Subject: [PATCH 51/72] fix lint --- extern/storage-sealing/stats.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/extern/storage-sealing/stats.go b/extern/storage-sealing/stats.go index 12d951ddb..050204519 100644 --- a/extern/storage-sealing/stats.go +++ b/extern/storage-sealing/stats.go @@ -2,13 +2,15 @@ package sealing import ( "context" - "github.com/filecoin-project/lotus/metrics" - "go.opencensus.io/stats" - "go.opencensus.io/tag" "sync" + "go.opencensus.io/stats" + "go.opencensus.io/tag" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/extern/storage-sealing/sealiface" + "github.com/filecoin-project/lotus/metrics" ) type statSectorState int From 32ce12acfc8e35f1b280d527e742a4092397ba3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 19:03:38 +0200 Subject: [PATCH 52/72] Update go-graphsync to v0.10.4 --- go.mod | 2 +- go.sum | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 03e7a5fe2..483d70ae6 100644 --- a/go.mod +++ b/go.mod @@ -77,7 +77,7 @@ require ( github.com/ipfs/go-ds-measure v0.1.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.10.1 + github.com/ipfs/go-graphsync v0.10.4 github.com/ipfs/go-ipfs-blockstore v1.0.4 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 diff --git a/go.sum b/go.sum index 1e6c85e45..5ecf531f1 100644 --- a/go.sum +++ b/go.sum @@ -745,6 +745,8 @@ github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqis github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.10.1 h1:m6nNwiRFE2FVBTCxHWVTRApjH0snIjFy7fkDbOlMa/I= github.com/ipfs/go-graphsync v0.10.1/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= +github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= +github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -844,6 +846,7 @@ github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3 github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= From b1c06ece85c4a0fda57e9a25b308b0922f88eae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 19:03:53 +0200 Subject: [PATCH 53/72] mod tidy --- go.sum | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/go.sum b/go.sum index 5ecf531f1..608ecc683 100644 --- a/go.sum +++ b/go.sum @@ -743,8 +743,6 @@ github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CE github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.1 h1:m6nNwiRFE2FVBTCxHWVTRApjH0snIjFy7fkDbOlMa/I= -github.com/ipfs/go-graphsync v0.10.1/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= @@ -844,8 +842,8 @@ github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipfs/go-peertaskqueue v0.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= From 9a993d25d0dde191fd11937e31a28a9d73a9fb0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 19:19:52 +0200 Subject: [PATCH 54/72] Collect and expose graphsync metrics --- metrics/metrics.go | 79 +++++++++++++++++++++++++++++++++++++++ node/modules/graphsync.go | 42 +++++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/metrics/metrics.go b/metrics/metrics.go index fd538839d..5dcc248e6 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -55,6 +55,22 @@ var ( PeerCount = stats.Int64("peer/count", "Current number of FIL peers", stats.UnitDimensionless) APIRequestDuration = stats.Float64("api/request_duration_ms", "Duration of API requests", stats.UnitMilliseconds) + // graphsync + + GraphsyncReceivingPeersCount = stats.Int64("graphsync/receiving_peers", "number of peers we are receiving graphsync data from", stats.UnitDimensionless) + GraphsyncReceivingActiveCount = stats.Int64("graphsync/receiving_active", "number of active receiving graphsync transfers", stats.UnitDimensionless) + GraphsyncReceivingCountCount = stats.Int64("graphsync/receiving_pending", "number of pending receiving graphsync transfers", stats.UnitDimensionless) + GraphsyncReceivingTotalMemoryAllocated = stats.Int64("graphsync/receiving_total_allocated", "amount of block memory allocated for receiving graphsync data", stats.UnitDimensionless) + GraphsyncReceivingTotalPendingAllocations = stats.Int64("graphsync/receiving_pending_allocations", "amount of block memory on hold being received pending allocation", stats.UnitDimensionless) + GraphsyncReceivingPeersPending = stats.Int64("graphsync/receiving_peers_pending", "number of peers we can't receive more data from cause of pending allocations", stats.UnitDimensionless) + + GraphsyncSendingPeersCount = stats.Int64("graphsync/sending_peers", "number of peers we are sending graphsync data to", stats.UnitDimensionless) + GraphsyncSendingActiveCount = stats.Int64("graphsync/sending_active", "number of active sending graphsync transfers", stats.UnitDimensionless) + GraphsyncSendingCountCount = stats.Int64("graphsync/sending_pending", "number of pending sending graphsync transfers", stats.UnitDimensionless) + GraphsyncSendingTotalMemoryAllocated = stats.Int64("graphsync/sending_total_allocated", "amount of block memory allocated for sending graphsync data", stats.UnitDimensionless) + GraphsyncSendingTotalPendingAllocations = stats.Int64("graphsync/sending_pending_allocations", "amount of block memory on hold from sending pending allocation", stats.UnitDimensionless) + GraphsyncSendingPeersPending = stats.Int64("graphsync/sending_peers_pending", "number of peers we can't send more data to cause of pending allocations", stats.UnitDimensionless) + // chain ChainNodeHeight = stats.Int64("chain/node_height", "Current Height of the node", stats.UnitDimensionless) ChainNodeHeightExpected = stats.Int64("chain/node_height_expected", "Expected Height of the node", stats.UnitDimensionless) @@ -380,6 +396,56 @@ var ( Measure: SplitstoreCompactionDead, Aggregation: view.Sum(), } + + // graphsync + GraphsyncReceivingPeersCountView = &view.View{ + Measure: GraphsyncReceivingPeersCount, + Aggregation: view.LastValue(), + } + GraphsyncReceivingActiveCountView = &view.View{ + Measure: GraphsyncReceivingActiveCount, + Aggregation: view.LastValue(), + } + GraphsyncReceivingCountCountView = &view.View{ + Measure: GraphsyncReceivingCountCount, + Aggregation: view.LastValue(), + } + GraphsyncReceivingTotalMemoryAllocatedView = &view.View{ + Measure: GraphsyncReceivingTotalMemoryAllocated, + Aggregation: view.LastValue(), + } + GraphsyncReceivingTotalPendingAllocationsView = &view.View{ + Measure: GraphsyncReceivingTotalPendingAllocations, + Aggregation: view.LastValue(), + } + GraphsyncReceivingPeersPendingView = &view.View{ + Measure: GraphsyncReceivingPeersPending, + Aggregation: view.LastValue(), + } + GraphsyncSendingPeersCountView = &view.View{ + Measure: GraphsyncSendingPeersCount, + Aggregation: view.LastValue(), + } + GraphsyncSendingActiveCountView = &view.View{ + Measure: GraphsyncSendingActiveCount, + Aggregation: view.LastValue(), + } + GraphsyncSendingCountCountView = &view.View{ + Measure: GraphsyncSendingCountCount, + Aggregation: view.LastValue(), + } + GraphsyncSendingTotalMemoryAllocatedView = &view.View{ + Measure: GraphsyncSendingTotalMemoryAllocated, + Aggregation: view.LastValue(), + } + GraphsyncSendingTotalPendingAllocationsView = &view.View{ + Measure: GraphsyncSendingTotalPendingAllocations, + Aggregation: view.LastValue(), + } + GraphsyncSendingPeersPendingView = &view.View{ + Measure: GraphsyncSendingPeersPending, + Aggregation: view.LastValue(), + } ) // DefaultViews is an array of OpenCensus views for metric gathering purposes @@ -388,6 +454,19 @@ var DefaultViews = func() []*view.View { InfoView, PeerCountView, APIRequestDurationView, + + GraphsyncReceivingPeersCountView, + GraphsyncReceivingActiveCountView, + GraphsyncReceivingCountCountView, + GraphsyncReceivingTotalMemoryAllocatedView, + GraphsyncReceivingTotalPendingAllocationsView, + GraphsyncReceivingPeersPendingView, + GraphsyncSendingPeersCountView, + GraphsyncSendingActiveCountView, + GraphsyncSendingCountCountView, + GraphsyncSendingTotalMemoryAllocatedView, + GraphsyncSendingTotalPendingAllocationsView, + GraphsyncSendingPeersPendingView, } views = append(views, blockstore.DefaultViews...) views = append(views, rpcmetrics.DefaultViews...) diff --git a/node/modules/graphsync.go b/node/modules/graphsync.go index 839508900..079bc7ba5 100644 --- a/node/modules/graphsync.go +++ b/node/modules/graphsync.go @@ -1,13 +1,17 @@ package modules import ( + "context" + "github.com/filecoin-project/lotus/metrics" "github.com/ipfs/go-graphsync" graphsyncimpl "github.com/ipfs/go-graphsync/impl" gsnet "github.com/ipfs/go-graphsync/network" "github.com/ipfs/go-graphsync/storeutil" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" + "go.opencensus.io/stats" "go.uber.org/fx" + "time" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/modules/dtypes" @@ -49,6 +53,44 @@ func Graphsync(parallelTransfersForStorage uint64, parallelTransfersForRetrieval hookActions.UsePersistenceOption("chainstore") } }) + + stopStats := make(chan struct{}) + lc.Append(fx.Hook{ + OnStart: func(context.Context) error { + go func() { + t := time.NewTicker(10 * time.Second) + for { + select { + case <-t.C: + + st := gs.Stats() + stats.Record(mctx, metrics.GraphsyncReceivingPeersCount.M(int64(st.OutgoingRequests.TotalPeers))) + stats.Record(mctx, metrics.GraphsyncReceivingActiveCount.M(int64(st.OutgoingRequests.Active))) + stats.Record(mctx, metrics.GraphsyncReceivingCountCount.M(int64(st.OutgoingRequests.Pending))) + stats.Record(mctx, metrics.GraphsyncReceivingTotalMemoryAllocated.M(int64(st.IncomingResponses.TotalAllocatedAllPeers))) + stats.Record(mctx, metrics.GraphsyncReceivingTotalPendingAllocations.M(int64(st.IncomingResponses.TotalPendingAllocations))) + stats.Record(mctx, metrics.GraphsyncReceivingPeersPending.M(int64(st.IncomingResponses.NumPeersWithPendingAllocations))) + stats.Record(mctx, metrics.GraphsyncSendingPeersCount.M(int64(st.IncomingRequests.TotalPeers))) + stats.Record(mctx, metrics.GraphsyncSendingActiveCount.M(int64(st.IncomingRequests.Active))) + stats.Record(mctx, metrics.GraphsyncSendingCountCount.M(int64(st.IncomingRequests.Pending))) + stats.Record(mctx, metrics.GraphsyncSendingTotalMemoryAllocated.M(int64(st.OutgoingResponses.TotalAllocatedAllPeers))) + stats.Record(mctx, metrics.GraphsyncSendingTotalPendingAllocations.M(int64(st.OutgoingResponses.TotalPendingAllocations))) + stats.Record(mctx, metrics.GraphsyncSendingPeersPending.M(int64(st.OutgoingResponses.NumPeersWithPendingAllocations))) + + case <-stopStats: + return + } + } + }() + + return nil + }, + OnStop: func(ctx context.Context) error { + close(stopStats) + return nil + }, + }) + return gs, nil } } From 32a855b984e8ae24c4543d933aa2609c5b51cdec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 19:22:32 +0200 Subject: [PATCH 55/72] Fix lint --- node/modules/graphsync.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/node/modules/graphsync.go b/node/modules/graphsync.go index 079bc7ba5..36f7dfbf2 100644 --- a/node/modules/graphsync.go +++ b/node/modules/graphsync.go @@ -2,17 +2,19 @@ package modules import ( "context" - "github.com/filecoin-project/lotus/metrics" + "time" + + "go.opencensus.io/stats" + "go.uber.org/fx" + "github.com/ipfs/go-graphsync" graphsyncimpl "github.com/ipfs/go-graphsync/impl" gsnet "github.com/ipfs/go-graphsync/network" "github.com/ipfs/go-graphsync/storeutil" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" - "go.opencensus.io/stats" - "go.uber.org/fx" - "time" + "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/helpers" From d2e9d21031011a6a677cb42a5ca79965ead113d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 19:45:25 +0200 Subject: [PATCH 56/72] Gather graphsync metrics on provider side as well --- node/modules/graphsync.go | 81 +++++++++++++++++++----------------- node/modules/storageminer.go | 2 + 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/node/modules/graphsync.go b/node/modules/graphsync.go index 36f7dfbf2..724c57ef0 100644 --- a/node/modules/graphsync.go +++ b/node/modules/graphsync.go @@ -4,15 +4,14 @@ import ( "context" "time" - "go.opencensus.io/stats" - "go.uber.org/fx" - "github.com/ipfs/go-graphsync" graphsyncimpl "github.com/ipfs/go-graphsync/impl" gsnet "github.com/ipfs/go-graphsync/network" "github.com/ipfs/go-graphsync/storeutil" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" + "go.opencensus.io/stats" + "go.uber.org/fx" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/config" @@ -56,43 +55,47 @@ func Graphsync(parallelTransfersForStorage uint64, parallelTransfersForRetrieval } }) - stopStats := make(chan struct{}) - lc.Append(fx.Hook{ - OnStart: func(context.Context) error { - go func() { - t := time.NewTicker(10 * time.Second) - for { - select { - case <-t.C: - - st := gs.Stats() - stats.Record(mctx, metrics.GraphsyncReceivingPeersCount.M(int64(st.OutgoingRequests.TotalPeers))) - stats.Record(mctx, metrics.GraphsyncReceivingActiveCount.M(int64(st.OutgoingRequests.Active))) - stats.Record(mctx, metrics.GraphsyncReceivingCountCount.M(int64(st.OutgoingRequests.Pending))) - stats.Record(mctx, metrics.GraphsyncReceivingTotalMemoryAllocated.M(int64(st.IncomingResponses.TotalAllocatedAllPeers))) - stats.Record(mctx, metrics.GraphsyncReceivingTotalPendingAllocations.M(int64(st.IncomingResponses.TotalPendingAllocations))) - stats.Record(mctx, metrics.GraphsyncReceivingPeersPending.M(int64(st.IncomingResponses.NumPeersWithPendingAllocations))) - stats.Record(mctx, metrics.GraphsyncSendingPeersCount.M(int64(st.IncomingRequests.TotalPeers))) - stats.Record(mctx, metrics.GraphsyncSendingActiveCount.M(int64(st.IncomingRequests.Active))) - stats.Record(mctx, metrics.GraphsyncSendingCountCount.M(int64(st.IncomingRequests.Pending))) - stats.Record(mctx, metrics.GraphsyncSendingTotalMemoryAllocated.M(int64(st.OutgoingResponses.TotalAllocatedAllPeers))) - stats.Record(mctx, metrics.GraphsyncSendingTotalPendingAllocations.M(int64(st.OutgoingResponses.TotalPendingAllocations))) - stats.Record(mctx, metrics.GraphsyncSendingPeersPending.M(int64(st.OutgoingResponses.NumPeersWithPendingAllocations))) - - case <-stopStats: - return - } - } - }() - - return nil - }, - OnStop: func(ctx context.Context) error { - close(stopStats) - return nil - }, - }) + graphsyncStats(mctx, lc, gs) return gs, nil } } + +func graphsyncStats(mctx helpers.MetricsCtx, lc fx.Lifecycle, gs dtypes.Graphsync) { + stopStats := make(chan struct{}) + lc.Append(fx.Hook{ + OnStart: func(context.Context) error { + go func() { + t := time.NewTicker(10 * time.Second) + for { + select { + case <-t.C: + + st := gs.Stats() + stats.Record(mctx, metrics.GraphsyncReceivingPeersCount.M(int64(st.OutgoingRequests.TotalPeers))) + stats.Record(mctx, metrics.GraphsyncReceivingActiveCount.M(int64(st.OutgoingRequests.Active))) + stats.Record(mctx, metrics.GraphsyncReceivingCountCount.M(int64(st.OutgoingRequests.Pending))) + stats.Record(mctx, metrics.GraphsyncReceivingTotalMemoryAllocated.M(int64(st.IncomingResponses.TotalAllocatedAllPeers))) + stats.Record(mctx, metrics.GraphsyncReceivingTotalPendingAllocations.M(int64(st.IncomingResponses.TotalPendingAllocations))) + stats.Record(mctx, metrics.GraphsyncReceivingPeersPending.M(int64(st.IncomingResponses.NumPeersWithPendingAllocations))) + stats.Record(mctx, metrics.GraphsyncSendingPeersCount.M(int64(st.IncomingRequests.TotalPeers))) + stats.Record(mctx, metrics.GraphsyncSendingActiveCount.M(int64(st.IncomingRequests.Active))) + stats.Record(mctx, metrics.GraphsyncSendingCountCount.M(int64(st.IncomingRequests.Pending))) + stats.Record(mctx, metrics.GraphsyncSendingTotalMemoryAllocated.M(int64(st.OutgoingResponses.TotalAllocatedAllPeers))) + stats.Record(mctx, metrics.GraphsyncSendingTotalPendingAllocations.M(int64(st.OutgoingResponses.TotalPendingAllocations))) + stats.Record(mctx, metrics.GraphsyncSendingPeersPending.M(int64(st.OutgoingResponses.NumPeersWithPendingAllocations))) + + case <-stopStats: + return + } + } + }() + + return nil + }, + OnStop: func(ctx context.Context) error { + close(stopStats) + return nil + }, + }) +} diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index b32cbe9e0..1a2dfc19f 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -408,6 +408,8 @@ func StagingGraphsync(parallelTransfersForStorage uint64, parallelTransfersForRe graphsyncimpl.MaxLinksPerIncomingRequests(config.MaxTraversalLinks), graphsyncimpl.MaxLinksPerOutgoingRequests(config.MaxTraversalLinks)) + graphsyncStats(mctx, lc, gs) + return gs } } From b7fe165b8f31baf2eb845556f57959de20c05f25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Oct 2021 19:57:47 +0200 Subject: [PATCH 57/72] metrics: More correct units in graphsync metrics --- metrics/metrics.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/metrics/metrics.go b/metrics/metrics.go index 5dcc248e6..56e2e77f5 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -60,15 +60,15 @@ var ( GraphsyncReceivingPeersCount = stats.Int64("graphsync/receiving_peers", "number of peers we are receiving graphsync data from", stats.UnitDimensionless) GraphsyncReceivingActiveCount = stats.Int64("graphsync/receiving_active", "number of active receiving graphsync transfers", stats.UnitDimensionless) GraphsyncReceivingCountCount = stats.Int64("graphsync/receiving_pending", "number of pending receiving graphsync transfers", stats.UnitDimensionless) - GraphsyncReceivingTotalMemoryAllocated = stats.Int64("graphsync/receiving_total_allocated", "amount of block memory allocated for receiving graphsync data", stats.UnitDimensionless) - GraphsyncReceivingTotalPendingAllocations = stats.Int64("graphsync/receiving_pending_allocations", "amount of block memory on hold being received pending allocation", stats.UnitDimensionless) + GraphsyncReceivingTotalMemoryAllocated = stats.Int64("graphsync/receiving_total_allocated", "amount of block memory allocated for receiving graphsync data", stats.UnitBytes) + GraphsyncReceivingTotalPendingAllocations = stats.Int64("graphsync/receiving_pending_allocations", "amount of block memory on hold being received pending allocation", stats.UnitBytes) GraphsyncReceivingPeersPending = stats.Int64("graphsync/receiving_peers_pending", "number of peers we can't receive more data from cause of pending allocations", stats.UnitDimensionless) GraphsyncSendingPeersCount = stats.Int64("graphsync/sending_peers", "number of peers we are sending graphsync data to", stats.UnitDimensionless) GraphsyncSendingActiveCount = stats.Int64("graphsync/sending_active", "number of active sending graphsync transfers", stats.UnitDimensionless) GraphsyncSendingCountCount = stats.Int64("graphsync/sending_pending", "number of pending sending graphsync transfers", stats.UnitDimensionless) - GraphsyncSendingTotalMemoryAllocated = stats.Int64("graphsync/sending_total_allocated", "amount of block memory allocated for sending graphsync data", stats.UnitDimensionless) - GraphsyncSendingTotalPendingAllocations = stats.Int64("graphsync/sending_pending_allocations", "amount of block memory on hold from sending pending allocation", stats.UnitDimensionless) + GraphsyncSendingTotalMemoryAllocated = stats.Int64("graphsync/sending_total_allocated", "amount of block memory allocated for sending graphsync data", stats.UnitBytes) + GraphsyncSendingTotalPendingAllocations = stats.Int64("graphsync/sending_pending_allocations", "amount of block memory on hold from sending pending allocation", stats.UnitBytes) GraphsyncSendingPeersPending = stats.Int64("graphsync/sending_peers_pending", "number of peers we can't send more data to cause of pending allocations", stats.UnitDimensionless) // chain From 9ba7f372cd4352d6b70149e2f01968d13bebe8d8 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 19 Oct 2021 17:47:43 -0700 Subject: [PATCH 58/72] Shed: Add a util to find miner based on peerid --- cmd/lotus-shed/main.go | 1 + cmd/lotus-shed/miner-peerid.go | 117 +++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 cmd/lotus-shed/miner-peerid.go diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index 21971a628..a982fcf23 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -59,6 +59,7 @@ func main() { signaturesCmd, actorCmd, minerTypesCmd, + minerPeeridCmd, minerMultisigsCmd, splitstoreCmd, fr32Cmd, diff --git a/cmd/lotus-shed/miner-peerid.go b/cmd/lotus-shed/miner-peerid.go new file mode 100644 index 000000000..3ccfb429b --- /dev/null +++ b/cmd/lotus-shed/miner-peerid.go @@ -0,0 +1,117 @@ +package main + +import ( + "context" + "fmt" + "io" + + "github.com/libp2p/go-libp2p-core/peer" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + "github.com/filecoin-project/lotus/chain/consensus/filcns" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/state" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/node/repo" + "github.com/filecoin-project/specs-actors/v4/actors/util/adt" + "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" + "github.com/urfave/cli/v2" + "golang.org/x/xerrors" +) + +var minerPeeridCmd = &cli.Command{ + Name: "miner-peerid", + Usage: "Scrape state to find a miner based on peerid", Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + Action: func(cctx *cli.Context) error { + ctx := context.TODO() + + if cctx.NArg() != 2 { + return fmt.Errorf("must pass peer id and state root") + } + + pid, err := peer.Decode(cctx.Args().Get(0)) + if err != nil { + return fmt.Errorf("failed to parse input as a peerId: %w", err) + } + + sroot, err := cid.Decode(cctx.Args().Get(1)) + if err != nil { + return fmt.Errorf("failed to parse state root: %w", err) + } + + fsrepo, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return err + } + + lkrepo, err := fsrepo.Lock(repo.FullNode) + if err != nil { + return err + } + + defer lkrepo.Close() //nolint:errcheck + + bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + mds, err := lkrepo.Datastore(context.Background(), "/metadata") + if err != nil { + return err + } + + cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) + defer cs.Close() //nolint:errcheck + + cst := cbor.NewCborStore(bs) + store := adt.WrapStore(ctx, cst) + + tree, err := state.LoadStateTree(cst, sroot) + if err != nil { + return err + } + + err = tree.ForEach(func(addr address.Address, act *types.Actor) error { + if act.Code == builtin5.StorageMinerActorCodeID { + ms, err := miner.Load(store, act) + if err != nil { + return err + } + + mi, err := ms.Info() + if err != nil { + return err + } + + if mi.PeerId != nil && *mi.PeerId == pid { + fmt.Println(addr) + } + } + return nil + }) + if err != nil { + return xerrors.Errorf("failed to loop over actors: %w", err) + } + + return nil + }, +} From 3f7b15b59845497faf4a3c43e405bdaebc92f3ea Mon Sep 17 00:00:00 2001 From: jennijuju Date: Wed, 20 Oct 2021 17:22:22 -0700 Subject: [PATCH 59/72] Resolve Conflicts --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5902ecd58..3bdb9b377 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,5 @@ # Lotus changelog -<<<<<<< HEAD -======= # v1.13.0 / 2021-10-18 Lotus v1.13.0 is a *highly recommended* feature release for all lotus users(i.e: storage providers, data brokers, application developers and so on) that supports the upcoming @@ -95,7 +93,6 @@ This feature release includes the latest functionalities and improvements, like | @jennijuju | 1 | +2/-2 | 1 | | @swift-mx | 1 | +1/-1 | 1 | ->>>>>>> releases # v1.12.0 / 2021-10-12 This is a mandatory release of Lotus that introduces [Filecoin Network v14](https://github.com/filecoin-project/community/discussions/74#discussioncomment-1398542), codenamed the Chocolate upgrade. The Filecoin mainnet will upgrade at epoch 1231620, on 2021-10-26T13:30:00Z. @@ -147,6 +144,9 @@ Note that this release is built on top of lotus v1.11.3. Enterprising users like - Extend FaultMaxAge to 6 weeks for actors v6 on test networks only ([filecoin-project/lotus#7421](https://github.com/filecoin-project/lotus/pull/7421)) ## Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| | @ZenGround0 | 12 | +4202/-2752 | 187 | | @arajasek | 25 | +4567/-854 | 190 | | @laudiacay | 4 | +1276/-435 | 37 | From 9369c54f54ad6b8b112aeab917be1795b04d1686 Mon Sep 17 00:00:00 2001 From: jennijuju Date: Wed, 20 Oct 2021 17:52:52 -0700 Subject: [PATCH 60/72] rename a fil plus cmd upon request --- cli/filplus.go | 4 ++-- documentation/en/cli-lotus.md | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cli/filplus.go b/cli/filplus.go index 007071ea2..02aac0b7b 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -220,8 +220,8 @@ var filplusCheckClientCmd = &cli.Command{ } var filplusCheckNotaryCmd = &cli.Command{ - Name: "check-notaries-datacap", - Usage: "check notaries remaining bytes", + Name: "check-notary-datacap", + Usage: "check a notary's remaining bytes", Action: func(cctx *cli.Context) error { if !cctx.Args().Present() { return fmt.Errorf("must specify notary address to check") diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index c3f45b533..0622e3c54 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -1117,12 +1117,12 @@ USAGE: lotus filplus command [command options] [arguments...] COMMANDS: - grant-datacap give allowance to the specified verified client address - list-notaries list all notaries - list-clients list all verified clients - check-client-datacap check verified client remaining bytes - check-notaries-datacap check notaries remaining bytes - help, h Shows a list of commands or help for one command + grant-datacap give allowance to the specified verified client address + list-notaries list all notaries + list-clients list all verified clients + check-client-datacap check verified client remaining bytes + check-notary-datacap check a notary's remaining bytes + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -1183,13 +1183,13 @@ OPTIONS: ``` -### lotus filplus check-notaries-datacap +### lotus filplus check-notary-datacap ``` NAME: - lotus filplus check-notaries-datacap - check notaries remaining bytes + lotus filplus check-notary-datacap - check a notary's remaining bytes USAGE: - lotus filplus check-notaries-datacap [command options] [arguments...] + lotus filplus check-notary-datacap [command options] [arguments...] OPTIONS: --help, -h show help (default: false) From 95d294db6320fbfb1075e39dacf5f6d0ceb38640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 26 Oct 2021 19:11:00 +0100 Subject: [PATCH 61/72] rename vm#make{=>Account}Actor(). --- chain/vm/mkactor.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index b0d6b454d..ea49abff3 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -68,7 +68,7 @@ func TryCreateAccountActor(rt *Runtime, addr address.Address) (*types.Actor, add return nil, address.Undef, aerrors.Escalate(err, "unsupported network version") } - act, aerr := makeActor(av, addr) + act, aerr := makeAccountActor(av, addr) if aerr != nil { return nil, address.Undef, aerr } @@ -95,7 +95,7 @@ func TryCreateAccountActor(rt *Runtime, addr address.Address) (*types.Actor, add return act, addrID, nil } -func makeActor(ver actors.Version, addr address.Address) (*types.Actor, aerrors.ActorError) { +func makeAccountActor(ver actors.Version, addr address.Address) (*types.Actor, aerrors.ActorError) { switch addr.Protocol() { case address.BLS, address.SECP256K1: return newAccountActor(ver), nil From 1f339f623e0be1e085f616daf5fea49f37b66b5a Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 26 Oct 2021 14:36:19 -0400 Subject: [PATCH 62/72] update to proof v10.1.0 --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 4e75bb4a2..791238933 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 4e75bb4a20d185bc912939c60fdcdc6c41fd8e60 +Subproject commit 7912389334e347bbb2eac0520c836830875c39de From 18834de7d00ba6cf54f9a417856282c7bad7e6a2 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 26 Oct 2021 19:32:16 -0400 Subject: [PATCH 63/72] parse attofil to fil --- chain/types/fil.go | 8 ++++++++ cli/wallet.go | 4 ++-- cmd/lotus-miner/actor.go | 4 ++-- cmd/lotus-shed/actor.go | 4 ++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/chain/types/fil.go b/chain/types/fil.go index 21125e6d6..4c26414a9 100644 --- a/chain/types/fil.go +++ b/chain/types/fil.go @@ -3,6 +3,7 @@ package types import ( "encoding" "fmt" + "github.com/filecoin-project/go-state-types/abi" "math/big" "strings" @@ -122,6 +123,13 @@ func ParseFIL(s string) (FIL, error) { return FIL{r.Num()}, nil } + +func ParseAttoFilToFIL(atto abi.TokenAmount) string { + vfil := big.NewFloat(0) + vfil.Add(vfil, new(big.Float).SetInt(atto.Int)) + return new(big.Float).Quo(vfil, big.NewFloat(float64(build.FilecoinPrecision))).String() + " FIL" +} + func MustParseFIL(s string) FIL { n, err := ParseFIL(s) if err != nil { diff --git a/cli/wallet.go b/cli/wallet.go index f7ad79e77..f70af7926 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -647,9 +647,9 @@ var walletMarketWithdraw = &cli.Command{ return err } - fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) + fmt.Printf("Successfully withdrew %s \n", types.ParseAttoFilToFIL(withdrawn)) if withdrawn.LessThan(amt) { - fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amt) + fmt.Printf("Note that this is less than the requested amount of %s \n", types.ParseAttoFilToFIL(amt)) } } diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index c5c9f572a..a5ea16804 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -306,9 +306,9 @@ var actorWithdrawCmd = &cli.Command{ return err } - fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) + fmt.Printf("Successfully withdrew %s \n", types.ParseAttoFilToFIL(withdrawn)) if withdrawn.LessThan(amount) { - fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amount) + fmt.Printf("Note that this is less than the requested amount of %s FIL\n", types.ParseAttoFilToFIL(amount)) } } diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index 822159bb4..16d90d4a1 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -151,9 +151,9 @@ var actorWithdrawCmd = &cli.Command{ return err } - fmt.Printf("Successfully withdrew %s FIL\n", withdrawn) + fmt.Printf("Successfully withdrew %s \n", types.ParseAttoFilToFIL(withdrawn)) if withdrawn.LessThan(amount) { - fmt.Printf("Note that this is less than the requested amount of %s FIL\n", amount) + fmt.Printf("Note that this is less than the requested amount of %s \n", types.ParseAttoFilToFIL(amount)) } } From 0fc123944521dda7a020989f7f1956e11546e839 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 26 Oct 2021 19:42:57 -0400 Subject: [PATCH 64/72] make jen --- chain/types/fil.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/types/fil.go b/chain/types/fil.go index 4c26414a9..79f67fb95 100644 --- a/chain/types/fil.go +++ b/chain/types/fil.go @@ -3,10 +3,11 @@ package types import ( "encoding" "fmt" - "github.com/filecoin-project/go-state-types/abi" "math/big" "strings" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/build" ) @@ -123,7 +124,6 @@ func ParseFIL(s string) (FIL, error) { return FIL{r.Num()}, nil } - func ParseAttoFilToFIL(atto abi.TokenAmount) string { vfil := big.NewFloat(0) vfil.Add(vfil, new(big.Float).SetInt(atto.Int)) From 47b82bdaea468786c0bcc3b32579adbdf7c0d630 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 26 Oct 2021 19:53:53 -0400 Subject: [PATCH 65/72] update to actor v6.0.1 to make the logs less noisy --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 6fefa376a..5f0f954a1 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/filecoin-project/specs-actors/v3 v3.1.1 github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 - github.com/filecoin-project/specs-actors/v6 v6.0.0 + github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index 440ed0c9a..e95e6d261 100644 --- a/go.sum +++ b/go.sum @@ -393,6 +393,8 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNP github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.0 h1:i+16MFE8GScWWUF0kG7x2RZ5Hqpz0CeyBHTpnijCJ6I= github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= +github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= From 724dfc6a4de077ecb92a81301539080cdf6210a5 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 26 Oct 2021 20:10:18 -0400 Subject: [PATCH 66/72] tidy --- api/api_full.go | 2 +- go.sum | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 3628a1441..158590b0d 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -291,7 +291,7 @@ type FullNode interface { // // UX ? - // MethodGroup: Wallet + // MethodGroup: WalletF // WalletNew creates a new address in the wallet with the given sigType. // Available key types: bls, secp256k1, secp256k1-ledger diff --git a/go.sum b/go.sum index e95e6d261..95320beba 100644 --- a/go.sum +++ b/go.sum @@ -391,8 +391,6 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIP github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= -github.com/filecoin-project/specs-actors/v6 v6.0.0 h1:i+16MFE8GScWWUF0kG7x2RZ5Hqpz0CeyBHTpnijCJ6I= -github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= From dc6bd2b0152fdd931161822374f10e9839b78b93 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 26 Oct 2021 20:51:40 -0400 Subject: [PATCH 67/72] use existing util --- chain/types/fil.go | 8 -------- cli/wallet.go | 4 ++-- cmd/lotus-miner/actor.go | 6 +++--- cmd/lotus-shed/actor.go | 6 +++--- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/chain/types/fil.go b/chain/types/fil.go index 79f67fb95..21125e6d6 100644 --- a/chain/types/fil.go +++ b/chain/types/fil.go @@ -6,8 +6,6 @@ import ( "math/big" "strings" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/lotus/build" ) @@ -124,12 +122,6 @@ func ParseFIL(s string) (FIL, error) { return FIL{r.Num()}, nil } -func ParseAttoFilToFIL(atto abi.TokenAmount) string { - vfil := big.NewFloat(0) - vfil.Add(vfil, new(big.Float).SetInt(atto.Int)) - return new(big.Float).Quo(vfil, big.NewFloat(float64(build.FilecoinPrecision))).String() + " FIL" -} - func MustParseFIL(s string) FIL { n, err := ParseFIL(s) if err != nil { diff --git a/cli/wallet.go b/cli/wallet.go index f70af7926..9faa10677 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -647,9 +647,9 @@ var walletMarketWithdraw = &cli.Command{ return err } - fmt.Printf("Successfully withdrew %s \n", types.ParseAttoFilToFIL(withdrawn)) + fmt.Printf("Successfully withdrew %s \n", types.FIL(withdrawn)) if withdrawn.LessThan(amt) { - fmt.Printf("Note that this is less than the requested amount of %s \n", types.ParseAttoFilToFIL(amt)) + fmt.Printf("Note that this is less than the requested amount of %s \n", types.FIL(amt)) } } diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index a5ea16804..6c4611327 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -257,7 +257,7 @@ var actorWithdrawCmd = &cli.Command{ amount = abi.TokenAmount(f) if amount.GreaterThan(available) { - return xerrors.Errorf("can't withdraw more funds than available; requested: %s; available: %s", amount, available) + return xerrors.Errorf("can't withdraw more funds than available; requested: %s; available: %s", types.FIL(amount), types.FIL(available)) } } @@ -306,9 +306,9 @@ var actorWithdrawCmd = &cli.Command{ return err } - fmt.Printf("Successfully withdrew %s \n", types.ParseAttoFilToFIL(withdrawn)) + fmt.Printf("Successfully withdrew %s \n", types.FIL(withdrawn)) if withdrawn.LessThan(amount) { - fmt.Printf("Note that this is less than the requested amount of %s FIL\n", types.ParseAttoFilToFIL(amount)) + fmt.Printf("Note that this is less than the requested amount of %s\n", types.FIL(amount)) } } diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index 16d90d4a1..7ddc79b18 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -104,7 +104,7 @@ var actorWithdrawCmd = &cli.Command{ amount = abi.TokenAmount(f) if amount.GreaterThan(available) { - return xerrors.Errorf("can't withdraw more funds than available; requested: %s; available: %s", amount, available) + return xerrors.Errorf("can't withdraw more funds than available; requested: %s; available: %s", types.FIL(amount), types.FIL(available)) } } @@ -151,9 +151,9 @@ var actorWithdrawCmd = &cli.Command{ return err } - fmt.Printf("Successfully withdrew %s \n", types.ParseAttoFilToFIL(withdrawn)) + fmt.Printf("Successfully withdrew %s \n", types.FIL(withdrawn)) if withdrawn.LessThan(amount) { - fmt.Printf("Note that this is less than the requested amount of %s \n", types.ParseAttoFilToFIL(amount)) + fmt.Printf("Note that this is less than the requested amount of %s \n", types.FIL(amount)) } } From 5a5a6f9cd2ad266f813e8a3f4476d0d73a72eb4a Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 26 Oct 2021 22:31:32 -0400 Subject: [PATCH 68/72] lotus v1.13.1-rc1 --- CHANGELOG.md | 65 +++++++++++++++++++++++++++ build/openrpc/full.json.gz | Bin 25453 -> 25453 bytes build/openrpc/miner.json.gz | Bin 10467 -> 10467 bytes build/openrpc/worker.json.gz | Bin 2713 -> 2713 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 69 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bdb9b377..40053f0ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,70 @@ # Lotus changelog +# v1.13.1-rc1 / 2021-10-26 + +This is the first release candidate for lotus optional release v1.13.1. More detailed changelog will be updated later. + +> For release related questions, leave a comment at https://github.com/filecoin-project/lotus/issues/7567. + +- github.com/filecoin-project/lotus: + - fix the withdrawn amount unit ([filecoin-project/lotus#7563](https://github.com/filecoin-project/lotus/pull/7563)) + - rename vm#make{=>Account}Actor(). ([filecoin-project/lotus#7562](https://github.com/filecoin-project/lotus/pull/7562)) + - update to actor v6.0.1 to make the logs less noisy ([filecoin-project/lotus#7566](https://github.com/filecoin-project/lotus/pull/7566)) + - update to proof v10.1.0 ([filecoin-project/lotus#7564](https://github.com/filecoin-project/lotus/pull/7564)) + - To make Deep happy ([filecoin-project/lotus#7546](https://github.com/filecoin-project/lotus/pull/7546)) + - Shed: Add a util to find miner based on peerid ([filecoin-project/lotus#7544](https://github.com/filecoin-project/lotus/pull/7544)) + - misc: back-port v1.13.0 back to master ([filecoin-project/lotus#7537](https://github.com/filecoin-project/lotus/pull/7537)) + - Show prepared tasks in sealing jobs ([filecoin-project/lotus#7527](https://github.com/filecoin-project/lotus/pull/7527)) + - Expose per-state sector counts on the prometheus endpoint ([filecoin-project/lotus#7541](https://github.com/filecoin-project/lotus/pull/7541)) + - Collect and expose graphsync metrics ([filecoin-project/lotus#7542](https://github.com/filecoin-project/lotus/pull/7542)) + - unpin the yamux dependency ([filecoin-project/lotus#7532](https://github.com/filecoin-project/lotus/pull/7532)) + - Inline codegen ([filecoin-project/lotus#7495](https://github.com/filecoin-project/lotus/pull/7495)) + - Add storage-id flag to proving check ([filecoin-project/lotus#7479](https://github.com/filecoin-project/lotus/pull/7479)) + - Update to go-fil-markets v1.13.3 ([filecoin-project/lotus#7538](https://github.com/filecoin-project/lotus/pull/7538)) + - add missing build constraint to statfs_unix.go ([filecoin-project/lotus#7531](https://github.com/filecoin-project/lotus/pull/7531)) + - Fix used sector space accounting after AddPieceFailed ([filecoin-project/lotus#7530](https://github.com/filecoin-project/lotus/pull/7530)) + - Don't remove sector data when moving data into a shared path ([filecoin-project/lotus#7494](https://github.com/filecoin-project/lotus/pull/7494)) + - fix: support node instantiation in external packages ([filecoin-project/lotus#7511](https://github.com/filecoin-project/lotus/pull/7511)) + - releases -> master ([filecoin-project/lotus#7507](https://github.com/filecoin-project/lotus/pull/7507)) + - FilecoinEC: Improve a log message ([filecoin-project/lotus#7499](https://github.com/filecoin-project/lotus/pull/7499)) + - Make chocolate back to master ([filecoin-project/lotus#7493](https://github.com/filecoin-project/lotus/pull/7493)) + - update to go-fil-markets v1.13.2 ([filecoin-project/lotus#7489](https://github.com/filecoin-project/lotus/pull/7489)) + - itests: retry deal when control addr is out of funds ([filecoin-project/lotus#7454](https://github.com/filecoin-project/lotus/pull/7454)) + - Stop adding Jennifer's $HOME to lotus docs ([filecoin-project/lotus#7477](https://github.com/filecoin-project/lotus/pull/7477)) + - peerstore@v0.2.9 was withdrawn, let's not depend on it directly ([filecoin-project/lotus#7481](https://github.com/filecoin-project/lotus/pull/7481)) + - Bugfix: withdraw CLIs should depend on network version ([filecoin-project/lotus#7483](https://github.com/filecoin-project/lotus/pull/7483)) + - Bugfix: Use correct startup network versions ([filecoin-project/lotus#7486](https://github.com/filecoin-project/lotus/pull/7486)) + - Dep upgrade pass ([filecoin-project/lotus#7478](https://github.com/filecoin-project/lotus/pull/7478)) + - Normlize selector use within lotus ([filecoin-project/lotus#7467](https://github.com/filecoin-project/lotus/pull/7467)) + - sealing: Improve scheduling of ready work ([filecoin-project/lotus#7335](https://github.com/filecoin-project/lotus/pull/7335)) + - Remove dead example code + dep ([filecoin-project/lotus#7466](https://github.com/filecoin-project/lotus/pull/7466)) + - chore(deps): use tagged github.com/ipld/go-ipld-selector-text-lite ([filecoin-project/lotus#7464](https://github.com/filecoin-project/lotus/pull/7464)) + - Stop indirectly depending on deprecated github.com/prometheus/common ([filecoin-project/lotus#7473](https://github.com/filecoin-project/lotus/pull/7473)) + - Remove obsolete GS testplan - it now lives in go-graphsync ([filecoin-project/lotus#7469](https://github.com/filecoin-project/lotus/pull/7469)) + - sealing: Recover sectors after failed AddPiece ([filecoin-project/lotus#7444](https://github.com/filecoin-project/lotus/pull/7444)) + - Shed: Add a util to find the most recent null tipset ([filecoin-project/lotus#7456](https://github.com/filecoin-project/lotus/pull/7456)) + - Update go-graphsync v0.10.1 ([filecoin-project/lotus#7457](https://github.com/filecoin-project/lotus/pull/7457)) + - restore filters for the build-macos job ([filecoin-project/lotus#7455](https://github.com/filecoin-project/lotus/pull/7455)) + - bump master to v1.13.1-dev ([filecoin-project/lotus#7451](https://github.com/filecoin-project/lotus/pull/7451)) +- github.com/filecoin-project/go-address (v0.0.5 -> v0.0.6): + - fix: reject 64bit addresses ([filecoin-project/go-address#20](https://github.com/filecoin-project/go-address/pull/20)) +- github.com/filecoin-project/go-cbor-util (v0.0.0-20191219014500-08c40a1e63a2 -> v0.0.1): + - Create SECURITY.md ([filecoin-project/go-cbor-util#1](https://github.com/filecoin-project/go-cbor-util/pull/1)) +- github.com/filecoin-project/go-commp-utils (v0.1.1-0.20210427191551-70bf140d31c7 -> v0.1.2): + - ([filecoin-project/go-commp-utils#5](https://github.com/filecoin-project/go-commp-utils/pull/5)) +- github.com/filecoin-project/go-crypto (v0.0.0-20191218222705-effae4ea9f03 -> v0.0.1): + - ([filecoin-project/go-crypto#1](https://github.com/filecoin-project/go-crypto/pull/1)) +- github.com/filecoin-project/go-data-transfer (v1.11.1 -> v1.11.4): + failed to fetch repo +- github.com/filecoin-project/go-fil-markets (v1.13.1 -> v1.13.3): + failed to fetch repo +- github.com/filecoin-project/go-jsonrpc (v0.1.4-0.20210217175800-45ea43ac2bec -> v0.1.5): + - ([filecoin-project/go-jsonrpc#63](https://github.com/filecoin-project/go-jsonrpc/pull/63)) + - add error msg for debug ([filecoin-project/go-jsonrpc#60](https://github.com/filecoin-project/go-jsonrpc/pull/60)) +- github.com/filecoin-project/specs-actors/v6 (v6.0.0 -> v6.0.1): + - Make this log less noisy (#1527) ([filecoin-project/specs-actors#1527](https://github.com/filecoin-project/specs-actors/pull/1527)) + + # v1.13.0 / 2021-10-18 Lotus v1.13.0 is a *highly recommended* feature release for all lotus users(i.e: storage providers, data brokers, application developers and so on) that supports the upcoming diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1c5765efe0dbcb07a8690e6da243d9459b5ef039..835c06f92980aa83310bd0c095db26bbf0736e12 100644 GIT binary patch delta 25389 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 Aa{vGU diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 5bdcf035c3be915b1e1292c2d10c38c3472013f4..2f0b48c3c8a6f0f0f80f11e457850afc60fce3f6 100644 GIT binary patch delta 23 fcmaDH_&9Jv8}s!y(i=O2G&p9g=Uo?apOFCoi)9K@ delta 23 fcmaDH_&9Jv8#DJ^$&H;s8XWtUHg5^J&&U7(fpiKD diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index a35fad110efd21ccec71c8449198f73d9b1f5a44..3914dfec9c3cacdeb524a5d6474f7ebc9c594515 100644 GIT binary patch delta 23 fcmbO!I#YB)BQxjj-i Date: Fri, 29 Oct 2021 13:53:55 +0300 Subject: [PATCH 69/72] update go-libp2p-pubsub to v0.5.6 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5f0f954a1..b44eb9835 100644 --- a/go.mod +++ b/go.mod @@ -113,7 +113,7 @@ require ( github.com/libp2p/go-libp2p-mplex v0.4.1 github.com/libp2p/go-libp2p-noise v0.2.2 github.com/libp2p/go-libp2p-peerstore v0.3.0 - github.com/libp2p/go-libp2p-pubsub v0.5.4 + github.com/libp2p/go-libp2p-pubsub v0.5.6 github.com/libp2p/go-libp2p-quic-transport v0.11.2 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 diff --git a/go.sum b/go.sum index 95320beba..2997154ac 100644 --- a/go.sum +++ b/go.sum @@ -1159,8 +1159,8 @@ github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1 github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= -github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= -github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= +github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= From 2767cdba9c5a1bc291c016ba4a3fa42d1b772b26 Mon Sep 17 00:00:00 2001 From: jennijuju Date: Tue, 2 Nov 2021 15:57:19 +0000 Subject: [PATCH 70/72] v1.13.1-rc2 prep --- build/openrpc/full.json.gz | Bin 25453 -> 25453 bytes build/openrpc/miner.json.gz | Bin 10467 -> 10467 bytes build/openrpc/worker.json.gz | Bin 2713 -> 2713 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 835c06f92980aa83310bd0c095db26bbf0736e12..60ac3231a2fc16a6f5614a258d3c3e55a629216e 100644 GIT binary patch literal 25453 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 literal 25453 zcmV);K!(2`iwFP!00000|LnbKbKAJGKm1itdR|PDQas+`B(6I3l$R{N<0QVeXL8Sp zbMHVTBw*fI#=J8;$O70~#U{h2CI)u(h$h zu{RhFFd5Uq{Vh+#@(jjf%Ht>=-qHTXUp%n+Ya zpAGiEd>arr6II{h0C^OXjY9-IO5P#48Jmd2aG2OYW zIs_<+X!I0(yCPQ{j{(~_Asj^n1_c_yzy1XX4phM_9w8n_L_8USH&OJF@{2eOX~dB) z3Vav;r_0nf`6S#FbUwWz->=A@fBrcb4p=;!!Dv3%9~635Z85;72#n+_faHrYjpV}# zzCi?x^#lVXhP(kz##cnVRb{7;0YW*LBMwFg5fDbyk3HlMWfL9@0&t6i0E`0aU4xi# z9Dua?6&WFq&JY9e2I2sY0(3K0U&7X&qVfiif>)a{`w@M#8|EY2l zA%1vMG=t_EB=Ky7qEa&-u?~}!C?PO(#+TI!$E}p zj&X$i!9I^-BpMDQhP= zkL4dDOkgyBLp*$LL&(qVJItr?2t;T`IRXJD*Ms38j)KAdV9I&O_J93#B8zNzboOhqIi80R z6?FX?2u}9vD4?TXXOM9e{R%_;YZ%eH`TtE2*_hD(?{sT(ds~dD%){h*Jrp~IaT=i$ z!6w@>vWhk;xY<+iWCp`8>RWupf}4z?hrWGpVqXMgijJ)99~m zt2(V-hk!loZyaHN(b`Vi>19=$RMq3#LdU-ROTbeffe4LJgou}|NQG{XPL6v+oO)^& zLrpoKgo6_w5st^W0(Kr@A4FpHF+{k)o(u)!=c>#|>>^LM0ewG0j3FQ3w6zUz!UbX# zn^_GQfH3SeGQ6G8W$?X(-Q-Fz&#R?aF%;JD!PrQ8|Lhl;+X)j{;JOz;W0D=#q z)D*JmMji=&8~iHa-gv$}`UiRl?%Xnex;Ni}J9~Vz!>-XR{EOcG9maDy3;!C;#%Mm? z*&XAZc)l0MXm|T&SHjO^t7@Rw9ZEks&hX+z17~=Lxa9TS7(-HfAzw&UVo~}%f(3D5a26_)j9gC_cw$@qEsaER z0t0Dj5lyIRJA@3qMM!?KmiC!L0%e|78MI-voxLp1L#)0 zg6*~=zCtW?Y2b4@(_Kc9X9f2YDYcumA}7hv#gE&PRh!I^b2ghMk4(C;^IQXqyOc!_ z=Ui3pY1sMC@z5-+FJD^dnkoNVO6N>kvCutp<*oJ3q(cAtr$M@<9-7jU=%cgbfi$oB z04wXOp`40p8&~9te54%hgOjl+5Fr2~q?k?^Bo3)hWHR*{tE*EzD9x2Zy}cl zC08WvQJvf(;KyMg*_bbQ-!BZnfKd=q#_%XW^1!&ed-+MUVAei5{r&jOv1;b>!+cWHTEAC1B*JwBa6jG>VXy zO^J_^FDHlROcoE+WYNrPORsHA6^8-Kz^gI`Tp%yJEm1L9KFB0s)@AyNdAC9+(8rh zBXI%iN2ylJ^pWcWg$>+o)9LzdtGcb)&sLS@7llUdgTd?ZX?m|-HEVkB5J3!g*YR}y zYA-c?)^dr%3!$+rR_JtVy{d8URQrc?qU;0(tm`YFELK~yXb$D z*)NVxj#GQU6_H+LhCi7*YJa$TYi@bh@v`i-4Kqu@$nLfRLD^xu!l2o24aP)4jeO)0 zcZM8a=MZS}G6jnAL4y9aGQ?IstQ`)HPL9iG&7)E1qsdLQgLgg3&@G?N+2qCD^(g|Lz*z?Xto5mU^~B-VS*`yekx2Tbougnw^kK3A~mS)@eg^ zQriSxzoGe4@Z`(a_JTX@rr}~m+HU*16xHLg7V8;xg~JJTHX+UbUK~kNzrwq{3Gc%6 zT1kVRMBcE(x5FJaiAjX~e_oF7$nNB?7dt!t4&B}1f0ONS8;5sy)9A*V z-k`zvuPedORdO|5Af;I}-z=U#p#*##CRU;^t+aCiwAwp8bh0fi*;SK{Z+r{`_$WR9 ze)G@mt!DlySYc{cE(>lX z9OxBlXOmsV*|~R?7K8pgCqIq;lDn`StnIYvRacMrUfkAB)6LV;A#-O2kZ)$Op`#U4 z$~V3;pi~;eVwhB*tigjLga$|gbgXP2WuFdb`goY84+qg4L|eqGcbo1or`#s>(p`>M zC(YRK>bzl2*R1%$p9tjIj7GlLCT9w3Wix;q$HeEhF9UVM(n2bl}DW<;t2arsytw+Qn_s^ zWK3PT)k>TU3_yh~#G2;HEF{|dt}m;!f^km}mq(vhMDY8}ZyFNHrzjc%<)AD#-@feriU9Q=r|F;If3Ju^-+2eR%+R<x?cek$`8&CFqi2HD7|K21ifnsded8k$)&)QRjD|% zS0s1MkXM zvd%GURo%r0mm^Apg&bEkR?TMBT()JjDR~Ptb=|WJvCIG-1DM5|1n3U4?9kBNk$E&n zdScO*W>!C3%!Wiy1~sA{g5-WPlI_i=>v``H^gFT<1pPklpo(_-gK3(oCcYv1GmU$R z2mVyNP_AW)W4Ozw_h5BzH(hKwN6_yqCv{~T51-MTFFu9U?KPgliiX-Bzh;y!keLYy z>bfZo17C)FXLk2Z<)*kInH-hUA@%lww?L53oOFG#(p4?cio-zt*urJMblI~jee24Q zcAH$rFA(o8adl8~4Enq-Nr(+s>ejE^x@?VIY%6E3W%8Ylay$+bKiud+#yz_=ePg-`v$%LA0EEjJ7Cf8|8?knzI%W8_G0@zdqdw{-bEiyZ+`n9KJIQa&&b~S zNvGt_#(285{kqN%)7YZth({RRz~C6c^6a!>e7TnDIA4?$n!)HA@eNV-rj{@^ouwv(Dd6 zE-dls&M@-Ok^F#NHlx|ZVy6Njp^r|E1u|T$$Cynwm_3X(+gUxT=wDK|5eP!U4Tk?g ziQ7%i>A)H5AF4^%Scjzv&cCzK{LbJ!pwL%3)a&6uuF*t++u7C+DkDmFn~IhyVU9kl zfXW8FE%Sh8Lw|J2?PQ>rg#ynP6;tMb%YXh zlyYgukRLKbuI0x4vEm=XI3Fwf+pUXGEVuYuOnjLEsvG-Ds@wRkJTpCG|2sy}{L^@h zqQ(3$>7>y^Hfyj0Pc(+Hz?CIWP|7iww0E&2#p(?L5O^r!5EE&gALd+QGg=vVLJ0z) zHkdtio+uB3mo}OKpFQ$VqXYi*=zN^*rwSM3+{+cm<%^=qXha_{Ig7B@Av4JbOi(TqhQ->WqkGnw1;5VC&1#tAc~LQU8SyFhAO>h~Ws z_NH=}h1FTRAwKbGqCR$=nq&$jKM_lzW`niPSCv~s-v&zRC>JsGoQtOw%9XKU+t``Y z{kGEcw&K3Es?kZu%rmQcq-$v1#iiY1`i!;Sj?CPeu0rbB3a@%=q}C}lZLI8yx7iwP zG0d!zwi&g{=p)uM@{{G<&gyb(%G-+ZoYF~W!cOU=vd!N^zbnC2>q|dSmWS`d!ACf& z{&Fkrx2ivm+@M4X~R!)7`csA%#vAD$z{Xvogr!~HkBd$ zvKW78r|>W9uF#ss6)kd>GCrv`>da3uCVX%ADR`p3i?!)VwOVa_x*A*!I$NJoaxLvo znh-OJM9j3M2?CG${dps)xmuZ5_U?9{ZrQ0p`6t_%*LDBBYP^K{94wwlJk>)m52HAD9-hyImLZS?eLZ(~8*lbWrj1~*lo%8BYsHtf z16SHqv#iqXbrn#W)QF*TpfW?wR43{HLLSobDZ&wmDCOYj_Z*zp zoH-0@?=XuMRa@ydG+(8vaY5tAYg95G?#AA0yw55Ya2nNcnZ2DgQn$U+680vKtkK4e zo@=?|e$UarXv-UP)tf=0tWcdDqz6`z8+!#uD865@Wq!^PJA>GNtEKY74J~V&BM;#l zTlK?P0q(IjRh!%Xdr}Sq!CKqXa6c6? z7p9~M*1c>DMIht%G(YT~6)8mE?{$u7DlsOHIxNU8swiSABK!8hyZYvMc zHse8&zyu0HBR*R(8j1&IqL$PP`wfdy_zHF|+xkZOYSIb0YjJ zS(QQS+Cl8fn;LcNvyAi_O4`NS%EW(idTKrs(y^E_;{&`aKPv)(OFTo2!&xXwY;A5y z9||m}(LXQH-ydm*RLw~bk#4QY97;Ki_KzktMo_4VGtnSbd9DYP4p2eh6_C9rglZt(LRh2 zU_AD&fgdB$8aDa@W6{~eb)s<$;B@Q7PGi)e3u(GQor5o?_3JkCv$VvSTtiR6lV_=a z+oChSv~G`wekR3>wrbXYD6bew4;h($SsHI(-$#4J$+8sDGKK6tNQd%SFtBE&MBV@` zoP)_`SU$H&;u(BIg8*_ArOK1O1RZgGmsB5my@kfblQcJnK6#PrzYCU0Cf-G&Xcvj1 z@QrMUGZ#i%1YY>~m3K_a%WS1*kmc3ewvGJatr}CZ-F}SDQF)x6xkEZX$-ev~*A-~& zHC}?2SKtH0*m7VaYhzV_BkQ4G(2=9u0(cm7jB$jXL*hRl(`bVD^9+m-K*!?%6BRQ` z;CqcpBtW4t2P_^j^mi;5W(2)!OePMmIK1NUio+`ouQ;PO2{ zVZ%k^+5# zJ%UWt?F}HgOyfUeXTPes-un)+H;m&Mp)ki@j!>t*-V~4RWzFT$wbae=;zE42%&19t``_ zJ#sT_sd;EgsWAB^HIe+=h|bL4A1U#)GsPcrODeqn4zg1`!+fy+TK>=rDSdesp&5>6 zi8dhlp-eukHKhH)ze%w9pNqq(NB(Py{`+758Vm=ONr^|J&_|P-Xb10ll%ZQbowLb{ zyX(8~?=jiF9ee-m&2F}*GkVQ$NB-S4yxV1iwyqXx)NQexG42jk_59i3RdYgH`(o(1 zx9LZJY&*{e^&P(rX2{2KiH$IU(fkeZs4qCR_=pVc?HXZ84E2L{fX-_DbwJ$AQZrbI zqrqx3xV`SdxwP!1SzygpY^A3Q>BABO2zS_&M`U;B`sHLNCK2-gc{#o#yOY0O?CkhE zba#jUO}4{r9NyhcqZ@B}g9hKf{;;D|Q^3?rWctzq|7@-(lERvTl-D)4Gz~eL^2#M( zO43FPpi+h>8oF5FlBC0GWU|>2h#13Y_GPW2Bo9Plru1fk_-AU^Qhi8+(eaHda>BtF z;(!4>P7A3AoC0)*yqNbGe#BuJhh-d=S!XQcaDhE8NO0f%K!fWE5B4@|F2d&JTf$J5 z0|>g6=CsvS5gnv8BYC^qk6k09XT`RS+`vuyh8T+txJby%;Kl6}a)~j*2zv;yDUAak zjF7?{V;TW?MG`o{DVV|=1g3a01p&TB0iIIo13CtnctI@q9l!+qNk;OdM?Cx!ppbe~ z)*tj(+dSL%E0{#1Qn{|IFQd84uARVhitvw-bXzso)(vK>6{B~s{cVKGR$3^-&-9NA zMEr{oc{K+7VofViml4#9t5MxhTiNann(}J1JeQK^&LAcX@l-9A#(j)}9&Zvjec0*4 zP9I)peYnULE%)dLc=r~m?bdQJCpCZg1xj~Du#`ttk&`<{?-;#f^y|gw*Hkgst_kDv zL55sB@cly=K=H}j>IB6G+QjCsvVi5RQQ(QiZG$2O4W_On{(l=ypkjcFm4FgW(D#|T zA`CcH$7QkzfF7s)MWtG2Th4vAJgtrKp$Z$+Ia@z+U+bTo-e66I!A?ya3&pkGA%2b+ zif&MOIoU}AqXp}@6xPQZr7l)+v{5yVdUx+KNfX3X#4k9bG2wuY6XrjKTn3Wx;wVCd z2Xhc5m68lCdTt)BP;hqNzIXI)O<)SOGS5+fAVb|k(3G2K1M%{3uJ)Ejxszq@YE+Wl z?Cw-SM5KNs&@J7nqj@?n^2ytW9sI?@ons9)r@OCly0y2r*~|&D<=UAOWKH}mWzVEx zCF)*bkhTh6jxNnC65b&_7Ub3PN6IJGnOdjqIc@KuYI`qhVu>i0^%?W2AHmy>(jck+ zvm`;%|4O8QF*sWZkkWIj|6m{{0hLQx%Yh`Rkuw0UHMLG8IFayBMZ&9^a1An~iN4e? zm{xnCP-vjmIZVF2M6)n}9A!RV^6>{YX=MC`K6>%@svx}H-q)9BR&Ek(y*`Rjlg?ly zc4KdAy)UD#`a2&8%19=*yFC=05lkj$^n&YtWPts4{sMU_z6~%(v&FIJt3ye3IzKQnMg0@Pt4m zLw+33NaMA&CfJ6FbPbG_2(q>nGdc6)I8oI+w9Hjm7C+rsQmz4uoh6DM&N=G3yB05j zUc<=cfnlB3qw(GbMZHJRS8KE)=c_Gh36LjYU19$GjPPX2 zwM*rD{X>HsRYC?m?K$eFY*-7xbL1f$s@>X8^QL6(r^Un5i-XA|LKA_m_rGbbw>{Ln zv+}zXAfk?hs#gfOma&@40=P>9pVOJ{45J^l1h~Ii!9&&vOwBhBcpmj~eQ4KBUe`p8m5luz zl05o^jA^$62BU#i=guR%aWsXPNGoUE5a#E)|~tLD~li^wQv_s^Jia`&F|uhE7!&M)@N^L z^i~>-HV4DON5pSwbZtJmkcpBrlMaopQ6xT>VPaBcRC11;-JKV&U+%ox*?T1O2JXc~ zn~T~8b*3Ao+lso7d7!N^t|*TD4q3btLKWZdYZV%7;Rgj_SWlq%ay!-DQo_dW^=A zhk8t?;AD)GF;2$ZXBp${O3tp-BX3;Y8XJ% zq>cRrIIEa&C)Ax#zh6TA4;WxSo0x(N$;xGD75AvvXf?$;?6pq2PRR1s9v4D@+AX#> zQDjVh*1~(NZbgKU3toAaqiN$={aR7qpbifiU;oo@OMLYQCd7B^;t8h$=L`|C^?Q)z zg_i8&3oj$i3!VNbsa_tdjc_j#TPNdXK*AsZp(>wBd8O4uFu^y7JkDUmj=MVUx;EVP zMO|#?bjP2gFn}KFfx8x3vOR)dlD!ss{ZZ_-JXjm{S|qkXg(`8@Tg;~*QVq-y;qDmT z=|vAiFLGLrlfw^O4!^96tS&`EfMD6mY$td{)jCNl=DaCyLfXL6`4UW07Rf=`p(p;I z)u<0Lz^y3Tn}`!LVYQ{jx-yntvT9up0qd3isxD%*_@M6)KcZxe%b}R8R(o2#V#OP| zpXD->_)sHkXKAgWr=p1rP#q*7w z;ovNa2|A)Q@aZiX?C))+|7E!D(+!Grl59ByQM0A%TwPP&D!^ENn6_8YO7c-ZNbhwO zMrtG6D`u^N;KC=cy7HF$LXR%x<;&M~L5}s-RoJ~N6O*;=t&cG#d~er=m&t~!S=nY6 zMwSq|K&GcX%hY8A-ElzV?<6Z33y~+VtPdC>K8iN3$Vc(@WJWV1x&WBLxeP-vLI83) z!`=q?ogp=Grn@>Oj3emx=Ph(EOp9tElxR;MuO=$N?sn&p1narGUv1V!7?I0NVbX4! zTUV~z+q@Jqq~k>s-OmrWUy_Yz0TW0_O5jX}?G=DYFn)h~mb;)9&N1KF5uF{;IZdv= z%-w1V*3dmpLsN)`8rOSU$NL4589F=K+l6G1z5mEK44oN&j(w;5c6VFxi!5@HV%OPk z&9_8B%_L+Hq>RbF&N1ucWy(|KgM?9TWz4M{Lja^tS(KO zOOy6v@y>Qr(2J$xU08&=unTn2&HAt?!bO*Jlh!dTOe&PI5C*{}B|O!R;;MuE=&j1c*SXC}@oaz#Fi zN?B_RaRJ#jhh;i zphp4q+F>n+njC6c<}A#`5~(_>ZZ=ptt<`C*j{iFT>$KK&R)%((qO$Z5ki{w%OAqE? zn-DBZ*@augUdhw51_4)`D0ZUQiDD;;ohWt&WM@EL8Z+%SMYp*?fmn*2z>=zK>7pj> z#^ZoOzPH=mT}^fQ1H9GJv02!UHBpJb8Uz7m9MEyatrQvoOuQf#8v$SnNb! zwR31&u|r#%{!a3R(HM5U9Vg9 z^*VPW`E={mUR?|vh9?KUe-MTdz3JeGldIk;mvHIX4oL3!g}W86UsOEX)7Sf-l%ioa zYGXN~`*GeW&V!k9SPV!EKoDHRp7Rtz^{-IJ!U)}98na*y1T&!w`QX6!C5DbN51tba zIJ`!RsgG$8&|9IrDPFt}uHwzj9Zwo47@njd$;4AM)Nj?L#N?e&0YzJy6fk3xeDRc; z#K?YftP5O`T#2ZlB2n6C32zqnV_?yXU9lBz(;)ow@aLM=bO13fdIZ-+eD z&QjwnHN9GD+Q*l^&j|l@UCbecEsr4aP+8}(1o*1dOM( z^0VD#(5|McPq>>6w1{^bv2H?%hLTK-RDf3Pf*mD(LJ4eLAL5Bw&9&~uHD<0gc3u`I>%Q9XL?OhyFb7u(vcEWvqyDL=sDm0+ICg+6bnJqDa zZi!KGGzUC_gh5ZtHaI!%1p}u2721}C5}c?YXs-Sv#ccP%mUj=Zn*&Y`I62_tfYU<+ zPTO^{X*1b>c}L#EE`0r;|QJoph%zemKLEB^;XDdowT4K@0k3^;N~Rjh9R4n>{-^H+nfI`enUt z+2HD2uTrkw{=ZV4tInI+sa#Iwx-WBFR=L(uiMj808t=opEvsHmiE&DdQ(~MF%&s1c+PeDXG7B=0dI%hk~}D&T6D{ybd~BC=io?de^{@BN-Pe zf&A(vCYWOwfDsIY{$X|PQ;n~rs7xROVT8TDm5TcScgo5|X?Lt3B4vr4bq&DRsBh#p z^vXWN*5=mc)=F+}Iu)dU6=ZGZ)B$`4@EyQ+0RJHZ{1KUHAL;TY1kebu5E1@J4e#8A;e6zA9j1U;dLFTOM4@FCJmFSsJ5KuBf(G`JVh+qV!NIK~{9_x7QqD&)& zy;7BBq+DdR8Ah~&y;K)^3e&EX!^H|k8$IQ|C?5|$Va4m04Z+yoA^r#ImITzSy@afj z#{)|%42p~ustM^h?XE9pB$;XfoY9!bd{=KzPL&dHqe@|7o(RZa9*Q``1cWHU)bHn3 z3F9#00EN_>=3gM%wAbY*JP>^9Vx$vgQkAu#JuR=4+sd1uB z-JqouGrDdNXGXhSrCENAR*GDaK2x^csCU3e9O8f}(^p=Zb4r)vkc&8^v9L??n15$; zGIyf<7!p&sIy1WvAV?is@5}S$;ox`a3~{V|A@t*x$6Cd{+Nv)mSvDG0k>=H7K+ z7vFO&G5W)~(S9F1`O3ad?&5;;YjS=~&acV&HT8t%w;Dq0pQ9PQK`Mn&CrEELuukFi zO}cu6?}fqIhuF_ilLB}FS;eQnfq}B>=t!sIh|Y51_SG2$^gI+M3BMBv&ncL}You-p zOd**dK*`WV!xX=}9cU%!neC$DKkxByZ(+CjC zRibe`A<~av8X-2Nfp3J}59lq5kPk+4Knc1cFrcCl%%{2T^^81Lo7Os0d*5$IyRiHY zOFAs+u%yG1U9seLLs`=w5Q4UtF9kniJ>CdnZuQRpxAnvI{`3~hflcKs@NPrMdI7MOaf3GMufk=bC*<3=?{j|C_P!G)Evf4SyM(HS?hYlS&boda_;ftDB;0ozM9<$cK zFsoXJ3AHP1R~C%F3=1y~1L|F?SKo&N8EQIfL%lph(IpNU;-`@Dt<6nQcw=W+_4X|$Fu;7S zihOS=h6=s6s98tow=xfIq`FkTin-Gn)MIvvnIHF{XqZ#rKW?Wkvbj;V%gU=B2 z3q&}UeUUf_hJ*i(QEb-zgT~$zMdt|l2pO%mM{R0EZFS82aN5@HW_>W{t7F~#)Mi{* zasa}?i7#G`v59vw9p3l|ZTs(}{#SkDcrz_iQNFMe# zjbnA&M5uZI@V3(+51NpX&un!_Z4U?w;5HJ*spQ|z> zOeSjeWYOo44{+Mr1~}mW%d>--iX;JnKDZhJ2#%ly?)sa)u&*+2ow9@pFawj zF9UHO8eH722_2TOH!)Y|2>SER%sy?Qj_W7j4m>IG`o+9FZM^|K7LjQeHgAq%su*fnHm$qtT2pqjQxjcAZnIO&I$}yuvx2?IWPoj%ifF4b4dBx3L{qyo3#rb$ zwrH*1t33K^x{P;gu20L)`w`uq!MQ;8-4=6Je_1{0%U5k6y9kjd6eZoRm7~9BMr~OS$}O=KaFRj>N0|k#J>q|J$0OL%IqtyYG-}_~G32nbH@LlzdX*pG z2TU#ym-TEs`Y!Pdol@`m1H5Zl0e8-s(oqgnD!B$TD=WGAmusZtriT_x9bEk=r8n!< zHu-5kTQ50H^!*N->2d5^=_+cOMmCzD&Y#e}AM5)sRm0H_(j2)dTY8W1WNLZSr^OAN z3*<$JpG64I^o6HR-|zxY2vi`W)vPYHa4zM8Zu9)Z_;`=lZs!@5S@Eqd^d8*a6IXrVMwg%r>zmF~#=hn-n>ttGOJMhcW z!)nuK_1hQ|pM|3ChKw=j>n5~CaWv;h2B9f9Venka&IQ~eqpAUYgw1rpUX#2odq&sH^d-vZ=nYY??oQL}_4)Uh^bX16lRGI%3z-m>rCD zFxJ6X2V)(KbuiY!*dGUDe+orakX47i`x)`@))j}oZVLTi0x224a(N6Yn^_irK2;FY z3Sr6)tI_2Wure8j3+CXUq=S+UN;)X%pya)Tl9h3K%SaGKNaDR}ZM*XFtWgw~cfS*Jf|lj88)&6G-Dv_3ZRdzq-N z(yymt7nA{Mbs-x-n!wk6hfN!>>2Po{r4b*)Am|bz%&6S)Rz_RU>Cmx5#||AoMs)m8 z3y%I_k)dyvc1z3M=S{u5szkgIRUPkSeg5m?aj#?HLJKlSsbqO{Bp;2 z?zqlD8V6|{q*+@?<2=7s=lSJA2)Gae)?j?MCd%doha4Svo)Ff*q4ptt3-#L{1YhFt z0*R{ag8dfyT~Vmt^5~kK94F7O$fHE< zh4o-XZBM&>SW3|!?yxD3$nMVd%gIhmBIN(`a(qX2Cx5-z+3|Pi?hgN(Y=_%8yt|u5 zH{SFH4ZeT{!fKc)r-GyQe0sWd!AqUj+;t1SgKE(tC zlwOaZcMXu3qyqcoGS7E^tTXpPR^~b)74y#dc^x_<@<5_iAG8N!D`&E8IV=__wH8$F-lSP4)pX1}CV7Yd%v|baFf>#V;O>LLW_Tq8+^JQHE~$bj~I(?ym2`zsF?zcI^GL zH@n%M&geD29r<_H@NSp2whVX6V`+@LLsdP0HvH9`(6&9<+jU!6ER*lp)o9oyjiy?E zt*a%A{fC$f9qL&sfS@6m%B(K`(uUD}V3Q;4mzhe}py(giL^SpY_@^A}xhFr)n>);p zsE-Ewo5R7m6uZ>~yo2m_Ccf}%#k7tnlMN)&skiTtb|k0g5Hj=@p+iNNc=G86MQ<3# zGbq-M@j@ciGels(=jNkJoJ{^X8pkAQ`I2%Ns8I|y)oC8`V$tSh1Qn}vOTvChyb(w< zl>^{Lj(#{ejw7h{_}*svpISgum^&VhM;;7qp6;E1LEucEq8(`W}^tC`s;sdR@sCs#YbrZ)1{$a4o((#dfF5Hb=(Ha$dM? zIZLc~WBWmFY$?34Bhl&{UG?dZxkKh1k-0g4sWfV1)k+1I<>yt>%cgK520KlB)c`Yb zmodT8rmCuFK(7{4lY>zmwoNiqZFfP64cnyUC_=f`-KMCoZOtld*|v=YWVWqm;L(o8 z*8Ki)%-AvG-k7o0v|H}tht0$v+WoheHEBPTU0oX5ed)d0@n|~N#DY}Z@^B+d%RPhP z7xf{&DwCURWbyHa*<-`GbanIXPpOL|v^fdMk!YS#^C<#QJ-(e%hSX67(?=d)g!nB& z>I{P4QhkUb%YdVkV|GO@KOKMC2NzQs2R`6a%m9bi$q5L!Mso%*VH`pK|L^U{!Z`!} zOlQC*Q?>gtYnIWyn(370y0(~&jht_8ZSU+2WO5w8M;q;X1bei+8%EPZ7(n@Bu&ECE zLdXS&JmdasVh4PZ>1kJMiCYa14T`*~Nl2tbCXT!~fE<&Fkjz0x zFXB=&b&#aOad?C`F6lKQ>ekU>98&D6$$vQCb_WnrF|PVc`8D*Jp2X-5dK`FJ8NgH_ zItIy?0g#uR<2J6yr9d6pogx-u0FwFb6h$cYo`@)?9t{BILWT?_7sm`x63m5!0Lfw$ zUxvjq`Gx!QuyE(MEqs9U3$xONG5_ABtSIue*EK0C)Gnm6Fzyf^&#c_S;rGkel0Vr_ zl|PwoS@!ZN=3#8X?^Kl@Jm!T zW@dPQ!3cpUCIE^CXgrz98h?BMw}QKAZWu=N2K&edQ+c&edZ~S$A_6=Z1jrxeJ{`El zL9l;Co`X{g{d|2z!w}F&uu=KWizDg4=83NgrU?1~k0ql`YKf+jwlmi^ts-h~wn7hb z)d?Pfb5dt?eHC8$E+JR2H-l62Q^r>n~ot|pF z7R2Esf<6+1fMl+wQSb~u4usrL6N=R8rIC;yBn|@65&)xsde;ny9gln=pt9kru8tCg z+KVVrTD2IeXkl^Xw?Yg-Z>mZrk}E4A${a|6X!-`~W_4*6B2NH6Kdo>JBVV@|A@yS} z*F{2tekzHrABB*S=5mlTB)u$oH5|N4~JyNhvu}P$P~azz}C*3#AJsrHA;yg9MC_LJ^z-hGzne7+#xMElhxq z$73XiL=eBF(KWbHDkj^gpP4Hn`>UED^@0{_Ci_yX*!%=tk(h9-K36(avBSk66sgj+ zG@F=Y2g%77iy)c4E0T3MQga+L6iIIK(b$dxRAG)`kl*Q^WC2jkjP`6DkCDgI=B`M^ z$9S$VSe47`pOVBs#rG0?P|%_0RPwb5+(N>c{z_t5cm@}eL=Ce!Vah%=Lb5qdugJpr zmLvaALsT|`S;_NlzAX>+e6HZnb~Rcbl!JYCsP;u zh-u{6c5+^Bv9AJ42wnhgvBR*V4YXXsB9md8k(gXUSZ_=0=lU)f{$L4hC2*92;A|Hgy4X65UjLTT;f zn>YdZYWItq^M=0%wMZ5@QGVZvW*AZYYGL>I+SNoB5a2}cTiPoFTMr!-BLF`-5yZ87 zrIUaA1P2@N*Iz9qk`Rlok!?3&1W7neJ6^kYc)MRmt5Dpd%*Cx-BKQhb=K9pu?QP|( zlFP#iXoH}w*E4eb%f@4w+9Wj&VVywPU7{3K?7?n%PkW(yp;&M(psu)jLdOzQSM>@I z>L4`SXzcjXP(1*Q`=5i}ispnb{pOj11#689?vX>?Bboxbt{hL`dbT1^lZ6Ryx8JpK z14&To@8Z)e9;JO0=r;DKtT#7{k#ssCV&(g3TC+50>AlfX{*ebYC1*c4&l}2>dQSE> zCM4Zc%<{*2kOf(l(RgR=WvVpl$*^QHu51v~BbM~yQ4=0sY5e$N7NAO9gab#`csjiO zlPy%%Mp_Lovvetiay$hXky4s~*MTD*$(+^z2yha!xVTvsZ8N?zgt0c-a=R5fVQZLE z;^i$;3lCWQW<=aKkR_7>&I-{_`sfzzdhW?d<&d^!P8ZtN&h8wQPJgRl875<3A}D*y zrfCj&vf|z~$Z(ENiLo!am=w?;9xOb-Au*Q6)yi+~ZSf*yu4-ZT7nnh;Kov{(oK5LI zAl^AlcmzqHnK)4L@`=qP>(*tHRa#eT3`8D~ml2MDU|HLRgU)4og#gm2c^iziFy;Vd z!P8BN5Ows$6 z&&e^YBOHe3Ca2Wd^+11%J=aN(dRJfdy$GYYdvKHUBx|g^rrDc8MYRQ{d%2J}N0rj^jCgY@nlEpfmT$yo%KJeGwKn=xLd9%DSKPSZD^N&2L!Z zgwV2Cvc;y4jm1w+hTAJ~EWcxAWc-EIEicGV*tS>hpQ*&~HDI|sr?}2?&eoK_))~r^ z22z0zxup@C@sB})s0o^7=&1lc)G(?aGVv#jE6N1Ng^}dc^~QXx6ebyIBbPiKP%^dn z2^GMpJy#aEh8g_U3`Iz2c2;G!enc3Kq>)Q_QbMR;fqmWPxsW$A-v z3_eqTQ>XM^oH$AJ*2X-DAGK}-s%x)t@$6&Wun2TCfm;t3KMl;jJi!p4!ZE&AATdY^>6-NYd>;4?X z>iO81tf#Faq?np0*mZa(k$09VysGla*%)`*5%3;q@;QsobwF*GJfS%O? zYHM!?3kOMl+%JVlus04d{A!t|Jyn-JI3K3|HZB%FBtnwVwW#X7G~%FQ;JE(~CLOUH zG^zrCB0PMrFyZK$ZU??rXe20`XhI*twa1Nc-bYB{&!s64`v8vTP>RZ{#}_3#CRP#L z(Or(pqjxN}ckiRnP3EiOqHcx|UoE8nsU-kQ*`QS<`+PyJfunrVXMx31D_W6Zegt*tl(q`JUMFMie4Pk3-~fkePKaFY%bXX$AaZ3{ zA=uMx<`XUJ#W?(8C+vQ37wNGUUJ6r4F7k@y@sHHEobC>bRcq{GOV7mZq>sWmh8B*V zxJA}^Yh3E+Qr-6d3AHtCeU<_$E8(Ml3;%wM3XO8X2~(bc;`)_jgj;ILO*6G?VcPlY zUxOaOWPKmP%4S6|UYP&3UPu_SB^=KzOZW34>a|&42$8gDR-h9J1lZnW_9+z_&}0=Q z16NJ&4QqBD6CR}GHt|aOgknXJ0P-usG!|-c|9RPveyo}qOd(S2O}boo6{J9R-8pV3#kd#BVl+(FSh?m zz5Sx=mo28|^+ew?lcs%eRzr$Ya7fagt-8cy1_cWa%wYwX!M%O3-f3jmZpFhYHQj|+ zBc(3m5AMJ(Z1H6+MYkv8M!Ii78!M?{lHTTYmCPgGQ$yM9CgYT&lH}t8p1Anfqy@Ns z;LurB0)V4@1ptyGkAl>BBR}|bUu4-!J0C?sa8g(Nhy{V(VZM)8>wdWL4@nMyRFNOj z1B|djC8<1lW>@>oN-EP znNQIc)CWWav2HRz1KV{i8oRND=(^_KaD8R$&F=>ob(yz6Q)e6eTCje7cgtyr@_jgR z_Ul@)MyM*{DRlZ&hi4z_&W zKoPFhiCO_ffTv}RY|ek26>kvv9ZNp#Z7C`JxN2uU)^oci-M?Cobd)w~tVg3fG&^57 z85eao{_5Ozob%Ry5almaEj0*?0)#QHE#}i`0?=ZNBM%^%bUyVr)<@e;)}7=8>Ei?a zVZnUPIoQyljH_-i!RY!4P9VN0MotnY!gO@@F1#Z}oT9gnwf zNrv>V_*C%j+W9U{y2-@^F^a`Xkq@tJ&kJNt^JpD+6FUqMw8&w{953gk?i&cd<4>Zb zLqdQAakj@}**dcu;ef65uz~}9nC|6K|dxkH>em0ON#(Q|JewBAbsD-8HkYN&7lFb1mfSD|PN-jCY%@sl^;zHr|qfOsKH>M5AX;P&CxTeh@r{ zpfCswTcx6J8Joih${`j0;*&9%=KF`}2qjZgRz#|ECO@BELYs(O?2P!v+_YESlDsW~ zmE-?|s&T=JLu;ubF>@BQgOctDTfPX&u*C6D<4O-U2*D7E(hp)fQ}Mk6+Z%9e1D7~u>6d!U{ltX?FXz({ zzj#s8>dNX7{2_Rv<3?+|@b6Q`uhiESKwHbq{k8-$ss=5hQ_op9GyLOjV)tHND-nX>Zd{}5${A#|x zvaX9~VD%KRPYg^Is$#KN*x1uz3VKqE(9@68v5#M&H%Y^tB&>ioB-|Fm7a9g^e`Bkr zk;_&7O(rD{7lYO}h-ggu6o0Q&)^&DfI&=^P@(RDuLvq6n1`ip!v#$6R~muWRenuaoX9F0WWfX|VD_y+!-E z1No(-pJlKewUn?9jML#UFkOCJaQiSS(MFc)7}&odF`KN30PXyXr#yEm~eDXi_)$2&0{nW~3}4O9fA^TN0-$SGkyN zWmHd*YO`L`2=rWT6z}aw9(@0FTgraT*qGsuVCjnY@|_@?flujW!C+ zJyWEDcjTH`-R(rB{lok4n+5dB9)a2L3w11l`HaT^jO|aLZ-Ab{D}!9HRPb{vR0??fHC3vK<0|O=e{#FXeqZKw|MP{*JdGq!Iua2EF0t4o3_JRRwrn^o+l{MrH z;Rk-;Cl*seCzB`p+-Mwhhdy^3>vQ#Kj_V{@_2SJejTP*d+ei;)QZnlLNQP9 zR@K(!PYY54M@4z?OC)X&O45$(%>RKT4t7tdXgZXu38PQKHt_%!KnRJlM77(~z(MS*VpUv* z0HQLU1BzZ~{{yW3?$LKMqy~1cqR?dcIn=OM(8wm@YkI&bYF z87Z}3jHS+$;P4QJ|EOmsYGLKsiv}D0cAQ`0>VwzhXUifdjX8h_S{Q~548S1qDB=PJ zE$z?6eTfsee(;17_&t@RKWHkjc%}vWH6O?Y9;J_Y^Lek4sFML$T@|wBP4+e+v`}bk z`;*;#$&MJtkk{ws&{bjgdHLZ?yXF52>k1r4wROH2i@!ZUaS1i&4i9#r8?S`- z__}(@M(}=mc{74;))0sq_2u6`;<>oJJ0f7%CIzVc2;*}=D>y>l^`P;ry#|6a#GqyV zC7jJtE6{up#hN5FF;MoGE0Cpd3DM z&3`OFW%XMo?H9B~NJ7CLZ!r?u63&s^yBL?lS4e3o>9Yz2!nu66b5Yo%OO&Kkm-oix z+gY&d!qGW*L{qAzZwFdbQ~k4(>jFtcGb=Lg>Z`%Tf6vQdpYZ(Kvd>UUw7KG!K==c} z;Y_M26KjfL-A8JSe|=3K>0!07(tLo+#pGtcMSz-N<0mO2do@#qwbKmiOLT&son+CF z)~R*m&V44o6}i_! z;;A#v(48(}mYbhJzd*dX(pBz&f<$-dZ8!(1d_DXWQ@DP;&*Di!VD;+W=l2$%>j6qu zncX^$Hc(n|Oh{J7Q1Y7UgY#M@LxC(KLz7b$cb2*3D>s41UZ&$aV};^1%3NF( z1*o+Sh*A3zIP;04%bPtojpu(OF`o3xy2F zzde!2&Dhl3KapX z$VbYQ89xDQ>KktE=0$`{yn@AYN3xFoz&Jgx-dv456>45Suwhg(T6~EXOqAuHD1zw? zRA#xPIdN65x@zi}AHgl$Q&%O@xQE{&*Y`~C4aJ(1uhxNXj#NydtagA*iET~2lP+gv zMk$@1VWS!=8ssP3)?KD{LW7WF`#7SyDzJpj-UN@oXLKk=LlK4%<@|03<&uy?2r$Qe zHVyUg5A`{w!^q6b30xo)enVe3?O=8>5y>O!FG_BZxb10Yn~9tqr7EMnBZ*Nt`{jAZmlQ zs7INoMoCbjw6~kvDSdTm)`wf>$Zy>==S6SK^oktPkG$_SQon1a-r!hwhDCQyX}fpy zo&5T#3+L|x=uaH?lB0nlg1v?Q>K43=jJy^u#>iQZ#>5R;hsc(7UEAF|xMqS&SQB&2 z!cHnjQ*?h;(ch`NG~0{;MA5_03s3yXz{FY-!mNfMIjJ* zhi60sRIzyzA>*F~U==`*GbE&GY0{xpZtWq+P(IPYLVL}yvAUZ(+h1r7{tN&p_+LC_ zx@~ToXPq9dh*+_}1tyacPASmrR*`-UHS6QC6zaq$w8dvi>WT*8S^L_jGg3F4q^&dS z_EFCHh9Siel>I}+Z6*{2m1$`)?exulzAKUr%1v5#>N7K2A`(+@jK-WAb7ne$KBMGU zhHe%L@KvUHHBu)k!CwMO7ozv>X@QUw{8_Z_f9JvgL@?j1E}~2s1!P_lG3yxPu%gy$ zd~%eO`*%(qYK{hK>9)XD;|&RpAub%hVHqkB7V%X`zVA@9t}c1SB{|>)+CX#pkc-Z>yAU>i9f=!QqCY#31*OCpNKmz zGepKoj^VvTc)&e=+nYzml^TJWa|#44@h8MZ!#9$!8jbhKkJYAnx}DqC4mMASH#jBQ z>QWKnjtz@9Jb9ihPjpz8y6h0co4UchJ)EQ~dj>w=WAQ8JwI5`SsC(SU`W z?B_>t9`bdI(!Qn%eilzU`n1Qm5b0?4yEK-NBsE$EyHusIvhm_B z3|fe?8OWFn!?Fex{&41SNgR+R+klkUe#j1y#FfZph|PW;JV_8Ni#wCM(16@4E6O-i z-E-mZpQ?*ga2HP~{(88HmI_^{EGIFvAaJN-k(1)7#PiAwzQ9x`&v8RnDz%Q~%I{(x zLzf+L|J|t1Fq$1a_!@3(Mqp0&s9-QS6eB*?rE9ISvyG2d-}MjpwmsH( z_eQZVigR+vF+x_6XI1__S?s_Zmr|&e8+ED*#Z#Xo3&CYUG_`geEHk0<20GMV)k-tv zAfd7@b-#XpbVLh-#G$Xfr+(CR0Viz|1DB}JVr9gr02q70Z-J;hUenh|>Z`gP1a30v zWgfrx<{ibO2O`#0J>ZL_y(dN-uQDZ;zl|F}|DajSt;ZqJ%Lvk3cl}o}ND?i{K8XsW zax{F~@a*bwoC$T^F!_~BJ0Lp-_N7n3^EvA}dA0c~JRUh3VqYJf;SF{`K*72pN*CPN zfSFmQvSccuW(b)dJ&0T|_VeUhDJltkdk4Pb9Ly#0^n9AF%M@lsoa}GspUvAv*tgx+ zUp-)Lt}Mi1EV9f>_HM}M|Czg~e-lHU_?XmF zo5t@?#!ykoQ5}Eb(^f*Zsi}xvukJl?9S~^o@bGeC$rQ7s2swCf{atEmv_A0rlc+oB z)ZM{1CYlDiw(BxgA@cvvfh__A26B|0j>@IviwhiO{3slwmgTq zdMP4p;L70{Ef*@|)ifoo`~Sq)0+`v% zh$ATv8pjTFgKZ5i%hoS_=I8MW%}Vyfwq$>-JJoB^9M2m{O zU>-O+6A!FWDe}3Zv5K2JbF!Ej7ZZsCFeAXnIefX^EIGU4VB{5^>-QPHZ57yvlR?27 z`4xj+Qe^@L-tLK3y(z5)vDQ6i>Z0sSxxhGE?+t~-uEWI6AH}zECO`3z3ed??_-OO; zw+D;gUj4&vKROzM(>a&9ga*ijU(sL_JkC+iT$&k~e+$7V-aR3H>MNUrNX}E-VjC>$ zHrV#XQvL!$qshj3cky@ZzJvLlJ9&e-vrk&ia=%QoWU1_J6 z-o`+!wa>@m8oz`I-q$WBPy|?Gnp@>OY@Q-WLA{thDo0h+f8L&HMjiVbt*U{qI-p(1 zhyI7wrtgTj&#{$DSIxDWqM&O4FQ6nd_1DmkUp=-hE!7>m1-6OXbGgqqq}X~IwT{Pj zo37$p-hp>33;oO4oEMwcnO*Ieh_$<1%Bknd1#SaR$Wyqb60GZ&LsgB!S4H4rZ!Q=y zyuXB_=xq{gY610yX=rHw{P^~Tta5kNAJ&F1PgF);Q8Ok7$;$M;^{H=ioaY!!4yWCJ zDdz!u;q~9&Ysgm$Hw$bI)HvP>G$H4j8}Z6ypN$!tCbdO~M(9_ai+cK^3E97IBe9qM zYSwd!2L7r_Ud4dYR@dKFuFiDA?N(^+RqxO_V{&5sU$zHOUSm^z1P_Eca!9XAnMv}T`8ulAEV z)%>uJZH<54B%QSz8Tvp6bLIQIhaIHfv~_hmzD3w;e%Ho6j~=Wn0D|X@PBs;qv$9J| zH5}9bM&kV&#^z}Y1SE)fhyG-+Fe8nD;(|u<{QD5yeag7|=aB8%2PA$6Fa=0q{80)K zz@u7h?Q>~-;POC0QDla0nNBnKb6E2%y7u|X)x6y4IjYpr3SJcrXUqJ$kG>NtpyV4R zIGWJNXUIFt=vIG^&{0q;@oq`AVg;ljs zd_3@m^d!tWCaJQgmN=2xw@ndJSI5BYyr(FnJ7^0e(qwkAP3l!~9@rP88QY`0lT718 z+HuPX1`WWUC**q0bVJ;Y{E#SFgTTjDCKM8Xo6M= zQ+q%r&v@V7hVanblGA|Cp0a_bfv972&~|&zQ2E!{Y>lgd0bf4)k8!uV=>zj(+BP}O zRl%n^?e^|i74u5^)re}}HMQ36j^o0;mbT9*W>}_Yz&^oS_q1U~Wh4M`(!u11yGy-~a#s diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 2f0b48c3c8a6f0f0f80f11e457850afc60fce3f6..455dcfba79fb47297f5af331d9b7602f8cfe7771 100644 GIT binary patch delta 22 dcmaDH_&9JvJClsW#?BxOj>>=yCL#A3831ef2vYz6 delta 22 ecmaDH_&9JvJJTEKjh#Un95dGQt_!)($N&I(bP0O^ diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 3914dfec9c3cacdeb524a5d6474f7ebc9c594515..9897980db8c575a35b9ef87f079f1fcb6ea0dab2 100644 GIT binary patch delta 21 ccmbO!I#YB)Gh_3{7G5q6iKEw5BdZt~08=yu^Z)<= delta 21 dcmbO!I#YB)Gh^?@7G5rnOS|TOi>zW`003MF2u1(^ diff --git a/build/version.go b/build/version.go index 43b71fac7..edcedc1d6 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.13.1-rc1" +const BuildVersion = "1.13.1-rc2" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 84a1e5f9e..c7dd4cf77 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.13.1-rc1 + 1.13.1-rc2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 60407ba02..0bfd9fa6c 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.13.1-rc1 + 1.13.1-rc2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 40add5a03..db68f06e4 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.13.1-rc1 + 1.13.1-rc2 COMMANDS: daemon Start a lotus daemon process From 34df787be6cd3652cea484cfd1bfeb8f394854ed Mon Sep 17 00:00:00 2001 From: jennijuju Date: Tue, 2 Nov 2021 16:27:17 +0000 Subject: [PATCH 71/72] update the changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40053f0ec..44be59ea2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ This is the first release candidate for lotus optional release v1.13.1. More det - Update go-graphsync v0.10.1 ([filecoin-project/lotus#7457](https://github.com/filecoin-project/lotus/pull/7457)) - restore filters for the build-macos job ([filecoin-project/lotus#7455](https://github.com/filecoin-project/lotus/pull/7455)) - bump master to v1.13.1-dev ([filecoin-project/lotus#7451](https://github.com/filecoin-project/lotus/pull/7451)) + - update go-libp2p-pubsub to v0.5.6 (([filecoin-project/lotus#7451](https://github.com/filecoin-project/lotus/pull/7451))) - github.com/filecoin-project/go-address (v0.0.5 -> v0.0.6): - fix: reject 64bit addresses ([filecoin-project/go-address#20](https://github.com/filecoin-project/go-address/pull/20)) - github.com/filecoin-project/go-cbor-util (v0.0.0-20191219014500-08c40a1e63a2 -> v0.0.1): From f6131ce3b56a45b5212fbf05f0c834e959d08f8e Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 26 Nov 2021 16:33:39 -0500 Subject: [PATCH 72/72] v1.13.1 prep --- CHANGELOG.md | 139 +++++++++++++++------------ build/openrpc/full.json.gz | Bin 25453 -> 25449 bytes build/openrpc/miner.json.gz | Bin 10467 -> 10464 bytes build/openrpc/worker.json.gz | Bin 2713 -> 2709 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 82 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4102bebc0..04471452f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,70 +1,87 @@ # Lotus changelog -# v1.13.1-rc2 / 2021-11-02 +# v1.13.1 / 2021-11-26 -This is the second release candidate for lotus optional release v1.13.1. More detailed changelog will be updated later. +This is an optional Lotus v1.13.1 release. -> For release related questions, leave a comment at https://github.com/filecoin-project/lotus/issues/7567. +## New Features +- Shed: Add a util to find miner based on peerid ([filecoin-project/lotus#7544](https://github.com/filecoin-project/lotus/pull/7544)) +- Collect and expose graphsync metrics ([filecoin-project/lotus#7542](https://github.com/filecoin-project/lotus/pull/7542)) +- Shed: Add a util to find the most recent null tipset ([filecoin-project/lotus#7456](https://github.com/filecoin-project/lotus/pull/7456)) -- github.com/filecoin-project/lotus: - - fix the withdrawn amount unit ([filecoin-project/lotus#7563](https://github.com/filecoin-project/lotus/pull/7563)) - - rename vm#make{=>Account}Actor(). ([filecoin-project/lotus#7562](https://github.com/filecoin-project/lotus/pull/7562)) - - update to actor v6.0.1 to make the logs less noisy ([filecoin-project/lotus#7566](https://github.com/filecoin-project/lotus/pull/7566)) - - update to proof v10.1.0 ([filecoin-project/lotus#7564](https://github.com/filecoin-project/lotus/pull/7564)) - - To make Deep happy ([filecoin-project/lotus#7546](https://github.com/filecoin-project/lotus/pull/7546)) - - Shed: Add a util to find miner based on peerid ([filecoin-project/lotus#7544](https://github.com/filecoin-project/lotus/pull/7544)) - - misc: back-port v1.13.0 back to master ([filecoin-project/lotus#7537](https://github.com/filecoin-project/lotus/pull/7537)) - - Show prepared tasks in sealing jobs ([filecoin-project/lotus#7527](https://github.com/filecoin-project/lotus/pull/7527)) - - Expose per-state sector counts on the prometheus endpoint ([filecoin-project/lotus#7541](https://github.com/filecoin-project/lotus/pull/7541)) - - Collect and expose graphsync metrics ([filecoin-project/lotus#7542](https://github.com/filecoin-project/lotus/pull/7542)) - - unpin the yamux dependency ([filecoin-project/lotus#7532](https://github.com/filecoin-project/lotus/pull/7532)) - - Inline codegen ([filecoin-project/lotus#7495](https://github.com/filecoin-project/lotus/pull/7495)) - - Add storage-id flag to proving check ([filecoin-project/lotus#7479](https://github.com/filecoin-project/lotus/pull/7479)) - - Update to go-fil-markets v1.13.3 ([filecoin-project/lotus#7538](https://github.com/filecoin-project/lotus/pull/7538)) - - add missing build constraint to statfs_unix.go ([filecoin-project/lotus#7531](https://github.com/filecoin-project/lotus/pull/7531)) - - Fix used sector space accounting after AddPieceFailed ([filecoin-project/lotus#7530](https://github.com/filecoin-project/lotus/pull/7530)) - - Don't remove sector data when moving data into a shared path ([filecoin-project/lotus#7494](https://github.com/filecoin-project/lotus/pull/7494)) - - fix: support node instantiation in external packages ([filecoin-project/lotus#7511](https://github.com/filecoin-project/lotus/pull/7511)) - - releases -> master ([filecoin-project/lotus#7507](https://github.com/filecoin-project/lotus/pull/7507)) - - FilecoinEC: Improve a log message ([filecoin-project/lotus#7499](https://github.com/filecoin-project/lotus/pull/7499)) - - Make chocolate back to master ([filecoin-project/lotus#7493](https://github.com/filecoin-project/lotus/pull/7493)) - - update to go-fil-markets v1.13.2 ([filecoin-project/lotus#7489](https://github.com/filecoin-project/lotus/pull/7489)) - - itests: retry deal when control addr is out of funds ([filecoin-project/lotus#7454](https://github.com/filecoin-project/lotus/pull/7454)) - - Stop adding Jennifer's $HOME to lotus docs ([filecoin-project/lotus#7477](https://github.com/filecoin-project/lotus/pull/7477)) - - peerstore@v0.2.9 was withdrawn, let's not depend on it directly ([filecoin-project/lotus#7481](https://github.com/filecoin-project/lotus/pull/7481)) - - Bugfix: withdraw CLIs should depend on network version ([filecoin-project/lotus#7483](https://github.com/filecoin-project/lotus/pull/7483)) - - Bugfix: Use correct startup network versions ([filecoin-project/lotus#7486](https://github.com/filecoin-project/lotus/pull/7486)) - - Dep upgrade pass ([filecoin-project/lotus#7478](https://github.com/filecoin-project/lotus/pull/7478)) - - Normlize selector use within lotus ([filecoin-project/lotus#7467](https://github.com/filecoin-project/lotus/pull/7467)) - - sealing: Improve scheduling of ready work ([filecoin-project/lotus#7335](https://github.com/filecoin-project/lotus/pull/7335)) - - Remove dead example code + dep ([filecoin-project/lotus#7466](https://github.com/filecoin-project/lotus/pull/7466)) - - chore(deps): use tagged github.com/ipld/go-ipld-selector-text-lite ([filecoin-project/lotus#7464](https://github.com/filecoin-project/lotus/pull/7464)) - - Stop indirectly depending on deprecated github.com/prometheus/common ([filecoin-project/lotus#7473](https://github.com/filecoin-project/lotus/pull/7473)) - - Remove obsolete GS testplan - it now lives in go-graphsync ([filecoin-project/lotus#7469](https://github.com/filecoin-project/lotus/pull/7469)) - - sealing: Recover sectors after failed AddPiece ([filecoin-project/lotus#7444](https://github.com/filecoin-project/lotus/pull/7444)) - - Shed: Add a util to find the most recent null tipset ([filecoin-project/lotus#7456](https://github.com/filecoin-project/lotus/pull/7456)) - - Update go-graphsync v0.10.1 ([filecoin-project/lotus#7457](https://github.com/filecoin-project/lotus/pull/7457)) - - restore filters for the build-macos job ([filecoin-project/lotus#7455](https://github.com/filecoin-project/lotus/pull/7455)) - - bump master to v1.13.1-dev ([filecoin-project/lotus#7451](https://github.com/filecoin-project/lotus/pull/7451)) - - update go-libp2p-pubsub to v0.5.6 (([filecoin-project/lotus#7451](https://github.com/filecoin-project/lotus/pull/7451))) -- github.com/filecoin-project/go-address (v0.0.5 -> v0.0.6): - - fix: reject 64bit addresses ([filecoin-project/go-address#20](https://github.com/filecoin-project/go-address/pull/20)) -- github.com/filecoin-project/go-cbor-util (v0.0.0-20191219014500-08c40a1e63a2 -> v0.0.1): - - Create SECURITY.md ([filecoin-project/go-cbor-util#1](https://github.com/filecoin-project/go-cbor-util/pull/1)) -- github.com/filecoin-project/go-commp-utils (v0.1.1-0.20210427191551-70bf140d31c7 -> v0.1.2): - - ([filecoin-project/go-commp-utils#5](https://github.com/filecoin-project/go-commp-utils/pull/5)) -- github.com/filecoin-project/go-crypto (v0.0.0-20191218222705-effae4ea9f03 -> v0.0.1): - - ([filecoin-project/go-crypto#1](https://github.com/filecoin-project/go-crypto/pull/1)) -- github.com/filecoin-project/go-data-transfer (v1.11.1 -> v1.11.4): - failed to fetch repo -- github.com/filecoin-project/go-fil-markets (v1.13.1 -> v1.13.3): - failed to fetch repo -- github.com/filecoin-project/go-jsonrpc (v0.1.4-0.20210217175800-45ea43ac2bec -> v0.1.5): - - ([filecoin-project/go-jsonrpc#63](https://github.com/filecoin-project/go-jsonrpc/pull/63)) - - add error msg for debug ([filecoin-project/go-jsonrpc#60](https://github.com/filecoin-project/go-jsonrpc/pull/60)) +## Improvements +- Show prepared tasks in sealing jobs ([filecoin-project/lotus#7527](https://github.com/filecoin-project/lotus/pull/7527)) +- To make Deep happy ([filecoin-project/lotus#7546](https://github.com/filecoin-project/lotus/pull/7546)) +- Expose per-state sector counts on the prometheus endpoint ([filecoin-project/lotus#7541](https://github.com/filecoin-project/lotus/pull/7541)) +- Add storage-id flag to proving check ([filecoin-project/lotus#7479](https://github.com/filecoin-project/lotus/pull/7479)) +- FilecoinEC: Improve a log message ([filecoin-project/lotus#7499](https://github.com/filecoin-project/lotus/pull/7499)) +- itests: retry deal when control addr is out of funds ([filecoin-project/lotus#7454](https://github.com/filecoin-project/lotus/pull/7454)) +- Normlize selector use within lotus ([filecoin-project/lotus#7467](https://github.com/filecoin-project/lotus/pull/7467)) +- sealing: Improve scheduling of ready work ([filecoin-project/lotus#7335](https://github.com/filecoin-project/lotus/pull/7335)) +- Remove dead example code + dep ([filecoin-project/lotus#7466](https://github.com/filecoin-project/lotus/pull/7466)) + +## Bug Fixes +- fix the withdrawn amount unit ([filecoin-project/lotus#7563](https://github.com/filecoin-project/lotus/pull/7563)) +- rename vm#make{=>Account}Actor(). ([filecoin-project/lotus#7562](https://github.com/filecoin-project/lotus/pull/7562)) +- Fix used sector space accounting after AddPieceFailed ([filecoin-project/lotus#7530](https://github.com/filecoin-project/lotus/pull/7530)) +- Don't remove sector data when moving data into a shared path ([filecoin-project/lotus#7494](https://github.com/filecoin-project/lotus/pull/7494)) +- fix: support node instantiation in external packages ([filecoin-project/lotus#7511](https://github.com/filecoin-project/lotus/pull/7511)) +- Stop adding Jennifer's $HOME to lotus docs ([filecoin-project/lotus#7477](https://github.com/filecoin-project/lotus/pull/7477)) +- Bugfix: Use correct startup network versions ([filecoin-project/lotus#7486](https://github.com/filecoin-project/lotus/pull/7486)) +- Dep upgrade pass ([filecoin-project/lotus#7478](https://github.com/filecoin-project/lotus/pull/7478)) +- Remove obsolete GS testplan - it now lives in go-graphsync ([filecoin-project/lotus#7469](https://github.com/filecoin-project/lotus/pull/7469)) +- sealing: Recover sectors after failed AddPiece ([filecoin-project/lotus#7444](https://github.com/filecoin-project/lotus/pull/7444)) + +## Dependency Updates +- Update go-graphsync v0.10.1 ([filecoin-project/lotus#7457](https://github.com/filecoin-project/lotus/pull/7457)) +- update to proof v10.1.0 ([filecoin-project/lotus#7564](https://github.com/filecoin-project/lotus/pull/7564)) - github.com/filecoin-project/specs-actors/v6 (v6.0.0 -> v6.0.1): - - Make this log less noisy (#1527) ([filecoin-project/specs-actors#1527](https://github.com/filecoin-project/specs-actors/pull/1527)) - +- github.com/filecoin-project/go-jsonrpc (v0.1.4-0.20210217175800-45ea43ac2bec -> v0.1.5): +- github.com/filecoin-project/go-fil-markets (v1.13.1 -> v1.13.3): +- github.com/filecoin-project/go-data-transfer (v1.11.1 -> v1.11.4): +- github.com/filecoin-project/go-crypto (v0.0.0-20191218222705-effae4ea9f03 -> v0.0.1): +- github.com/filecoin-project/go-commp-utils (v0.1.1-0.20210427191551-70bf140d31c7 -> v0.1.2): +- github.com/filecoin-project/go-cbor-util (v0.0.0-20191219014500-08c40a1e63a2 -> v0.0.1): +- github.com/filecoin-project/go-address (v0.0.5 -> v0.0.6): +- unpin the yamux dependency ([filecoin-project/lotus#7532](https://github.com/filecoin-project/lotus/pull/7532) +- peerstore@v0.2.9 was withdrawn, let's not depend on it directly ([filecoin-project/lotus#7481](https://github.com/filecoin-project/lotus/pull/7481)) +- chore(deps): use tagged github.com/ipld/go-ipld-selector-text-lite ([filecoin-project/lotus#7464](https://github.com/filecoin-project/lotus/pull/7464)) +- Stop indirectly depending on deprecated github.com/prometheus/common ([filecoin-project/lotus#7473](https://github.com/filecoin-project/lotus/pull/7473)) + +## Others +- fix the changelog ([filecoin-project/lotus#7594](https://github.com/filecoin-project/lotus/pull/7594)) +- v1.13.1-rc2 prep ([filecoin-project/lotus#7593](https://github.com/filecoin-project/lotus/pull/7593)) +- lotus v1.13.1-rc1 ([filecoin-project/lotus#7569](https://github.com/filecoin-project/lotus/pull/7569)) +- misc: back-port v1.13.0 back to master ([filecoin-project/lotus#7537](https://github.com/filecoin-project/lotus/pull/7537)) +- Inline codegen ([filecoin-project/lotus#7495](https://github.com/filecoin-project/lotus/pull/7495)) +- releases -> master ([filecoin-project/lotus#7507](https://github.com/filecoin-project/lotus/pull/7507)) +- Make chocolate back to master ([filecoin-project/lotus#7493](https://github.com/filecoin-project/lotus/pull/7493)) +- restore filters for the build-macos job ([filecoin-project/lotus#7455](https://github.com/filecoin-project/lotus/pull/7455)) +- bump master to v1.13.1-dev ([filecoin-project/lotus#7451](https://github.com/filecoin-project/lotus/pull/7451)) + +Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| +| @magik6k | 27 | +1285/-531 | 76 | +| @ribasushi | 7 | +265/-1635 | 21 | +| @raulk | 2 | +2/-737 | 13 | +| @nonsens | 4 | +391/-21 | 19 | +| @arajasek | 6 | +216/-23 | 14 | +| @jennijuju| 8 | +102/-37 | 29 | +| Steven Allen | 2 | +77/-29 | 6 | +| @jennijuju | 4 | +19/-18 | 11 | +| @dirkmc | 2 | +9/-9 | 4 | +| @@coryschwartz | 1 | +16/-2 | 2 | +| @frrist | 1 | +12/-0 | 2 | +| @Kubuxu | 5 | +5/-5 | 5 | +| @hunjixin | 2 | +6/-3 | 2 | +| @vyzo | 1 | +3/-3 | 2 | +| @@rvagg | 1 | +3/-3 | 2 | +| @hannahhoward | 1 | +3/-2 | 2 | +| Marten Seemann | 1 | +3/-0 | 1 | +| @ZenGround0 | 1 | +1/-1 | 1 | + # v1.13.0 / 2021-10-18 diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 60ac3231a2fc16a6f5614a258d3c3e55a629216e..e70c3507353d44a7a53043d8c8bffe0bba3e6848 100644 GIT binary patch literal 25449 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 J(tL&m{4dWRnHT^7 literal 25453 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 455dcfba79fb47297f5af331d9b7602f8cfe7771..f8ec0f7fb92ef3c0d48f55adb12b21db699ec58f 100644 GIT binary patch delta 10420 zcmV;lC`;GlQQ%RKgnxbGp<}EOTT#n1PCkD#2wd}S@3DWYj&iEEjp6(J?IK znJ#vi1o7vee=g|_S!{?2UU}fB8KW*-qK}v$cgEa}$zFpvfLBfrn3OPd&$?6j-`C(3 zlrOt}qYgl>OWoJt+YPy4cmcfbIbp~p&`w|je*PH{Y|Cah%zs5};}Y-_L0{7lUw6Pe z*ZqyM*~W3G%aFypJn(<{y)>VA<@8?PkcS)c=bwKX9mCtK*U;S>Cx+269O%Ne9OTC3 zQ#RioIMl;pYW&xHO22dr7kL|-@m29>H-%qjUbF8LpZ3fZT0;&G-NUtGBmNy@(d!R} zBjZblcNb_t`+w4<4ssdhEf&!BP{&|f2l3`~{$FG= zw%sw553iBC#so5ydVYqWeYu(2*juIFU=Pl1^!rzW-1pG7=g_?dFu)2$ERK^hBweW|y-u ze6x$+5a@>&CMA!@IZ|?l#J}<1sJ@7dU?}8c2RMC@*2v%$oa1iPuTW@4P4o1A0%moQ znHUGhduN#$PP)^7`dVITswAc~JBIXY%@6`}lz(j2bL3{g{3ad)>;VYECb3};N5jM8 zqv2#Yo_vW0=eK;;%sK8IshM-SLgwwIOYgX(t;L!N2wKLRo1q^i^p6{a&4dlS~<*|1HKYxr>B7rn-7l< zWq-f?t)AMwF-d*ah(n{_;(fuiAn))AnX*S-tKhdZWx^^}U z1(K(R7Ks7SDUr`#<{NA?O#HMk*pt)Fl!oazO2*V2;?;3Cz?;3IX_kWX@ zS(TQh%6gMtM_*?Ybj<;(q_Khpa!9U(LDCS#MPDjKaiZzlEt8$s$if1dIVRBEz9S~J zIDMTMbLgS*D7JmilkIis=!uH^!Ldf%y9hG$7Miykr=GZv0nmwi-w2m7TPd<*K-40; zf?Q4_q~Db%K5B{|9w5|0U@o6gVt*kQuoVKHgG?^9EWoE9@JZ}~>lL~o@+buOgy8|U zf=qM~%W|;hQ^h&j-4KGw5`4vM#oynMi{Gz5&HnTDbo%S3%m2JRoxS_d<>~b=0FgWF zQnKdK@(#LKYRk`o@qA9jL9phKDRX(3>Op{we3NQW- zpid9``7C!%FvHNsf6GNp9!PDy&*Rw z>;?s^nv{6hV;-Ojut3aQalIn+Ht+F29_ap3O*p-+z>{=0-D&y404i#47tEX%*E&q+Mek7 zhPqsZJMu7&{~1s*@aV=hktarWy}};gj44NkJ%IVn$wC(IVp7iQ!Zwg!7t;XNcq!Wl zMoI7+xV}4)Zz;rNfPV#b0lGu(mQU_q8w4DTOa!LqXB}yr*zoV|O*HQz+>O_fAUptF z1PEmyzBqU-3~z?)EyonzQEc6i^WOn98NS18E09MlG=dzL-eI!rf^*_A1T7!B03HK; zLxeT6z^=yt6e0&%93Sif-}qWkK7H{S2?&EO!g0^HH$-;l7=K_URx^&Yi);k_mp**# zfsKb28=H^lD|FXj<4EJpgysr?qkBWn8JOGDy!F6_Fl?tMXn_g#R)Y3g3-B4M zqoZNII=a9f6MqC!FD5Gsrj$h}-Fn6LU<9_jUC3eAvI-Mp$k$FWyd*p>jTh8iOXh)d zx?up?b|4pT3H?eqvkMs!S&ra$Vs8PwgV+|^IZDJnGujn$eqKZO7BMfa64E^1Y%w*>n*1UuA(6(m;Z6S+gKIGJviXw`5V zAY3)zeGsp92rU6W4gnwPj?Uw&^v}JJuL^1d#DA*-yARUUpx+Yi;}GsxcL2@T;e5^4 z@(eOqpG+edI%lAXt?m?CB5=3ZF_?t8vrjOC;-duM`a>>G$xsHoCSgsn1zb*B9wJN} z&?0+rAlu9_S;{#lEXajJ7Qi92E;wfZdtgD`HL}2b3n2KXOx5oI2&U9RCV2IAh0PVf z#DBu3h;D;my|EcK`P%~rnzzUbzrxw$wK%PW;3IFfg5Ii|%ozD*yb*Dfi|t_kH#89( ze)X)?csqo{F`Ey)TeNomOYi@3He0%O{ySeU&~`B#E%0!&9d9;hG`JfX4|TnXxiPw} zZ}WRdp`$^L6uQ7(HoU2{{NcTIr;H!PS$`RCR;U&^nA}sv2v)V@#2Aiy(Rp#q6sLBH zmwOJ!cBw->Xjja!n%WozjOE|DAdtoGHweiS5}7etuERDT`= zS0KX+=&?_Z#U*EzG0Gg}sxxClZ&kW|c7!kgIQwX#i&WwAR5Bd4-rCf>wRch<8BjW1 z5?ZkZiX;OtSF89?tE&_h-h0w7kujTAE`?@pnJlLlWCCXl#23bt$GR93PLVUj_H;^J z1X;K7l=TGix0*$;8`*%C7{K1Ef`5F!WbPkrw=?PGMRH_mp&55!KHO$mq}XS;GlQg% zZ`tGJutz^HRwPadjh?(00B(vwN*}=Qz#(e%TNZgaEHcQ8Ov#W!^9rQQF@Jsb*sJ=7AaFa;yfX$Zhr*h4=Z1RCB8!>dVYQ;n1iwva>cAPmhPyT{{0o5-b+1Q zpHRw0HuVQ*!(S==Hn)Z=wmpk}UcGu~YAM2YDv}sE^No@@wbF;(rC*8D5gmtUmQ_ z^A6SHz}1qBV7tokc?#RT9GVx5H#5t{?aS0L<}F1W7B)E&JtK;qi9h>@Ni6QD-y04( z#z%OceI|=v2Ui1hjBC6`9)oL#x9Io!9pl}-gE> z)`N~AVvSFXe-XR)?|<3bl}Y}wLjU{o&&ET=i%|TbRw*Xoqgp0DCpjCXdL-twWRH4* zTw)wMvsxpC^nTQbV%S-op>9;}E`KZ;lKFPa0;TYYc%puH zq$V!mc8v%VGjIoOF4i*-&xz?G=piBVt4Z(-_)-C|y3d!3o{f*Xssv3;P)#ZKLPW$s zbAT^-#Lu=t(5{_Wqyp4Pc99BjGuz_~vTdGGn`hMK89lOO8fxMuB#&NTkHvjZ^$xi- zu=JGUjPUSAPOl53| zs{$;(QLJu9oyAvKF`f&$tc}(ii0{d?+$E^+nVCQ@q|DDu@aJMrnr4G^ZJ?hXjr zWsUCl&|?MDE7tG|dC0w!mU%U7&dHo^h&4UEQm#9{*1(aAzMqbJ*dusK)LW_#jAB5}foqu+&;8zh6T%iZ0tU6kO!y%N^8Ye;` z%%R%Nz*P;<_zfea9VWi-^1N6$t8S|={*KD=7$+ppp()3sehPm8d-_Nd@*mlV4Wu0F zfa$F1^jUr&WqBt-a^>vmGKt5&SzY+Wng;gc6a_DVzrxZk(`UancOVPSo`Edr7}JgG zR)3Ds@a<6(;d=IH$&p^5B{a8}E@jlD8q+w>c)gStJk~R|9zS+vH^Wd|*Hv+IC1hXC zgP1B?oC`#jtfcn+eX;NmtKyI-1lP1q_E7)boPCj2v1*nb5kYUhh8EVQ%mf-7)BKi9q9iTLN=MyjoG zGVX={s~F$8lm2+7e!&fo7p8^=LuRvjR*rkvXl(4vYYOoA#%Jt`sL zlJJ@mZy7B2UY)1SH~NnGMy(LI7=QH!n%dfuCuX}Av6$(KSO|va^XPTo;^jGE!q`bY z7y>xQ-RTNqBKCS6;EcqhOK4fh3irAl;2f%+7fO;@P8p1<@*^B-+#=!_bL{piMdGto zPT%*8BIi@R?PZ=p@)WVm+8;@R+ndcN3VbwR_l=YTNU^~lM==~UFo?rvJAa5)g#Insu?#?B0}+;i0sP&37H;&|<+LQZ^SS*enGTSlBru@xSeityI(*DnY! zSIjsmJ^_6}XB?y6p(cY>SbsR)2gIi5XUY@nGL)MJQs`oN^^+sIFzTYN-zkrx(;sMr zt`%6fE|(w8<)R?OtN>EBDJ6#FA$k*o_7B&EFuS0p$XN1)T17Lb{>gs&7zLZ|q!dCh)zm`Rt(0O2TQ{p3;(xfe%Hc;=4ti$L zwJNpkjS07Av_vdc@G)cj+8FVd8Xq<4O*A=HQc7N6k4>?~iN0Q7R2Iw*w{~ZNHGX5a z65sZ=?iX^g%2Q>+V@-H}M2+&V9a&KR)d&O1zxK#}A+9a+wam9q=Ii$~5yF=?vX)5N z9rYM520+bpaE`lyVSkg$cQHsgJQoL7jqQ?{s#)$DtsMXz%xMlVHS;pq}>zMR=ywl_ikabwo`&KB^w|*LEtGbzC)H4)m7pqn6hSRy zob+O46q1$dtA8FM2ymsYM$(pTXoC=T(5(Ya{Jhi!?-3L6gLM_F=wC^z*3zNkGtDT_ z0OLowsiW19t%fYpkgcq4WwkG>hnh48UvgmrZT$BxZUhyeN08o$?=>XG(_?7mc`MIb zdEUzNrzFounw$eE!amYFx*x7Nf})-)+AR2 zLexgkLo!A8bmgq({;24_dYIB-BbP(_5MD%k(2nc9fK1GX(7^ zU9U0A3V)jN@;nBmk}UV{nCtp|f8VhBJBAnz&4~BppxRwSE8d@sc+c|9ZV}v7YW`#@ z{L~GRZucau{wkrrjx|YJX(65Ek~;cpP)mPZx|A-OP+fzjRo9?ZU9IYRimFSnOsln8 zt@R?c)}W`!a*X8jrHh)`ctwC}>MqpO_A3I_oPQcijIPyWttNYdnhdr3uvVkJbdA>6 zqz)@Y^{!j72v9AJCMD4nTV6xztifGbVrZ>8Yt`A4Q)dzPl%$gIJh-vaPqRkhRV2LV z!649fmvIbt7cMlUC^Z(}%Gh5RHGax24I z8Gr7}@S!e8enS{uquFNeZ9Ty{wPbi2in@T4>=QQ1tKpP^m{Z6p1-4QxCl%&uxt+yG zLi5C>m|paltsn!?MF0^vxB1sG0c?dmfQiQ-F;REtLQtt8XBI8{zL@Dh8}fPsLz>UQ zUtDHJIb8BW70>wcbi7Ybl;cL4OlN;?Pk-ms&0g?OhS}l(%GydfCQ%&RuGUZrwY`^# zZjGSU2x>LFlsAW(OkAHQXXXl7XBaMbkvSm{o!pTZW52>&AaK6?_K>IK(@+~JSg$}; zFNZQ1Sev!O6}1EgJoz4Qim^5}a)HMnLygs!`+m19$CfCARq|a4iK>@@5~X@un|~+D zXk$&fq?D{d^}=g_W)n9ZGVF~0;Y>N4R!!^r5$fV+xFku)Vu|JXJCUhbs!s@&yyI+CEw$noP*I`ZpDw&XA?4JcZYX^LCW4)A#W+4Vk@{)Ex7#Qa5Nmq zUmR2F$vYIAzvChz0l%8$Kaqp9q4ee&a{kOFPo5TE!3MuSC`REwhtV6+$#;rS2t>w2<+^ z?Q#cIj8w~A2pW)R)uF0Lu74_wIMtQ9a7D=hRlk~K-f;ENktPA%4@wY` zGw&28!-_5V3KTo+;7zEoA2E3g!B|Gr)5%4AFg|hS{AQkAH5boJJ0>*T}+< zA$tovL@ZC-q`}{VwLHX;CU;;F!{yRNOHME1P6XMsdqb{#H##?<0A56$p-29QanNjM zf4P3T6jz$$G_4VtSw$X;13Hz~eGjpXEV%}vsRJ2b!plVe?oWBgW-&qh(OXv6-?6VZ z>%L67C{+UKg&hq{G=B-zaUQ!w#F9rayGbb@j!sUMy;DU2GFLj)zFb9(d$CLkkO~gv zAh5B=09^pbf8)!hKpZj3_vc)?0C7Ht073UGl2U;jYC!hnUfYs+y!_bKj)Zl0RX!1B) zhvyP8dFqb*w}9g(tO^)7?-&)%`<=NrG4jlMrr++z3pehC|Eukcd!lUB*JQbc1Rxe3 z*>D$MdK^qs3={&~FW1EJE?|`iqmVxYTgZ46K+sovd*J({eJ;5nUm<4VUOeHx1{Q+0 z2j*zOe{f~V_ka9ea17Qm)6-_AfhNI5lE_Es-oB^qCuiwGt6r?G3Q*qJlx#0oBsT;l z3wHNV6eX&A4@pT6dvA1nT$g&=Xo-u_aHxrCmrEDsSncX5N&+f&7KQE0`-_sFDCsiF ze5ZzX%8V^fKc%o#`HsRSYWLBcW9s{k!lvKBeUzEHTz?Oes`dABBDG$h?<#Uenh@+1 zgY543NrP&}_mhUYPxp^v1f_&au@fi~G6jAhA#Pe9Q0oJVaqyuwq?<3?6QJ zpfP(|f@{W(4pGYsrHp;l760*5BcwxS;nH;&mIlrluqYB5njv?M31ni!Ny&k^f|zuG zyp7$2!4E?h);6fhQtDdMgaLU8{eT=1ek3D6K*^NB5vWL0ot53 znhnxwHvvzcpU2veX_55OxKCFDQOEH~_fZkMYk)Vy|9Z@e1cDANZ%;nlJhpr`4yKkn zFGjKOkmjf(u2`k#|EF1%xZtEq}{Jo`)=eLukVFhJ~HKMi!WF0R;aBfhC~UvI43jViP)7V0yw(O<>xP<&xD~}xFz_|qi{`ZRQesM;Gmed z$AK=x=EjC@=;di>yO@~7nzst1?SHkJB;T_9(`5O>+>j*i3N3bGb>3gC{?^d>EQ#t1 zCsSx6>k2JOFf|96!^~>9br{;medkzV73r(7%*?d5S(%*k<4LdAi)EjmpNTSe@eK6Q zli`#5b^s#5P42|X&42#*VOg0wK&SwlTc;B7DpgHXWky?1}k}7D}QWu;%*6{ ztbbTkrSi+e`AbX|v;@b?&lJ|25@oGw@Oe0j{Hom_5R)Ebi49!<2$uLREH(w^TX25% z1G##0t2=$avUU+MXbN{!sO}U=qGM70gz*oE;xfXWGo|bGSy1l&N4Qb_(&lwR^5rz#!IkgT1O*Cq^d6%pSN zf{6!Lh`B;Mj|Ls%ng(e>{%l`BkG*rxEV@SQxx59>7DJJ?M= z;^Y4V;pK|?WuW3EZxS!g31%4Dmo~CQ`Ema2cXEx_D1r}Ndm9Y9T7NN>IJRZzO~lVq&Q? zGPK3+xj0xOkHNK5ZsgZ4G;^!wYYm@>txA>U@?}=NnF#Ca)#%n%XKSmowbj|4d3Clp zA&4u3s?AA#`mVoGEPo?GlNMKH-jhbuH$xnE^FQX8KzI9&m{gn{o)~lJq46m8>8N*T z$d%h&hc??DHsii+T7}5VQ@C&OK2jcHQra+`jt)%r7dGVBen2G%R7QI>Y5LN!28arB43_ z&9*630or#5ob(610>^0stozcqW|EuY;q7|0U=~c?eL2z9rQ#^UFQPBg_=Ae;Z?_Dc z6ARson)BVX&;%;1z|+S%_EG=NNPJ_I_1QVunjH zn6y2#_w)!`=6_o7#H7|uJWnRbCb>ll2DQfmzD4EvHI%={y9P$R;iQS{2C~KdpXIFy zBh9fuT&&bQ*Z-bp;n4sO+c?<<<7C_5`-{=&I5$Df`{Y==<;D0ADxG>JVwnmRzkuJA z&JU1%lq-p!`JrXiXsOWlZyB~e!yfi@sce!3Pc7?$ntw1mC#6_62}5uE^F_;J%_N+i znKOgdBV3f}%0ufCWSuzhZE1T4+8*dK!F&Q>44O4lz~T_{HnqqLz9z$MoB>#P8;0%f zdlC9lg6hRLnxgpt;e3S@VD3k3Sm?g7$eQe=RM?0bN8?5RcruwEpvACvFtU!&!F-6! zgJU=z9DglFb9e|RM#uPcbrFVj1pd*{pksW5_rX=l;`bDiS^SjtY3mdarp zK~}x>{rj2I=@_(?j6VFSWKq)?&c~v=U7~C9eH(Ww2koHsl!RG{9A4t*TyJ&qUfKfAz;RUS3uv(cws!NGsRi44F1`k>uxHR7(O- z!N%wOETvDxgJGWb8Tly+MVq1o8V&7@(nCuh(d}Jnh$$;4ol5P4Y8QMcrxr@$sy#fc zW`RFihJAw?=Nak$>{-|M%OUyU_5_Ez%ztlRFuBxeKyrsr8W!6nq;>e|rbKmoERSl~ zw=%kw(T^&lTLF17IvnfrXNK5K(|?>VMNZ zm3C6QN4gRgImA^#;qv~4dy&`RRjp$N-YiE!Hgmq@CCD`iNEq zYx|+Hb$Hsx{1KQs40g@q<_Zz9W!czxV?hSrIFPN30v6SkM|c@*Fz)HHFhW|m-H{7! zoAHs=KU3g1G<2Ha59iU&5n89#58~8%KEr5F87@ZSets&<72*Qr7X)p#Q-9Jx98S5T zSpS#oBD)t0$oOX(5|k;-A0?^nDY-rhWmamD%GSALkV#KMGokGrLs2=hqOQ{$)JWiA0tXn?BwwXU~_+5Ua7-^YQ-S{nF_K zqc;8MC5g}%vRNPHX9Qil+kaj6>pqBmZ`ohXDJ|p7_R&!bK)Ei}MP4+E6cp(b1A59;0`cS;H23{XenCLq)*hU;lHMvzewHEIme({B zY9YWVAB%iL!B^4L16P;R21^69MKT_r7si_814#`3p!0f{)I{C&$A4v;4Ys#WG;yz`p6SSCE$H#DRFrJJL4@UjT@xf%V zfCtA5wCF7+y)i;4Rus|?xz?43?Du+pjEiwJ?oIl0*gF{a=hngK5FQ@P&EDhyE_#QH zzBw49Ln|tGT>$YKdVjZES|Dh@x$C{*JS9qhzv1@B)rR~5F*8njeo1!Y#2EAjy@P)L zpg*|o9iI#aC%vP88y({p>M?)XSJY$1Ue5KSk0_jJl`CM%4$T&$Uc>uy39vuz7;8*o zztV9-(fT|Yb2Yb2d`J!DYpp-c!G*;9%~()(4LMm`kf8&H*MCS=(q1x2joV0G+V1*D zlR6@0??GPlm1{b z86EfflgXqf9)CyfvO#}zG@1;@qe;h@UVie7lkuoyd=P(qHsFWLPoO^>9vNRA#N9P; zZbz*75v@OY$ohzhP=divcrSi_a5mD<=3_k-zm1dLLxJ+E5)tdeEOo(DfV?U`Hbhn# zJX`%5qkLtYURTve6R)dGiCDTa6Y{}tSw5IIL2IS_w=Ho}E7?JkY*TtUPLw4P2xm7b?fwZpaP83*dFn2}3S{b^;sl^Ur`_TYomYVJ>1Dmw=xL`kIFL zx&z+1?r)UMHjYDGhAiIYf&a_zrTN4wr}z4XJlv2!|NPVF7~W>RhVIrlF^rDkKo_p% zAU7_bvibJFp&k}f*c#YgOCXk`j^D_kP%gx-z-YWeDdvI=}-@g*%zK6CwhvscS_x`&-sC%1! z`B21GPJistw=}Zf49w74yeYw(0c$>l51{M9E&r_=S98FXQ}ZooH>cD_ki=T1CrZ^c zyPS>Tn_c{dKtH@NDS153k&-hc{*C`e^+jX^Lm?kK!0CguMh36o9CxFBg+eoGny2>@ zFsqBq#5g$KJIl;)(w+X(*YZkJB{8MhF{EE>hJO&4q-3+6BR2!)H}M!?4?qw$i4A)= z8Xg`W4JX6#+yd)= ze1CX+DEsAa_0;Z-N$RskG>Spys|q40C8@Z%^`#Ri|U zyZ`&4Mc)`UZkArP2p^|eC|k7lsU zZ(C+-&>swq6T^h$e;9zKz!$g(TEM2}t$)E0bRgqgf0-bT?oTn()c@d1v+>6LiAIgk zwX*F;)=QR|qx$P?`Z}YaYYtE)jTJ1ALvkeyl7=WQ`cf&16HVW4ne4nq78c0NF@f&( z9WklJ>FdOpLl2EdvF&@FY_Cg4PgL9wjy2-mMUbJl(7fF^^~8M)fKJ@|M!1yON|7A{ zq88Z|(_cSb{^#xK?A?DZPp^Lg zh}>b9k~No>chJRR)8ioq7zG|(Bj7-`>HtVA@vR%eKgOTMko>wr1enma`F|G^!^EDz z026^DX9&^vhBTz0Dwt<}TW|;M4KiZv=EJBj)_&XAwnDgyhq295C|GU#nKSpOr)KUm zxa4~=^kG_ywWIFpQ;g4Ff)=wCbge6~4tbVY1TfbwQ$Vd`nI-U6^L`8ycSAg|gzg+J z5iqH3Ba_b&ppr+XSs8N8HP6gTdv|x{Fj1NTgz(T?W%C~XzF#Z4iy~!_5dVcL!t*3@OYE% z4Y?s^8j6d1!Crk>lLB5d5{0`fCU)@uPg*@;J~d-p?~!nEL^&l+SB(} z0dF(+wjM+44p<_BT*x>aNB|}lx|cfFK`#GP@B#7WhA;{i(8M-okdqu_$OSH9E=G6I z_C(J&)a5GNk%w{o&wz@7M>npCJTbEC74`sUOgS>_0nB$!7P5F3lX6}cwt@V*meEOd~*NVAmCtRA}~Ea>qz6ohJSBwqInPDZoG~J z;Q{C(Kqv$8#ldS~cr#>gIi~QAV(W&S{|=zZ@EvAbfjnZN5#+e^4wGdUoD+{BX!+0u z@EG75BCMGOc0C555IM-=_+StC#@B-K>5I=uKp1opj(fhnA%C(v#{e_2nsKCEWFzRm z^x&K6EAaRq-5YYwz}%+htp_%QVLLrR3rw)L613M^ zfX`SR9S!r<(SHT@m>`gPFN7%^Jd^< zP0Z;Tg0?s1TNewtzb_UxCg>_K9L39e>|6*|t-JZ|Jy%&5!d3IRT!<>{UScj!67J&=?m!ciqgbPcg>43AV??`mQL93|CD_Ly*r6t@AhAN9$Q^RU$#k`egLt(=XbJdn2>4KUbRJ)&f9{2RRew+$AYK*NeUPpO{g!Yahj7Qb18BYu z=WD)}XOO}AWE#QHIRi~>b*I=8fxE?y!6eL`eS#SjA0+_SA98U@hBDwa32TZi;BwmX z5Mkng7TJpf*=CN(QqDPHK`tD!01lyb!8rri0}JY|kp<>k0Kq?Hx_$>hFr^kU!K<$; zY=5o*CKfhDbQ=Wgjm@yh-yS&7yhT>{70w>7#c3r3A9<@4^j6(u#>hA0jfkUMYzOnd zp^4z|t7omo+aVl|*?j2TqP6p1djFTR+0wQ1-}!ohwu|9tfrp#zc(XyH!QIGssOwG4 zjnQp=o8LnU9Sw4%&;|Cg;Z3FG5AUrzWq+;cd#OC9P#yJC*j)W(Rg>bcdj-;~-Sj;6$CGZ5Yp>zzZ*Rk`r-3phu%^3?GX zBNNriWDq??hHKdf_B(DCwG3c@i6Xvt*rHf5;iQKSfwXX*DqafkDAb-Ln zrt%oL0vTRFk9~41E;*}=QRXODof#W?tJ3YWBYgSC*+&yyqzad(lHsuR)~4pIy_5RL zfYRxb(26ZkBpHCYTE&N2U8Sh--jjZbjM=nuDKvA-WI4Sc6F6fazA&ad*2S1`iku;~ zr&H=8$hwWEtS6Aa)hvSD$Og2;0Dtyg73BLRbN^_&ok=e*k|RqC&A1Em;Wo=6#XiHG z86<^#%N{R>J^FdEB5_J+^yIw&a8nFY`T%|h4pF1uvdGI}kwIQ$N`@4gS0H7M`RlXC zUe$*R^_DeW4r>haVqao}&~!9GA?Su!q)JdheKye!p=Fhq!z!b^sGAruG=CenPyo0g zHYp#zP@hRO=(jBLa#&=X7uPdGtU*t+3Yxy~S>PBh=7^FG=jv>r!glYp-#V4|kj?$f6VzXKK0yB|9ETuasSKP_p`w--aGo? z`riF`arf*0u|@3&s3%%u_J@;w6HO47WYG_ZoqD%B$U6x@eSH3tUw=DC7BA?|@REdP z^{IE8cc>l*u9jp3+f|OwQ`qk1(7a&0nOQDwU#5;RZzK%#rec&d^`KQR8GZc<2~>3{cM8 zH$zso9&`*5YkXq-i+|X?f6v~oO!AKv`rn^_HXbTogyIjiN-+r^)iUup$=N8?BQd8X zd(;c$5(`;5c1x~I8N_0%T&8)7!m1&r4Bmltf_)fy?J_oF@(!_Mjqb$_FBcVWqp%(q(>D1}eN z6ZN|zHE{{IYeblsfjek(v7UK&PD~d;4+)uHO@e2@mkNN@eZE}uY<$#JC1_%TYD&2m zA|eKw1ANINezpyQcJ0I>6`)44i&TJ{*&b(*ZS#!UJfk+x=#eGUP!l&HdGrE%EbfD< zcgUrIrLS}tHGi6}AR#C>8A$`Zpx|NV6O{tW^&{F-M7aWCWx+vJtNrFMy@g)AOrCR3 z78_=XiiNQYE6=?dB7W{p_U%XHd2p#JUDz>xXDj4hBBU;bIAd^$im#?j-PICyDtEDE zDq~Ar6=3m=Vs$&}EWXN$@m$blZNx6#2jVYJZ2CzA*GRxK^*+UcakLeA;*= z_xX{hyHb0h7)p5t=*CeRB{Z;0hhu~l7Op9WRx-%~eqiL3WEky^_@k*}WFiBCsvfG{O> zcR*V4T2!R|Ab(tU@3eCTzlxCH3Oy)g)zJzZ4xyyh zI1v(I4%Kc3u4;hBZx|`cTJ9G_W71D0m6{6_$3HKKr$~16gqP3}iva zn160uw{nbzZ;zS?*Rw}Uj`RX8p}D!rNlv7WK@_^~Uy8HVDzu8Ny0 zA^U0`#8lbhTp+S!CAIJGi-m_+6^B$gEXthn)LjC#S-DFnlFwY4^FU;afmd9yEBLkM zR(jWSsF}Fnwd^4jWze1l?u5eT4F_$#Fn>#ElA8>5i3nf%U2UK^7`62iYf*F)WENzO zjgx{~!=6duz86a-g=J=@v+v79c>2a(`@~ z7ZL$|oSRA)&QmiAGz(3sM+<_U6=0f)d{*PP7hU;-#j}ojJxvv4IrCS@<4o94zPbY1 zqa>^=zS|68ss~gyWnG0<@@`=9zRh26^Vi$_^+yqg{oKsNE5zKbuZxs{7F8r+5>!Fz zQ3(l`gx8dK%V4?p>O5_}(Ra)@YJY{m#i%#X)Yg_fG269>#Y|VkLNGj^N3Z)9FV6`R z#!l+N5WqR^PFD~UvDfPWXCxk7Ld!x{xYz9f=TP;$P?F4Y%3xHLAK_5r77@poW4Bi+ z5}&nl`o3orIiKonFY^qNr-)_N{zwws-fTWm;G+S%Z=@VRiVgNSis7JvL4O=R+d;G{ zVy^3pNE zWcik_el0l@cGr~8kv7aVc4mm>o~wp{nkkkO$7??oa^fS)N|n^xGU8;4t?K5XZe$4nMMT z&@+RsRjF-nOt>|pC1SCHj~V0F#)!Yv_^45DqRFw6Qt|?OY>F*T^z{OxvS4<&wL1%} z@f*99__nuozmSVno+=X_Yr^{@YLtKN$b#~(Mi@~3wMX^~ac!BeWxjnfU%#h`5WcjL zwM5eHsKv z#5l^zv)b6pGB&qg$E4ru^*TmSUEsK)u^bgcDKtyV7ch8XhGW0433$E|)OBjf^YvPc zlLVpjEbvVkUO*Fdr_i?jm}YUjA2}DCA^0iT?ww>Z?V)Y*+kd;B)@DXh9Mc@3`v-Mz zkt;zo7J{6fwUT@_3o}(U946Djjoy*`|AFFP!T*hl>?k*B;l{N@3`Q~EuHpT;1lS*U zj5Q{)U+JyltWK8her3q+7Z&8jQze+FEP=$XBWl|5QT3?5wo|#R|4Lf5mJSu4 zX-0tt7(dEQ9j%6JHDr;7Y-M#Tt9@BL)TBB1k_!`P9z!e7 zTY28f^H!ceC3!y5KZhyx(2Q4YE{=$R9%8) zTCLS;trw}a20cxdVj~DWCBxHD)CHVmpRiG04W|smoI*}1u$5{#sW4Z| z?JPzTnkO#B^rFXX1sQ-Y0*Ju5&A*NbU@PnaOgsjOiMl%%f=UfJvuN4(#Z3R%kk=a+ z(tHm7;xaSJ;gT1sc*d8f<9&Lf95>QrI)D3fdpf6X_JW5p%oYbw)>g_fiQ?dPwT4ot z?Y&HNYXr4MP^;mkygAfl;`%%}Ggrtu!*IEa%n5<$phT2HM zdIhR_Ih4V`+N>R}s3kDq$@hR$jJ2_m3p@rHYOKE8_q$~|wnQ1MlJ81LRJ{z8D1X)4 z+B{K48*9=frDP4N7hcm-vaQK$88|w2gLB;dM4ZeetkFrv8DvnLVTjkFG(B0+*Wi`> zimWN0&!ZV^a!m0!)Jk@^deFtk8>f~9#H9m(Q2+^`4kEx4z`Edk0SNVfdGZ2#MCfL@ z0-gg+B#d<4p>snJ7WdafK+spe2Y>jAZ5zxHFkQrHumh+o?RXQ~w*S_q<}Khm0~@TV zi*88pH4~Cp-)a_rp2Sct`5y1&9E|pID}J0ln~*WPJG>JNQufXYc}w{eTfv=b!Q~H! zqv1gQ;+RrT-l5q19TyP^_|+u;iCnzE$P!n@`!g}MF(S-3F&4f4U^p^5#($+t@36(~ zwCLFdoFhB!=jj+T23;mE;XM(z<#vpB#7aK!#aM8MqyJJ~ROx?dN^Ki5Dt<73C92+UnVqbv5TZFNbuWpe zg^UkwmpiCpq+0Gm(11j%4u4fea#dl(sjk$8D@qQi`qd=!hO-}7d&;X?()?0^8mrMn zwJA}dn&i^#@Hz>B`Z$N6D%&`2#boqE>SYyw!*O(p4;R)IMO5|se=4oh3$f0RGzsW_ zP=bh@d2esLdL>~qP;}RWh>fH4Oo_&CAv0H3DA(tm0iJtdi0%tD%zy6Wcyv4EG;(;o zMizz)*<0WtVtL{w4gMai zj(xpZ_hr&WsS-#p?0;xrqDiQZ^VlUKmOO&lO-lK2baJZfohk~DxzefjcQ+MRQ1sp$NRlvY`$Ea}L@65f4k!RL3{dPZIxN$H1Uu|dH6J@KuCd(}( z0I~4MhP(LE<6xR%pb+4Gxh9Tx0joq9h5RAdLdK&2g1*|@1K%I*bIA?)3NaJ+;tBUP zun@F8Fh>jigMTYazUTLXW3ZN)o;EWLGzm76L_R|I_C0k!IZGE>^TZ3&AssRcm#)LGG;q# z(B`bsY>-yF33&4SJl2Lxi=>yveYzTmI*w1ekBZn`1H2jj*JEBJ5OipHd-CDtvE{RI zFtyxyF&ZA_##zsraShM%UBmVGu)sH5gZbh(mVe;52m$XYxPn`rd?`FR$&IcO5rR?f zXl?ZAT}jK&x+gxC!C#StuGz39{7UNf;Z4K|(N z6@T9rk|kGni~<<#Bq{M7LJRDA>~)9tCN~6b7+ph#IUjGsO)qAN&2Gz_KNNG0`ni!p zAuaBDw3Gy-_VNB?VyipFRc@kB2Q zSXOx|lLR)!7H~P~bDTY~UA7kovdvsr7k@qsXjv}uJY)eJLKChxEbRO>vcP-`AowS8 zJrVZ;!IWCa1h1s?4HFBSLRdnu-q;MA{Oy4Q&0A!JU*W9#S~%Yz_{dwWpttHKC5rE@ z4!GPuUV7eqKFAGS3Q2kQ^PDuOX3lfcQ1^MBqZmOcF;IM-6L^XuR&P&q+7q49JbygQ zjhON-uvfQ6PuRbhTjh!rbF2VYl1+W1ygI7}IIH&+k!_YqNJI4yENMDU*W~Q~x%H*6MPkOyxEc^WYOq98c zXP}QJhezXH#|X-Yh~E!_$aB(5!zjSLrmmN*#Zk7NgenWRI0ErG^Y%D5SbxdmT4A#j zcS{Im{llUvm0uptUt+SLB{*Jwrm*IeC~H-N&%;sVSMC0QnDiJ+Z0G_&u*7#^u_-X$ zg7dQ<$km%$-Rb+4wTp;BQ@Eo-b*D%Y9gFHGjDJ8Bml5uqDP6D6g1S%q$5rq{-b{F6 z{EOJVf6v~oO!AKv`rn^_Hh*Nb7B6gvk%_`z*Vw$3Lh_%Y^pgKLRq1GkWbKr^Heryf zi1>~WOgy+k%oXB!H0T)DG)N2bXZr$r?49do%Rybx5Q4moMhtb*F-}c}@8l_dSf}aU z!EW*qAO9Z+FIUVj0~IfMlX!7XFvHNkw2>vskMn20lWV+25q#*{+kar#)rzUau`Q!# z{Kc*sJ@1o6oo@bORqYy|$ExLreB#`1q<^?gI{;bWPffwC%ZaWo6-N<%5q+7)A5>g_ zyJhH{Sm<8V)Yp~YANk%-XkS5M(KSJy*8$EU2*SV$gJr!2uP9W`LcFp*$C#tH_p5pm zGhC9vr0t=-r+-J-GS`A9Cbe$jc``vZ$t_Yas67_&Eh^8iq5M7GH8AQ8Crw;8kS*^2 zEN@L1X^sWrVx{J}{`Wi!j|OqAqC))C`h3%T%cN z1^lLTet_(wTuJ=Q4=t-kONF+7%dqts_OPc*Ws@v;YJXW5)P&hNDaEo$7<%KMFIpaJ zCgJSNoEfwp;i61e9$J?m>%@U?OWQlp_CS{j<`V#8(5#sP7Kf0xsYPD!H5qQ>48X$M zFl=|{;Akx7~i!iJs@Q;oL9pfXs53W)czo(GQ;`ekx!e66WH&}(R zR1Vt+vg)nx-_M**$FME4>6N37Ijb`e)5j)}@A$jyaub|T_F{bKKohgA2nssAgV=_1 zj`?xNct1=2zCs>y?>H{UVlu^lKY8Lo)o_&vaDS<2l@Q4?trK{cx}%?urA)(U21?P7 zSFUAyP4EsnX{gIul$`z+dF<4-skw_<3V{?~PcB6~$KrbH$g4}EZG`Vm9md*ULbkdV z8|hb{zo-;k&Y?#Nx%^VO8PL_vJ+c!~e3xnCm!c;pcYp4#y==#lWUx2nhoj-)@zHQH z9Dh&t;(5%HZb>WLFQe0>0j?rzRrTU}CekkXt3RIc^0G3C4oA8~TDb;i$h4u0BtP$> zS`vT?Ha_QPDSaXy4D+>JcL&q)7g&$_-}4#^Lz?epDIV3doDm;aHa^FU7%oOsw4nWCW%7blI1YIhO1&>qiNU+n9U9Kk}^N zKZ(#RY)p^h6RF*A>97PpeDe5BY@mt=(jV$aUo^puQdJ;&#Gm=sN)o1f{@#eWiC zRiDq?o`Cxg9I=zn^&+!jsl=?h`+V_iayxw$3GkOnMTU32pBfipr4{b%m}9 zUw~^HJHKP>{LYnlT9JJ*8V~a`y!^b9+M=5GFXN$3B(jv)^zmjnd%k3bSdGn|kM|Gn zmrf@bwdqGMNrb+T&H5-mBY)`H-R`LkX&Gm>kB(XZ%5|wO@}e=e`}lSr z-|pihCFsYbe2+ktrz&y}HQ6$MQ1=$OQ%VSDfI1R40ikxmiv*NiH}7eb^j2Z=vkcj` zyr!8@3js#?SmYZDzKW(ExVoG+SQ?-$lJWSwFxDg=NMiU0o!7ghCV%R#KQ7yBu+{za zDLmViGB)g)XG%oi3(n38zENp+l^E0B4$=xRR-UUB_bFqYpvA;GK8AyX@nn2>FzQc^ z4!@bF-6_9h2# z(K}r9&A}KQT2Z;{0)L3t(7WZ*0zv!DUGEL&DN*|S4Yxn8HslY8nQ_wdOR^g$#-KOo z9rXJL{lRtb_+&6R=^g#s=or6HkNMNSq8>B$a;_hJMBz-UTme&dXto&j8s48vfc;6$_18cz9<8X7Jb)g!1lCCUXVPS>Y775B{u zF3CwNiH>o;B-BM$$fFzAjLC)AlW)dHw7y(zJ#0eTI2jy`CPzodz47sA)ZwpYU!h~1 z^aqp4=(yLPOn)Xl@i=mq4f>;_(PTItO*+Q(@{?zrj7J^ggZS&S0Y6-R0{!9e$oTRg z?yiAzJ7Ud`X#L4U)<;Z)5)6LAd-3ywvypx_AM2_3ZJhKT3Y1@!h*%$HsSBn8m#L|_SkPm*#^1-|bS}-f+zm1bx$qtfao6^g1qAZC( hNYjsb#`aW|+T_r9c=+=0{{sL3|NnVVuryTP0RXT2c3J=c diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 9897980db8c575a35b9ef87f079f1fcb6ea0dab2..3ba1f8b7bd3cab7276b27012d42322324204e778 100644 GIT binary patch delta 2608 zcmV-03eWYK6_pi`fPdqug*{MX?nvDK{)!p#G}+J81)EdW_~ba(6l}m2c0k&K`YIxS zcz77`J2niMjSeLG;dd?`LEI`4*y<3?$PWA#vN==mq8b;`{}%GwNGdMK2pYFwD=uze zXd%CYzTcApZG2-saU6&mxTSxAh5RlmyVIMubx9OCL>l>UM_2m0)2%RWxhafFNcfQE(P9Vqq0B zFuR^6EUvCQotN;zA7Cq-70RH2@3R)}rxq6QXFvrwxPPxi0D3Zf0X9*(BouCHC9~DZ z%~pvuRGKpuxbD4$se)K3auQ_wipC02i3nN{^81YDUeE2Uj0iy{=2CWZJsZlnjvT3R zX}3DP`vS=f#psoqmUcqbtg75nGy|15y4RIt;40mA%-f>BD&%ybLKPnn`HZE0KpQh| zokstT3V(iP|L|H~B391|favnTG;g7mv<^!kE@dN}VoE9zmTU%Q=KMo7zC8W}Yco|N%^GR$8`3;KE`bM> z5tsf2@mv_}Pu3TKr#>Zw3Tv0I(BAx(fhcL66r!7Kg(-t~AQ zsZCtm?{zF)aQjUB`Na)L5Kmf1b-~5;HyQo)OZb;|?o&f=k}&)_Gp2aOGA-bFUVmqn zxtcCWV9;~KeHD-JOI&mA^Ky(X`l!r6R_P)$wiOAYnW^1W@2q`V?54i(C%BC;ilMhk zQEnz1Xo&Jt{cj86XGN^>{Z0XiUBLJ6C&5=k?;3jVTTJVm700w|qQ=rNnuRpQ;5%Bx zgKWg1Kv!KBn8K!(gruVOjKb24*MF_R?;`F>@*25H+f8m<5OxbOTFgOQeN(ekd^hq6 zIZXPQ+r$ldFS`3X(9yV3GG&7)l3lg6?s6_|4I*>%Md2I_(r2mtK`$aL=PEuRY5xEJbMsN+YEt?oGIUVj$)GXk2JB z#8&hPay5GK!MgBxP4p1eKVInKf;!R=f7QoGp)Z(6FEk+G=cYh+H?gG%wTgM(A zl`FOLcP(pvqw|8t+WM*`?CB!Tn8t$=I%KBMl>=*ma%{6F~1pMEgmp8vC!q7H@U`Fh8x~GnXJ7K@O5DWJ{%~Pj7Y7|kUh<}fRBFEt`}6{}#|tFP?YKRCfU|6l(MP!whxgt0UjOMZR{)G4k~`*1vs6{kFE! zui8WZnLfh8xd00d0)^(A>sh?lDz#%?TY*Dm_*TJsxBQ3MEq~rAIn;a$YQ2|aCWK`$ zalpB|WVc_^z<*nJ{AE~KvgMht zV;-3xMIHeWG=yg)!RE}7NO7dyI~frL`a%);h_t#pfxE#yhJVl7IqOY)pL^%sl0%d6 z_R&v{6P}7QHJmJU`65eDHd>J+L^-y~EooybqJJGzLp@`Z#SPOEz* z#}j`e^6@hAeTEvHqAb;BAg*?ZGVCULg+-}mr`mg~R%cn;zDDQ7tp57X=2NR_hfB?7 zr`GVdX!uFV$v{0P5dv64!6U+r>37uJCe(Y*SgqY3Lc32(&h5rB3>@x#gl)t;x0&PtBuMB8`Q`DRs$a@|*Z%|2xF&xwL7 z=D^E}PgfOg*EmKtbs87cF?`~Z;(uF@Te3q`pMS@xpSx6gO<2w>w)lOgUaNbyiBCN3 z?U$MU-{Y48Abip04(ZTbW+G9kSL$!#y4=->Pwe{U2pV*J!%zIJc zYJY?<2NCo|*BTQ!Ze$f_Gly;J4@J~ZDeI?{5!5^{In5H=vLVcjsfw3qbN5gV^WrK? zAYNR<2-ziEZRP!XWkZ#eZz+m)+uhFD+HrIz74o>%D%p1aJE7{|0R?5Kl5@I3r7TT; z&B@-H`%3p;tbR#X1DD&65(P|A7pXA_Kq*83V$oANiA2Cy_-yZu8vDVLQOB+JF`iEE Sr~eB80RR8X%I%p|dH?`~c@1Cy delta 2612 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 W