LFUDA changes #47

Closed
nikooo777 wants to merge 12 commits from improvements into master
17 changed files with 553 additions and 80 deletions

View file

@ -37,7 +37,7 @@ func peerCmd(cmd *cobra.Command, args []string) {
err = db.Connect(globalConfig.DBConn) err = db.Connect(globalConfig.DBConn)
checkErr(err) checkErr(err)
combo := store.NewDBBackedStore(s3, db) combo := store.NewDBBackedStore(s3, db, false)
peerServer = peer.NewServer(combo) peerServer = peer.NewServer(combo)
} }

View file

@ -16,25 +16,28 @@ import (
"github.com/lbryio/reflector.go/reflector" "github.com/lbryio/reflector.go/reflector"
"github.com/lbryio/reflector.go/store" "github.com/lbryio/reflector.go/store"
"github.com/lbryio/lbry.go/v2/stream"
"github.com/c2h5oh/datasize"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/spf13/cast"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var ( var (
tcpPeerPort int tcpPeerPort int
http3PeerPort int http3PeerPort int
receiverPort int receiverPort int
metricsPort int metricsPort int
disableUploads bool disableUploads bool
disableBlocklist bool disableBlocklist bool
proxyAddress string proxyAddress string
proxyPort string proxyPort string
proxyProtocol string proxyProtocol string
useDB bool useDB bool
cloudFrontEndpoint string cloudFrontEndpoint string
reflectorCmdDiskCache string reflectorCmdDiskCache string
reflectorCmdMemCache int bufferReflectorCmdDiskCache string
reflectorCmdMemCache int
) )
func init() { func init() {
@ -55,7 +58,9 @@ func init() {
cmd.Flags().BoolVar(&disableBlocklist, "disable-blocklist", false, "Disable blocklist watching/updating") cmd.Flags().BoolVar(&disableBlocklist, "disable-blocklist", false, "Disable blocklist watching/updating")
cmd.Flags().BoolVar(&useDB, "use-db", true, "whether to connect to the reflector db or not") cmd.Flags().BoolVar(&useDB, "use-db", true, "whether to connect to the reflector db or not")
cmd.Flags().StringVar(&reflectorCmdDiskCache, "disk-cache", "", cmd.Flags().StringVar(&reflectorCmdDiskCache, "disk-cache", "",
"enable disk cache, setting max size and path where to store blobs. format is 'MAX_BLOBS:CACHE_PATH'") "enable disk cache, setting max size and path where to store blobs. format is 'sizeGB:CACHE_PATH'")
cmd.Flags().StringVar(&bufferReflectorCmdDiskCache, "buffer-disk-cache", "",
"enable buffer disk cache, setting max size and path where to store blobs. format is 'sizeGB:CACHE_PATH'")
cmd.Flags().IntVar(&reflectorCmdMemCache, "mem-cache", 0, "enable in-memory cache with a max size of this many blobs") cmd.Flags().IntVar(&reflectorCmdMemCache, "mem-cache", 0, "enable in-memory cache with a max size of this many blobs")
rootCmd.AddCommand(cmd) rootCmd.AddCommand(cmd)
} }
@ -122,11 +127,21 @@ func setupStore() store.BlobStore {
log.Fatalf("protocol is not recognized: %s", proxyProtocol) log.Fatalf("protocol is not recognized: %s", proxyProtocol)
} }
} else { } else {
s3Store := store.NewS3Store(globalConfig.AwsID, globalConfig.AwsSecret, globalConfig.BucketRegion, globalConfig.BucketName) var s3Store *store.S3Store
if conf != "none" {
s3Store = store.NewS3Store(globalConfig.AwsID, globalConfig.AwsSecret, globalConfig.BucketRegion, globalConfig.BucketName)
}
if cloudFrontEndpoint != "" { if cloudFrontEndpoint != "" {
s = store.NewCloudFrontRWStore(store.NewCloudFrontROStore(cloudFrontEndpoint), s3Store) cfs := store.NewCloudFrontROStore(cloudFrontEndpoint)
} else { if s3Store != nil {
s = store.NewCloudFrontRWStore(cfs, s3Store)
} else {
s = cfs
}
} else if s3Store != nil {
s = s3Store s = s3Store
} else {
log.Fatalf("this configuration does not include a valid upstream source")
} }
} }
@ -138,7 +153,7 @@ func setupStore() store.BlobStore {
log.Fatal(err) log.Fatal(err)
} }
s = store.NewDBBackedStore(s, db) s = store.NewDBBackedStore(s, db, false)
} }
return s return s
@ -147,7 +162,10 @@ func setupStore() store.BlobStore {
func wrapWithCache(s store.BlobStore) store.BlobStore { func wrapWithCache(s store.BlobStore) store.BlobStore {
wrapped := s wrapped := s
diskCacheMaxSize, diskCachePath := diskCacheParams() diskCacheMaxSize, diskCachePath := diskCacheParams(reflectorCmdDiskCache)
//we are tracking blobs in memory with a 1 byte long boolean, which means that for each 2MB (a blob) we need 1Byte
// so if the underlying cache holds 10MB, 10MB/2MB=5Bytes which is also the exact count of objects to restore on startup
realCacheSize := float64(diskCacheMaxSize) / float64(stream.MaxBlobSize)
if diskCacheMaxSize > 0 { if diskCacheMaxSize > 0 {
err := os.MkdirAll(diskCachePath, os.ModePerm) err := os.MkdirAll(diskCachePath, os.ModePerm)
if err != nil { if err != nil {
@ -156,7 +174,21 @@ func wrapWithCache(s store.BlobStore) store.BlobStore {
wrapped = store.NewCachingStore( wrapped = store.NewCachingStore(
"reflector", "reflector",
wrapped, wrapped,
store.NewLRUStore("peer_server", store.NewDiskStore(diskCachePath, 2), diskCacheMaxSize), store.NewLFUDAStore("hdd", store.NewDiskStore(diskCachePath, 2), realCacheSize),
)
}
diskCacheMaxSize, diskCachePath = diskCacheParams(bufferReflectorCmdDiskCache)
realCacheSize = float64(diskCacheMaxSize) / float64(stream.MaxBlobSize)
if diskCacheMaxSize > 0 {
err := os.MkdirAll(diskCachePath, os.ModePerm)
if err != nil {
log.Fatal(err)
}
wrapped = store.NewCachingStore(
"reflector",
wrapped,
store.NewLFUDAStore("nvme", store.NewDiskStore(diskCachePath, 2), realCacheSize),
) )
} }
@ -164,32 +196,36 @@ func wrapWithCache(s store.BlobStore) store.BlobStore {
wrapped = store.NewCachingStore( wrapped = store.NewCachingStore(
"reflector", "reflector",
wrapped, wrapped,
store.NewLRUStore("peer_server", store.NewMemStore(), reflectorCmdMemCache), store.NewLRUStore("mem", store.NewMemStore(), reflectorCmdMemCache),
) )
} }
return wrapped return wrapped
} }
func diskCacheParams() (int, string) { func diskCacheParams(diskParams string) (int, string) {
if reflectorCmdDiskCache == "" { if diskParams == "" {
return 0, "" return 0, ""
} }
parts := strings.Split(reflectorCmdDiskCache, ":") parts := strings.Split(diskParams, ":")
if len(parts) != 2 { if len(parts) != 2 {
log.Fatalf("--disk-cache must be a number, followed by ':', followed by a string") log.Fatalf("--disk-cache must be a number, followed by ':', followed by a string")
} }
maxSize := cast.ToInt(parts[0]) diskCacheSize := parts[0]
if maxSize <= 0 {
log.Fatalf("--disk-cache max size must be more than 0")
}
path := parts[1] path := parts[1]
if len(path) == 0 || path[0] != '/' { if len(path) == 0 || path[0] != '/' {
log.Fatalf("--disk-cache path must start with '/'") log.Fatalf("--disk-cache path must start with '/'")
} }
return maxSize, path var maxSize datasize.ByteSize
err := maxSize.UnmarshalText([]byte(diskCacheSize))
if err != nil {
log.Fatal(err)
}
if maxSize <= 0 {
log.Fatal("--disk-cache size must be more than 0")
}
return int(maxSize), path
} }

View file

@ -56,7 +56,7 @@ func startCmd(cmd *cobra.Command, args []string) {
err := db.Connect(globalConfig.DBConn) err := db.Connect(globalConfig.DBConn)
checkErr(err) checkErr(err)
s3 := store.NewS3Store(globalConfig.AwsID, globalConfig.AwsSecret, globalConfig.BucketRegion, globalConfig.BucketName) s3 := store.NewS3Store(globalConfig.AwsID, globalConfig.AwsSecret, globalConfig.BucketRegion, globalConfig.BucketName)
comboStore := store.NewDBBackedStore(s3, db) comboStore := store.NewDBBackedStore(s3, db, false)
conf := prism.DefaultConf() conf := prism.DefaultConf()

View file

@ -36,7 +36,7 @@ func uploadCmd(cmd *cobra.Command, args []string) {
st := store.NewDBBackedStore( st := store.NewDBBackedStore(
store.NewS3Store(globalConfig.AwsID, globalConfig.AwsSecret, globalConfig.BucketRegion, globalConfig.BucketName), store.NewS3Store(globalConfig.AwsID, globalConfig.AwsSecret, globalConfig.BucketRegion, globalConfig.BucketName),
db) db, false)
uploader := reflector.NewUploader(db, st, uploadWorkers, uploadSkipExistsCheck, uploadDeleteBlobsAfterUpload) uploader := reflector.NewUploader(db, st, uploadWorkers, uploadSkipExistsCheck, uploadDeleteBlobsAfterUpload)

12
go.mod
View file

@ -5,13 +5,15 @@ replace github.com/btcsuite/btcd => github.com/lbryio/lbrycrd.go v0.0.0-20200203
require ( require (
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 // indirect github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 // indirect
github.com/aws/aws-sdk-go v1.16.11 github.com/aws/aws-sdk-go v1.16.11
github.com/bparli/lfuda-go v0.3.1
github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3 github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d
github.com/c2h5oh/datasize v0.0.0-20200825124411-48ed595a09d2
github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew v1.1.1
github.com/go-sql-driver/mysql v1.4.1 github.com/go-sql-driver/mysql v1.4.1
github.com/golang/protobuf v1.4.2 github.com/golang/protobuf v1.4.2
github.com/google/btree v1.0.0 // indirect github.com/google/btree v1.0.0 // indirect
github.com/google/gops v0.3.7 github.com/google/gops v0.3.7 // indirect
github.com/gorilla/mux v1.7.4 github.com/gorilla/mux v1.7.4
github.com/hashicorp/go-msgpack v0.5.5 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect
github.com/hashicorp/golang-lru v0.5.4 github.com/hashicorp/golang-lru v0.5.4
@ -24,14 +26,15 @@ require (
github.com/lbryio/lbry.go v1.1.2 // indirect github.com/lbryio/lbry.go v1.1.2 // indirect
github.com/lbryio/lbry.go/v2 v2.6.1-0.20200901175808-73382bb02128 github.com/lbryio/lbry.go/v2 v2.6.1-0.20200901175808-73382bb02128
github.com/lbryio/types v0.0.0-20191228214437-05a22073b4ec github.com/lbryio/types v0.0.0-20191228214437-05a22073b4ec
github.com/lucas-clemente/quic-go v0.18.1 github.com/lucas-clemente/quic-go v0.19.3
github.com/phayes/freeport v0.0.0-20171002185219-e27662a4a9d6 github.com/phayes/freeport v0.0.0-20171002185219-e27662a4a9d6
github.com/prometheus/client_golang v0.9.2 github.com/prometheus/client_golang v0.9.3
github.com/sirupsen/logrus v1.4.2 github.com/sirupsen/logrus v1.4.2
github.com/spf13/afero v1.4.1 github.com/spf13/afero v1.4.1 // indirect
github.com/spf13/cast v1.3.0 github.com/spf13/cast v1.3.0
github.com/spf13/cobra v0.0.3 github.com/spf13/cobra v0.0.3
github.com/spf13/pflag v1.0.3 // indirect github.com/spf13/pflag v1.0.3 // indirect
github.com/spf13/viper v1.7.1 // indirect
github.com/stretchr/testify v1.4.0 github.com/stretchr/testify v1.4.0
github.com/volatiletech/null v8.0.0+incompatible github.com/volatiletech/null v8.0.0+incompatible
go.uber.org/atomic v1.5.1 go.uber.org/atomic v1.5.1
@ -40,7 +43,6 @@ require (
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 // indirect golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 // indirect
google.golang.org/appengine v1.6.2 // indirect google.golang.org/appengine v1.6.2 // indirect
gotest.tools v2.2.0+incompatible
) )
go 1.15 go 1.15

168
go.sum
View file

@ -2,16 +2,31 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
cloud.google.com/go v0.31.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.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= 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/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= 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= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
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/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/StackExchange/wmi v0.0.0-20170410192909-ea383cf3ba6e/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v0.0.0-20170410192909-ea383cf3ba6e/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
@ -24,7 +39,12 @@ github.com/aws/aws-sdk-go v1.16.11 h1:g/c7gJeVyHoXCxM2fddS85bPGVkBF8s2q8t3fyEleg
github.com/aws/aws-sdk-go v1.16.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.16.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
github.com/bparli/lfuda-go v0.3.1 h1:nO9Szo627RC8/z+R+MMPBItNwHCOonchmpjQuQi8jVY=
github.com/bparli/lfuda-go v0.3.1/go.mod h1:BR5a9lwlqRqnPhU3F5ojFK3VhTKg8iFVtJJKgZBQhAo=
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
@ -39,17 +59,26 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3
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/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
github.com/c2h5oh/datasize v0.0.0-20200825124411-48ed595a09d2 h1:t8KYCwSKsOEZBFELI4Pn/phbp38iJ1RRAkDFNin1aak=
github.com/c2h5oh/datasize v0.0.0-20200825124411-48ed595a09d2/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
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-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/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
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/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-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
@ -64,23 +93,31 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-ini/ini v1.38.2/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-ini/ini v1.38.2/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-ini/ini v1.48.0 h1:TvO60hO/2xgaaTWp2P0wUe4CFxwdMzfbkv3+343Xzqw= github.com/go-ini/ini v1.48.0 h1:TvO60hO/2xgaaTWp2P0wUe4CFxwdMzfbkv3+343Xzqw=
github.com/go-ini/ini v1.48.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-ini/ini v1.48.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU=
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU=
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
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/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
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/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= 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.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0 h1:Rd1kQnQu0Hq3qvJppYSG0HtP+f5LPPUiDswTLiEegLg= github.com/golang/mock v1.4.0 h1:Rd1kQnQu0Hq3qvJppYSG0HtP+f5LPPUiDswTLiEegLg=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
@ -109,10 +146,15 @@ github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+u
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gops v0.3.7 h1:KtVAagOM0FIq+02DiQrKBTnLhYpWBMowaufcj+W1Exw= github.com/google/gops v0.3.7 h1:KtVAagOM0FIq+02DiQrKBTnLhYpWBMowaufcj+W1Exw=
github.com/google/gops v0.3.7/go.mod h1:bj0cwMmX1X4XIJFTjR99R5sCxNssNJ8HebFNvoQlmgY= github.com/google/gops v0.3.7/go.mod h1:bj0cwMmX1X4XIJFTjR99R5sCxNssNJ8HebFNvoQlmgY=
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 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/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= 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/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
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/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20190915194858-d3ddacdb130f h1:TyqzGm2z1h3AGhjOoRYyeLcW4WlW81MDQkWa+rx/000= github.com/gopherjs/gopherjs v0.0.0-20190915194858-d3ddacdb130f h1:TyqzGm2z1h3AGhjOoRYyeLcW4WlW81MDQkWa+rx/000=
@ -129,11 +171,19 @@ github.com/gorilla/schema v1.0.2/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlI
github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= 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/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-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.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
@ -142,6 +192,7 @@ github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iP
github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
@ -150,12 +201,13 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
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.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce h1:xdsDDbiBDQTKASoGEZ+pEmF1OnWuu8AQ9I8iNbHNeno= github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce h1:xdsDDbiBDQTKASoGEZ+pEmF1OnWuu8AQ9I8iNbHNeno=
github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
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/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
@ -179,6 +231,7 @@ github.com/johntdyer/slack-go v0.0.0-20180213144715-95fac1160b22/go.mod h1:u0Jo4
github.com/johntdyer/slackrus v0.0.0-20170926115001-3992f319fd0a/go.mod h1:j1kV/8f3jowErEq4XyeypkCdvg5EeHkf0YCKCcq5Ybo= github.com/johntdyer/slackrus v0.0.0-20170926115001-3992f319fd0a/go.mod h1:j1kV/8f3jowErEq4XyeypkCdvg5EeHkf0YCKCcq5Ybo=
github.com/johntdyer/slackrus v0.0.0-20180518184837-f7aae3243a07 h1:+kBG/8rjCa6vxJZbUjAiE4MQmBEBYc8nLEb51frnvBY= github.com/johntdyer/slackrus v0.0.0-20180518184837-f7aae3243a07 h1:+kBG/8rjCa6vxJZbUjAiE4MQmBEBYc8nLEb51frnvBY=
github.com/johntdyer/slackrus v0.0.0-20180518184837-f7aae3243a07/go.mod h1:j1kV/8f3jowErEq4XyeypkCdvg5EeHkf0YCKCcq5Ybo= github.com/johntdyer/slackrus v0.0.0-20180518184837-f7aae3243a07/go.mod h1:j1kV/8f3jowErEq4XyeypkCdvg5EeHkf0YCKCcq5Ybo=
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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
@ -186,17 +239,20 @@ github.com/jteeuwen/go-bindata v3.0.7+incompatible/go.mod h1:JVvhzYOiGBnFSYRyV00
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible 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/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 h1:PJPDf8OUfOK1bb/NeTKd4f1QXZItOX389VN3B6qC8ro= github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 h1:PJPDf8OUfOK1bb/NeTKd4f1QXZItOX389VN3B6qC8ro=
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw=
github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ= github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/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 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/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
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 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/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@ -222,8 +278,8 @@ github.com/lbryio/types v0.0.0-20191009145016-1bb8107e04f8/go.mod h1:CG3wsDv5BiV
github.com/lbryio/types v0.0.0-20191228214437-05a22073b4ec h1:2xk/qg4VTOCJ8RzV/ED5AKqDcJ00zVb08ltf9V+sr3c= github.com/lbryio/types v0.0.0-20191228214437-05a22073b4ec h1:2xk/qg4VTOCJ8RzV/ED5AKqDcJ00zVb08ltf9V+sr3c=
github.com/lbryio/types v0.0.0-20191228214437-05a22073b4ec/go.mod h1:CG3wsDv5BiVYQd5i1Jp7wGsaVyjZTJshqXeWMVKsISE= github.com/lbryio/types v0.0.0-20191228214437-05a22073b4ec/go.mod h1:CG3wsDv5BiVYQd5i1Jp7wGsaVyjZTJshqXeWMVKsISE=
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lucas-clemente/quic-go v0.18.1 h1:DMR7guC0NtVS8zNZR3IO7NARZvZygkSC56GGtC6cyys= github.com/lucas-clemente/quic-go v0.19.3 h1:eCDQqvGBB+kCTkA0XrAFtNe81FMa0/fn4QSoeAbmiF4=
github.com/lucas-clemente/quic-go v0.18.1/go.mod h1:yXttHsSNxQi8AWijC/vLP+OJczXqzHSOcJrM5ITUlCg= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5/go.mod h1:c2mYKRyMb1BPkO5St0c/ps62L4S0W2NAkaTXj9qEI+0= github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5/go.mod h1:c2mYKRyMb1BPkO5St0c/ps62L4S0W2NAkaTXj9qEI+0=
github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6/go.mod h1:sFlOUpQL1YcjhFVXhg1CG8ZASEs/Mf1oVb6H75JL/zg= github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6/go.mod h1:sFlOUpQL1YcjhFVXhg1CG8ZASEs/Mf1oVb6H75JL/zg=
@ -231,13 +287,15 @@ github.com/lyoshenka/bencode v0.0.0-20180323155644-b7abd7672df5 h1:mG83tLXWSRdcX
github.com/lyoshenka/bencode v0.0.0-20180323155644-b7abd7672df5/go.mod h1:H0aPCWffGOaDcjkw1iB7W9DVLp6GXmfcJY/7YZCWPA4= github.com/lyoshenka/bencode v0.0.0-20180323155644-b7abd7672df5/go.mod h1:H0aPCWffGOaDcjkw1iB7W9DVLp6GXmfcJY/7YZCWPA4=
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
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/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/marten-seemann/qpack v0.2.0 h1:/r1rhZoOmgxVKBqPNnYilZBDEyw+6OUHCbBzA5jc2y0= github.com/marten-seemann/qpack v0.2.1 h1:jvTsT/HpCn2UZJdP+UUB53FfUUgeOyG5K1ns0OJOGVs=
github.com/marten-seemann/qpack v0.2.0/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc=
github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc= github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc=
github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs=
github.com/marten-seemann/qtls-go1-15 v0.1.0 h1:i/YPXVxz8q9umso/5y474CNcHmTpA+5DH+mFPjx6PZg= github.com/marten-seemann/qtls-go1-15 v0.1.1 h1:LIH6K34bPVttyXnUWixk0bzH6/N07VxbSabxn5A5gZQ=
github.com/marten-seemann/qtls-go1-15 v0.1.0/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
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-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
@ -247,6 +305,8 @@ github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00v
github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
@ -255,6 +315,7 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
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/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/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/nlopes/slack v0.5.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= github.com/nlopes/slack v0.5.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM=
@ -262,6 +323,7 @@ github.com/nlopes/slack v0.6.0 h1:jt0jxVQGhssx1Ib7naAOZEZcGdtIhTzkP0nopK0AsRA=
github.com/nlopes/slack v0.6.0/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk= github.com/nlopes/slack v0.6.0/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk=
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
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.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@ -290,16 +352,30 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740=
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8=
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 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 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-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8=
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 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-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE=
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/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/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rubenv/sql-migrate v0.0.0-20170330050058-38004e7a77f2/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY= github.com/rubenv/sql-migrate v0.0.0-20170330050058-38004e7a77f2/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY=
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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
@ -348,10 +424,15 @@ github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUr
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8=
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/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/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/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.1 h1:Lt3ihYMlE+lreX1GS4Qw4ZsNpYQLxIXKBTEOXm3nt6I= github.com/spf13/afero v1.1.1 h1:Lt3ihYMlE+lreX1GS4Qw4ZsNpYQLxIXKBTEOXm3nt6I=
github.com/spf13/afero v1.1.1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.4.1 h1:asw9sl74539yqavKaglDM5hFpdJVK0Y5Dr/JOgQ89nQ= github.com/spf13/afero v1.4.1 h1:asw9sl74539yqavKaglDM5hFpdJVK0Y5Dr/JOgQ89nQ=
github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
@ -361,18 +442,25 @@ github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec h1:2ZXvIUGghLpdTVHR1UfvfrzoVlZaE/yOWC5LueIHZig= github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec h1:2ZXvIUGghLpdTVHR1UfvfrzoVlZaE/yOWC5LueIHZig=
github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
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/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
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.0.2 h1:Ncr3ZIuJn322w2k1qmzXDnkLAdQMlJqBa9kfAH+irso= github.com/spf13/viper v1.0.2 h1:Ncr3ZIuJn322w2k1qmzXDnkLAdQMlJqBa9kfAH+irso=
github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
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=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
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/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g=
github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
@ -383,15 +471,21 @@ github.com/volatiletech/null v8.0.0+incompatible h1:7wP8m5d/gZ6kW/9GnrLtMCRre2dl
github.com/volatiletech/null v8.0.0+incompatible/go.mod h1:0wD98JzdqB+rLyZ70fN05VDbXbafIb0KU0MdVhCzmOQ= github.com/volatiletech/null v8.0.0+incompatible/go.mod h1:0wD98JzdqB+rLyZ70fN05VDbXbafIb0KU0MdVhCzmOQ=
github.com/volatiletech/sqlboiler v3.4.0+incompatible h1:saQ6WxZ9wEJp33q3w/DHs7an7SYi1H7Yzf4/moxCbJU= github.com/volatiletech/sqlboiler v3.4.0+incompatible h1:saQ6WxZ9wEJp33q3w/DHs7an7SYi1H7Yzf4/moxCbJU=
github.com/volatiletech/sqlboiler v3.4.0+incompatible/go.mod h1:jLfDkkHWPbS2cWRLkyC20vQWaIQsASEY7gM7zSo11Yw= github.com/volatiletech/sqlboiler v3.4.0+incompatible/go.mod h1:jLfDkkHWPbS2cWRLkyC20vQWaIQsASEY7gM7zSo11Yw=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
github.com/ybbus/jsonrpc v0.0.0-20180411222309-2a548b7d822d/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= github.com/ybbus/jsonrpc v0.0.0-20180411222309-2a548b7d822d/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
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.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.3.2/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/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.1 h1:rsqfU5vBkVknbhUGbAUwQKR2H4ItV8tjJ+6kJX4cxHM= go.uber.org/atomic v1.5.1 h1:rsqfU5vBkVknbhUGbAUwQKR2H4ItV8tjJ+6kJX4cxHM=
go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= 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/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=
@ -400,6 +494,7 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/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-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@ -409,13 +504,26 @@ golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 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=
@ -425,11 +533,14 @@ golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20181106065722-10aee1819953/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-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/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-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-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-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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
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-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@ -442,6 +553,7 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/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-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= 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=
@ -458,13 +570,18 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h
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-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/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-20181029174526-d69651ed3497/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/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-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190520201301-c432e742b0af/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190520201301-c432e742b0af/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -484,19 +601,30 @@ golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-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-20190921001708-c4c64cad1fd0 h1:xQwXv67TxFo9nC1GJFyab5eq/5B590r6RlnL/G8Sz7w= golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 h1:xQwXv67TxFo9nC1GJFyab5eq/5B590r6RlnL/G8Sz7w=
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-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-20181030000716-a0a13e073c7b/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=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-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-20190506145303-2d16b83fe98c/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-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 h1:Toz2IK7k8rbltAXwNAxKcn9OzqyNfMUhUNjz3sL0NMk= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 h1:Toz2IK7k8rbltAXwNAxKcn9OzqyNfMUhUNjz3sL0NMk=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
@ -507,10 +635,17 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= 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.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
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.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.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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI= google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI=
google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
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=
@ -519,13 +654,21 @@ google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoA
google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/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-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-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-20190418145605-e7d98fc518a7/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-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= 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.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.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@ -534,10 +677,12 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
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/gorp.v1 v1.7.1/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/gorp.v1 v1.7.1/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw=
@ -545,10 +690,14 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/ini.v1 v1.41.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.41.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.48.0 h1:URjZc+8ugRY5mL5uUeQH/a63JcHwdX9xZaWvmNWD7z8= gopkg.in/ini.v1 v1.48.0 h1:URjZc+8ugRY5mL5uUeQH/a63JcHwdX9xZaWvmNWD7z8=
gopkg.in/ini.v1 v1.48.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.48.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/nullbio/null.v6 v6.0.0-20161116030900-40264a2e6b79 h1:FpCr9V8wuOei4BAen+93HtVJ+XSi+KPbaPKm0Vj5R64= gopkg.in/nullbio/null.v6 v6.0.0-20161116030900-40264a2e6b79 h1:FpCr9V8wuOei4BAen+93HtVJ+XSi+KPbaPKm0Vj5R64=
gopkg.in/nullbio/null.v6 v6.0.0-20161116030900-40264a2e6b79/go.mod h1:gWkaRU7CoXpezCBWfWjm3999QqS+1pYPXGbqQCTMzo8= gopkg.in/nullbio/null.v6 v6.0.0-20161116030900-40264a2e6b79/go.mod h1:gWkaRU7CoXpezCBWfWjm3999QqS+1pYPXGbqQCTMzo8=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
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 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
@ -561,7 +710,10 @@ grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJd
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 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-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/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=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/goversion v1.0.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo= rsc.io/goversion v1.0.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

View file

@ -65,7 +65,7 @@ func (s *Server) Start(address string) error {
log.Println("HTTP3 peer listening on " + address) log.Println("HTTP3 peer listening on " + address)
quicConf := &quic.Config{ quicConf := &quic.Config{
HandshakeTimeout: 4 * time.Second, HandshakeTimeout: 4 * time.Second,
MaxIdleTimeout: 10 * time.Second, MaxIdleTimeout: 20 * time.Second,
} }
r := mux.NewRouter() r := mux.NewRouter()
r.HandleFunc("/get/{hash}", func(w http.ResponseWriter, r *http.Request) { r.HandleFunc("/get/{hash}", func(w http.ResponseWriter, r *http.Request) {

View file

@ -32,7 +32,7 @@ func NewStore(opts StoreOpts) *Store {
func (p *Store) getClient() (*Client, error) { func (p *Store) getClient() (*Client, error) {
var qconf quic.Config var qconf quic.Config
qconf.HandshakeTimeout = 4 * time.Second qconf.HandshakeTimeout = 4 * time.Second
qconf.MaxIdleTimeout = 10 * time.Second qconf.MaxIdleTimeout = 20 * time.Second
pool, err := x509.SystemCertPool() pool, err := x509.SystemCertPool()
if err != nil { if err != nil {
return nil, err return nil, err

View file

@ -5,6 +5,7 @@ import (
"github.com/lbryio/lbry.go/v2/extras/errors" "github.com/lbryio/lbry.go/v2/extras/errors"
"github.com/lbryio/lbry.go/v2/stream" "github.com/lbryio/lbry.go/v2/stream"
log "github.com/sirupsen/logrus"
"github.com/lbryio/reflector.go/internal/metrics" "github.com/lbryio/reflector.go/internal/metrics"
) )
@ -62,9 +63,15 @@ func (c *CachingStore) Get(hash string) (stream.Blob, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
// there is no need to wait for the blob to be stored before we return it
err = c.cache.Put(hash, blob) // TODO: however this should be refactored to limit the amount of routines that the process can spawn to avoid a possible DoS
return blob, err go func() {
err = c.cache.Put(hash, blob)
if err != nil {
log.Errorf("error saving blob to underlying cache: %s", err.Error())
}
}()
return blob, nil
} }
// Put stores the blob in the origin and the cache // Put stores the blob in the origin and the cache

View file

@ -58,6 +58,7 @@ func TestCachingStore_CacheMiss(t *testing.T) {
if !bytes.Equal(b, res) { if !bytes.Equal(b, res) {
t.Errorf("expected Get() to return %s, got %s", string(b), string(res)) t.Errorf("expected Get() to return %s, got %s", string(b), string(res))
} }
time.Sleep(10 * time.Millisecond) //storing to cache is done async so let's give it some time
lyoshenka commented 2020-11-27 22:24:56 +01:00 (Migrated from github.com)
Review

need a way to do these sync or async. at the very least, an option for the cache. ideally, some process of notifying when writes finish.

need a way to do these sync or async. at the very least, an option for the cache. ideally, some process of notifying when writes finish.
has, err := cache.Has(hash) has, err := cache.Has(hash)
if err != nil { if err != nil {

View file

@ -14,15 +14,16 @@ import (
// DBBackedStore is a store that's backed by a DB. The DB contains data about what's in the store. // DBBackedStore is a store that's backed by a DB. The DB contains data about what's in the store.
type DBBackedStore struct { type DBBackedStore struct {
blobs BlobStore blobs BlobStore
db *db.SQL db *db.SQL
blockedMu sync.RWMutex blockedMu sync.RWMutex
blocked map[string]bool blocked map[string]bool
deleteOnMiss bool
} }
// NewDBBackedStore returns an initialized store pointer. // NewDBBackedStore returns an initialized store pointer.
func NewDBBackedStore(blobs BlobStore, db *db.SQL) *DBBackedStore { func NewDBBackedStore(blobs BlobStore, db *db.SQL, deleteOnMiss bool) *DBBackedStore {
return &DBBackedStore{blobs: blobs, db: db} return &DBBackedStore{blobs: blobs, db: db, deleteOnMiss: deleteOnMiss}
} }
const nameDBBacked = "db-backed" const nameDBBacked = "db-backed"
@ -44,6 +45,16 @@ func (d *DBBackedStore) Get(hash string) (stream.Blob, error) {
if !has { if !has {
return nil, ErrBlobNotFound return nil, ErrBlobNotFound
} }
if d.deleteOnMiss {
b, err := d.blobs.Get(hash)
if err != nil && errors.Is(err, ErrBlobNotFound) {
e2 := d.Delete(hash)
if e2 != nil {
log.Errorf("error while deleting blob from db: %s", errors.FullTrace(err))
}
return b, err
}
}
return d.blobs.Get(hash) return d.blobs.Get(hash)
} }

123
store/lfuda.go Normal file
View file

@ -0,0 +1,123 @@
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
package store
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
import (
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
"github.com/bparli/lfuda-go"
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
"github.com/lbryio/lbry.go/v2/extras/errors"
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
"github.com/lbryio/lbry.go/v2/stream"
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
"github.com/lbryio/reflector.go/internal/metrics"
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
"github.com/sirupsen/logrus"
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// LRUStore adds a max cache size and LRU eviction to a BlobStore
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
type LFUDAStore struct {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:27:23 +01:00 (Migrated from github.com)
Review

if this is very similar to LRUStore, maybe we need a generic EvictionStrategy struct of some sort

if this is very similar to LRUStore, maybe we need a generic EvictionStrategy struct of some sort
// underlying store
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
store BlobStore
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// lfuda implementation
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lfuda *lfuda.Cache
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// NewLRUStore initialize a new LRUStore
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
func NewLFUDAStore(component string, store BlobStore, maxSize float64) *LFUDAStore {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lfuda := lfuda.NewGDSFWithEvict(maxSize, func(key interface{}, value interface{}) {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
metrics.CacheLRUEvictCount.With(metrics.CacheLabels(store.Name(), component)).Inc()
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
_ = store.Delete(key.(string)) // TODO: log this error. may happen if underlying entry is gone but cache entry still there
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
})
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
l := &LFUDAStore{
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
store: store,
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lfuda: lfuda,
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
go func() {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if lstr, ok := store.(lister); ok {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
err := l.loadExisting(lstr, int(maxSize))
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if err != nil {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
panic(err) // TODO: what should happen here? panic? return nil? just keep going?
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}()
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return l
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
const nameLFUDA = "lfuda"
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// Name is the cache type name
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
func (l *LFUDAStore) Name() string { return nameLFUDA }
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// Has returns whether the blob is in the store, without updating the recent-ness.
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
func (l *LFUDAStore) Has(hash string) (bool, error) {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return l.lfuda.Contains(hash), nil
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// Get returns the blob or an error if the blob doesn't exist.
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
func (l *LFUDAStore) Get(hash string) (stream.Blob, error) {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
_, has := l.lfuda.Get(hash)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if !has {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return nil, errors.Err(ErrBlobNotFound)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
blob, err := l.store.Get(hash)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if errors.Is(err, ErrBlobNotFound) {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// Blob disappeared from underlying store
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
l.lfuda.Remove(hash)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return blob, err
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// Put stores the blob. Following LFUDA rules it's not guaranteed that a SET will store the value!!!
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:29:30 +01:00 (Migrated from github.com)
Review

👍 for the comment

:+1: for the comment
func (l *LFUDAStore) Put(hash string, blob stream.Blob) error {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
l.lfuda.Set(hash, true)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
has, _ := l.Has(hash)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if has {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
err := l.store.Put(hash, blob)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if err != nil {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return err
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return nil
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// PutSD stores the sd blob. Following LFUDA rules it's not guaranteed that a SET will store the value!!!
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
func (l *LFUDAStore) PutSD(hash string, blob stream.Blob) error {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:31:02 +01:00 (Migrated from github.com)
Review

why are Put and PutSD implemented differently?

why are Put and PutSD implemented differently?
l.lfuda.Set(hash, true)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
has, _ := l.Has(hash)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if has {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
err := l.store.PutSD(hash, blob)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if err != nil {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return err
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return nil
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// Delete deletes the blob from the store
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
func (l *LFUDAStore) Delete(hash string) error {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
err := l.store.Delete(hash)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if err != nil {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return err
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// This must come after store.Delete()
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// Remove triggers onEvict function, which also tries to delete blob from store
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// We need to delete it manually first so any errors can be propagated up
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
l.lfuda.Remove(hash)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return nil
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
// loadExisting imports existing blobs from the underlying store into the LRU cache
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
func (l *LFUDAStore) loadExisting(store lister, maxItems int) error {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:32:23 +01:00 (Migrated from github.com)
Review

stuff like this makes me even more confident that LRU and LFUDA should be less copy-pasted and more the same object with an eviction strategy selector

stuff like this makes me even more confident that LRU and LFUDA should be less copy-pasted and more the same object with an eviction strategy selector
logrus.Infof("loading at most %d items", maxItems)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
existing, err := store.list()
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if err != nil {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return err
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
logrus.Infof("read %d files from disk", len(existing))
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
added := 0
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
for _, h := range existing {
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
l.lfuda.Set(h, true)
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
added++
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
if maxItems > 0 && added >= maxItems { // underlying cache is bigger than the cache
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
break
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
return nil
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool
}
lyoshenka commented 2020-11-27 22:26:46 +01:00 (Migrated from github.com)
Review

seems weird to do this. why not an actual bool, or an empty struct?

seems weird to do this. why not an actual `bool`, or an empty struct?
nikooo777 commented 2020-12-09 19:19:18 +01:00 (Migrated from github.com)
Review

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM.

I since worked with the developer of the library to address this so i believe we can go back to using a bool

the reason I did this was because the library wasn't treating a bool as a 1byte type and it would waste a lot of RAM. I since worked with the developer of the library to address this so i believe we can go back to using a bool

136
store/lfuda_test.go Normal file
View file

@ -0,0 +1,136 @@
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
package store
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
import (
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"io/ioutil"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"os"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"reflect"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"testing"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"time"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"github.com/lbryio/lbry.go/v2/extras/errors"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"github.com/stretchr/testify/assert"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"github.com/stretchr/testify/require"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
const cacheMaxSize = 3
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
func getTestLFUDAStore() (*LFUDAStore, *MemStore) {
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
m := NewMemStore()
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
return NewLFUDAStore("test", m, cacheMaxSize), m
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
}
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
func TestFUDAStore_Eviction(t *testing.T) {
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lfuda, mem := getTestLFUDAStore()
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
b := []byte("x")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err := lfuda.Put("one", b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Put("two", b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Put("three", b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Put("four", b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Put("five", b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Put("five", b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Put("four", b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Put("two", b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
_, err = lfuda.Get("five")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:33:36 +01:00 (Migrated from github.com)
Review

check the blob value too?

check the blob value too?
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
_, err = lfuda.Get("four")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
_, err = lfuda.Get("two")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.Equal(t, cacheMaxBlobs, len(mem.Debug()))
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
for k, v := range map[string]bool{
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"one": false,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"two": true,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"three": false,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"four": true,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"five": true,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"six": false,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
} {
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
has, err := lfuda.Has(k)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.Equal(t, v, has)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
}
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lfuda.Get("two") // touch so it stays in cache
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lfuda.Get("five") // touch so it stays in cache
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lfuda.Put("six", b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.Equal(t, cacheMaxBlobs, len(mem.Debug()))
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
for k, v := range map[string]bool{
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"one": false,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"two": true,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"three": false,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"four": false,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"five": true,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
"six": true,
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
} {
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
has, err := lfuda.Has(k)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.Equal(t, v, has)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
}
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Delete("six")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Delete("five")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = lfuda.Delete("two")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.Equal(t, 0, len(mem.Debug()))
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
}
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
func TestFUDAStore_UnderlyingBlobMissing(t *testing.T) {
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lfuda, mem := getTestLFUDAStore()
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
hash := "hash"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
b := []byte("this is a blob of stuff")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err := lfuda.Put(hash, b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = mem.Delete(hash)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
// hash still exists in lru
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.True(t, lfuda.lfuda.Contains(hash))
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
blob, err := lfuda.Get(hash)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.Nil(t, blob)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.True(t, errors.Is(err, ErrBlobNotFound), "expected (%s) %s, got (%s) %s",
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
reflect.TypeOf(ErrBlobNotFound).String(), ErrBlobNotFound.Error(),
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
reflect.TypeOf(err).String(), err.Error())
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
// lru.Get() removes hash if underlying store doesn't have it
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.False(t, lfuda.lfuda.Contains(hash))
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
}
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
func TestFUDAStore_loadExisting(t *testing.T) {
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
tmpDir, err := ioutil.TempDir("", "reflector_test_*")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
defer os.RemoveAll(tmpDir)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
d := NewDiskStore(tmpDir, 2)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
hash := "hash"
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
b := []byte("this is a blob of stuff")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
err = d.Put(hash, b)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
existing, err := d.list()
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.Equal(t, 1, len(existing), "blob should exist in cache")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.Equal(t, hash, existing[0])
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
lfuda := NewLFUDAStore("test", d, 3) // lru should load existing blobs when it's created
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
time.Sleep(100 * time.Millisecond) // async load so let's wait...
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
has, err := lfuda.Has(hash)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
require.NoError(t, err)
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
assert.True(t, has, "hash should be loaded from disk store but it's not")
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement
}
lyoshenka commented 2020-11-27 22:34:03 +01:00 (Migrated from github.com)
Review

use t.Log() insteade

use `t.Log()` insteade
nikooo777 commented 2020-12-09 19:20:19 +01:00 (Migrated from github.com)
Review

ah right, this can actually be removed. it was a debug statement

ah right, this can actually be removed. it was a debug statement

View file

@ -6,6 +6,7 @@ import (
"github.com/lbryio/reflector.go/internal/metrics" "github.com/lbryio/reflector.go/internal/metrics"
golru "github.com/hashicorp/golang-lru" golru "github.com/hashicorp/golang-lru"
"github.com/sirupsen/logrus"
) )
// LRUStore adds a max cache size and LRU eviction to a BlobStore // LRUStore adds a max cache size and LRU eviction to a BlobStore
@ -18,33 +19,36 @@ type LRUStore struct {
// NewLRUStore initialize a new LRUStore // NewLRUStore initialize a new LRUStore
func NewLRUStore(component string, store BlobStore, maxItems int) *LRUStore { func NewLRUStore(component string, store BlobStore, maxItems int) *LRUStore {
l := &LRUStore{
store: store,
}
lru, err := golru.NewWithEvict(maxItems, func(key interface{}, value interface{}) { lru, err := golru.NewWithEvict(maxItems, func(key interface{}, value interface{}) {
metrics.CacheLRUEvictCount.With(metrics.CacheLabels(store.Name(), component)).Inc() metrics.CacheLRUEvictCount.With(metrics.CacheLabels(l.Name(), component)).Inc()
_ = store.Delete(key.(string)) // TODO: log this error. may happen if underlying entry is gone but cache entry still there _ = store.Delete(key.(string)) // TODO: log this error. may happen if underlying entry is gone but cache entry still there
}) })
if err != nil { if err != nil {
panic(err) panic(err)
} }
l := &LRUStore{ l.lru = lru
store: store,
lru: lru,
}
if lstr, ok := store.(lister); ok { go func() {
err = l.loadExisting(lstr, maxItems) if lstr, ok := store.(lister); ok {
if err != nil { err = l.loadExisting(lstr, maxItems)
panic(err) // TODO: what should happen here? panic? return nil? just keep going? if err != nil {
panic(err) // TODO: what should happen here? panic? return nil? just keep going?
}
} }
} }()
return l return l
} }
const nameLRU = "lru"
// Name is the cache type name // Name is the cache type name
func (l *LRUStore) Name() string { return nameLRU } func (l *LRUStore) Name() string {
return "lru_" + l.store.Name()
}
lyoshenka commented 2020-11-27 22:35:00 +01:00 (Migrated from github.com)
Review

this should at least be an option, and ideally should have a way to notify that load finished.

also needs clean shutdown

this should at least be an option, and ideally should have a way to notify that load finished. also needs clean shutdown
nikooo777 commented 2020-12-09 19:21:17 +01:00 (Migrated from github.com)
Review

can I argue that a clean shutdown here doesn't matter? or is it just bad?

can I argue that a clean shutdown here doesn't matter? or is it just bad?
anbsky commented 2020-12-10 08:24:56 +01:00 (Migrated from github.com)
Review

If you have a big cache, start this and immediately press Ctrl+C, what will happen? My guess is it probably won't shut down and will annoyingly keep running in the foreground.

If you have a big cache, start this and immediately press `Ctrl+C`, what will happen? My guess is it probably won't shut down and will annoyingly keep running in the foreground.
lyoshenka commented 2020-12-10 15:59:29 +01:00 (Migrated from github.com)
Review

YES! this was in the back of my mind but i forgot about it. i think there's even a TODO in the code. thanks for catching it

YES! this was in the back of my mind but i forgot about it. i think there's even a TODO in the code. thanks for catching it
nikooo777 commented 2020-12-22 21:10:14 +01:00 (Migrated from github.com)
Review

@andybeletsky IIRC as long as the main thread returns, all routines are automatically killed in GO. I'll have to test that but I think a ctrl+c would kill it right away

@andybeletsky IIRC as long as the main thread returns, all routines are automatically killed in GO. I'll have to test that but I think a ctrl+c would kill it right away
// Has returns whether the blob is in the store, without updating the recent-ness. // Has returns whether the blob is in the store, without updating the recent-ness.
func (l *LRUStore) Has(hash string) (bool, error) { func (l *LRUStore) Has(hash string) (bool, error) {
@ -103,11 +107,12 @@ func (l *LRUStore) Delete(hash string) error {
// loadExisting imports existing blobs from the underlying store into the LRU cache // loadExisting imports existing blobs from the underlying store into the LRU cache
func (l *LRUStore) loadExisting(store lister, maxItems int) error { func (l *LRUStore) loadExisting(store lister, maxItems int) error {
logrus.Infof("loading at most %d items", maxItems)
existing, err := store.list() existing, err := store.list()
if err != nil { if err != nil {
return err return err
} }
logrus.Infof("read %d files from disk", len(existing))
added := 0 added := 0
for _, h := range existing { for _, h := range existing {
l.lru.Add(h, true) l.lru.Add(h, true)

View file

@ -5,6 +5,7 @@ import (
"os" "os"
"reflect" "reflect"
"testing" "testing"
"time"
"github.com/lbryio/lbry.go/v2/extras/errors" "github.com/lbryio/lbry.go/v2/extras/errors"
@ -114,7 +115,8 @@ func TestLRUStore_loadExisting(t *testing.T) {
require.Equal(t, 1, len(existing), "blob should exist in cache") require.Equal(t, 1, len(existing), "blob should exist in cache")
assert.Equal(t, hash, existing[0]) assert.Equal(t, hash, existing[0])
lru := NewLRUStore("test", d, 3) // lru should load existing blobs when it's created lru := NewLRUStore("test", d, 3) // lru should load existing blobs when it's created
time.Sleep(100 * time.Millisecond) // async load so let's wait...
has, err := lru.Has(hash) has, err := lru.Has(hash)
require.NoError(t, err) require.NoError(t, err)
assert.True(t, has, "hash should be loaded from disk store but it's not") assert.True(t, has, "hash should be loaded from disk store but it's not")

View file

@ -32,8 +32,8 @@ func (s *singleflightStore) Name() string {
// Get ensures that only one request per hash is sent to the origin at a time, // Get ensures that only one request per hash is sent to the origin at a time,
// thereby protecting against https://en.wikipedia.org/wiki/Thundering_herd_problem // thereby protecting against https://en.wikipedia.org/wiki/Thundering_herd_problem
func (s *singleflightStore) Get(hash string) (stream.Blob, error) { func (s *singleflightStore) Get(hash string) (stream.Blob, error) {
metrics.CacheWaitingRequestsCount.With(metrics.CacheLabels(s.BlobStore.Name(), s.component)).Inc() metrics.CacheWaitingRequestsCount.With(metrics.CacheLabels(s.Name(), s.component)).Inc()
defer metrics.CacheWaitingRequestsCount.With(metrics.CacheLabels(s.BlobStore.Name(), s.component)).Dec() defer metrics.CacheWaitingRequestsCount.With(metrics.CacheLabels(s.Name(), s.component)).Dec()
blob, err, _ := s.sf.Do(hash, s.getter(hash)) blob, err, _ := s.sf.Do(hash, s.getter(hash))
if err != nil { if err != nil {
@ -46,8 +46,8 @@ func (s *singleflightStore) Get(hash string) (stream.Blob, error) {
// only one getter per hash will be executing at a time // only one getter per hash will be executing at a time
func (s *singleflightStore) getter(hash string) func() (interface{}, error) { func (s *singleflightStore) getter(hash string) func() (interface{}, error) {
return func() (interface{}, error) { return func() (interface{}, error) {
metrics.CacheOriginRequestsCount.With(metrics.CacheLabels(s.BlobStore.Name(), s.component)).Inc() metrics.CacheOriginRequestsCount.With(metrics.CacheLabels(s.Name(), s.component)).Inc()
defer metrics.CacheOriginRequestsCount.With(metrics.CacheLabels(s.BlobStore.Name(), s.component)).Dec() defer metrics.CacheOriginRequestsCount.With(metrics.CacheLabels(s.Name(), s.component)).Dec()
start := time.Now() start := time.Now()
blob, err := s.BlobStore.Get(hash) blob, err := s.BlobStore.Get(hash)
@ -57,7 +57,7 @@ func (s *singleflightStore) getter(hash string) func() (interface{}, error) {
rate := float64(len(blob)) / 1024 / 1024 / time.Since(start).Seconds() rate := float64(len(blob)) / 1024 / 1024 / time.Since(start).Seconds()
metrics.CacheRetrievalSpeed.With(map[string]string{ metrics.CacheRetrievalSpeed.With(map[string]string{
metrics.LabelCacheType: s.BlobStore.Name(), metrics.LabelCacheType: s.Name(),
metrics.LabelComponent: s.component, metrics.LabelComponent: s.component,
metrics.LabelSource: "origin", metrics.LabelSource: "origin",
}).Set(rate) }).Set(rate)

View file

@ -60,7 +60,6 @@ func AllFiles(startDir string, basename bool) ([]string, error) {
walkerWG.Done() walkerWG.Done()
goroutineLimiter <- struct{}{} goroutineLimiter <- struct{}{}
}() }()
err = godirwalk.Walk(filepath.Join(startDir, dir), &godirwalk.Options{ err = godirwalk.Walk(filepath.Join(startDir, dir), &godirwalk.Options{
Unsorted: true, // faster this way Unsorted: true, // faster this way
Callback: func(osPathname string, de *godirwalk.Dirent) error { Callback: func(osPathname string, de *godirwalk.Dirent) error {
@ -84,6 +83,5 @@ func AllFiles(startDir string, basename bool) ([]string, error) {
close(pathChan) close(pathChan)
pathWG.Wait() pathWG.Wait()
return paths, nil return paths, nil
} }