Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
mybee
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
vicotor
mybee
Commits
7459b900
Unverified
Commit
7459b900
authored
Apr 21, 2020
by
acud
Committed by
GitHub
Apr 21, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Revert badgerDB to levelDB (#113)
* Revert "shed: Replace levelDB with badgerDB (#75)"
parent
f3a6d2e6
Changes
28
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
573 additions
and
1003 deletions
+573
-1003
.gitignore
.gitignore
+0
-1
go.mod
go.mod
+21
-18
go.sum
go.sum
+120
-305
gc.go
pkg/localstore/gc.go
+11
-16
gc_test.go
pkg/localstore/gc_test.go
+2
-1
localstore.go
pkg/localstore/localstore.go
+2
-1
localstore_test.go
pkg/localstore/localstore_test.go
+2
-1
mode_get.go
pkg/localstore/mode_get.go
+4
-3
mode_get_multi.go
pkg/localstore/mode_get_multi.go
+2
-1
mode_put.go
pkg/localstore/mode_put.go
+9
-11
mode_put_test.go
pkg/localstore/mode_put_test.go
+3
-3
mode_set.go
pkg/localstore/mode_set.go
+16
-19
mode_set_test.go
pkg/localstore/mode_set_test.go
+3
-2
subscription_pull.go
pkg/localstore/subscription_pull.go
+2
-1
subscription_push_test.go
pkg/localstore/subscription_push_test.go
+0
-4
db.go
pkg/shed/db.go
+61
-302
example_store_test.go
pkg/shed/example_store_test.go
+9
-4
field_string.go
pkg/shed/field_string.go
+7
-3
field_string_test.go
pkg/shed/field_string_test.go
+7
-11
field_struct.go
pkg/shed/field_struct.go
+5
-7
field_struct_test.go
pkg/shed/field_struct_test.go
+6
-4
field_uint64.go
pkg/shed/field_uint64.go
+36
-18
field_uint64_test.go
pkg/shed/field_uint64_test.go
+12
-19
index.go
pkg/shed/index.go
+132
-67
index_test.go
pkg/shed/index_test.go
+17
-15
metrics.go
pkg/shed/metrics.go
+45
-129
vector_uint64.go
pkg/shed/vector_uint64.go
+27
-18
vector_uint64_test.go
pkg/shed/vector_uint64_test.go
+12
-19
No files found.
.gitignore
View file @
7459b900
/dist
/dist
/.idea
/.idea
/.vscode
/.vscode
vendor/*
# Compiled Object files, Static and Dynamic libs (Shared Objects)
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.o
...
...
go.mod
View file @
7459b900
...
@@ -6,29 +6,32 @@ require (
...
@@ -6,29 +6,32 @@ require (
github.com/btcsuite/btcd v0.20.1-beta
github.com/btcsuite/btcd v0.20.1-beta
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect
github.com/coreos/go-semver v0.3.0
github.com/coreos/go-semver v0.3.0
github.com/dgraph-io/badger/v2 v2.0.3
github.com/ethersphere/bmt v0.1.0
github.com/ethersphere/bmt v0.1.0
github.com/gogo/protobuf v1.3.1
github.com/gogo/protobuf v1.3.1
github.com/gorilla/handlers v1.4.2
github.com/gorilla/handlers v1.4.2
github.com/gorilla/mux v1.7.4
github.com/gorilla/mux v1.7.3
github.com/libp2p/go-libp2p v0.7.4
github.com/hashicorp/golang-lru v0.5.3 // indirect
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
github.com/libp2p/go-libp2p v0.5.1
github.com/libp2p/go-libp2p-autonat-svc v0.1.0
github.com/libp2p/go-libp2p-autonat-svc v0.1.0
github.com/libp2p/go-libp2p-core v0.5.1
github.com/libp2p/go-libp2p-core v0.3.0
github.com/libp2p/go-libp2p-peerstore v0.2.3
github.com/libp2p/go-libp2p-peerstore v0.1.4
github.com/libp2p/go-libp2p-quic-transport v0.3.3
github.com/libp2p/go-libp2p-quic-transport v0.2.2
github.com/libp2p/go-tcp-transport v0.2.0
github.com/libp2p/go-tcp-transport v0.1.1
github.com/libp2p/go-ws-transport v0.3.0
github.com/libp2p/go-ws-transport v0.2.0
github.com/multiformats/go-multiaddr v0.2.1
github.com/mattn/go-colorable v0.1.2 // indirect
github.com/multiformats/go-multistream v0.1.1
github.com/multiformats/go-multiaddr v0.2.0
github.com/multiformats/go-multistream v0.1.0
github.com/opentracing/opentracing-go v1.1.0
github.com/opentracing/opentracing-go v1.1.0
github.com/prometheus/client_golang v1.5.1
github.com/prometheus/client_golang v1.3.0
github.com/sirupsen/logrus v1.5.0
github.com/sirupsen/logrus v1.4.2
github.com/spf13/cobra v0.0.7
github.com/spf13/afero v1.2.2 // indirect
github.com/spf13/viper v1.6.3
github.com/spf13/cobra v0.0.5
github.com/syndtr/goleveldb v1.0.0
github.com/spf13/viper v1.6.2
github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d
github.com/uber/jaeger-client-go v2.22.1+incompatible
github.com/uber/jaeger-client-go v2.22.1+incompatible
github.com/uber/jaeger-lib v2.2.0+incompatible // indirect
github.com/uber/jaeger-lib v2.2.0+incompatible // indirect
golang.org/x/crypto v0.0.0-20200
406173513-056763e48d71
golang.org/x/crypto v0.0.0-20200
323165209-0ec3e9974c59
golang.org/x/sync v0.0.0-20
200317015054-43a5402ce75a
golang.org/x/sync v0.0.0-20
190911185100-cd5d95a43a6e
resenje.org/web v0.4.
3
resenje.org/web v0.4.
0
)
)
go.sum
View file @
7459b900
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
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-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
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 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
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/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=
github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
...
@@ -23,13 +13,11 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
...
@@ -23,13 +13,11 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/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-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/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/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
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.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
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/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-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-20190523000118-16327141da8c/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.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
...
@@ -43,7 +31,6 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa
...
@@ -43,7 +31,6 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
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/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/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/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 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
...
@@ -53,37 +40,25 @@ github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitf
...
@@ -53,37 +40,25 @@ github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitf
github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U=
github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
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=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
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.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 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
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/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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.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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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 h1:6xT9KW8zLC5IlbaIF5Q7JNieBoACT7iW0YTxQHR0in0=
github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/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.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-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo=
github.com/dgraph-io/badger v1.6.0/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/badger/v2 v2.0.3 h1:inzdf6VF/NZ+tJ8RwwYMjJMvsOALTHYdozn0qSl6XJI=
github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM=
github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
...
@@ -91,24 +66,19 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn
...
@@ -91,24 +66,19 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/ethersphere/bmt v0.1.0 h1:27wVVSodxfADhN64KXhV/P8Gd6RlEC2miNujJY+huNY=
github.com/ethersphere/bmt v0.1.0 h1:27wVVSodxfADhN64KXhV/P8Gd6RlEC2miNujJY+huNY=
github.com/ethersphere/bmt v0.1.0/go.mod h1:S+nhucAQ/MYvaOBzRhIkXrWogaLH8IRSb9a7D7JW85k=
github.com/ethersphere/bmt v0.1.0/go.mod h1:S+nhucAQ/MYvaOBzRhIkXrWogaLH8IRSb9a7D7JW85k=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
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 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
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/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-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.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.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.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.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
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-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.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.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
...
@@ -119,60 +89,45 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
...
@@ -119,60 +89,45 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
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/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.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.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.
4.0 h1:Rd1kQnQu0Hq3qvJppYSG0HtP+f5LPPUiDswTLiEegLg
=
github.com/golang/mock v1.
3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s
=
github.com/golang/mock v1.
4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw
=
github.com/golang/mock v1.
3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y
=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
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.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.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1/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/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
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.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
github.com/google/go-cmp v0.3.1/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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.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/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/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
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/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 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg=
github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg=
github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
github.com/gorilla/mux v1.7.
4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc
=
github.com/gorilla/mux v1.7.
3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw
=
github.com/gorilla/mux v1.7.
4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So
=
github.com/gorilla/mux v1.7.
3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs
=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
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/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
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/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/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.
3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk
=
github.com/hashicorp/golang-lru v0.5.
4
/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru v0.5.
3
/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
...
@@ -185,53 +140,41 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
...
@@ -185,53 +140,41 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
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.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.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.4 h1:UlfXKrZx1DjZoBhQHmNHLC1fK1dUJDN20Y28A7s+gJ8=
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
github.com/ipfs/go-cid v0.0.5 h1:o0Ix8e/ql7Zb5UVUJEUfjsWCIY8t48++9lR8qi6oiJU=
github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog=
github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
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 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
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.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.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.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk=
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.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.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8=
github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50=
github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50=
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc=
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-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/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc=
github.com/ipfs/go-log v1.0.3 h1:Gg7SUYSZ7BrqaKMwM+hRgcAkKv4QLfzP4XPQt5Sx/OI=
github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A=
github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
github.com/ipfs/go-log/v2 v2.0.3 h1:Q2gXcBoCALyLN/pUQlz1qgu0x3uFV6FzP9oXhpfyJpc=
github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA=
github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA=
github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA=
github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
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.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 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A=
github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A=
github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs=
github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs=
github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10=
github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
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 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/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
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.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.8/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.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
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/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.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
...
@@ -243,15 +186,15 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
...
@@ -243,15 +186,15 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/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-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 h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ=
github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
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/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
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.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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88=
github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88=
...
@@ -264,161 +207,130 @@ github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2h
...
@@ -264,161 +207,130 @@ github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2h
github.com/libp2p/go-eventbus v0.1.0 h1:mlawomSAjjkk97QnYiEmHsLu7E136+2oCWSHRUvMfzQ=
github.com/libp2p/go-eventbus v0.1.0 h1:mlawomSAjjkk97QnYiEmHsLu7E136+2oCWSHRUvMfzQ=
github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4=
github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4=
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM=
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-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.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM=
github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54=
github.com/libp2p/go-libp2p v0.5.1 h1:kZ9jg+2B9IIptRcltBHKBrQdhXNNSrjCoztvrMx7tqI=
github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k=
github.com/libp2p/go-libp2p v0.5.1/go.mod h1:Os7a5Z3B+ErF4v7zgIJ7nBHNu2LYt8ZMLkTQUB3G/wA=
github.com/libp2p/go-libp2p v0.7.4 h1:xVj1oSlN0C+FlxqiLuHC8WruMvq24xxfeVxmNhTG0r0=
github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw=
github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8=
github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8=
github.com/libp2p/go-libp2p-autonat v0.1.1 h1:WLBZcIRsjZlWdAZj9CiBSvU2wQXoUOiS1Zk1tM7DTJI=
github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE=
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 h1:T0CRQhrvTBKfBSYw6Xo2K3ixtNpAnRCraxof3AAfgQA=
github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI=
github.com/libp2p/go-libp2p-autonat-svc v0.1.0 h1:28IM7iWMDclZeVkpiFQaWVANwXwE7zLlpbnS7yXxrfs=
github.com/libp2p/go-libp2p-autonat-svc v0.1.0 h1:28IM7iWMDclZeVkpiFQaWVANwXwE7zLlpbnS7yXxrfs=
github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A=
github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A=
github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro=
github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro=
github.com/libp2p/go-libp2p-blankhost v0.1.4 h1:I96SWjR4rK9irDHcHq3XHN6hawCRTPUADzkJacgZLvk=
github.com/libp2p/go-libp2p-blankhost v0.1.4 h1:I96SWjR4rK9irDHcHq3XHN6hawCRTPUADzkJacgZLvk=
github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU=
github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU=
github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8=
github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8=
github.com/libp2p/go-libp2p-circuit v0.1.4 h1:Phzbmrg3BkVzbqd4ZZ149JxCuUWu2wZcXf/Kr6hZJj8=
github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU=
github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU=
github.com/libp2p/go-libp2p-circuit v0.2.1 h1:BDiBcQxX/ZJJ/yDl3sqZt1bjj4PkZCEi7IEpwxXr13k=
github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo=
github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco=
github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco=
github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I=
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.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.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.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA=
github.com/libp2p/go-libp2p-core v0.3.0 h1:F7PqduvrztDtFsAa/bcheQ3azmNo+Nq7m8hQY5GiUW8=
github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw=
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 h1:6Cu7WljPQtGY2krBlMoD8L/zH3tMUsCbqNFH7cZwCoI=
github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y=
github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
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.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g=
github.com/libp2p/go-libp2p-discovery v0.2.0 h1:1p3YSOq7VsgaL+xVHPi8XAmtGyas6D2J6rWBEfz/aiY=
github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg=
github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg=
github.com/libp2p/go-libp2p-discovery v0.3.0 h1:+JnYBRLzZQtRq0mK3xhyjBwHytLmJXMTZkQfbw+UrGA=
github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw=
github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8=
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-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.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo=
github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI=
github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE=
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.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY=
github.com/libp2p/go-libp2p-nat v0.0.5 h1:/mH8pXFVKleflDL1YwqMg27W9GD8kjEx7NY0P6eGc98=
github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE=
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-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU=
github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY=
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.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.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.1.4 h1:d23fvq5oYMJ/lkkbO4oTwBp/JP+I/1m5gZJobNXCE/k=
github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA=
github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs=
github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA=
github.com/libp2p/go-libp2p-quic-transport v0.2.2 h1:XyGRqFHD1oHdI2k98P1tWWRb9s27fl1SfmCcaX8plso=
github.com/libp2p/go-libp2p-peerstore v0.2.3 h1:MofRq2l3c15vQpEygTetV+zRRrncz+ktiXW7H2EKoEQ=
github.com/libp2p/go-libp2p-quic-transport v0.2.2/go.mod h1:rVzcsiuOFBomAqvNOxeBUcP4vM4wE+NqqRZWvxjkbe0=
github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw=
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.3.3 h1:A920y1nion8PkGKsEnMiho+3OHpXUqfy35YnPfta4aI=
github.com/libp2p/go-libp2p-quic-transport v0.3.3/go.mod h1:DqzycUAZfeuritygmSOh3kPrs/Cqvc0V1uGkoCEGUXI=
github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8=
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.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g=
github.com/libp2p/go-libp2p-secio v0.2.1 h1:eNWbJTdyPA7NxhP7J3c5lT97DC5d+u+IldkgCYFTPVA=
github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8=
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.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4=
github.com/libp2p/go-libp2p-swarm v0.2.2 h1:T4hUpgEs2r371PweU3DuH7EOmBIdTBCwWs+FLcgx3bQ=
github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU=
github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU=
github.com/libp2p/go-libp2p-swarm v0.2.3 h1:uVkCb8Blfg7HQ/f30TyHn1g/uCwXsAET7pU0U59gx/A=
github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM=
github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
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.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.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.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 h1:U03z3HnGI7Ni8Xx6ONVZvUFOAzWYmolWf5W5jAOPNmU=
github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
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.1 h1:tjW7njTM8JX8FbEvqr8/VSKBdZYZ7CtGtv3i6NiFf10=
github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M=
github.com/libp2p/go-libp2p-tls v0.1.1/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M=
github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw=
github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA=
github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA=
github.com/libp2p/go-libp2p-transport-upgrader v0.2.0 h1:5EhPgQhXZNyfL22ERZTUoVp9UVVbNowWNVtELQaKCHk=
github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns=
github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8=
github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8=
github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw=
github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI=
github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA=
github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI=
github.com/libp2p/go-libp2p-yamux v0.2.7 h1:vzKu0NVtxvEIDGCv6mjKRcK0gipSgaXmJZ6jFv0d/dk=
github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU=
github.com/libp2p/go-maddr-filter v0.0.4/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 h1:CW3AgbMO6vUvT4kf87y4N+0P8KUl2aqLYhrGyDUbLSg=
github.com/libp2p/go-maddr-filter v0.0.5 h1:CW3AgbMO6vUvT4kf87y4N+0P8KUl2aqLYhrGyDUbLSg=
github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M=
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.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0=
github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU=
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.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA=
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-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.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI=
github.com/libp2p/go-nat v0.0.4 h1:KbizNnq8YIf7+Hn7+VFL/xE0eDrkPru2zIO9NMwL8UQ=
github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo=
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.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.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-openssl v0.0.4 h1:d27YZvLoTyMhIN4njrkr8zMDOM4lfpHIp6A+TK9fovg=
github.com/libp2p/go-openssl v0.0.4 h1:d27YZvLoTyMhIN4njrkr8zMDOM4lfpHIp6A+TK9fovg=
github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw=
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 v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA=
github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4=
github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs=
github.com/libp2p/go-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 h1:tCuXfpA9rq7llM/v834RKc/Xvovy/AqM9kHvTV/jY/Q=
github.com/libp2p/go-sockaddr v0.0.2/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 v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14=
github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg=
github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg=
github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc=
github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc=
github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc=
github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc=
github.com/libp2p/go-tcp-transport v0.1.1 h1:yGlqURmqgNA2fvzjSgZNlHcsd/IulAnKM8Ncu+vlqnw=
github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY=
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-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo=
github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo=
github.com/libp2p/go-ws-transport v0.2.0 h1:MJCw2OrPA9+76YNRvdo1wMnSOxb9Bivj6sVFY1Xrj6w=
github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM=
github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM=
github.com/libp2p/go-ws-transport v0.3.0 h1:mjo6pL5aVR9rCjl9wNq3DupbaQlyR61pzoOT2MdtxaA=
github.com/libp2p/go-ws-transport v0.3.0/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.2/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.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI=
github.com/libp2p/go-yamux v1.3.3/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.5 h1:ibuz4naPAully0pN6J/kmUARiqLpnDQIzI/8GCOrljg=
github.com/lucas-clemente/quic-go v0.13.1/go.mod h1:Vn3/Fb0/77b02SGhQk36KzOUmXgVpFfizUfW5WMaqyU=
github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
github.com/lucas-clemente/quic-go v0.14.1 h1:c1aKoBZKOPA+49q96B1wGkibyPP0AxYh45WuAoq+87E=
github.com/lucas-clemente/quic-go v0.15.2/go.mod h1:qxmO5Y4ZMhdNkunGfxuZnZXnJwYpW9vjQkyrZ7BsgUI=
github.com/lucas-clemente/quic-go v0.14.1/go.mod h1:Vn3/Fb0/77b02SGhQk36KzOUmXgVpFfizUfW5WMaqyU=
github.com/lucas-clemente/quic-go v0.15.3 h1:i6n4Jr7673z9TlurAjc87+GlE/BN10++r9XZIPS9j6I=
github.com/lucas-clemente/quic-go v0.15.3/go.mod h1:oj40DjNLuNugvtXWg4PwaYgv7tAbzAabrT57CC69EhI=
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/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1/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-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/marten-seemann/chacha20 v0.2.0 h1:f40vqzzx+3GdOmzQoItkLX5WLvHgPgyYqFFIO5Gh4hQ=
github.com/marten-seemann/chacha20 v0.2.0/go.mod h1:HSdjFau7GzYRj+ahFNwsO3ouVJr1HFkWoEwNDb4TMtE=
github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI=
github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI=
github.com/marten-seemann/qtls v0.8.0/go.mod h1:Lao6jDqlCfxyLKYFmZXGm2LSHBgVn+P+ROOex6YkT+k=
github.com/marten-seemann/qtls v0.4.1 h1:YlT8QP3WCCvvok7MGEZkMldXbyqgr8oFg5/n8Gtbkks=
github.com/marten-seemann/qtls v0.9.0 h1:8Zguhc72eS+DH5EAb0BpAPIy3HDXYcihQi4xoDZOnjQ=
github.com/marten-seemann/qtls v0.4.1/go.mod h1:pxVXcHHw1pNIt8Qo0pwSYQEoZ8yYOOPXTCZLQQunvRc=
github.com/marten-seemann/qtls v0.9.0/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk=
github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs=
github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-isatty v0.0.4/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 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
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/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.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 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
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-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
...
@@ -446,9 +358,9 @@ github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg
...
@@ -446,9 +358,9 @@ github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg
github.com/multiformats/go-multiaddr v0.0.4/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.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.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr v0.1.2/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
github.com/multiformats/go-multiaddr v0.2.0 h1:lR52sFwcTCuQb6bTfnXF6zA2XfyYvyd+5a9qECv/J90=
github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
github.com/multiformats/go-multiaddr v0.2.1 h1:SgG/cw5vqyB5QQe5FPe2TqggU9WtrA9X4nZw7LlVqOI=
github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE=
github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
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.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 h1:YWJoIDwLePniH7OU5hBnDZV6SWuvJqJ0YtN6pLeH9zA=
...
@@ -458,73 +370,56 @@ github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/e
...
@@ -458,73 +370,56 @@ github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/e
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
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.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.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
github.com/multiformats/go-multiaddr-net v0.1.1 h1:jFFKUuXTXv+3ARyHZi3XUqQO+YWMKgBdhEvuGRfnL6s=
github.com/multiformats/go-multiaddr-net v0.1.1/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 h1:g6gwydsfADqFvrHoMkS0n9Ok9CG6F7ytOH/bJDkhIOY=
github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA=
github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA=
github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA=
github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
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.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.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.0.10 h1:lMoNbh2Ssd9PUF74Nz008KGzGPlfeV6wH3rit5IIGCM=
github.com/multiformats/go-multihash v0.0.10/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-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ=
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.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
github.com/multiformats/go-multistream v0.1.1 h1:JlAdpIFhBhGRLxe9W6Om0w++Gd6KMWoFPZL/dEnm9nI=
github.com/multiformats/go-varint v0.0.1 h1:TR/0rdQtnNxuN2IhiB639xC3tWM4IUi7DkTBVTdGW/M=
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.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/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/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
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.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.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw=
github.com/onsi/ginkgo v1.11.0/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 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU=
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
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.5.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 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34
=
github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
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.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 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
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 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
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.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
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.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.
5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA
=
github.com/prometheus/client_golang v1.
3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc
=
github.com/prometheus/client_golang v1.
5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU
=
github.com/prometheus/client_golang v1.
3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og
=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
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-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.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.1.0 h1:ElTg5tNp4DqfV7UQjDqv2+RJlNzsDtvNAWccbItceIE=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY=
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
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.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
...
@@ -534,43 +429,15 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
...
@@ -534,43 +429,15 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
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/sanitized_anchor_name v1.0.0/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.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q=
github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
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/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/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
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/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 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU=
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
...
@@ -579,19 +446,19 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b
...
@@ -579,19 +446,19 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/cobra v0.0.7 h1:FfTH+vuMXOas8jmfb5/M7dzEYx7LpcLb7a0LPe34uOU=
github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E=
github.com/spf13/viper v1.6.3 h1:pDDu1OyEDTKzpJwdq4TiuLyMsUgRa/BT5cn5O62NoHs=
github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw=
github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc=
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.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
...
@@ -601,11 +468,13 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy
...
@@ -601,11 +468,13 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
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/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs=
github.com/tdewolff/minify/v2 v2.7.3/go.mod h1:BkDSm8aMMT0ALGmpt7j3Ra7nLUgZL0qhyrAHXwxcy5w=
github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA=
github.com/tdewolff/parse/v2 v2.4.2/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho=
github.com/tdewolff/minify/v2 v2.6.1/go.mod h1:l9hbQnH096st77OkscoRUvKdd23oUM6pDZpYx381sPo=
github.com/tdewolff/parse/v2 v2.3.14/go.mod h1:+V2lSZ93xpH2Csfs/vtNY1Fjr8kcFMsZKjyLoSkZbM0=
github.com/tdewolff/parse/v2 v2.4.1/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho=
github.com/tdewolff/test v1.0.4/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/uber/jaeger-client-go v2.22.1+incompatible h1:NHcubEkVbahf9t3p75TOCR83gdUHXjRJvjoBh1yACsM=
github.com/uber/jaeger-client-go v2.22.1+incompatible h1:NHcubEkVbahf9t3p75TOCR83gdUHXjRJvjoBh1yACsM=
...
@@ -614,10 +483,13 @@ github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/
...
@@ -614,10 +483,13 @@ github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/
github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
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/vishvananda/netlink v1.0.0 h1:bqNY2lgheFIu1meHUFSH3d7vG93AFyqg3oGbJCOJgSM=
github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
github.com/vishvananda/netns v0.0.0-20190625233234-7109fa855b0f h1:nBX3nTcmxEtHSERBJaIo1Qa26VwRaopnZmfDQUXsF4I=
github.com/vishvananda/netns v0.0.0-20190625233234-7109fa855b0f/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc=
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.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM=
github.com/whyrusleeping/go-logging v0.0.1 h1:fwpzlmT0kRC/Fmd0MdmGgJG/CXIZ6gFq46FQZjprUcc=
github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE=
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/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8=
github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA=
github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA=
...
@@ -632,86 +504,60 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:
...
@@ -632,86 +504,60 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:
gitlab.com/nolash/go-mockbytes v0.0.6 h1:Fha6AnxnjXXKw/Ukacnbla8uY3jp/n1RsPHpzfmHn0U=
gitlab.com/nolash/go-mockbytes v0.0.6 h1:Fha6AnxnjXXKw/Ukacnbla8uY3jp/n1RsPHpzfmHn0U=
gitlab.com/nolash/go-mockbytes v0.0.6/go.mod h1:KKOpNTT39j2Eo+P6uUTOncntfeKY6AFh/2CxuD5MpgE=
gitlab.com/nolash/go-mockbytes v0.0.6/go.mod h1:KKOpNTT39j2Eo+P6uUTOncntfeKY6AFh/2CxuD5MpgE=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
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.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
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 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
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 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
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-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-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-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-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-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-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-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/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-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20
200221231518-2aa609cf4a9d
/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20
191219195013-becbf705a915
/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-2020032
0181102-891825fb96df/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto
=
golang.org/x/crypto v0.0.0-2020032
3165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM
=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200406173513-056763e48d71 h1:DOmugCavvUtnUD114C1Wh+UgTgQZ4pMLzXxi1pSt+/Y=
golang.org/x/crypto v0.0.0-20200406173513-056763e48d71/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
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-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-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-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.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
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-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-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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-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-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-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-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-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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/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-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-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8=
golang.org/x/net v0.0.0-20200320220750-118fecf932d8 h1:1+zQlQqEEhUeStBTi653GZAnAuivZq/2hz+Iz+OP7rg=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
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-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-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-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-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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/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-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-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-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-20181031143558-9b800f95dbbc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181031143558-9b800f95dbbc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/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-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
...
@@ -720,31 +566,22 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
...
@@ -720,31 +566,22 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190219092855-153ac476189d/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-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-20190228124157-a34e9553db1e/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-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-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-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191224085550-c709ea063b76 h1:Dho5nD6R3PcW2SH1or8vS0dszDaXRxIw55lBX7XiE5g=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/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.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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
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/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/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-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-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-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-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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
...
@@ -753,37 +590,22 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3
...
@@ -753,37 +590,22 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/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-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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/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/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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.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/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-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-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-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-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-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/genproto v0.0.0-20191223191004-3caeed10a8bf/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
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.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
...
@@ -792,9 +614,9 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR
...
@@ -792,9 +614,9 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
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/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/mail.v2 v2.0.0-20180731213649-a0242b2233b4/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8=
gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8=
...
@@ -805,23 +627,16 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl
...
@@ -805,23 +627,16 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
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.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.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c=
gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
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-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.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
resenje.org/daemon v0.1.2/go.mod h1:mF5JRpH3EbrxI9WoeKY78e6PqSsbBtX9jAQL5vj/GBA=
resenje.org/daemon v0.1.2/go.mod h1:mF5JRpH3EbrxI9WoeKY78e6PqSsbBtX9jAQL5vj/GBA=
resenje.org/email v0.1.
3/go.mod h1:OhAVLRG3vqd9NSgayN3pAgzxTmc2B6mAefgShZvEgf0
=
resenje.org/email v0.1.
2/go.mod h1:erp4uyQKjfJMEKrlG6JIWbMhFlUpIV+pkFptfJNm5uA
=
resenje.org/json
http v0.2.0/go.mod h1:EDyeguyTWj2fU3D3SCE0qNTgthzyEkHYLM1uu0uikHU
=
resenje.org/json
response v0.1.2/go.mod h1:L+alM0Xnew+XnpuINkpoyJI8Q6zaVKqmGkW8ELwzxs0
=
resenje.org/logging v0.1.5/go.mod h1:1IdoCm3+UwYfsplxDGV2pHCkUrLlQzlWwp4r28XfPx4=
resenje.org/logging v0.1.5/go.mod h1:1IdoCm3+UwYfsplxDGV2pHCkUrLlQzlWwp4r28XfPx4=
resenje.org/marshal v0.1.1/go.mod h1:P7Cla6Ju5CFvW4Y8JbRgWX1Hcy4L1w4qcCsyadO7G94=
resenje.org/marshal v0.1.1/go.mod h1:P7Cla6Ju5CFvW4Y8JbRgWX1Hcy4L1w4qcCsyadO7G94=
resenje.org/recovery v0.1.1/go.mod h1:3S6aCVKMJEWsSAb61oZTteaiqkIfQPTr1RdiWnRbhME=
resenje.org/recovery v0.1.1/go.mod h1:3S6aCVKMJEWsSAb61oZTteaiqkIfQPTr1RdiWnRbhME=
resenje.org/web v0.4.
3 h1:G9vceKKGvsVg0WpyafJEEMHfstoxSO8rG/1Bo7fOkhw
=
resenje.org/web v0.4.
0 h1:EBoea/NwSJIPAXhKdYUOEAvCG0IyQGB9AZLD44y9gEQ
=
resenje.org/web v0.4.
3/go.mod h1:GZw/Jt7IGIYlytsyGdAV5CytZnaQu7GV2u1LLuViihc
=
resenje.org/web v0.4.
0/go.mod h1:NIqBGFkZRjbdpgpTjbo5UwXrzVSS0IaGX6QH4OHHcsg
=
resenje.org/x v0.2.4/go.mod h1:1b2Xpo29FRc3IMvg/u46/IyjySl5IjvtuSjXTA/AOnk=
resenje.org/x v0.2.4/go.mod h1:1b2Xpo29FRc3IMvg/u46/IyjySl5IjvtuSjXTA/AOnk=
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=
pkg/localstore/gc.go
View file @
7459b900
...
@@ -20,8 +20,8 @@ import (
...
@@ -20,8 +20,8 @@ import (
"errors"
"errors"
"time"
"time"
"github.com/dgraph-io/badger/v2"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/shed"
"github.com/syndtr/goleveldb/leveldb"
)
)
var
(
var
(
...
@@ -85,7 +85,7 @@ func (db *DB) collectGarbage() (collectedCount uint64, done bool, err error) {
...
@@ -85,7 +85,7 @@ func (db *DB) collectGarbage() (collectedCount uint64, done bool, err error) {
}
}
}()
}()
batch
:=
db
.
shed
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
target
:=
db
.
gcTarget
()
target
:=
db
.
gcTarget
()
// protect database from changing idexes and gcSize
// protect database from changing idexes and gcSize
...
@@ -146,10 +146,7 @@ func (db *DB) collectGarbage() (collectedCount uint64, done bool, err error) {
...
@@ -146,10 +146,7 @@ func (db *DB) collectGarbage() (collectedCount uint64, done bool, err error) {
}
}
db
.
metrics
.
GCCollectedCounter
.
Inc
()
db
.
metrics
.
GCCollectedCounter
.
Inc
()
if
err
:=
db
.
gcSize
.
PutInBatch
(
batch
,
gcSize
-
collectedCount
);
err
!=
nil
{
db
.
gcSize
.
PutInBatch
(
batch
,
gcSize
-
collectedCount
)
return
0
,
false
,
err
}
err
=
db
.
shed
.
WriteBatch
(
batch
)
err
=
db
.
shed
.
WriteBatch
(
batch
)
if
err
!=
nil
{
if
err
!=
nil
{
db
.
metrics
.
GCExcludeWriteBatchError
.
Inc
()
db
.
metrics
.
GCExcludeWriteBatchError
.
Inc
()
...
@@ -168,7 +165,7 @@ func (db *DB) removeChunksInExcludeIndexFromGC() (err error) {
...
@@ -168,7 +165,7 @@ func (db *DB) removeChunksInExcludeIndexFromGC() (err error) {
}
}
}()
}()
batch
:=
db
.
shed
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
excludedCount
:=
0
excludedCount
:=
0
var
gcSizeChange
int64
var
gcSizeChange
int64
err
=
db
.
gcExcludeIndex
.
Iterate
(
func
(
item
shed
.
Item
)
(
stop
bool
,
err
error
)
{
err
=
db
.
gcExcludeIndex
.
Iterate
(
func
(
item
shed
.
Item
)
(
stop
bool
,
err
error
)
{
...
@@ -247,18 +244,18 @@ func (db *DB) triggerGarbageCollection() {
...
@@ -247,18 +244,18 @@ func (db *DB) triggerGarbageCollection() {
// incGCSizeInBatch changes gcSize field value
// incGCSizeInBatch changes gcSize field value
// by change which can be negative. This function
// by change which can be negative. This function
// must be called under batchMu lock.
// must be called under batchMu lock.
func
(
db
*
DB
)
incGCSizeInBatch
(
batch
*
badger
.
Txn
,
change
int64
)
(
err
error
)
{
func
(
db
*
DB
)
incGCSizeInBatch
(
batch
*
leveldb
.
Batch
,
change
int64
)
(
err
error
)
{
if
change
==
0
{
if
change
==
0
{
return
nil
return
nil
}
}
gcSize
,
err
:=
db
.
gcSize
.
Get
()
gcSize
,
err
:=
db
.
gcSize
.
Get
()
if
err
!=
nil
&&
!
errors
.
Is
(
err
,
shed
.
ErrNotFound
)
{
if
err
!=
nil
&&
!
errors
.
Is
(
err
,
leveldb
.
ErrNotFound
)
{
return
err
return
err
}
}
var
new
uint64
var
new
Size
uint64
if
change
>
0
{
if
change
>
0
{
new
=
gcSize
+
uint64
(
change
)
new
Size
=
gcSize
+
uint64
(
change
)
}
else
{
}
else
{
// 'change' is an int64 and is negative
// 'change' is an int64 and is negative
// a conversion is needed with correct sign
// a conversion is needed with correct sign
...
@@ -267,14 +264,12 @@ func (db *DB) incGCSizeInBatch(batch *badger.Txn, change int64) (err error) {
...
@@ -267,14 +264,12 @@ func (db *DB) incGCSizeInBatch(batch *badger.Txn, change int64) (err error) {
// protect uint64 undeflow
// protect uint64 undeflow
return
nil
return
nil
}
}
new
=
gcSize
-
c
newSize
=
gcSize
-
c
}
if
err
:=
db
.
gcSize
.
PutInBatch
(
batch
,
new
);
err
!=
nil
{
return
err
}
}
db
.
gcSize
.
PutInBatch
(
batch
,
newSize
)
// trigger garbage collection if we reached the capacity
// trigger garbage collection if we reached the capacity
if
new
>=
db
.
capacity
{
if
new
Size
>=
db
.
capacity
{
db
.
triggerGarbageCollection
()
db
.
triggerGarbageCollection
()
}
}
return
nil
return
nil
...
...
pkg/localstore/gc_test.go
View file @
7459b900
...
@@ -29,6 +29,7 @@ import (
...
@@ -29,6 +29,7 @@ import (
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/syndtr/goleveldb/leveldb"
)
)
// TestDB_collectGarbageWorker tests garbage collection runs
// TestDB_collectGarbageWorker tests garbage collection runs
...
@@ -237,7 +238,7 @@ func TestPinGC(t *testing.T) {
...
@@ -237,7 +238,7 @@ func TestPinGC(t *testing.T) {
t
.
Run
(
"first chunks after pinned chunks should be removed"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"first chunks after pinned chunks should be removed"
,
func
(
t
*
testing
.
T
)
{
for
i
:=
pinChunksCount
;
i
<
(
int
(
dbCapacity
)
-
int
(
gcTarget
));
i
++
{
for
i
:=
pinChunksCount
;
i
<
(
int
(
dbCapacity
)
-
int
(
gcTarget
));
i
++
{
_
,
err
:=
db
.
Get
(
context
.
Background
(),
storage
.
ModeGetRequest
,
addrs
[
i
])
_
,
err
:=
db
.
Get
(
context
.
Background
(),
storage
.
ModeGetRequest
,
addrs
[
i
])
if
err
!=
storage
.
ErrNotFound
{
if
err
!=
leveldb
.
ErrNotFound
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
}
}
}
}
...
...
pkg/localstore/localstore.go
View file @
7459b900
...
@@ -30,6 +30,7 @@ import (
...
@@ -30,6 +30,7 @@ import (
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/tags"
"github.com/ethersphere/bee/pkg/tags"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus"
"github.com/syndtr/goleveldb/leveldb"
)
)
var
_
storage
.
Storer
=
&
DB
{}
var
_
storage
.
Storer
=
&
DB
{}
...
@@ -191,7 +192,7 @@ func New(path string, baseKey []byte, o *Options, logger logging.Logger) (db *DB
...
@@ -191,7 +192,7 @@ func New(path string, baseKey []byte, o *Options, logger logging.Logger) (db *DB
return
nil
,
err
return
nil
,
err
}
}
schemaName
,
err
:=
db
.
schemaName
.
Get
()
schemaName
,
err
:=
db
.
schemaName
.
Get
()
if
err
!=
nil
&&
!
errors
.
Is
(
err
,
shed
.
ErrNotFound
)
{
if
err
!=
nil
&&
!
errors
.
Is
(
err
,
leveldb
.
ErrNotFound
)
{
return
nil
,
err
return
nil
,
err
}
}
if
schemaName
==
""
{
if
schemaName
==
""
{
...
...
pkg/localstore/localstore_test.go
View file @
7459b900
...
@@ -33,6 +33,7 @@ import (
...
@@ -33,6 +33,7 @@ import (
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage"
chunktesting
"github.com/ethersphere/bee/pkg/storage/testing"
chunktesting
"github.com/ethersphere/bee/pkg/storage/testing"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/syndtr/goleveldb/leveldb"
)
)
func
init
()
{
func
init
()
{
...
@@ -245,7 +246,7 @@ func newRetrieveIndexesTest(db *DB, chunk swarm.Chunk, storeTimestamp, accessTim
...
@@ -245,7 +246,7 @@ func newRetrieveIndexesTest(db *DB, chunk swarm.Chunk, storeTimestamp, accessTim
validateItem
(
t
,
item
,
chunk
.
Address
()
.
Bytes
(),
chunk
.
Data
(),
storeTimestamp
,
0
)
validateItem
(
t
,
item
,
chunk
.
Address
()
.
Bytes
(),
chunk
.
Data
(),
storeTimestamp
,
0
)
// access index should not be set
// access index should not be set
wantErr
:=
shed
.
ErrNotFound
wantErr
:=
leveldb
.
ErrNotFound
_
,
err
=
db
.
retrievalAccessIndex
.
Get
(
addressToItem
(
chunk
.
Address
()))
_
,
err
=
db
.
retrievalAccessIndex
.
Get
(
addressToItem
(
chunk
.
Address
()))
if
err
!=
wantErr
{
if
err
!=
wantErr
{
t
.
Errorf
(
"got error %v, want %v"
,
err
,
wantErr
)
t
.
Errorf
(
"got error %v, want %v"
,
err
,
wantErr
)
...
...
pkg/localstore/mode_get.go
View file @
7459b900
...
@@ -23,6 +23,7 @@ import (
...
@@ -23,6 +23,7 @@ import (
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/syndtr/goleveldb/leveldb"
)
)
// Get returns a chunk from the database. If the chunk is
// Get returns a chunk from the database. If the chunk is
...
@@ -42,7 +43,7 @@ func (db *DB) Get(ctx context.Context, mode storage.ModeGet, addr swarm.Address)
...
@@ -42,7 +43,7 @@ func (db *DB) Get(ctx context.Context, mode storage.ModeGet, addr swarm.Address)
out
,
err
:=
db
.
get
(
mode
,
addr
)
out
,
err
:=
db
.
get
(
mode
,
addr
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
shed
.
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
return
nil
,
storage
.
ErrNotFound
return
nil
,
storage
.
ErrNotFound
}
}
return
nil
,
err
return
nil
,
err
...
@@ -123,7 +124,7 @@ func (db *DB) updateGC(item shed.Item) (err error) {
...
@@ -123,7 +124,7 @@ func (db *DB) updateGC(item shed.Item) (err error) {
db
.
batchMu
.
Lock
()
db
.
batchMu
.
Lock
()
defer
db
.
batchMu
.
Unlock
()
defer
db
.
batchMu
.
Unlock
()
batch
:=
db
.
shed
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
// update accessTimeStamp in retrieve, gc
// update accessTimeStamp in retrieve, gc
...
@@ -131,7 +132,7 @@ func (db *DB) updateGC(item shed.Item) (err error) {
...
@@ -131,7 +132,7 @@ func (db *DB) updateGC(item shed.Item) (err error) {
switch
err
{
switch
err
{
case
nil
:
case
nil
:
item
.
AccessTimestamp
=
i
.
AccessTimestamp
item
.
AccessTimestamp
=
i
.
AccessTimestamp
case
shed
.
ErrNotFound
:
case
leveldb
.
ErrNotFound
:
// no chunk accesses
// no chunk accesses
default
:
default
:
return
err
return
err
...
...
pkg/localstore/mode_get_multi.go
View file @
7459b900
...
@@ -23,6 +23,7 @@ import (
...
@@ -23,6 +23,7 @@ import (
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/syndtr/goleveldb/leveldb"
)
)
// GetMulti returns chunks from the database. If one of the chunks is not found
// GetMulti returns chunks from the database. If one of the chunks is not found
...
@@ -41,7 +42,7 @@ func (db *DB) GetMulti(ctx context.Context, mode storage.ModeGet, addrs ...swarm
...
@@ -41,7 +42,7 @@ func (db *DB) GetMulti(ctx context.Context, mode storage.ModeGet, addrs ...swarm
out
,
err
:=
db
.
getMulti
(
mode
,
addrs
...
)
out
,
err
:=
db
.
getMulti
(
mode
,
addrs
...
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
shed
.
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
return
nil
,
storage
.
ErrNotFound
return
nil
,
storage
.
ErrNotFound
}
}
return
nil
,
err
return
nil
,
err
...
...
pkg/localstore/mode_put.go
View file @
7459b900
...
@@ -20,10 +20,10 @@ import (
...
@@ -20,10 +20,10 @@ import (
"context"
"context"
"time"
"time"
"github.com/dgraph-io/badger/v2"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/syndtr/goleveldb/leveldb"
)
)
// Put stores Chunks to database and depending
// Put stores Chunks to database and depending
...
@@ -55,7 +55,7 @@ func (db *DB) put(mode storage.ModePut, chs ...swarm.Chunk) (exist []bool, err e
...
@@ -55,7 +55,7 @@ func (db *DB) put(mode storage.ModePut, chs ...swarm.Chunk) (exist []bool, err e
db
.
batchMu
.
Lock
()
db
.
batchMu
.
Lock
()
defer
db
.
batchMu
.
Unlock
()
defer
db
.
batchMu
.
Unlock
()
batch
:=
db
.
shed
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
// variables that provide information for operations
// variables that provide information for operations
// to be done after write batch function successfully executes
// to be done after write batch function successfully executes
...
@@ -130,9 +130,7 @@ func (db *DB) put(mode storage.ModePut, chs ...swarm.Chunk) (exist []bool, err e
...
@@ -130,9 +130,7 @@ func (db *DB) put(mode storage.ModePut, chs ...swarm.Chunk) (exist []bool, err e
}
}
for
po
,
id
:=
range
binIDs
{
for
po
,
id
:=
range
binIDs
{
if
err
:=
db
.
binIDs
.
PutInBatch
(
batch
,
uint64
(
po
),
id
);
err
!=
nil
{
db
.
binIDs
.
PutInBatch
(
batch
,
uint64
(
po
),
id
)
return
nil
,
err
}
}
}
err
=
db
.
incGCSizeInBatch
(
batch
,
gcSizeChange
)
err
=
db
.
incGCSizeInBatch
(
batch
,
gcSizeChange
)
...
@@ -159,14 +157,14 @@ func (db *DB) put(mode storage.ModePut, chs ...swarm.Chunk) (exist []bool, err e
...
@@ -159,14 +157,14 @@ func (db *DB) put(mode storage.ModePut, chs ...swarm.Chunk) (exist []bool, err e
// - it does not enter the syncpool
// - it does not enter the syncpool
// The batch can be written to the database.
// The batch can be written to the database.
// Provided batch and binID map are updated.
// Provided batch and binID map are updated.
func
(
db
*
DB
)
putRequest
(
batch
*
badger
.
Txn
,
binIDs
map
[
uint8
]
uint64
,
item
shed
.
Item
)
(
exists
bool
,
gcSizeChange
int64
,
err
error
)
{
func
(
db
*
DB
)
putRequest
(
batch
*
leveldb
.
Batch
,
binIDs
map
[
uint8
]
uint64
,
item
shed
.
Item
)
(
exists
bool
,
gcSizeChange
int64
,
err
error
)
{
i
,
err
:=
db
.
retrievalDataIndex
.
Get
(
item
)
i
,
err
:=
db
.
retrievalDataIndex
.
Get
(
item
)
switch
err
{
switch
err
{
case
nil
:
case
nil
:
exists
=
true
exists
=
true
item
.
StoreTimestamp
=
i
.
StoreTimestamp
item
.
StoreTimestamp
=
i
.
StoreTimestamp
item
.
BinID
=
i
.
BinID
item
.
BinID
=
i
.
BinID
case
shed
.
ErrNotFound
:
case
leveldb
.
ErrNotFound
:
// no chunk accesses
// no chunk accesses
exists
=
false
exists
=
false
default
:
default
:
...
@@ -199,7 +197,7 @@ func (db *DB) putRequest(batch *badger.Txn, binIDs map[uint8]uint64, item shed.I
...
@@ -199,7 +197,7 @@ func (db *DB) putRequest(batch *badger.Txn, binIDs map[uint8]uint64, item shed.I
// - put to indexes: retrieve, push, pull
// - put to indexes: retrieve, push, pull
// The batch can be written to the database.
// The batch can be written to the database.
// Provided batch and binID map are updated.
// Provided batch and binID map are updated.
func
(
db
*
DB
)
putUpload
(
batch
*
badger
.
Txn
,
binIDs
map
[
uint8
]
uint64
,
item
shed
.
Item
)
(
exists
bool
,
gcSizeChange
int64
,
err
error
)
{
func
(
db
*
DB
)
putUpload
(
batch
*
leveldb
.
Batch
,
binIDs
map
[
uint8
]
uint64
,
item
shed
.
Item
)
(
exists
bool
,
gcSizeChange
int64
,
err
error
)
{
exists
,
err
=
db
.
retrievalDataIndex
.
Has
(
item
)
exists
,
err
=
db
.
retrievalDataIndex
.
Has
(
item
)
if
err
!=
nil
{
if
err
!=
nil
{
return
false
,
0
,
err
return
false
,
0
,
err
...
@@ -261,7 +259,7 @@ func (db *DB) putUpload(batch *badger.Txn, binIDs map[uint8]uint64, item shed.It
...
@@ -261,7 +259,7 @@ func (db *DB) putUpload(batch *badger.Txn, binIDs map[uint8]uint64, item shed.It
// - put to indexes: retrieve, pull
// - put to indexes: retrieve, pull
// The batch can be written to the database.
// The batch can be written to the database.
// Provided batch and binID map are updated.
// Provided batch and binID map are updated.
func
(
db
*
DB
)
putSync
(
batch
*
badger
.
Txn
,
binIDs
map
[
uint8
]
uint64
,
item
shed
.
Item
)
(
exists
bool
,
gcSizeChange
int64
,
err
error
)
{
func
(
db
*
DB
)
putSync
(
batch
*
leveldb
.
Batch
,
binIDs
map
[
uint8
]
uint64
,
item
shed
.
Item
)
(
exists
bool
,
gcSizeChange
int64
,
err
error
)
{
exists
,
err
=
db
.
retrievalDataIndex
.
Has
(
item
)
exists
,
err
=
db
.
retrievalDataIndex
.
Has
(
item
)
if
err
!=
nil
{
if
err
!=
nil
{
return
false
,
0
,
err
return
false
,
0
,
err
...
@@ -311,7 +309,7 @@ func (db *DB) putSync(batch *badger.Txn, binIDs map[uint8]uint64, item shed.Item
...
@@ -311,7 +309,7 @@ func (db *DB) putSync(batch *badger.Txn, binIDs map[uint8]uint64, item shed.Item
// a chunk is added to a node's localstore and given that the chunk is
// a chunk is added to a node's localstore and given that the chunk is
// already within that node's NN (thus, it can be added to the gc index
// already within that node's NN (thus, it can be added to the gc index
// safely)
// safely)
func
(
db
*
DB
)
setGC
(
batch
*
badger
.
Txn
,
item
shed
.
Item
)
(
gcSizeChange
int64
,
err
error
)
{
func
(
db
*
DB
)
setGC
(
batch
*
leveldb
.
Batch
,
item
shed
.
Item
)
(
gcSizeChange
int64
,
err
error
)
{
if
item
.
BinID
==
0
{
if
item
.
BinID
==
0
{
i
,
err
:=
db
.
retrievalDataIndex
.
Get
(
item
)
i
,
err
:=
db
.
retrievalDataIndex
.
Get
(
item
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -328,7 +326,7 @@ func (db *DB) setGC(batch *badger.Txn, item shed.Item) (gcSizeChange int64, err
...
@@ -328,7 +326,7 @@ func (db *DB) setGC(batch *badger.Txn, item shed.Item) (gcSizeChange int64, err
return
0
,
err
return
0
,
err
}
}
gcSizeChange
--
gcSizeChange
--
case
shed
.
ErrNotFound
:
case
leveldb
.
ErrNotFound
:
// the chunk is not accessed before
// the chunk is not accessed before
default
:
default
:
return
0
,
err
return
0
,
err
...
...
pkg/localstore/mode_put_test.go
View file @
7459b900
...
@@ -24,9 +24,9 @@ import (
...
@@ -24,9 +24,9 @@ import (
"testing"
"testing"
"time"
"time"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/syndtr/goleveldb/leveldb"
)
)
// TestModePutRequest validates ModePutRequest index values on the provided DB.
// TestModePutRequest validates ModePutRequest index values on the provided DB.
...
@@ -362,7 +362,7 @@ func TestModePut_addToGc(t *testing.T) {
...
@@ -362,7 +362,7 @@ func TestModePut_addToGc(t *testing.T) {
binIDs
[
po
]
++
binIDs
[
po
]
++
var
wantErr
error
var
wantErr
error
if
!
m
.
putToGc
{
if
!
m
.
putToGc
{
wantErr
=
shed
.
ErrNotFound
wantErr
=
leveldb
.
ErrNotFound
}
}
newRetrieveIndexesTestWithAccess
(
db
,
ch
,
wantTimestamp
,
wantTimestamp
)
newRetrieveIndexesTestWithAccess
(
db
,
ch
,
wantTimestamp
,
wantTimestamp
)
newGCIndexTest
(
db
,
ch
,
wantTimestamp
,
wantTimestamp
,
binIDs
[
po
],
wantErr
)(
t
)
newGCIndexTest
(
db
,
ch
,
wantTimestamp
,
wantTimestamp
,
binIDs
[
po
],
wantErr
)(
t
)
...
@@ -428,7 +428,7 @@ func TestModePut_addToGcExisting(t *testing.T) {
...
@@ -428,7 +428,7 @@ func TestModePut_addToGcExisting(t *testing.T) {
binIDs
[
po
]
++
binIDs
[
po
]
++
var
wantErr
error
var
wantErr
error
if
!
m
.
putToGc
{
if
!
m
.
putToGc
{
wantErr
=
shed
.
ErrNotFound
wantErr
=
leveldb
.
ErrNotFound
}
}
newRetrieveIndexesTestWithAccess
(
db
,
ch
,
wantStoreTimestamp
,
wantAccessTimestamp
)
newRetrieveIndexesTestWithAccess
(
db
,
ch
,
wantStoreTimestamp
,
wantAccessTimestamp
)
...
...
pkg/localstore/mode_set.go
View file @
7459b900
...
@@ -21,11 +21,10 @@ import (
...
@@ -21,11 +21,10 @@ import (
"errors"
"errors"
"time"
"time"
"github.com/dgraph-io/badger/v2"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/tags"
"github.com/ethersphere/bee/pkg/tags"
"github.com/syndtr/goleveldb/leveldb"
)
)
// Set updates database indexes for
// Set updates database indexes for
...
@@ -51,7 +50,7 @@ func (db *DB) set(mode storage.ModeSet, addrs ...swarm.Address) (err error) {
...
@@ -51,7 +50,7 @@ func (db *DB) set(mode storage.ModeSet, addrs ...swarm.Address) (err error) {
db
.
batchMu
.
Lock
()
db
.
batchMu
.
Lock
()
defer
db
.
batchMu
.
Unlock
()
defer
db
.
batchMu
.
Unlock
()
batch
:=
db
.
shed
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
// variables that provide information for operations
// variables that provide information for operations
// to be done after write batch function successfully executes
// to be done after write batch function successfully executes
...
@@ -74,9 +73,7 @@ func (db *DB) set(mode storage.ModeSet, addrs ...swarm.Address) (err error) {
...
@@ -74,9 +73,7 @@ func (db *DB) set(mode storage.ModeSet, addrs ...swarm.Address) (err error) {
triggerPullFeed
[
po
]
=
struct
{}{}
triggerPullFeed
[
po
]
=
struct
{}{}
}
}
for
po
,
id
:=
range
binIDs
{
for
po
,
id
:=
range
binIDs
{
if
err
:=
db
.
binIDs
.
PutInBatch
(
batch
,
uint64
(
po
),
id
);
err
!=
nil
{
db
.
binIDs
.
PutInBatch
(
batch
,
uint64
(
po
),
id
)
return
err
}
}
}
case
storage
.
ModeSetSyncPush
,
storage
.
ModeSetSyncPull
:
case
storage
.
ModeSetSyncPush
,
storage
.
ModeSetSyncPull
:
...
@@ -134,7 +131,7 @@ func (db *DB) set(mode storage.ModeSet, addrs ...swarm.Address) (err error) {
...
@@ -134,7 +131,7 @@ func (db *DB) set(mode storage.ModeSet, addrs ...swarm.Address) (err error) {
// setAccess sets the chunk access time by updating required indexes:
// setAccess sets the chunk access time by updating required indexes:
// - add to pull, insert to gc
// - add to pull, insert to gc
// Provided batch and binID map are updated.
// Provided batch and binID map are updated.
func
(
db
*
DB
)
setAccess
(
batch
*
badger
.
Txn
,
binIDs
map
[
uint8
]
uint64
,
addr
swarm
.
Address
,
po
uint8
)
(
gcSizeChange
int64
,
err
error
)
{
func
(
db
*
DB
)
setAccess
(
batch
*
leveldb
.
Batch
,
binIDs
map
[
uint8
]
uint64
,
addr
swarm
.
Address
,
po
uint8
)
(
gcSizeChange
int64
,
err
error
)
{
item
:=
addressToItem
(
addr
)
item
:=
addressToItem
(
addr
)
...
@@ -146,7 +143,7 @@ func (db *DB) setAccess(batch *badger.Txn, binIDs map[uint8]uint64, addr swarm.A
...
@@ -146,7 +143,7 @@ func (db *DB) setAccess(batch *badger.Txn, binIDs map[uint8]uint64, addr swarm.A
case
nil
:
case
nil
:
item
.
StoreTimestamp
=
i
.
StoreTimestamp
item
.
StoreTimestamp
=
i
.
StoreTimestamp
item
.
BinID
=
i
.
BinID
item
.
BinID
=
i
.
BinID
case
shed
.
ErrNotFound
:
case
leveldb
.
ErrNotFound
:
err
=
db
.
pushIndex
.
DeleteInBatch
(
batch
,
item
)
err
=
db
.
pushIndex
.
DeleteInBatch
(
batch
,
item
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
return
0
,
err
...
@@ -169,7 +166,7 @@ func (db *DB) setAccess(batch *badger.Txn, binIDs map[uint8]uint64, addr swarm.A
...
@@ -169,7 +166,7 @@ func (db *DB) setAccess(batch *badger.Txn, binIDs map[uint8]uint64, addr swarm.A
return
0
,
err
return
0
,
err
}
}
gcSizeChange
--
gcSizeChange
--
case
shed
.
ErrNotFound
:
case
leveldb
.
ErrNotFound
:
// the chunk is not accessed before
// the chunk is not accessed before
default
:
default
:
return
0
,
err
return
0
,
err
...
@@ -199,7 +196,7 @@ func (db *DB) setAccess(batch *badger.Txn, binIDs map[uint8]uint64, addr swarm.A
...
@@ -199,7 +196,7 @@ func (db *DB) setAccess(batch *badger.Txn, binIDs map[uint8]uint64, addr swarm.A
// from push sync index
// from push sync index
// - update to gc index happens given item does not exist in pin index
// - update to gc index happens given item does not exist in pin index
// Provided batch is updated.
// Provided batch is updated.
func
(
db
*
DB
)
setSync
(
batch
*
badger
.
Txn
,
addr
swarm
.
Address
,
mode
storage
.
ModeSet
)
(
gcSizeChange
int64
,
err
error
)
{
func
(
db
*
DB
)
setSync
(
batch
*
leveldb
.
Batch
,
addr
swarm
.
Address
,
mode
storage
.
ModeSet
)
(
gcSizeChange
int64
,
err
error
)
{
item
:=
addressToItem
(
addr
)
item
:=
addressToItem
(
addr
)
// need to get access timestamp here as it is not
// need to get access timestamp here as it is not
...
@@ -208,7 +205,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
...
@@ -208,7 +205,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
i
,
err
:=
db
.
retrievalDataIndex
.
Get
(
item
)
i
,
err
:=
db
.
retrievalDataIndex
.
Get
(
item
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
shed
.
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
// chunk is not found,
// chunk is not found,
// no need to update gc index
// no need to update gc index
// just delete from the push index
// just delete from the push index
...
@@ -231,7 +228,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
...
@@ -231,7 +228,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
// this prevents duplicate increments
// this prevents duplicate increments
i
,
err
:=
db
.
pullIndex
.
Get
(
item
)
i
,
err
:=
db
.
pullIndex
.
Get
(
item
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
shed
.
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
// we handle this error internally, since this is an internal inconsistency of the indices
// we handle this error internally, since this is an internal inconsistency of the indices
// if we return the error here - it means that for example, in stream protocol peers which we sync
// if we return the error here - it means that for example, in stream protocol peers which we sync
// to would be dropped. this is possible when the chunk is put with ModePutRequest and ModeSetSyncPull is
// to would be dropped. this is possible when the chunk is put with ModePutRequest and ModeSetSyncPull is
...
@@ -266,7 +263,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
...
@@ -266,7 +263,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
case
storage
.
ModeSetSyncPush
:
case
storage
.
ModeSetSyncPush
:
i
,
err
:=
db
.
pushIndex
.
Get
(
item
)
i
,
err
:=
db
.
pushIndex
.
Get
(
item
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
shed
.
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
// we handle this error internally, since this is an internal inconsistency of the indices
// we handle this error internally, since this is an internal inconsistency of the indices
// this error can happen if the chunk is put with ModePutRequest or ModePutSync
// this error can happen if the chunk is put with ModePutRequest or ModePutSync
// but this function is called with ModeSetSyncPush
// but this function is called with ModeSetSyncPush
...
@@ -306,7 +303,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
...
@@ -306,7 +303,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
return
0
,
err
return
0
,
err
}
}
gcSizeChange
--
gcSizeChange
--
case
shed
.
ErrNotFound
:
case
leveldb
.
ErrNotFound
:
// the chunk is not accessed before
// the chunk is not accessed before
default
:
default
:
return
0
,
err
return
0
,
err
...
@@ -336,7 +333,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
...
@@ -336,7 +333,7 @@ func (db *DB) setSync(batch *badger.Txn, addr swarm.Address, mode storage.ModeSe
// setRemove removes the chunk by updating indexes:
// setRemove removes the chunk by updating indexes:
// - delete from retrieve, pull, gc
// - delete from retrieve, pull, gc
// Provided batch is updated.
// Provided batch is updated.
func
(
db
*
DB
)
setRemove
(
batch
*
badger
.
Txn
,
addr
swarm
.
Address
)
(
gcSizeChange
int64
,
err
error
)
{
func
(
db
*
DB
)
setRemove
(
batch
*
leveldb
.
Batch
,
addr
swarm
.
Address
)
(
gcSizeChange
int64
,
err
error
)
{
item
:=
addressToItem
(
addr
)
item
:=
addressToItem
(
addr
)
// need to get access timestamp here as it is not
// need to get access timestamp here as it is not
...
@@ -346,7 +343,7 @@ func (db *DB) setRemove(batch *badger.Txn, addr swarm.Address) (gcSizeChange int
...
@@ -346,7 +343,7 @@ func (db *DB) setRemove(batch *badger.Txn, addr swarm.Address) (gcSizeChange int
switch
err
{
switch
err
{
case
nil
:
case
nil
:
item
.
AccessTimestamp
=
i
.
AccessTimestamp
item
.
AccessTimestamp
=
i
.
AccessTimestamp
case
shed
.
ErrNotFound
:
case
leveldb
.
ErrNotFound
:
default
:
default
:
return
0
,
err
return
0
,
err
}
}
...
@@ -386,14 +383,14 @@ func (db *DB) setRemove(batch *badger.Txn, addr swarm.Address) (gcSizeChange int
...
@@ -386,14 +383,14 @@ func (db *DB) setRemove(batch *badger.Txn, addr swarm.Address) (gcSizeChange int
// setPin increments pin counter for the chunk by updating
// setPin increments pin counter for the chunk by updating
// pin index and sets the chunk to be excluded from garbage collection.
// pin index and sets the chunk to be excluded from garbage collection.
// Provided batch is updated.
// Provided batch is updated.
func
(
db
*
DB
)
setPin
(
batch
*
badger
.
Txn
,
addr
swarm
.
Address
)
(
err
error
)
{
func
(
db
*
DB
)
setPin
(
batch
*
leveldb
.
Batch
,
addr
swarm
.
Address
)
(
err
error
)
{
item
:=
addressToItem
(
addr
)
item
:=
addressToItem
(
addr
)
// Get the existing pin counter of the chunk
// Get the existing pin counter of the chunk
existingPinCounter
:=
uint64
(
0
)
existingPinCounter
:=
uint64
(
0
)
pinnedChunk
,
err
:=
db
.
pinIndex
.
Get
(
item
)
pinnedChunk
,
err
:=
db
.
pinIndex
.
Get
(
item
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
shed
.
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
// If this Address is not present in DB, then its a new entry
// If this Address is not present in DB, then its a new entry
existingPinCounter
=
0
existingPinCounter
=
0
...
@@ -421,7 +418,7 @@ func (db *DB) setPin(batch *badger.Txn, addr swarm.Address) (err error) {
...
@@ -421,7 +418,7 @@ func (db *DB) setPin(batch *badger.Txn, addr swarm.Address) (err error) {
// setUnpin decrements pin counter for the chunk by updating pin index.
// setUnpin decrements pin counter for the chunk by updating pin index.
// Provided batch is updated.
// Provided batch is updated.
func
(
db
*
DB
)
setUnpin
(
batch
*
badger
.
Txn
,
addr
swarm
.
Address
)
(
err
error
)
{
func
(
db
*
DB
)
setUnpin
(
batch
*
leveldb
.
Batch
,
addr
swarm
.
Address
)
(
err
error
)
{
item
:=
addressToItem
(
addr
)
item
:=
addressToItem
(
addr
)
// Get the existing pin counter of the chunk
// Get the existing pin counter of the chunk
...
...
pkg/localstore/mode_set_test.go
View file @
7459b900
...
@@ -25,6 +25,7 @@ import (
...
@@ -25,6 +25,7 @@ import (
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/tags"
"github.com/ethersphere/bee/pkg/tags"
tagtesting
"github.com/ethersphere/bee/pkg/tags/testing"
tagtesting
"github.com/ethersphere/bee/pkg/tags/testing"
"github.com/syndtr/goleveldb/leveldb"
)
)
// TestModeSetAccess validates ModeSetAccess index values on the provided DB.
// TestModeSetAccess validates ModeSetAccess index values on the provided DB.
...
@@ -333,7 +334,7 @@ func TestModeSetRemove(t *testing.T) {
...
@@ -333,7 +334,7 @@ func TestModeSetRemove(t *testing.T) {
t
.
Run
(
"retrieve indexes"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"retrieve indexes"
,
func
(
t
*
testing
.
T
)
{
for
_
,
ch
:=
range
chunks
{
for
_
,
ch
:=
range
chunks
{
wantErr
:=
shed
.
ErrNotFound
wantErr
:=
leveldb
.
ErrNotFound
_
,
err
:=
db
.
retrievalDataIndex
.
Get
(
addressToItem
(
ch
.
Address
()))
_
,
err
:=
db
.
retrievalDataIndex
.
Get
(
addressToItem
(
ch
.
Address
()))
if
err
!=
wantErr
{
if
err
!=
wantErr
{
t
.
Errorf
(
"got error %v, want %v"
,
err
,
wantErr
)
t
.
Errorf
(
"got error %v, want %v"
,
err
,
wantErr
)
...
@@ -352,7 +353,7 @@ func TestModeSetRemove(t *testing.T) {
...
@@ -352,7 +353,7 @@ func TestModeSetRemove(t *testing.T) {
})
})
for
_
,
ch
:=
range
chunks
{
for
_
,
ch
:=
range
chunks
{
newPullIndexTest
(
db
,
ch
,
0
,
shed
.
ErrNotFound
)(
t
)
newPullIndexTest
(
db
,
ch
,
0
,
leveldb
.
ErrNotFound
)(
t
)
}
}
t
.
Run
(
"pull index count"
,
newItemsCountTest
(
db
.
pullIndex
,
0
))
t
.
Run
(
"pull index count"
,
newItemsCountTest
(
db
.
pullIndex
,
0
))
...
...
pkg/localstore/subscription_pull.go
View file @
7459b900
...
@@ -25,6 +25,7 @@ import (
...
@@ -25,6 +25,7 @@ import (
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/syndtr/goleveldb/leveldb"
)
)
// SubscribePull returns a channel that provides chunk addresses and stored times from pull syncing index.
// SubscribePull returns a channel that provides chunk addresses and stored times from pull syncing index.
...
@@ -186,7 +187,7 @@ func (db *DB) LastPullSubscriptionBinID(bin uint8) (id uint64, err error) {
...
@@ -186,7 +187,7 @@ func (db *DB) LastPullSubscriptionBinID(bin uint8) (id uint64, err error) {
item
,
err
:=
db
.
pullIndex
.
Last
([]
byte
{
bin
})
item
,
err
:=
db
.
pullIndex
.
Last
([]
byte
{
bin
})
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
shed
.
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
return
0
,
nil
return
0
,
nil
}
}
return
0
,
err
return
0
,
err
...
...
pkg/localstore/subscription_push_test.go
View file @
7459b900
...
@@ -32,8 +32,6 @@ import (
...
@@ -32,8 +32,6 @@ import (
// push syncing subscription is created and validates if
// push syncing subscription is created and validates if
// all addresses are received in the right order.
// all addresses are received in the right order.
func
TestDB_SubscribePush
(
t
*
testing
.
T
)
{
func
TestDB_SubscribePush
(
t
*
testing
.
T
)
{
t
.
Skip
(
"fails with badger shed"
)
db
,
cleanupFunc
:=
newTestDB
(
t
,
nil
)
db
,
cleanupFunc
:=
newTestDB
(
t
,
nil
)
defer
cleanupFunc
()
defer
cleanupFunc
()
...
@@ -120,8 +118,6 @@ func TestDB_SubscribePush(t *testing.T) {
...
@@ -120,8 +118,6 @@ func TestDB_SubscribePush(t *testing.T) {
// multiple push syncing subscriptions are created and
// multiple push syncing subscriptions are created and
// validates if all addresses are received in the right order.
// validates if all addresses are received in the right order.
func
TestDB_SubscribePush_multiple
(
t
*
testing
.
T
)
{
func
TestDB_SubscribePush_multiple
(
t
*
testing
.
T
)
{
t
.
Skip
(
"fails with badger shed"
)
db
,
cleanupFunc
:=
newTestDB
(
t
,
nil
)
db
,
cleanupFunc
:=
newTestDB
(
t
,
nil
)
defer
cleanupFunc
()
defer
cleanupFunc
()
...
...
pkg/shed/db.go
View file @
7459b900
...
@@ -23,66 +23,53 @@
...
@@ -23,66 +23,53 @@
package
shed
package
shed
import
(
import
(
"bytes"
"context"
"errors"
"github.com/dgraph-io/badger/v2"
"github.com/ethersphere/bee/pkg/logging"
"github.com/ethersphere/bee/pkg/logging"
)
"github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/iterator"
const
(
"github.com/syndtr/goleveldb/leveldb/opt"
DefaultSyncWrites
=
false
// Dont sync the writes to disk, instead delay it as a batch
"github.com/syndtr/goleveldb/leveldb/storage"
DefaultValueThreshold
=
1024
// Anything less than 1K value will be store with the LSM key itself
DefaultValueLogMaxEntries
=
500000
// Max number of entries in a value log
)
)
var
(
var
(
ErrNotFound
=
errors
.
New
(
"shed: not found"
)
openFileLimit
=
128
// The limit for LevelDB OpenFilesCacheCapacity.
)
)
// DB provides abstractions over
badger
DB in order to
// DB provides abstractions over
Level
DB in order to
// implement complex structures using fields and ordered indexes.
// implement complex structures using fields and ordered indexes.
// It provides a schema functionality to store fields and indexes
// It provides a schema functionality to store fields and indexes
// information about naming and types.
// information about naming and types.
type
DB
struct
{
type
DB
struct
{
path
string
ldb
*
leveldb
.
DB
bdb
*
badger
.
DB
metrics
metrics
metrics
metrics
logger
logging
.
Logger
logger
logging
.
Logger
quit
chan
struct
{}
// Quit channel to stop the metrics collection before closing the database
}
}
// NewDB opens the badger DB with options that make the DB useful for
// NewDB constructs a new DB and validates the schema
// Chunk, State as well as Index stores
// if it exists in database on the given path.
// metricsPrefix is used for metrics collection for the given DB.
func
NewDB
(
path
string
,
logger
logging
.
Logger
)
(
db
*
DB
,
err
error
)
{
func
NewDB
(
path
string
,
logger
logging
.
Logger
)
(
db
*
DB
,
err
error
)
{
var
o
badger
.
Options
var
ldb
*
leveldb
.
DB
// an empty path is used for implicit in-memory badgerdb
if
path
==
""
{
if
path
==
""
{
o
=
badger
.
DefaultOptions
(
""
)
.
WithInMemory
(
true
)
ldb
,
err
=
leveldb
.
Open
(
storage
.
NewMemStorage
(),
nil
)
}
else
{
}
else
{
o
=
badger
.
DefaultOptions
(
path
)
ldb
,
err
=
leveldb
.
OpenFile
(
path
,
&
opt
.
Options
{
OpenFilesCacheCapacity
:
openFileLimit
,
})
}
}
o
.
SyncWrites
=
DefaultSyncWrites
o
.
ValueThreshold
=
DefaultValueThreshold
o
.
ValueLogMaxEntries
=
DefaultValueLogMaxEntries
o
.
Logger
=
nil
// Dont enable the badger logs
database
,
err
:=
badger
.
Open
(
o
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
db
=
&
DB
{
db
=
&
DB
{
bdb
:
database
,
ldb
:
ldb
,
metrics
:
newMetrics
(),
metrics
:
newMetrics
(),
logger
:
logger
,
logger
:
logger
,
path
:
path
,
}
}
if
_
,
err
=
db
.
getSchema
();
err
!=
nil
{
if
_
,
err
=
db
.
getSchema
();
err
!=
nil
{
if
err
==
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
// save schema with initialized default fields
// save schema with initialized default fields
if
err
=
db
.
putSchema
(
schema
{
if
err
=
db
.
putSchema
(
schema
{
Fields
:
make
(
map
[
string
]
fieldSpec
),
Fields
:
make
(
map
[
string
]
fieldSpec
),
...
@@ -94,306 +81,78 @@ func NewDB(path string, logger logging.Logger) (db *DB, err error) {
...
@@ -94,306 +81,78 @@ func NewDB(path string, logger logging.Logger) (db *DB, err error) {
return
nil
,
err
return
nil
,
err
}
}
}
}
// Create a quit channel for the periodic metrics collector and run it
db
.
quit
=
make
(
chan
struct
{})
return
db
,
nil
return
db
,
nil
}
}
// Put
inserts the given key and value in to badg
er.
// Put
wraps LevelDB Put method to increment metrics count
er.
func
(
db
*
DB
)
Put
(
key
[]
byte
,
value
[]
byte
)
(
err
error
)
{
func
(
db
*
DB
)
Put
(
key
[]
byte
,
value
[]
byte
)
(
err
error
)
{
return
db
.
bdb
.
Update
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
err
=
db
.
ldb
.
Put
(
key
,
value
,
nil
)
db
.
metrics
.
PutCount
.
Inc
()
if
err
!=
nil
{
err
=
txn
.
Set
(
key
,
value
)
db
.
metrics
.
PutFailCounter
.
Inc
()
if
err
!=
nil
{
return
err
db
.
metrics
.
PutFailCount
.
Inc
()
}
return
err
db
.
metrics
.
PutCounter
.
Inc
()
}
return
nil
return
nil
})
}
}
// Get retrieves the value given the key.
// Get wraps LevelDB Get method to increment metrics counter.
// if the key is not present a ErrNotFound is returned.
func
(
db
*
DB
)
Get
(
key
[]
byte
)
(
value
[]
byte
,
err
error
)
{
func
(
db
*
DB
)
Get
(
key
[]
byte
)
(
value
[]
byte
,
err
error
)
{
err
=
db
.
bdb
.
View
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
value
,
err
=
db
.
ldb
.
Get
(
key
,
nil
)
item
,
err
:=
txn
.
Get
(
key
)
if
err
==
leveldb
.
ErrNotFound
{
if
err
!=
nil
{
db
.
metrics
.
GetNotFoundCounter
.
Inc
()
db
.
metrics
.
GetFailCount
.
Inc
()
return
nil
,
err
if
err
==
badger
.
ErrKeyNotFound
{
}
else
{
db
.
metrics
.
GetNotFoundCount
.
Inc
()
db
.
metrics
.
GetFailCounter
.
Inc
()
return
ErrNotFound
}
db
.
metrics
.
GetFailCount
.
Inc
()
return
err
}
return
item
.
Value
(
func
(
val
[]
byte
)
error
{
value
=
val
return
nil
})
})
if
err
==
nil
{
db
.
metrics
.
GetCount
.
Inc
()
}
}
return
value
,
err
db
.
metrics
.
GetCounter
.
Inc
()
return
value
,
nil
}
}
// Has checks if the given key is present in the database.
// Has wraps LevelDB Has method to increment metrics counter.
// it returns a bool indicating true or false OR error if it encounters one during the operation.
func
(
db
*
DB
)
Has
(
key
[]
byte
)
(
yes
bool
,
err
error
)
{
func
(
db
*
DB
)
Has
(
key
[]
byte
)
(
yes
bool
,
err
error
)
{
yes
=
false
yes
,
err
=
db
.
ldb
.
Has
(
key
,
nil
)
err
=
db
.
bdb
.
View
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
item
,
err
:=
txn
.
Get
(
key
)
if
err
!=
nil
{
if
err
==
badger
.
ErrKeyNotFound
{
return
nil
}
return
err
}
return
item
.
Value
(
func
(
val
[]
byte
)
error
{
yes
=
true
db
.
metrics
.
HasCount
.
Inc
()
return
nil
})
})
if
err
!=
nil
{
if
err
!=
nil
{
db
.
metrics
.
HasFailCount
.
Inc
()
db
.
metrics
.
HasFailCount
er
.
Inc
()
return
false
,
err
return
false
,
err
}
}
db
.
metrics
.
HasCounter
.
Inc
()
return
yes
,
nil
return
yes
,
nil
}
}
// Delete
removed the key and value if a given key is present in the DB
.
// Delete
wraps LevelDB Delete method to increment metrics counter
.
func
(
db
*
DB
)
Delete
(
key
[]
byte
)
(
err
error
)
{
func
(
db
*
DB
)
Delete
(
key
[]
byte
)
(
err
error
)
{
return
db
.
bdb
.
Update
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
err
=
db
.
ldb
.
Delete
(
key
,
nil
)
db
.
metrics
.
DeleteCount
.
Inc
()
err
=
txn
.
Delete
(
key
)
if
err
!=
nil
{
db
.
metrics
.
DeleteFailCount
.
Inc
()
}
return
err
})
}
// Count gives a count of all the keys present in the DB.
func
(
db
*
DB
)
Count
(
ctx
context
.
Context
)
(
count
int
,
err
error
)
{
db
.
metrics
.
TotalCount
.
Inc
()
err
=
db
.
bdb
.
View
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
o
:=
badger
.
DefaultIteratorOptions
o
.
PrefetchValues
=
false
i
:=
txn
.
NewIterator
(
o
)
defer
i
.
Close
()
for
i
.
Rewind
();
i
.
Valid
();
i
.
Next
()
{
item
:=
i
.
Item
()
k
:=
item
.
KeySize
()
if
k
<
1
{
continue
}
count
++
}
return
nil
})
return
count
,
err
}
// CountPrefix gives a count of all the keys that starts with a given key prefix.
// a nil prefix acts like the total count of the DB
func
(
db
*
DB
)
CountPrefix
(
prefix
[]
byte
)
(
count
int
,
err
error
)
{
db
.
metrics
.
CountPrefixCount
.
Inc
()
err
=
db
.
bdb
.
View
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
o
:=
badger
.
DefaultIteratorOptions
o
.
PrefetchValues
=
false
o
.
PrefetchSize
=
1024
i
:=
txn
.
NewIterator
(
o
)
defer
i
.
Close
()
// if prefix is nil, it is equivalent to counting from beginning
for
i
.
Seek
(
prefix
);
i
.
ValidForPrefix
(
prefix
);
i
.
Next
()
{
item
:=
i
.
Item
()
k
:=
item
.
Key
()
if
prefix
!=
nil
{
if
!
bytes
.
HasPrefix
(
k
,
prefix
)
{
break
}
}
count
++
}
return
nil
})
if
err
!=
nil
{
if
err
!=
nil
{
db
.
metrics
.
CountPrefixFailCount
.
Inc
()
db
.
metrics
.
DeleteFailCounter
.
Inc
()
}
return
err
return
count
,
err
}
// CountFrom gives a count of all the keys that start from a given prefix till the end of the DB.
func
(
db
*
DB
)
CountFrom
(
prefix
[]
byte
)
(
count
int
,
err
error
)
{
db
.
metrics
.
CountFromCount
.
Inc
()
err
=
db
.
bdb
.
View
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
o
:=
badger
.
DefaultIteratorOptions
o
.
PrefetchValues
=
false
o
.
PrefetchSize
=
1024
i
:=
txn
.
NewIterator
(
o
)
defer
i
.
Close
()
// if prefix is nil, it is equivalent to counting from beginning
for
i
.
Seek
(
prefix
);
i
.
Valid
();
i
.
Next
()
{
count
++
}
return
nil
})
if
err
!=
nil
{
db
.
metrics
.
CountPrefixFailCount
.
Inc
()
}
return
count
,
err
}
// Iterate goes through the entries in the DB starting from the startKey and executing a
// given function to see if it needs to stop the iteration or not. The skipStartKey indicates
// weather to skip the first key or not.
func
(
db
*
DB
)
Iterate
(
startKey
[]
byte
,
skipStartKey
bool
,
fn
func
(
key
[]
byte
,
value
[]
byte
)
(
stop
bool
,
err
error
))
(
err
error
)
{
db
.
metrics
.
IterationCount
.
Inc
()
err
=
db
.
bdb
.
View
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
o
:=
badger
.
DefaultIteratorOptions
o
.
PrefetchValues
=
true
o
.
PrefetchSize
=
1024
i
:=
txn
.
NewIterator
(
o
)
defer
i
.
Close
()
i
.
Seek
(
startKey
)
if
!
i
.
Valid
()
{
return
nil
}
if
skipStartKey
{
i
.
Next
()
}
for
;
i
.
Valid
();
i
.
Next
()
{
item
:=
i
.
Item
()
k
:=
item
.
Key
()
v
,
err
:=
item
.
ValueCopy
(
nil
)
if
err
!=
nil
{
return
err
}
stop
,
err
:=
fn
(
k
,
v
)
if
err
!=
nil
{
return
err
}
if
stop
{
return
nil
}
}
return
nil
})
if
err
!=
nil
{
db
.
metrics
.
IterationFailCount
.
Inc
()
}
return
err
}
// First returns the first key which matches the given prefix.
func
(
db
*
DB
)
First
(
prefix
[]
byte
)
(
key
[]
byte
,
value
[]
byte
,
err
error
)
{
db
.
metrics
.
FirstCount
.
Inc
()
err
=
db
.
bdb
.
View
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
o
:=
badger
.
DefaultIteratorOptions
o
.
PrefetchValues
=
true
o
.
PrefetchSize
=
1
i
:=
txn
.
NewIterator
(
o
)
defer
i
.
Close
()
i
.
Seek
(
prefix
)
key
=
i
.
Item
()
.
Key
()
if
!
bytes
.
HasPrefix
(
key
,
prefix
)
{
return
ErrNotFound
}
value
,
err
=
i
.
Item
()
.
ValueCopy
(
value
)
if
err
!=
nil
{
return
err
}
return
nil
})
if
err
!=
nil
{
db
.
metrics
.
FirstFailCount
.
Inc
()
}
return
key
,
value
,
err
}
// Last retuns the last key matching the given prefix.
func
(
db
*
DB
)
Last
(
prefix
[]
byte
)
(
key
[]
byte
,
value
[]
byte
,
err
error
)
{
db
.
metrics
.
LastCount
.
Inc
()
err
=
db
.
bdb
.
View
(
func
(
txn
*
badger
.
Txn
)
(
err
error
)
{
o
:=
badger
.
DefaultIteratorOptions
o
.
PrefetchValues
=
true
o
.
PrefetchSize
=
1024
o
.
Reverse
=
true
// iterate backwards
i
:=
txn
.
NewIterator
(
o
)
defer
i
.
Close
()
// get the next prefix in line
// since leveldb iterator Seek seeks to the
// next key if the key that it seeks to is not found
// and by getting the previous key, the last one for the
// actual prefix is found
nextPrefix
:=
incByteSlice
(
prefix
)
l
:=
len
(
prefix
)
if
l
>
0
&&
nextPrefix
!=
nil
{
// If there is a no key which starts which nextPrefix, badger moves the
// cursor to the previous key (which should be our key).
i
.
Seek
(
nextPrefix
)
if
bytes
.
HasPrefix
(
i
.
Item
()
.
Key
(),
prefix
)
{
key
=
i
.
Item
()
.
Key
()
value
,
err
=
i
.
Item
()
.
ValueCopy
(
nil
)
if
err
!=
nil
{
return
err
}
}
else
{
// If there is a key which starts with nextPrefix, we do reverse Next() to
// reach our key and pick that up.
i
.
Next
()
if
bytes
.
HasPrefix
(
i
.
Item
()
.
Key
(),
prefix
)
{
key
=
i
.
Item
()
.
Key
()
value
,
err
=
i
.
Item
()
.
ValueCopy
(
nil
)
if
err
!=
nil
{
return
err
}
}
}
}
if
key
==
nil
{
return
ErrNotFound
}
return
nil
})
if
err
!=
nil
{
db
.
metrics
.
LastFailCount
.
Inc
()
}
}
return
key
,
value
,
err
db
.
metrics
.
DeleteCounter
.
Inc
()
return
nil
}
}
// GetBatch get a new badger transaction to be used for multiple atomic operations.
// NewIterator wraps LevelDB NewIterator method to increment metrics counter.
func
(
db
*
DB
)
GetBatch
(
update
bool
)
(
txn
*
badger
.
Txn
)
{
func
(
db
*
DB
)
NewIterator
()
iterator
.
Iterator
{
db
.
metrics
.
GetBatchCount
.
Inc
()
db
.
metrics
.
IteratorCounter
.
Inc
()
// set update to true indicating that data will be added/changed in this transaction.
return
db
.
ldb
.
NewIterator
(
nil
,
nil
)
return
db
.
bdb
.
NewTransaction
(
update
)
}
}
// WriteBatch commits the badger transaction after all the operations are over.
// WriteBatch wraps LevelDB Write method to increment metrics counter.
func
(
db
*
DB
)
WriteBatch
(
txn
*
badger
.
Txn
)
(
err
error
)
{
func
(
db
*
DB
)
WriteBatch
(
batch
*
leveldb
.
Batch
)
(
err
error
)
{
db
.
metrics
.
WriteBatchCount
.
Inc
()
err
=
db
.
ldb
.
Write
(
batch
,
nil
)
err
=
txn
.
Commit
()
if
err
!=
nil
{
if
err
!=
nil
{
db
.
metrics
.
WriteBatchFailCount
.
Inc
()
db
.
metrics
.
WriteBatchFailCount
er
.
Inc
()
return
err
return
err
}
}
db
.
metrics
.
WriteBatchCounter
.
Inc
()
return
nil
return
nil
}
}
// Close
shuts down the badger DB
.
// Close
closes LevelDB database
.
func
(
db
*
DB
)
Close
()
(
err
error
)
{
func
(
db
*
DB
)
Close
()
(
err
error
)
{
return
db
.
bdb
.
Close
()
close
(
db
.
quit
)
return
db
.
ldb
.
Close
()
}
}
pkg/shed/example_store_test.go
View file @
7459b900
...
@@ -27,8 +27,10 @@ import (
...
@@ -27,8 +27,10 @@ import (
"github.com/ethersphere/bee/pkg/logging"
"github.com/ethersphere/bee/pkg/logging"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/shed"
"github.com/ethersphere/bee/pkg/storage"
"github.com/ethersphere/bee/pkg/storage/testing"
"github.com/ethersphere/bee/pkg/storage/testing"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/ethersphere/bee/pkg/swarm"
"github.com/syndtr/goleveldb/leveldb"
)
)
// Store holds fields and indexes (including their encoding functions)
// Store holds fields and indexes (including their encoding functions)
...
@@ -157,13 +159,16 @@ func (s *Store) Put(_ context.Context, ch swarm.Chunk) (err error) {
...
@@ -157,13 +159,16 @@ func (s *Store) Put(_ context.Context, ch swarm.Chunk) (err error) {
// items from them and adding new items as keys of index entries
// items from them and adding new items as keys of index entries
// are changed.
// are changed.
func
(
s
*
Store
)
Get
(
_
context
.
Context
,
addr
swarm
.
Address
)
(
c
swarm
.
Chunk
,
err
error
)
{
func
(
s
*
Store
)
Get
(
_
context
.
Context
,
addr
swarm
.
Address
)
(
c
swarm
.
Chunk
,
err
error
)
{
batch
:=
s
.
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
// Get the chunk data and storage timestamp.
// Get the chunk data and storage timestamp.
item
,
err
:=
s
.
retrievalIndex
.
Get
(
shed
.
Item
{
item
,
err
:=
s
.
retrievalIndex
.
Get
(
shed
.
Item
{
Address
:
addr
.
Bytes
(),
Address
:
addr
.
Bytes
(),
})
})
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
leveldb
.
ErrNotFound
{
return
nil
,
storage
.
ErrNotFound
}
return
nil
,
err
return
nil
,
err
}
}
...
@@ -182,7 +187,7 @@ func (s *Store) Get(_ context.Context, addr swarm.Address) (c swarm.Chunk, err e
...
@@ -182,7 +187,7 @@ func (s *Store) Get(_ context.Context, addr swarm.Address) (c swarm.Chunk, err e
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
case
shed
.
ErrNotFound
:
case
leveldb
.
ErrNotFound
:
// Access timestamp is not found. Do not do anything.
// Access timestamp is not found. Do not do anything.
// This is the firs get request.
// This is the firs get request.
default
:
default
:
...
@@ -238,7 +243,7 @@ func (s *Store) CollectGarbage() (err error) {
...
@@ -238,7 +243,7 @@ func (s *Store) CollectGarbage() (err error) {
for
roundCount
:=
0
;
roundCount
<
maxRounds
;
roundCount
++
{
for
roundCount
:=
0
;
roundCount
<
maxRounds
;
roundCount
++
{
var
garbageCount
int
var
garbageCount
int
// New batch for a new cg round.
// New batch for a new cg round.
trash
:=
s
.
db
.
GetBatch
(
true
)
trash
:=
new
(
leveldb
.
Batch
)
// Iterate through all index items and break when needed.
// Iterate through all index items and break when needed.
err
=
s
.
gcIndex
.
Iterate
(
func
(
item
shed
.
Item
)
(
stop
bool
,
err
error
)
{
err
=
s
.
gcIndex
.
Iterate
(
func
(
item
shed
.
Item
)
(
stop
bool
,
err
error
)
{
// Remove the chunk.
// Remove the chunk.
...
@@ -280,7 +285,7 @@ func (s *Store) CollectGarbage() (err error) {
...
@@ -280,7 +285,7 @@ func (s *Store) CollectGarbage() (err error) {
// string from a database field.
// string from a database field.
func
(
s
*
Store
)
GetSchema
()
(
name
string
,
err
error
)
{
func
(
s
*
Store
)
GetSchema
()
(
name
string
,
err
error
)
{
name
,
err
=
s
.
schemaName
.
Get
()
name
,
err
=
s
.
schemaName
.
Get
()
if
err
==
shed
.
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
return
""
,
nil
return
""
,
nil
}
}
return
name
,
err
return
name
,
err
...
...
pkg/shed/field_string.go
View file @
7459b900
...
@@ -17,8 +17,8 @@
...
@@ -17,8 +17,8 @@
package
shed
package
shed
import
(
import
(
"github.com/dgraph-io/badger/v2"
"github.com/ethersphere/bee/pkg/logging"
"github.com/ethersphere/bee/pkg/logging"
"github.com/syndtr/goleveldb/leveldb"
)
)
// StringField is the most simple field implementation
// StringField is the most simple field implementation
...
@@ -49,6 +49,10 @@ func (db *DB) NewStringField(name string) (f StringField, err error) {
...
@@ -49,6 +49,10 @@ func (db *DB) NewStringField(name string) (f StringField, err error) {
func
(
f
StringField
)
Get
()
(
val
string
,
err
error
)
{
func
(
f
StringField
)
Get
()
(
val
string
,
err
error
)
{
b
,
err
:=
f
.
db
.
Get
(
f
.
key
)
b
,
err
:=
f
.
db
.
Get
(
f
.
key
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
leveldb
.
ErrNotFound
{
f
.
logger
.
Errorf
(
"key %s not found"
,
string
(
f
.
key
))
return
""
,
nil
}
return
""
,
err
return
""
,
err
}
}
return
string
(
b
),
nil
return
string
(
b
),
nil
...
@@ -61,6 +65,6 @@ func (f StringField) Put(val string) (err error) {
...
@@ -61,6 +65,6 @@ func (f StringField) Put(val string) (err error) {
// PutInBatch stores a string in a batch that can be
// PutInBatch stores a string in a batch that can be
// saved later in database.
// saved later in database.
func
(
f
StringField
)
PutInBatch
(
batch
*
badger
.
Txn
,
val
string
)
(
err
error
)
{
func
(
f
StringField
)
PutInBatch
(
batch
*
leveldb
.
Batch
,
val
string
)
{
return
batch
.
Se
t
(
f
.
key
,
[]
byte
(
val
))
batch
.
Pu
t
(
f
.
key
,
[]
byte
(
val
))
}
}
pkg/shed/field_string_test.go
View file @
7459b900
...
@@ -18,6 +18,8 @@ package shed
...
@@ -18,6 +18,8 @@ package shed
import
(
import
(
"testing"
"testing"
"github.com/syndtr/goleveldb/leveldb"
)
)
// TestStringField validates put and get operations
// TestStringField validates put and get operations
...
@@ -33,7 +35,7 @@ func TestStringField(t *testing.T) {
...
@@ -33,7 +35,7 @@ func TestStringField(t *testing.T) {
t
.
Run
(
"get empty"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"get empty"
,
func
(
t
*
testing
.
T
)
{
got
,
err
:=
simpleString
.
Get
()
got
,
err
:=
simpleString
.
Get
()
if
err
=
=
nil
{
if
err
!
=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
}
}
want
:=
""
want
:=
""
...
@@ -73,12 +75,9 @@ func TestStringField(t *testing.T) {
...
@@ -73,12 +75,9 @@ func TestStringField(t *testing.T) {
})
})
t
.
Run
(
"put in batch"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"put in batch"
,
func
(
t
*
testing
.
T
)
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
want
:=
"simple string batch value"
want
:=
"simple string batch value"
err
=
simpleString
.
PutInBatch
(
batch
,
want
)
simpleString
.
PutInBatch
(
batch
,
want
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
db
.
WriteBatch
(
batch
)
err
=
db
.
WriteBatch
(
batch
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -92,12 +91,9 @@ func TestStringField(t *testing.T) {
...
@@ -92,12 +91,9 @@ func TestStringField(t *testing.T) {
}
}
t
.
Run
(
"overwrite"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"overwrite"
,
func
(
t
*
testing
.
T
)
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
want
:=
"overwritten string batch value"
want
:=
"overwritten string batch value"
err
=
simpleString
.
PutInBatch
(
batch
,
want
)
simpleString
.
PutInBatch
(
batch
,
want
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
db
.
WriteBatch
(
batch
)
err
=
db
.
WriteBatch
(
batch
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
...
pkg/shed/field_struct.go
View file @
7459b900
...
@@ -19,8 +19,8 @@ package shed
...
@@ -19,8 +19,8 @@ package shed
import
(
import
(
"encoding/json"
"encoding/json"
"github.com/dgraph-io/badger/v2"
"github.com/ethersphere/bee/pkg/logging"
"github.com/ethersphere/bee/pkg/logging"
"github.com/syndtr/goleveldb/leveldb"
)
)
// StructField is a helper to store complex structure by
// StructField is a helper to store complex structure by
...
@@ -46,7 +46,7 @@ func (db *DB) NewStructField(name string) (f StructField, err error) {
...
@@ -46,7 +46,7 @@ func (db *DB) NewStructField(name string) (f StructField, err error) {
}
}
// Get unmarshals data from the database to a provided val.
// Get unmarshals data from the database to a provided val.
// If the data is not found ErrNotFound is returned.
// If the data is not found
leveldb.
ErrNotFound is returned.
func
(
f
StructField
)
Get
(
val
interface
{})
(
err
error
)
{
func
(
f
StructField
)
Get
(
val
interface
{})
(
err
error
)
{
b
,
err
:=
f
.
db
.
Get
(
f
.
key
)
b
,
err
:=
f
.
db
.
Get
(
f
.
key
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -67,14 +67,12 @@ func (f StructField) Put(val interface{}) (err error) {
...
@@ -67,14 +67,12 @@ func (f StructField) Put(val interface{}) (err error) {
}
}
// PutInBatch marshals provided val and puts it into the batch.
// PutInBatch marshals provided val and puts it into the batch.
func
(
f
StructField
)
PutInBatch
(
batch
*
badger
.
Txn
,
val
interface
{})
(
err
error
)
{
func
(
f
StructField
)
PutInBatch
(
batch
*
leveldb
.
Batch
,
val
interface
{})
(
err
error
)
{
b
,
err
:=
json
.
Marshal
(
val
)
b
,
err
:=
json
.
Marshal
(
val
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"could not PUT key %s in batch"
,
string
(
f
.
key
))
return
err
return
err
}
}
err
=
batch
.
Set
(
f
.
key
,
b
)
batch
.
Put
(
f
.
key
,
b
)
if
err
!=
nil
{
return
err
}
return
nil
return
nil
}
}
pkg/shed/field_struct_test.go
View file @
7459b900
...
@@ -18,6 +18,8 @@ package shed
...
@@ -18,6 +18,8 @@ package shed
import
(
import
(
"testing"
"testing"
"github.com/syndtr/goleveldb/leveldb"
)
)
// TestStructField validates put and get operations
// TestStructField validates put and get operations
...
@@ -38,8 +40,8 @@ func TestStructField(t *testing.T) {
...
@@ -38,8 +40,8 @@ func TestStructField(t *testing.T) {
t
.
Run
(
"get empty"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"get empty"
,
func
(
t
*
testing
.
T
)
{
var
s
complexStructure
var
s
complexStructure
err
:=
complexField
.
Get
(
&
s
)
err
:=
complexField
.
Get
(
&
s
)
if
err
!=
ErrNotFound
{
if
err
!=
leveldb
.
ErrNotFound
{
t
.
Fatalf
(
"got error %v, want %v"
,
err
,
ErrNotFound
)
t
.
Fatalf
(
"got error %v, want %v"
,
err
,
leveldb
.
ErrNotFound
)
}
}
want
:=
""
want
:=
""
if
s
.
A
!=
want
{
if
s
.
A
!=
want
{
...
@@ -84,7 +86,7 @@ func TestStructField(t *testing.T) {
...
@@ -84,7 +86,7 @@ func TestStructField(t *testing.T) {
})
})
t
.
Run
(
"put in batch"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"put in batch"
,
func
(
t
*
testing
.
T
)
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
want
:=
complexStructure
{
want
:=
complexStructure
{
A
:
"simple string batch value"
,
A
:
"simple string batch value"
,
}
}
...
@@ -106,7 +108,7 @@ func TestStructField(t *testing.T) {
...
@@ -106,7 +108,7 @@ func TestStructField(t *testing.T) {
}
}
t
.
Run
(
"overwrite"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"overwrite"
,
func
(
t
*
testing
.
T
)
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
want
:=
complexStructure
{
want
:=
complexStructure
{
A
:
"overwritten string batch value"
,
A
:
"overwritten string batch value"
,
}
}
...
...
pkg/shed/field_uint64.go
View file @
7459b900
...
@@ -19,8 +19,8 @@ package shed
...
@@ -19,8 +19,8 @@ package shed
import
(
import
(
"encoding/binary"
"encoding/binary"
"github.com/dgraph-io/badger/v2"
"github.com/ethersphere/bee/pkg/logging"
"github.com/ethersphere/bee/pkg/logging"
"github.com/syndtr/goleveldb/leveldb"
)
)
// Uint64Field provides a way to have a simple counter in the database.
// Uint64Field provides a way to have a simple counter in the database.
...
@@ -51,7 +51,7 @@ func (db *DB) NewUint64Field(name string) (f Uint64Field, err error) {
...
@@ -51,7 +51,7 @@ func (db *DB) NewUint64Field(name string) (f Uint64Field, err error) {
func
(
f
Uint64Field
)
Get
()
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Field
)
Get
()
(
val
uint64
,
err
error
)
{
b
,
err
:=
f
.
db
.
Get
(
f
.
key
)
b
,
err
:=
f
.
db
.
Get
(
f
.
key
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
f
.
logger
.
Errorf
(
"key %s not found"
,
string
(
f
.
key
))
f
.
logger
.
Errorf
(
"key %s not found"
,
string
(
f
.
key
))
return
0
,
nil
return
0
,
nil
}
}
...
@@ -67,8 +67,8 @@ func (f Uint64Field) Put(val uint64) (err error) {
...
@@ -67,8 +67,8 @@ func (f Uint64Field) Put(val uint64) (err error) {
// PutInBatch stores a uint64 value in a batch
// PutInBatch stores a uint64 value in a batch
// that can be saved later in the database.
// that can be saved later in the database.
func
(
f
Uint64Field
)
PutInBatch
(
batch
*
badger
.
Txn
,
val
uint64
)
(
err
error
)
{
func
(
f
Uint64Field
)
PutInBatch
(
batch
*
leveldb
.
Batch
,
val
uint64
)
{
return
batch
.
Se
t
(
f
.
key
,
encodeUint64
(
val
))
batch
.
Pu
t
(
f
.
key
,
encodeUint64
(
val
))
}
}
// Inc increments a uint64 value in the database.
// Inc increments a uint64 value in the database.
...
@@ -76,7 +76,13 @@ func (f Uint64Field) PutInBatch(batch *badger.Txn, val uint64) (err error) {
...
@@ -76,7 +76,13 @@ func (f Uint64Field) PutInBatch(batch *badger.Txn, val uint64) (err error) {
func
(
f
Uint64Field
)
Inc
()
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Field
)
Inc
()
(
val
uint64
,
err
error
)
{
val
,
err
=
f
.
Get
()
val
,
err
=
f
.
Get
()
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
if
err
==
leveldb
.
ErrNotFound
{
f
.
logger
.
Debugf
(
"key %s not found"
,
string
(
f
.
key
))
val
=
0
}
else
{
f
.
logger
.
Errorf
(
"key %s not found. Error: %s"
,
string
(
f
.
key
),
err
.
Error
())
return
0
,
err
}
}
}
val
++
val
++
return
val
,
f
.
Put
(
val
)
return
val
,
f
.
Put
(
val
)
...
@@ -85,16 +91,19 @@ func (f Uint64Field) Inc() (val uint64, err error) {
...
@@ -85,16 +91,19 @@ func (f Uint64Field) Inc() (val uint64, err error) {
// IncInBatch increments a uint64 value in the batch
// IncInBatch increments a uint64 value in the batch
// by retreiving a value from the database, not the same batch.
// by retreiving a value from the database, not the same batch.
// This operation is not goroutine save.
// This operation is not goroutine save.
func
(
f
Uint64Field
)
IncInBatch
(
batch
*
badger
.
Txn
)
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Field
)
IncInBatch
(
batch
*
leveldb
.
Batch
)
(
val
uint64
,
err
error
)
{
val
,
err
=
f
.
Get
()
val
,
err
=
f
.
Get
()
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
if
err
==
leveldb
.
ErrNotFound
{
f
.
logger
.
Debugf
(
"key %s not found"
,
string
(
f
.
key
))
val
=
0
}
else
{
f
.
logger
.
Errorf
(
"key %s not found. Error: %s"
,
string
(
f
.
key
),
err
.
Error
())
return
0
,
err
}
}
}
val
++
val
++
err
=
f
.
PutInBatch
(
batch
,
val
)
f
.
PutInBatch
(
batch
,
val
)
if
err
!=
nil
{
return
0
,
err
}
return
val
,
nil
return
val
,
nil
}
}
...
@@ -104,7 +113,13 @@ func (f Uint64Field) IncInBatch(batch *badger.Txn) (val uint64, err error) {
...
@@ -104,7 +113,13 @@ func (f Uint64Field) IncInBatch(batch *badger.Txn) (val uint64, err error) {
func
(
f
Uint64Field
)
Dec
()
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Field
)
Dec
()
(
val
uint64
,
err
error
)
{
val
,
err
=
f
.
Get
()
val
,
err
=
f
.
Get
()
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
if
err
==
leveldb
.
ErrNotFound
{
f
.
logger
.
Debugf
(
"key %s not found"
,
string
(
f
.
key
))
val
=
0
}
else
{
f
.
logger
.
Errorf
(
"key %s not found. Error: %s"
,
string
(
f
.
key
),
err
.
Error
())
return
0
,
err
}
}
}
if
val
!=
0
{
if
val
!=
0
{
val
--
val
--
...
@@ -116,18 +131,21 @@ func (f Uint64Field) Dec() (val uint64, err error) {
...
@@ -116,18 +131,21 @@ func (f Uint64Field) Dec() (val uint64, err error) {
// by retreiving a value from the database, not the same batch.
// by retreiving a value from the database, not the same batch.
// This operation is not goroutine save.
// This operation is not goroutine save.
// The field is protected from overflow to a negative value.
// The field is protected from overflow to a negative value.
func
(
f
Uint64Field
)
DecInBatch
(
batch
*
badger
.
Txn
)
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Field
)
DecInBatch
(
batch
*
leveldb
.
Batch
)
(
val
uint64
,
err
error
)
{
val
,
err
=
f
.
Get
()
val
,
err
=
f
.
Get
()
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
if
err
==
leveldb
.
ErrNotFound
{
f
.
logger
.
Debugf
(
"key %s not found"
,
string
(
f
.
key
))
val
=
0
}
else
{
f
.
logger
.
Errorf
(
"key %s not found. Error: %s"
,
string
(
f
.
key
),
err
.
Error
())
return
0
,
err
}
}
}
if
val
!=
0
{
if
val
!=
0
{
val
--
val
--
}
}
err
=
f
.
PutInBatch
(
batch
,
val
)
f
.
PutInBatch
(
batch
,
val
)
if
err
!=
nil
{
return
0
,
err
}
return
val
,
nil
return
val
,
nil
}
}
...
...
pkg/shed/field_uint64_test.go
View file @
7459b900
...
@@ -18,6 +18,8 @@ package shed
...
@@ -18,6 +18,8 @@ package shed
import
(
import
(
"testing"
"testing"
"github.com/syndtr/goleveldb/leveldb"
)
)
// TestUint64Field validates put and get operations
// TestUint64Field validates put and get operations
...
@@ -73,12 +75,9 @@ func TestUint64Field(t *testing.T) {
...
@@ -73,12 +75,9 @@ func TestUint64Field(t *testing.T) {
})
})
t
.
Run
(
"put in batch"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"put in batch"
,
func
(
t
*
testing
.
T
)
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
var
want
uint64
=
42
var
want
uint64
=
42
err
=
counter
.
PutInBatch
(
batch
,
want
)
counter
.
PutInBatch
(
batch
,
want
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
db
.
WriteBatch
(
batch
)
err
=
db
.
WriteBatch
(
batch
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -92,12 +91,9 @@ func TestUint64Field(t *testing.T) {
...
@@ -92,12 +91,9 @@ func TestUint64Field(t *testing.T) {
}
}
t
.
Run
(
"overwrite"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"overwrite"
,
func
(
t
*
testing
.
T
)
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
var
want
uint64
=
84
var
want
uint64
=
84
err
=
counter
.
PutInBatch
(
batch
,
want
)
counter
.
PutInBatch
(
batch
,
want
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
db
.
WriteBatch
(
batch
)
err
=
db
.
WriteBatch
(
batch
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -154,7 +150,7 @@ func TestUint64Field_IncInBatch(t *testing.T) {
...
@@ -154,7 +150,7 @@ func TestUint64Field_IncInBatch(t *testing.T) {
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
}
}
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
var
want
uint64
=
1
var
want
uint64
=
1
got
,
err
:=
counter
.
IncInBatch
(
batch
)
got
,
err
:=
counter
.
IncInBatch
(
batch
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -175,7 +171,7 @@ func TestUint64Field_IncInBatch(t *testing.T) {
...
@@ -175,7 +171,7 @@ func TestUint64Field_IncInBatch(t *testing.T) {
t
.
Errorf
(
"got uint64 %v, want %v"
,
got
,
want
)
t
.
Errorf
(
"got uint64 %v, want %v"
,
got
,
want
)
}
}
batch2
:=
db
.
GetBatch
(
true
)
batch2
:=
new
(
leveldb
.
Batch
)
want
=
2
want
=
2
got
,
err
=
counter
.
IncInBatch
(
batch2
)
got
,
err
=
counter
.
IncInBatch
(
batch2
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -245,7 +241,7 @@ func TestUint64Field_DecInBatch(t *testing.T) {
...
@@ -245,7 +241,7 @@ func TestUint64Field_DecInBatch(t *testing.T) {
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
}
}
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
var
want
uint64
var
want
uint64
got
,
err
:=
counter
.
DecInBatch
(
batch
)
got
,
err
:=
counter
.
DecInBatch
(
batch
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -266,12 +262,9 @@ func TestUint64Field_DecInBatch(t *testing.T) {
...
@@ -266,12 +262,9 @@ func TestUint64Field_DecInBatch(t *testing.T) {
t
.
Errorf
(
"got uint64 %v, want %v"
,
got
,
want
)
t
.
Errorf
(
"got uint64 %v, want %v"
,
got
,
want
)
}
}
batch2
:=
db
.
GetBatch
(
true
)
batch2
:=
new
(
leveldb
.
Batch
)
want
=
42
want
=
42
err
=
counter
.
PutInBatch
(
batch2
,
want
)
counter
.
PutInBatch
(
batch2
,
want
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
db
.
WriteBatch
(
batch2
)
err
=
db
.
WriteBatch
(
batch2
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -284,7 +277,7 @@ func TestUint64Field_DecInBatch(t *testing.T) {
...
@@ -284,7 +277,7 @@ func TestUint64Field_DecInBatch(t *testing.T) {
t
.
Errorf
(
"got uint64 %v, want %v"
,
got
,
want
)
t
.
Errorf
(
"got uint64 %v, want %v"
,
got
,
want
)
}
}
batch3
:=
db
.
GetBatch
(
true
)
batch3
:=
new
(
leveldb
.
Batch
)
want
=
41
want
=
41
got
,
err
=
counter
.
DecInBatch
(
batch3
)
got
,
err
=
counter
.
DecInBatch
(
batch3
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
pkg/shed/index.go
View file @
7459b900
...
@@ -19,8 +19,9 @@ package shed
...
@@ -19,8 +19,9 @@ package shed
import
(
import
(
"bytes"
"bytes"
"github.com/dgraph-io/badger/v2"
"github.com/ethersphere/bee/pkg/logging"
"github.com/ethersphere/bee/pkg/logging"
"github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/iterator"
)
)
// Item holds fields relevant to Swarm Chunk data and metadata.
// Item holds fields relevant to Swarm Chunk data and metadata.
...
@@ -78,7 +79,7 @@ func (i Item) Merge(i2 Item) (new Item) {
...
@@ -78,7 +79,7 @@ func (i Item) Merge(i2 Item) (new Item) {
// to provide transparent actions on saved data which inclide:
// to provide transparent actions on saved data which inclide:
// - getting a particular Item
// - getting a particular Item
// - saving a particular Item
// - saving a particular Item
// - iterating over a sorted
Badger
DB keys
// - iterating over a sorted
Level
DB keys
// It implements IndexIteratorInterface interface.
// It implements IndexIteratorInterface interface.
type
Index
struct
{
type
Index
struct
{
db
*
DB
db
*
DB
...
@@ -140,14 +141,17 @@ func (db *DB) NewIndex(name string, funcs IndexFuncs) (f Index, err error) {
...
@@ -140,14 +141,17 @@ func (db *DB) NewIndex(name string, funcs IndexFuncs) (f Index, err error) {
func
(
f
Index
)
Get
(
keyFields
Item
)
(
out
Item
,
err
error
)
{
func
(
f
Index
)
Get
(
keyFields
Item
)
(
out
Item
,
err
error
)
{
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in Get. Error: %s"
,
err
.
Error
())
return
out
,
err
return
out
,
err
}
}
value
,
err
:=
f
.
db
.
Get
(
key
)
value
,
err
:=
f
.
db
.
Get
(
key
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"error getting key %s in Get. Error: %s"
,
string
(
key
),
err
.
Error
())
return
out
,
err
return
out
,
err
}
}
out
,
err
=
f
.
decodeValueFunc
(
keyFields
,
value
)
out
,
err
=
f
.
decodeValueFunc
(
keyFields
,
value
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"error decofing keyfields in Get. Error: %s"
,
err
.
Error
())
return
out
,
err
return
out
,
err
}
}
return
out
.
Merge
(
keyFields
),
nil
return
out
.
Merge
(
keyFields
),
nil
...
@@ -158,31 +162,32 @@ func (f Index) Get(keyFields Item) (out Item, err error) {
...
@@ -158,31 +162,32 @@ func (f Index) Get(keyFields Item) (out Item, err error) {
// fields. Every item must have all fields needed for encoding the
// fields. Every item must have all fields needed for encoding the
// key set. The passed slice items will be changed so that they
// key set. The passed slice items will be changed so that they
// contain data from the index values. No new slice is allocated.
// contain data from the index values. No new slice is allocated.
// This function uses a single leveldb snapshot.
func
(
f
Index
)
Fill
(
items
[]
Item
)
(
err
error
)
{
func
(
f
Index
)
Fill
(
items
[]
Item
)
(
err
error
)
{
txn
:=
f
.
db
.
GetBatch
(
false
)
snapshot
,
err
:=
f
.
db
.
ldb
.
GetSnapshot
()
defer
txn
.
Discard
()
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"error getting snapshot in Fill. Error: %s"
,
err
.
Error
())
return
err
}
defer
snapshot
.
Release
()
for
i
,
item
:=
range
items
{
for
i
,
item
:=
range
items
{
key
,
err
:=
f
.
encodeKeyFunc
(
item
)
key
,
err
:=
f
.
encodeKeyFunc
(
item
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in Fill. Error: %s"
,
err
.
Error
())
f
.
logger
.
Debugf
(
"keyfields encoding error in Fill. Error: %s"
,
err
.
Error
())
return
err
return
err
}
}
badgerItem
,
err
:=
txn
.
Get
(
key
)
value
,
err
:=
snapshot
.
Get
(
key
,
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
badger
.
ErrKeyNotFound
{
f
.
logger
.
Debugf
(
"error getting key %s in Fill. Error: %s"
,
string
(
key
),
err
.
Error
())
return
ErrNotFound
}
return
err
return
err
}
}
var
decodedItem
Item
v
,
err
:=
f
.
decodeValueFunc
(
item
,
value
)
err
=
badgerItem
.
Value
(
func
(
val
[]
byte
)
error
{
decodedItem
,
err
=
f
.
decodeValueFunc
(
item
,
val
)
return
err
})
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"error decofing keyfields in Fill . Error: %s"
,
err
.
Error
())
return
err
return
err
}
}
items
[
i
]
=
decodedItem
.
Merge
(
item
)
items
[
i
]
=
v
.
Merge
(
item
)
}
}
return
nil
return
nil
}
}
...
@@ -193,6 +198,7 @@ func (f Index) Fill(items []Item) (err error) {
...
@@ -193,6 +198,7 @@ func (f Index) Fill(items []Item) (err error) {
func
(
f
Index
)
Has
(
keyFields
Item
)
(
bool
,
error
)
{
func
(
f
Index
)
Has
(
keyFields
Item
)
(
bool
,
error
)
{
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in Has. Error: %s"
,
err
.
Error
())
return
false
,
err
return
false
,
err
}
}
return
f
.
db
.
Has
(
key
)
return
f
.
db
.
Has
(
key
)
...
@@ -202,29 +208,22 @@ func (f Index) Has(keyFields Item) (bool, error) {
...
@@ -202,29 +208,22 @@ func (f Index) Has(keyFields Item) (bool, error) {
// there this Item's encoded key is stored in the index for each of them.
// there this Item's encoded key is stored in the index for each of them.
func
(
f
Index
)
HasMulti
(
items
...
Item
)
([]
bool
,
error
)
{
func
(
f
Index
)
HasMulti
(
items
...
Item
)
([]
bool
,
error
)
{
have
:=
make
([]
bool
,
len
(
items
))
have
:=
make
([]
bool
,
len
(
items
))
snapshot
,
err
:=
f
.
db
.
ldb
.
GetSnapshot
()
txn
:=
f
.
db
.
GetBatch
(
false
)
if
err
!=
nil
{
defer
txn
.
Discard
()
f
.
logger
.
Debugf
(
"error getting snapshot in HasMulti. Error: %s"
,
err
.
Error
())
return
nil
,
err
opts
:=
badger
.
DefaultIteratorOptions
}
opts
.
PrefetchValues
=
false
defer
snapshot
.
Release
()
it
:=
txn
.
NewIterator
(
opts
)
defer
it
.
Close
()
for
i
,
keyFields
:=
range
items
{
for
i
,
keyFields
:=
range
items
{
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in HasMulti. Error: %s"
,
err
.
Error
())
return
nil
,
err
return
nil
,
err
}
}
it
.
Seek
(
key
)
have
[
i
],
err
=
snapshot
.
Has
(
key
,
nil
)
if
err
!=
nil
{
if
!
it
.
Valid
()
{
f
.
logger
.
Debugf
(
"snaoshot Has error in HasMulti. Error: %s"
,
err
.
Error
())
have
[
i
]
=
false
return
nil
,
err
continue
}
if
bytes
.
Equal
(
key
,
it
.
Item
()
.
Key
())
{
have
[
i
]
=
true
}
}
}
}
return
have
,
nil
return
have
,
nil
...
@@ -235,10 +234,12 @@ func (f Index) HasMulti(items ...Item) ([]bool, error) {
...
@@ -235,10 +234,12 @@ func (f Index) HasMulti(items ...Item) ([]bool, error) {
func
(
f
Index
)
Put
(
i
Item
)
(
err
error
)
{
func
(
f
Index
)
Put
(
i
Item
)
(
err
error
)
{
key
,
err
:=
f
.
encodeKeyFunc
(
i
)
key
,
err
:=
f
.
encodeKeyFunc
(
i
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in Put. Error: %s"
,
err
.
Error
())
return
err
return
err
}
}
value
,
err
:=
f
.
encodeValueFunc
(
i
)
value
,
err
:=
f
.
encodeValueFunc
(
i
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in Put. Error: %s"
,
err
.
Error
())
return
err
return
err
}
}
return
f
.
db
.
Put
(
key
,
value
)
return
f
.
db
.
Put
(
key
,
value
)
...
@@ -247,16 +248,19 @@ func (f Index) Put(i Item) (err error) {
...
@@ -247,16 +248,19 @@ func (f Index) Put(i Item) (err error) {
// PutInBatch is the same as Put method, but it just
// PutInBatch is the same as Put method, but it just
// saves the key/value pair to the batch instead
// saves the key/value pair to the batch instead
// directly to the database.
// directly to the database.
func
(
f
Index
)
PutInBatch
(
batch
*
badger
.
Txn
,
i
Item
)
(
err
error
)
{
func
(
f
Index
)
PutInBatch
(
batch
*
leveldb
.
Batch
,
i
Item
)
(
err
error
)
{
key
,
err
:=
f
.
encodeKeyFunc
(
i
)
key
,
err
:=
f
.
encodeKeyFunc
(
i
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in PutInBatch. Error: %s"
,
err
.
Error
())
return
err
return
err
}
}
value
,
err
:=
f
.
encodeValueFunc
(
i
)
value
,
err
:=
f
.
encodeValueFunc
(
i
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in PutInBatch. Error: %s"
,
err
.
Error
())
return
err
return
err
}
}
return
batch
.
Set
(
key
,
value
)
batch
.
Put
(
key
,
value
)
return
nil
}
}
// Delete accepts Item to remove a key/value pair
// Delete accepts Item to remove a key/value pair
...
@@ -264,6 +268,7 @@ func (f Index) PutInBatch(batch *badger.Txn, i Item) (err error) {
...
@@ -264,6 +268,7 @@ func (f Index) PutInBatch(batch *badger.Txn, i Item) (err error) {
func
(
f
Index
)
Delete
(
keyFields
Item
)
(
err
error
)
{
func
(
f
Index
)
Delete
(
keyFields
Item
)
(
err
error
)
{
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in Delete. Error: %s"
,
err
.
Error
())
return
err
return
err
}
}
return
f
.
db
.
Delete
(
key
)
return
f
.
db
.
Delete
(
key
)
...
@@ -271,12 +276,14 @@ func (f Index) Delete(keyFields Item) (err error) {
...
@@ -271,12 +276,14 @@ func (f Index) Delete(keyFields Item) (err error) {
// DeleteInBatch is the same as Delete just the operation
// DeleteInBatch is the same as Delete just the operation
// is performed on the batch instead on the database.
// is performed on the batch instead on the database.
func
(
f
Index
)
DeleteInBatch
(
batch
*
badger
.
Txn
,
keyFields
Item
)
(
err
error
)
{
func
(
f
Index
)
DeleteInBatch
(
batch
*
leveldb
.
Batch
,
keyFields
Item
)
(
err
error
)
{
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
key
,
err
:=
f
.
encodeKeyFunc
(
keyFields
)
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"keyfields encoding error in DeleteInBatch. Error: %s"
,
err
.
Error
())
return
err
return
err
}
}
return
batch
.
Delete
(
key
)
batch
.
Delete
(
key
)
return
nil
}
}
// IndexIterFunc is a callback on every Item that is decoded
// IndexIterFunc is a callback on every Item that is decoded
...
@@ -315,64 +322,102 @@ func (f Index) Iterate(fn IndexIterFunc, options *IterateOptions) (err error) {
...
@@ -315,64 +322,102 @@ func (f Index) Iterate(fn IndexIterFunc, options *IterateOptions) (err error) {
return
err
return
err
}
}
}
}
it
:=
f
.
db
.
NewIterator
()
defer
it
.
Release
()
err
=
f
.
db
.
Iterate
(
startKey
,
options
.
SkipStartFromItem
,
func
(
key
[]
byte
,
value
[]
byte
)
(
stop
bool
,
err
error
)
{
// move the cursor to the start key
item
,
err
:=
f
.
itemFromKeyValue
(
key
,
value
,
prefix
)
ok
:=
it
.
Seek
(
startKey
)
if
!
ok
{
f
.
logger
.
Debugf
(
"seek error in Iterate. Error: %s"
,
it
.
Error
())
// stop iterator if seek has failed
return
it
.
Error
()
}
if
options
.
SkipStartFromItem
&&
bytes
.
Equal
(
startKey
,
it
.
Key
())
{
// skip the start from Item if it is the first key
// and it is explicitly configured to skip it
ok
=
it
.
Next
()
}
for
;
ok
;
ok
=
it
.
Next
()
{
item
,
err
:=
f
.
itemFromIterator
(
it
,
prefix
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
badger
.
ErrKey
NotFound
{
if
err
==
leveldb
.
Err
NotFound
{
return
true
,
nil
break
}
}
return
false
,
err
return
err
}
stop
,
err
:=
fn
(
item
)
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"error executing callback function in Iterate. Error: %s"
,
err
.
Error
())
return
err
}
if
stop
{
break
}
}
stop
,
err
=
fn
(
item
)
}
return
stop
,
err
return
it
.
Error
()
})
return
err
}
}
// First returns the first item in the Index which encoded key starts with a prefix.
// First returns the first item in the Index which encoded key starts with a prefix.
// If the prefix is nil, the first element of the whole index is returned.
// If the prefix is nil, the first element of the whole index is returned.
// If Index has no elements, a ErrNotFound error is returned.
// If Index has no elements, a
leveldb.
ErrNotFound error is returned.
func
(
f
Index
)
First
(
prefix
[]
byte
)
(
i
Item
,
err
error
)
{
func
(
f
Index
)
First
(
prefix
[]
byte
)
(
i
Item
,
err
error
)
{
it
:=
f
.
db
.
NewIterator
()
defer
it
.
Release
()
totalPrefix
:=
append
(
f
.
prefix
,
prefix
...
)
totalPrefix
:=
append
(
f
.
prefix
,
prefix
...
)
k
,
v
,
err
:=
f
.
db
.
First
(
totalPrefix
)
it
.
Seek
(
totalPrefix
)
if
err
!=
nil
{
return
i
,
err
return
f
.
itemFromIterator
(
it
,
totalPrefix
)
}
return
f
.
itemFromKeyValue
(
k
,
v
,
totalPrefix
)
}
}
// itemFrom
KeyValue
returns the Item from the current iterator position.
// itemFrom
Iterator
returns the Item from the current iterator position.
// If the complete encoded key does not start with totalPrefix,
// If the complete encoded key does not start with totalPrefix,
//
badger
.ErrNotFound is returned. Value for totalPrefix must start with
//
leveldb
.ErrNotFound is returned. Value for totalPrefix must start with
// Index prefix.
// Index prefix.
func
(
f
Index
)
itemFromKeyValue
(
key
[]
byte
,
value
[]
byte
,
totalPrefix
[]
byte
)
(
i
Item
,
err
error
)
{
func
(
f
Index
)
itemFromIterator
(
it
iterator
.
Iterator
,
totalPrefix
[]
byte
)
(
i
Item
,
err
error
)
{
key
:=
it
.
Key
()
if
!
bytes
.
HasPrefix
(
key
,
totalPrefix
)
{
if
!
bytes
.
HasPrefix
(
key
,
totalPrefix
)
{
return
i
,
badger
.
ErrKey
NotFound
return
i
,
leveldb
.
Err
NotFound
}
}
// create a copy of key byte slice not to share
badger
underlaying slice array
// create a copy of key byte slice not to share
leveldb
underlaying slice array
keyItem
,
err
:=
f
.
decodeKeyFunc
(
append
([]
byte
(
nil
),
key
...
))
keyItem
,
err
:=
f
.
decodeKeyFunc
(
append
([]
byte
(
nil
),
key
...
))
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"error decoding key in itemFromIterator. Error: %s"
,
err
.
Error
())
return
i
,
err
return
i
,
err
}
}
// create a copy of value byte slice not to share
badger
underlaying slice array
// create a copy of value byte slice not to share
leveldb
underlaying slice array
valueItem
,
err
:=
f
.
decodeValueFunc
(
keyItem
,
append
([]
byte
(
nil
),
value
...
))
valueItem
,
err
:=
f
.
decodeValueFunc
(
keyItem
,
append
([]
byte
(
nil
),
it
.
Value
()
...
))
if
err
!=
nil
{
if
err
!=
nil
{
f
.
logger
.
Debugf
(
"error decoding value in itemFromIterator. Error: %s"
,
err
.
Error
())
return
i
,
err
return
i
,
err
}
}
return
keyItem
.
Merge
(
valueItem
),
nil
return
keyItem
.
Merge
(
valueItem
),
it
.
Error
()
}
}
// Last returns the last item in the Index which encoded key starts with a prefix.
// Last returns the last item in the Index which encoded key starts with a prefix.
// If the prefix is nil, the last element of the whole index is returned.
// If the prefix is nil, the last element of the whole index is returned.
// If Index has no elements, a ErrNotFound error is returned.
// If Index has no elements, a
leveldb.
ErrNotFound error is returned.
func
(
f
Index
)
Last
(
prefix
[]
byte
)
(
i
Item
,
err
error
)
{
func
(
f
Index
)
Last
(
prefix
[]
byte
)
(
i
Item
,
err
error
)
{
totalPrefix
:=
append
(
f
.
prefix
,
prefix
...
)
it
:=
f
.
db
.
NewIterator
()
k
,
v
,
err
:=
f
.
db
.
Last
(
totalPrefix
)
defer
it
.
Release
()
if
err
!=
nil
{
return
i
,
err
// get the next prefix in line
// since leveldb iterator Seek seeks to the
// next key if the key that it seeks to is not found
// and by getting the previous key, the last one for the
// actual prefix is found
nextPrefix
:=
incByteSlice
(
prefix
)
l
:=
len
(
prefix
)
if
l
>
0
&&
nextPrefix
!=
nil
{
it
.
Seek
(
append
(
f
.
prefix
,
nextPrefix
...
))
it
.
Prev
()
}
else
{
it
.
Last
()
}
}
return
f
.
itemFromKeyValue
(
k
,
v
,
totalPrefix
)
totalPrefix
:=
append
(
f
.
prefix
,
prefix
...
)
return
f
.
itemFromIterator
(
it
,
totalPrefix
)
}
}
// incByteSlice returns the byte slice of the same size
// incByteSlice returns the byte slice of the same size
...
@@ -397,7 +442,17 @@ func incByteSlice(b []byte) (next []byte) {
...
@@ -397,7 +442,17 @@ func incByteSlice(b []byte) (next []byte) {
// Count returns the number of items in index.
// Count returns the number of items in index.
func
(
f
Index
)
Count
()
(
count
int
,
err
error
)
{
func
(
f
Index
)
Count
()
(
count
int
,
err
error
)
{
return
f
.
db
.
CountPrefix
(
f
.
prefix
)
it
:=
f
.
db
.
NewIterator
()
defer
it
.
Release
()
for
ok
:=
it
.
Seek
(
f
.
prefix
);
ok
;
ok
=
it
.
Next
()
{
key
:=
it
.
Key
()
if
key
[
0
]
!=
f
.
prefix
[
0
]
{
break
}
count
++
}
return
count
,
it
.
Error
()
}
}
// CountFrom returns the number of items in index keys
// CountFrom returns the number of items in index keys
...
@@ -408,5 +463,15 @@ func (f Index) CountFrom(start Item) (count int, err error) {
...
@@ -408,5 +463,15 @@ func (f Index) CountFrom(start Item) (count int, err error) {
f
.
logger
.
Debugf
(
"error encoding item in CountFrom. Error: %s"
,
err
.
Error
())
f
.
logger
.
Debugf
(
"error encoding item in CountFrom. Error: %s"
,
err
.
Error
())
return
0
,
err
return
0
,
err
}
}
return
f
.
db
.
CountFrom
(
startKey
)
it
:=
f
.
db
.
NewIterator
()
defer
it
.
Release
()
for
ok
:=
it
.
Seek
(
startKey
);
ok
;
ok
=
it
.
Next
()
{
key
:=
it
.
Key
()
if
key
[
0
]
!=
f
.
prefix
[
0
]
{
break
}
count
++
}
return
count
,
it
.
Error
()
}
}
pkg/shed/index_test.go
View file @
7459b900
...
@@ -23,6 +23,8 @@ import (
...
@@ -23,6 +23,8 @@ import (
"sort"
"sort"
"testing"
"testing"
"time"
"time"
"github.com/syndtr/goleveldb/leveldb"
)
)
// Index functions for the index that is used in tests in this file.
// Index functions for the index that is used in tests in this file.
...
@@ -104,7 +106,7 @@ func TestIndex(t *testing.T) {
...
@@ -104,7 +106,7 @@ func TestIndex(t *testing.T) {
StoreTimestamp
:
time
.
Now
()
.
UTC
()
.
UnixNano
(),
StoreTimestamp
:
time
.
Now
()
.
UTC
()
.
UnixNano
(),
}
}
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
err
=
index
.
PutInBatch
(
batch
,
want
)
err
=
index
.
PutInBatch
(
batch
,
want
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -128,7 +130,7 @@ func TestIndex(t *testing.T) {
...
@@ -128,7 +130,7 @@ func TestIndex(t *testing.T) {
StoreTimestamp
:
time
.
Now
()
.
UTC
()
.
UnixNano
(),
StoreTimestamp
:
time
.
Now
()
.
UTC
()
.
UnixNano
(),
}
}
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
err
=
index
.
PutInBatch
(
batch
,
want
)
err
=
index
.
PutInBatch
(
batch
,
want
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -150,7 +152,7 @@ func TestIndex(t *testing.T) {
...
@@ -150,7 +152,7 @@ func TestIndex(t *testing.T) {
t
.
Run
(
"put in batch twice"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"put in batch twice"
,
func
(
t
*
testing
.
T
)
{
// ensure that the last item of items with the same db keys
// ensure that the last item of items with the same db keys
// is actually saved
// is actually saved
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
address
:=
[]
byte
(
"put-in-batch-twice-hash"
)
address
:=
[]
byte
(
"put-in-batch-twice-hash"
)
// put the first item
// put the first item
...
@@ -214,7 +216,7 @@ func TestIndex(t *testing.T) {
...
@@ -214,7 +216,7 @@ func TestIndex(t *testing.T) {
}
}
has
,
err
=
index
.
Has
(
dontWant
)
has
,
err
=
index
.
Has
(
dontWant
)
if
err
!=
nil
&&
err
!=
ErrNotFound
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
}
}
if
has
{
if
has
{
...
@@ -248,7 +250,7 @@ func TestIndex(t *testing.T) {
...
@@ -248,7 +250,7 @@ func TestIndex(t *testing.T) {
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
}
}
wantErr
:=
ErrNotFound
wantErr
:=
leveldb
.
ErrNotFound
_
,
err
=
index
.
Get
(
Item
{
_
,
err
=
index
.
Get
(
Item
{
Address
:
want
.
Address
,
Address
:
want
.
Address
,
})
})
...
@@ -276,7 +278,7 @@ func TestIndex(t *testing.T) {
...
@@ -276,7 +278,7 @@ func TestIndex(t *testing.T) {
}
}
checkItem
(
t
,
got
,
want
)
checkItem
(
t
,
got
,
want
)
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
err
=
index
.
DeleteInBatch
(
batch
,
Item
{
err
=
index
.
DeleteInBatch
(
batch
,
Item
{
Address
:
want
.
Address
,
Address
:
want
.
Address
,
})
})
...
@@ -288,7 +290,7 @@ func TestIndex(t *testing.T) {
...
@@ -288,7 +290,7 @@ func TestIndex(t *testing.T) {
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
}
}
wantErr
:=
ErrNotFound
wantErr
:=
leveldb
.
ErrNotFound
_
,
err
=
index
.
Get
(
Item
{
_
,
err
=
index
.
Get
(
Item
{
Address
:
want
.
Address
,
Address
:
want
.
Address
,
})
})
...
@@ -351,7 +353,7 @@ func TestIndex(t *testing.T) {
...
@@ -351,7 +353,7 @@ func TestIndex(t *testing.T) {
items
=
append
(
items
,
Item
{
items
=
append
(
items
,
Item
{
Address
:
[]
byte
(
"put-hash-missing"
),
Address
:
[]
byte
(
"put-hash-missing"
),
})
})
want
:=
ErrNotFound
want
:=
leveldb
.
ErrNotFound
err
:=
index
.
Fill
(
items
)
err
:=
index
.
Fill
(
items
)
if
err
!=
want
{
if
err
!=
want
{
t
.
Errorf
(
"got error %v, want %v"
,
err
,
want
)
t
.
Errorf
(
"got error %v, want %v"
,
err
,
want
)
...
@@ -393,7 +395,7 @@ func TestIndex_Iterate(t *testing.T) {
...
@@ -393,7 +395,7 @@ func TestIndex_Iterate(t *testing.T) {
Data
:
[]
byte
(
"data1"
),
Data
:
[]
byte
(
"data1"
),
},
},
}
}
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
for
_
,
i
:=
range
items
{
for
_
,
i
:=
range
items
{
err
=
index
.
PutInBatch
(
batch
,
i
)
err
=
index
.
PutInBatch
(
batch
,
i
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -567,7 +569,7 @@ func TestIndex_Iterate_withPrefix(t *testing.T) {
...
@@ -567,7 +569,7 @@ func TestIndex_Iterate_withPrefix(t *testing.T) {
{
Address
:
[]
byte
(
"want-hash-09"
),
Data
:
[]
byte
(
"data89"
)},
{
Address
:
[]
byte
(
"want-hash-09"
),
Data
:
[]
byte
(
"data89"
)},
{
Address
:
[]
byte
(
"skip-hash-10"
),
Data
:
[]
byte
(
"data90"
)},
{
Address
:
[]
byte
(
"skip-hash-10"
),
Data
:
[]
byte
(
"data90"
)},
}
}
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
for
_
,
i
:=
range
allItems
{
for
_
,
i
:=
range
allItems
{
err
=
index
.
PutInBatch
(
batch
,
i
)
err
=
index
.
PutInBatch
(
batch
,
i
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -763,7 +765,7 @@ func TestIndex_count(t *testing.T) {
...
@@ -763,7 +765,7 @@ func TestIndex_count(t *testing.T) {
Data
:
[]
byte
(
"data1"
),
Data
:
[]
byte
(
"data1"
),
},
},
}
}
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
for
_
,
i
:=
range
items
{
for
_
,
i
:=
range
items
{
err
=
index
.
PutInBatch
(
batch
,
i
)
err
=
index
.
PutInBatch
(
batch
,
i
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -936,7 +938,7 @@ func TestIndex_firstAndLast(t *testing.T) {
...
@@ -936,7 +938,7 @@ func TestIndex_firstAndLast(t *testing.T) {
return
bytes
.
Compare
(
addrs
[
i
],
addrs
[
j
])
==
-
1
return
bytes
.
Compare
(
addrs
[
i
],
addrs
[
j
])
==
-
1
})
})
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
for
_
,
addr
:=
range
addrs
{
for
_
,
addr
:=
range
addrs
{
err
=
index
.
PutInBatch
(
batch
,
Item
{
err
=
index
.
PutInBatch
(
batch
,
Item
{
Address
:
addr
,
Address
:
addr
,
...
@@ -998,11 +1000,11 @@ func TestIndex_firstAndLast(t *testing.T) {
...
@@ -998,11 +1000,11 @@ func TestIndex_firstAndLast(t *testing.T) {
},
},
{
{
prefix
:
[]
byte
{
0
,
3
},
prefix
:
[]
byte
{
0
,
3
},
err
:
ErrNotFound
,
err
:
leveldb
.
ErrNotFound
,
},
},
{
{
prefix
:
[]
byte
{
222
},
prefix
:
[]
byte
{
222
},
err
:
ErrNotFound
,
err
:
leveldb
.
ErrNotFound
,
},
},
}
{
}
{
got
,
err
:=
index
.
Last
(
tc
.
prefix
)
got
,
err
:=
index
.
Last
(
tc
.
prefix
)
...
@@ -1087,7 +1089,7 @@ func TestIndex_HasMulti(t *testing.T) {
...
@@ -1087,7 +1089,7 @@ func TestIndex_HasMulti(t *testing.T) {
Data
:
[]
byte
(
"data0"
),
Data
:
[]
byte
(
"data0"
),
}
}
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
for
_
,
i
:=
range
items
{
for
_
,
i
:=
range
items
{
err
=
index
.
PutInBatch
(
batch
,
i
)
err
=
index
.
PutInBatch
(
batch
,
i
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
pkg/shed/metrics.go
View file @
7459b900
...
@@ -13,179 +13,95 @@ type metrics struct {
...
@@ -13,179 +13,95 @@ type metrics struct {
// all metrics fields must be exported
// all metrics fields must be exported
// to be able to return them by Metrics()
// to be able to return them by Metrics()
// using reflection
// using reflection
GetCount
prometheus
.
Counter
PutCounter
prometheus
.
Counter
GetFailCount
prometheus
.
Counter
PutFailCounter
prometheus
.
Counter
GetNotFoundCount
prometheus
.
Counter
GetCounter
prometheus
.
Counter
PutCount
prometheus
.
Counter
GetFailCounter
prometheus
.
Counter
PutFailCount
prometheus
.
Counter
GetNotFoundCounter
prometheus
.
Counter
HasCount
prometheus
.
Counter
HasCounter
prometheus
.
Counter
HasFailCount
prometheus
.
Counter
HasFailCounter
prometheus
.
Counter
DeleteCount
prometheus
.
Counter
DeleteCounter
prometheus
.
Counter
DeleteFailCount
prometheus
.
Counter
DeleteFailCounter
prometheus
.
Counter
TotalCount
prometheus
.
Counter
IteratorCounter
prometheus
.
Counter
TotalFailCount
prometheus
.
Counter
WriteBatchCounter
prometheus
.
Counter
CountPrefixCount
prometheus
.
Counter
WriteBatchFailCounter
prometheus
.
Counter
CountPrefixFailCount
prometheus
.
Counter
CountFromCount
prometheus
.
Counter
CountFromFailCount
prometheus
.
Counter
IterationCount
prometheus
.
Counter
IterationFailCount
prometheus
.
Counter
FirstCount
prometheus
.
Counter
FirstFailCount
prometheus
.
Counter
LastCount
prometheus
.
Counter
LastFailCount
prometheus
.
Counter
GetBatchCount
prometheus
.
Counter
WriteBatchCount
prometheus
.
Counter
WriteBatchFailCount
prometheus
.
Counter
}
}
func
newMetrics
()
metrics
{
func
newMetrics
()
metrics
{
subsystem
:=
"shed"
subsystem
:=
"shed"
return
metrics
{
return
metrics
{
GetCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
PutCounter
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"
ge
t_count"
,
Name
:
"
pu
t_count"
,
Help
:
"Number of times
a GET operation is performed
."
,
Help
:
"Number of times
the PUT operation is done
."
,
}),
}),
GetFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
PutFailCounter
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"
get_failure
_count"
,
Name
:
"
put_fail
_count"
,
Help
:
"Number of times
a GE
T operation failed."
,
Help
:
"Number of times
the PU
T operation failed."
,
}),
}),
Get
NotFoundCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Get
Counter
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"get_
not_found_
count"
,
Name
:
"get_count"
,
Help
:
"Number of times
a GET operation failed
."
,
Help
:
"Number of times
the GET operation is done
."
,
}),
}),
PutCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
GetNotFoundCounter
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"
put
_count"
,
Name
:
"
get_not_found
_count"
,
Help
:
"Number of times
a PUT operation is performed
."
,
Help
:
"Number of times
the GET operation could not find key
."
,
}),
}),
PutFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
GetFailCounter
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"
put_failure
_count"
,
Name
:
"
get_fail
_count"
,
Help
:
"Number of times
a PUT operation
failed."
,
Help
:
"Number of times
the GET operation is
failed."
,
}),
}),
HasCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
HasCount
er
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"has_count"
,
Name
:
"has_count"
,
Help
:
"Number of times
a HAS operation is performed
."
,
Help
:
"Number of times
the HAS operation is done
."
,
}),
}),
HasFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
HasFailCount
er
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"has_fail
ure
_count"
,
Name
:
"has_fail_count"
,
Help
:
"Number of times
a
HAS operation failed."
,
Help
:
"Number of times
the
HAS operation failed."
,
}),
}),
DeleteCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
DeleteCount
er
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"delete_count"
,
Name
:
"delete_count"
,
Help
:
"Number of times a DELETE operation is performed."
,
Help
:
"Number of times the DELETE operation is done."
,
}),
DeleteFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"delete_failure_count"
,
Help
:
"Number of times a DELETE operation failed."
,
}),
TotalCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"total_count"
,
Help
:
"Number of times a COUNT operation is performed."
,
}),
TotalFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"total_failure_count"
,
Help
:
"Number of times a COUNT operation failed."
,
}),
CountPrefixCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"count_prefix_count"
,
Help
:
"Number of times a COUNT_PREFIX operation is performed."
,
}),
CountFromFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"count_from_failure_count"
,
Help
:
"Number of times a COUNT_FROM operation failed."
,
}),
CountFromCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"count_from_count"
,
Help
:
"Number of times a COUNT_FROM operation is performed."
,
}),
CountPrefixFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"count_prefix_failure_count"
,
Help
:
"Number of times a COUNT_PREFIX operation failed."
,
}),
IterationCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"iteration_count"
,
Help
:
"Number of times a ITERATION operation is performed."
,
}),
IterationFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"iteration_failure_count"
,
Help
:
"Number of times a ITERATION operation failed."
,
}),
FirstCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"first_count"
,
Help
:
"Number of times a FIRST operation is performed."
,
}),
FirstFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"first_failure_count"
,
Help
:
"Number of times a FIRST operation failed."
,
}),
LastCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Name
:
"last_count"
,
Help
:
"Number of times a LAST operation is performed."
,
}),
}),
LastFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
DeleteFailCounter
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"
last_failure
_count"
,
Name
:
"
delete_fail
_count"
,
Help
:
"Number of times
a LAST
operation failed."
,
Help
:
"Number of times
the DELETE
operation failed."
,
}),
}),
GetBatchCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
IteratorCounter
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"
getbatch
_count"
,
Name
:
"
iterator
_count"
,
Help
:
"Number of times
a GET_BATCH operation is performed
."
,
Help
:
"Number of times
the ITERATOR operation is done
."
,
}),
}),
WriteBatchCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
WriteBatchCount
er
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"write_batch_count"
,
Name
:
"write_batch_count"
,
Help
:
"Number of times
a WRITE_BATCH operation is performed
."
,
Help
:
"Number of times
the WRITE_BATCH operation is done
."
,
}),
}),
WriteBatchFailCount
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
WriteBatchFailCount
er
:
prometheus
.
NewCounter
(
prometheus
.
CounterOpts
{
Namespace
:
m
.
Namespace
,
Namespace
:
m
.
Namespace
,
Subsystem
:
subsystem
,
Subsystem
:
subsystem
,
Name
:
"write_batch_fail
ure
_count"
,
Name
:
"write_batch_fail_count"
,
Help
:
"Number of times
a
WRITE_BATCH operation failed."
,
Help
:
"Number of times
the
WRITE_BATCH operation failed."
,
}),
}),
}
}
}
}
...
...
pkg/shed/vector_uint64.go
View file @
7459b900
...
@@ -19,8 +19,8 @@ package shed
...
@@ -19,8 +19,8 @@ package shed
import
(
import
(
"encoding/binary"
"encoding/binary"
"github.com/dgraph-io/badger/v2"
"github.com/ethersphere/bee/pkg/logging"
"github.com/ethersphere/bee/pkg/logging"
"github.com/syndtr/goleveldb/leveldb"
)
)
// Uint64Vector provides a way to have multiple counters in the database.
// Uint64Vector provides a way to have multiple counters in the database.
...
@@ -51,7 +51,7 @@ func (db *DB) NewUint64Vector(name string) (f Uint64Vector, err error) {
...
@@ -51,7 +51,7 @@ func (db *DB) NewUint64Vector(name string) (f Uint64Vector, err error) {
func
(
f
Uint64Vector
)
Get
(
i
uint64
)
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Vector
)
Get
(
i
uint64
)
(
val
uint64
,
err
error
)
{
b
,
err
:=
f
.
db
.
Get
(
f
.
indexKey
(
i
))
b
,
err
:=
f
.
db
.
Get
(
f
.
indexKey
(
i
))
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
return
0
,
nil
return
0
,
nil
}
}
return
0
,
err
return
0
,
err
...
@@ -66,8 +66,8 @@ func (f Uint64Vector) Put(i, val uint64) (err error) {
...
@@ -66,8 +66,8 @@ func (f Uint64Vector) Put(i, val uint64) (err error) {
// PutInBatch stores a uint64 value at index i in a batch
// PutInBatch stores a uint64 value at index i in a batch
// that can be saved later in the database.
// that can be saved later in the database.
func
(
f
Uint64Vector
)
PutInBatch
(
batch
*
badger
.
Txn
,
i
,
val
uint64
)
(
err
error
)
{
func
(
f
Uint64Vector
)
PutInBatch
(
batch
*
leveldb
.
Batch
,
i
,
val
uint64
)
{
return
batch
.
Se
t
(
f
.
indexKey
(
i
),
encodeUint64
(
val
))
batch
.
Pu
t
(
f
.
indexKey
(
i
),
encodeUint64
(
val
))
}
}
// Inc increments a uint64 value in the database.
// Inc increments a uint64 value in the database.
...
@@ -75,7 +75,12 @@ func (f Uint64Vector) PutInBatch(batch *badger.Txn, i, val uint64) (err error) {
...
@@ -75,7 +75,12 @@ func (f Uint64Vector) PutInBatch(batch *badger.Txn, i, val uint64) (err error) {
func
(
f
Uint64Vector
)
Inc
(
i
uint64
)
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Vector
)
Inc
(
i
uint64
)
(
val
uint64
,
err
error
)
{
val
,
err
=
f
.
Get
(
i
)
val
,
err
=
f
.
Get
(
i
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
if
err
==
leveldb
.
ErrNotFound
{
val
=
0
}
else
{
f
.
logger
.
Debugf
(
"error getiing value while doing Inc. Error: %s"
,
err
.
Error
())
return
0
,
err
}
}
}
val
++
val
++
return
val
,
f
.
Put
(
i
,
val
)
return
val
,
f
.
Put
(
i
,
val
)
...
@@ -84,16 +89,18 @@ func (f Uint64Vector) Inc(i uint64) (val uint64, err error) {
...
@@ -84,16 +89,18 @@ func (f Uint64Vector) Inc(i uint64) (val uint64, err error) {
// IncInBatch increments a uint64 value at index i in the batch
// IncInBatch increments a uint64 value at index i in the batch
// by retreiving a value from the database, not the same batch.
// by retreiving a value from the database, not the same batch.
// This operation is not goroutine safe.
// This operation is not goroutine safe.
func
(
f
Uint64Vector
)
IncInBatch
(
batch
*
badger
.
Txn
,
i
uint64
)
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Vector
)
IncInBatch
(
batch
*
leveldb
.
Batch
,
i
uint64
)
(
val
uint64
,
err
error
)
{
val
,
err
=
f
.
Get
(
i
)
val
,
err
=
f
.
Get
(
i
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
if
err
==
leveldb
.
ErrNotFound
{
val
=
0
}
else
{
f
.
logger
.
Debugf
(
"error getiing value while doing IncInBatch. Error: %s"
,
err
.
Error
())
return
0
,
err
}
}
}
val
++
val
++
err
=
f
.
PutInBatch
(
batch
,
i
,
val
)
f
.
PutInBatch
(
batch
,
i
,
val
)
if
err
!=
nil
{
return
0
,
err
}
return
val
,
nil
return
val
,
nil
}
}
...
@@ -103,7 +110,7 @@ func (f Uint64Vector) IncInBatch(batch *badger.Txn, i uint64) (val uint64, err e
...
@@ -103,7 +110,7 @@ func (f Uint64Vector) IncInBatch(batch *badger.Txn, i uint64) (val uint64, err e
func
(
f
Uint64Vector
)
Dec
(
i
uint64
)
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Vector
)
Dec
(
i
uint64
)
(
val
uint64
,
err
error
)
{
val
,
err
=
f
.
Get
(
i
)
val
,
err
=
f
.
Get
(
i
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
==
ErrNotFound
{
if
err
==
leveldb
.
ErrNotFound
{
val
=
0
val
=
0
}
else
{
}
else
{
f
.
logger
.
Debugf
(
"error getiing value while doing Dec. Error: %s"
,
err
.
Error
())
f
.
logger
.
Debugf
(
"error getiing value while doing Dec. Error: %s"
,
err
.
Error
())
...
@@ -120,18 +127,20 @@ func (f Uint64Vector) Dec(i uint64) (val uint64, err error) {
...
@@ -120,18 +127,20 @@ func (f Uint64Vector) Dec(i uint64) (val uint64, err error) {
// by retreiving a value from the database, not the same batch.
// by retreiving a value from the database, not the same batch.
// This operation is not goroutine safe.
// This operation is not goroutine safe.
// The field is protected from overflow to a negative value.
// The field is protected from overflow to a negative value.
func
(
f
Uint64Vector
)
DecInBatch
(
batch
*
badger
.
Txn
,
i
uint64
)
(
val
uint64
,
err
error
)
{
func
(
f
Uint64Vector
)
DecInBatch
(
batch
*
leveldb
.
Batch
,
i
uint64
)
(
val
uint64
,
err
error
)
{
val
,
err
=
f
.
Get
(
i
)
val
,
err
=
f
.
Get
(
i
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
if
err
==
leveldb
.
ErrNotFound
{
val
=
0
}
else
{
f
.
logger
.
Debugf
(
"error getiing value while doing DecInBatch. Error: %s"
,
err
.
Error
())
return
0
,
err
}
}
}
if
val
!=
0
{
if
val
!=
0
{
val
--
val
--
}
}
err
=
f
.
PutInBatch
(
batch
,
i
,
val
)
f
.
PutInBatch
(
batch
,
i
,
val
)
if
err
!=
nil
{
return
0
,
err
}
return
val
,
nil
return
val
,
nil
}
}
...
...
pkg/shed/vector_uint64_test.go
View file @
7459b900
...
@@ -18,6 +18,8 @@ package shed
...
@@ -18,6 +18,8 @@ package shed
import
(
import
(
"testing"
"testing"
"github.com/syndtr/goleveldb/leveldb"
)
)
// TestUint64Vector validates put and get operations
// TestUint64Vector validates put and get operations
...
@@ -76,12 +78,9 @@ func TestUint64Vector(t *testing.T) {
...
@@ -76,12 +78,9 @@ func TestUint64Vector(t *testing.T) {
t
.
Run
(
"put in batch"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"put in batch"
,
func
(
t
*
testing
.
T
)
{
for
_
,
index
:=
range
[]
uint64
{
0
,
1
,
2
,
3
,
5
,
10
}
{
for
_
,
index
:=
range
[]
uint64
{
0
,
1
,
2
,
3
,
5
,
10
}
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
var
want
uint64
=
43
+
index
var
want
uint64
=
43
+
index
err
=
bins
.
PutInBatch
(
batch
,
index
,
want
)
bins
.
PutInBatch
(
batch
,
index
,
want
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
db
.
WriteBatch
(
batch
)
err
=
db
.
WriteBatch
(
batch
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -95,12 +94,9 @@ func TestUint64Vector(t *testing.T) {
...
@@ -95,12 +94,9 @@ func TestUint64Vector(t *testing.T) {
}
}
t
.
Run
(
"overwrite"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"overwrite"
,
func
(
t
*
testing
.
T
)
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
var
want
uint64
=
85
+
index
var
want
uint64
=
85
+
index
err
=
bins
.
PutInBatch
(
batch
,
index
,
want
)
bins
.
PutInBatch
(
batch
,
index
,
want
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
db
.
WriteBatch
(
batch
)
err
=
db
.
WriteBatch
(
batch
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -161,7 +157,7 @@ func TestUint64Vector_IncInBatch(t *testing.T) {
...
@@ -161,7 +157,7 @@ func TestUint64Vector_IncInBatch(t *testing.T) {
}
}
for
_
,
index
:=
range
[]
uint64
{
0
,
1
,
2
,
3
,
5
,
10
}
{
for
_
,
index
:=
range
[]
uint64
{
0
,
1
,
2
,
3
,
5
,
10
}
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
var
want
uint64
=
1
var
want
uint64
=
1
got
,
err
:=
bins
.
IncInBatch
(
batch
,
index
)
got
,
err
:=
bins
.
IncInBatch
(
batch
,
index
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -182,7 +178,7 @@ func TestUint64Vector_IncInBatch(t *testing.T) {
...
@@ -182,7 +178,7 @@ func TestUint64Vector_IncInBatch(t *testing.T) {
t
.
Errorf
(
"got %v uint64 %v, want %v"
,
index
,
got
,
want
)
t
.
Errorf
(
"got %v uint64 %v, want %v"
,
index
,
got
,
want
)
}
}
batch2
:=
db
.
GetBatch
(
true
)
batch2
:=
new
(
leveldb
.
Batch
)
want
=
2
want
=
2
got
,
err
=
bins
.
IncInBatch
(
batch2
,
index
)
got
,
err
=
bins
.
IncInBatch
(
batch2
,
index
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -256,7 +252,7 @@ func TestUint64Vector_DecInBatch(t *testing.T) {
...
@@ -256,7 +252,7 @@ func TestUint64Vector_DecInBatch(t *testing.T) {
}
}
for
_
,
index
:=
range
[]
uint64
{
0
,
1
,
2
,
3
,
5
,
10
}
{
for
_
,
index
:=
range
[]
uint64
{
0
,
1
,
2
,
3
,
5
,
10
}
{
batch
:=
db
.
GetBatch
(
true
)
batch
:=
new
(
leveldb
.
Batch
)
var
want
uint64
var
want
uint64
got
,
err
:=
bins
.
DecInBatch
(
batch
,
index
)
got
,
err
:=
bins
.
DecInBatch
(
batch
,
index
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -277,12 +273,9 @@ func TestUint64Vector_DecInBatch(t *testing.T) {
...
@@ -277,12 +273,9 @@ func TestUint64Vector_DecInBatch(t *testing.T) {
t
.
Errorf
(
"got %v uint64 %v, want %v"
,
index
,
got
,
want
)
t
.
Errorf
(
"got %v uint64 %v, want %v"
,
index
,
got
,
want
)
}
}
batch2
:=
db
.
GetBatch
(
true
)
batch2
:=
new
(
leveldb
.
Batch
)
want
=
42
+
index
want
=
42
+
index
err
=
bins
.
PutInBatch
(
batch2
,
index
,
want
)
bins
.
PutInBatch
(
batch2
,
index
,
want
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
db
.
WriteBatch
(
batch2
)
err
=
db
.
WriteBatch
(
batch2
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -295,7 +288,7 @@ func TestUint64Vector_DecInBatch(t *testing.T) {
...
@@ -295,7 +288,7 @@ func TestUint64Vector_DecInBatch(t *testing.T) {
t
.
Errorf
(
"got %v uint64 %v, want %v"
,
index
,
got
,
want
)
t
.
Errorf
(
"got %v uint64 %v, want %v"
,
index
,
got
,
want
)
}
}
batch3
:=
db
.
GetBatch
(
true
)
batch3
:=
new
(
leveldb
.
Batch
)
want
=
41
+
index
want
=
41
+
index
got
,
err
=
bins
.
DecInBatch
(
batch3
,
index
)
got
,
err
=
bins
.
DecInBatch
(
batch3
,
index
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment