@cryptotaxi247 / kubo / commits / c3589a172

WIP rcmgr auto limit scaling

Marten Seemann committed Jul 2, 2022 at 14:45 UTC c3589a172870c40cd73c8fda0298a1d523bb0eeb
8 files changed +207 -254
config/swarm.go
+2 -2
@@ -139,8 +139,8 @@ type ConnMgr struct {
139 // <https://github.com/libp2p/go-libp2p-resource-manager#readme>
140 type ResourceMgr struct {
141 // Enables the Network Resource Manager feature, default to on.
142 - Enabled Flag `json:",omitempty"`
143 - Limits *rcmgr.BasicLimiterConfig `json:",omitempty"`
142 + Enabled Flag `json:",omitempty"`
143 + Limits *rcmgr.LimitConfig `json:",omitempty"`
144 }
145
146 const (
core/commands/swarm.go
+1 -1
@@ -401,7 +401,7 @@ Changes made via command line are persisted in the Swarm.ResourceMgr.Limits fiel
401
402 // set scope limit to new values (when limit.json is passed as a second arg)
403 if req.Files != nil {
404 - var newLimit rcmgr.BasicLimitConfig
404 + var newLimit rcmgr.BaseLimit
405 it := req.Files.Entries()
406 if it.Next() {
407 file := files.FileFromEntry(it)
core/node/libp2p/rcmgr.go
+39 -124
@@ -34,7 +34,7 @@ func ResourceManager(cfg config.SwarmConfig) interface{} {
34
35 enabled := cfg.ResourceMgr.Enabled.WithDefault(false)
36
37 - /// ENV overrides Config (if present)
37 + // ENV overrides Config (if present)
38 switch os.Getenv("LIBP2P_RCMGR") {
39 case "0", "false":
40 enabled = false
@@ -50,19 +50,17 @@ func ResourceManager(cfg config.SwarmConfig) interface{} {
50 return nil, opts, fmt.Errorf("opening IPFS_PATH: %w", err)
51 }
52
53 - defaultLimits := adjustedDefaultLimits(cfg)
53 + limitCfg := adjustedDefaultLimits(cfg)
54 + libp2p.SetDefaultServiceLimits(limitCfg)
55 + limits := limitCfg.AutoScale()
56
55 - var limits rcmgr.BasicLimiterConfig
57 if cfg.ResourceMgr.Limits != nil {
57 - limits = *cfg.ResourceMgr.Limits
58 + l := *cfg.ResourceMgr.Limits
59 + l.Apply(limits)
60 + limits = l
61 }
62
60 - limiter, err := rcmgr.NewLimiter(limits, defaultLimits)
61 - if err != nil {
62 - return nil, opts, err
63 - }
64 -
65 - libp2p.SetDefaultServiceLimits(limiter)
63 + limiter := rcmgr.NewFixedLimiter(limits)
64
65 ropts := []rcmgr.Option{rcmgr.WithMetrics(createRcmgrMetrics())}
66
@@ -195,8 +193,8 @@ func NetStat(mgr network.ResourceManager, scope string) (NetStatOut, error) {
193 }
194 }
195
198 -func NetLimit(mgr network.ResourceManager, scope string) (rcmgr.BasicLimitConfig, error) {
199 - var result rcmgr.BasicLimitConfig
196 +func NetLimit(mgr network.ResourceManager, scope string) (rcmgr.BaseLimit, error) {
197 + var result rcmgr.BaseLimit
198 getLimit := func(s network.ResourceScope) error {
199 limiter, ok := s.(rcmgr.ResourceScopeLimiter)
200 if !ok { // NullResourceManager
@@ -204,30 +202,15 @@ func NetLimit(mgr network.ResourceManager, scope string) (rcmgr.BasicLimitConfig
202 }
203 limit := limiter.Limit()
204 switch l := limit.(type) {
207 - case *rcmgr.StaticLimit:
208 - result.Dynamic = false
205 + case *rcmgr.BaseLimit:
206 result.Memory = l.Memory
210 - result.Streams = l.BaseLimit.Streams
211 - result.StreamsInbound = l.BaseLimit.StreamsInbound
212 - result.StreamsOutbound = l.BaseLimit.StreamsOutbound
213 - result.Conns = l.BaseLimit.Conns
214 - result.ConnsInbound = l.BaseLimit.ConnsInbound
215 - result.ConnsOutbound = l.BaseLimit.ConnsOutbound
216 - result.FD = l.BaseLimit.FD
217 -
218 - case *rcmgr.DynamicLimit:
219 - result.Dynamic = true
220 - result.MemoryFraction = l.MemoryLimit.MemoryFraction
221 - result.MinMemory = l.MemoryLimit.MinMemory
222 - result.MaxMemory = l.MemoryLimit.MaxMemory
223 - result.Streams = l.BaseLimit.Streams
224 - result.StreamsInbound = l.BaseLimit.StreamsInbound
225 - result.StreamsOutbound = l.BaseLimit.StreamsOutbound
226 - result.Conns = l.BaseLimit.Conns
227 - result.ConnsInbound = l.BaseLimit.ConnsInbound
228 - result.ConnsOutbound = l.BaseLimit.ConnsOutbound
229 - result.FD = l.BaseLimit.FD
230 -
207 + result.Streams = l.Streams
208 + result.StreamsInbound = l.StreamsInbound
209 + result.StreamsOutbound = l.StreamsOutbound
210 + result.Conns = l.Conns
211 + result.ConnsInbound = l.ConnsInbound
212 + result.ConnsOutbound = l.ConnsOutbound
213 + result.FD = l.FD
214 default:
215 return fmt.Errorf("unknown limit type %T", limit)
216 }
@@ -237,89 +220,36 @@ func NetLimit(mgr network.ResourceManager, scope string) (rcmgr.BasicLimitConfig
220
221 switch {
222 case scope == config.ResourceMgrSystemScope:
240 - err := mgr.ViewSystem(func(s network.ResourceScope) error {
241 - return getLimit(s)
242 - })
243 - return result, err
244 -
223 + return result, mgr.ViewSystem(func(s network.ResourceScope) error { return getLimit(s) })
224 case scope == config.ResourceMgrTransientScope:
246 - err := mgr.ViewTransient(func(s network.ResourceScope) error {
247 - return getLimit(s)
248 - })
249 - return result, err
250 -
225 + return result, mgr.ViewTransient(func(s network.ResourceScope) error { return getLimit(s) })
226 case strings.HasPrefix(scope, config.ResourceMgrServiceScopePrefix):
227 svc := strings.TrimPrefix(scope, config.ResourceMgrServiceScopePrefix)
253 - err := mgr.ViewService(svc, func(s network.ServiceScope) error {
254 - return getLimit(s)
255 - })
256 - return result, err
257 -
228 + return result, mgr.ViewService(svc, func(s network.ServiceScope) error { return getLimit(s) })
229 case strings.HasPrefix(scope, config.ResourceMgrProtocolScopePrefix):
230 proto := strings.TrimPrefix(scope, config.ResourceMgrProtocolScopePrefix)
260 - err := mgr.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error {
261 - return getLimit(s)
262 - })
263 - return result, err
264 -
231 + return result, mgr.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { return getLimit(s) })
232 case strings.HasPrefix(scope, config.ResourceMgrPeerScopePrefix):
233 p := strings.TrimPrefix(scope, config.ResourceMgrPeerScopePrefix)
234 pid, err := peer.Decode(p)
235 if err != nil {
236 return result, fmt.Errorf("invalid peer ID: %q: %w", p, err)
237 }
271 - err = mgr.ViewPeer(pid, func(s network.PeerScope) error {
272 - return getLimit(s)
273 - })
274 - return result, err
275 -
238 + return result, mgr.ViewPeer(pid, func(s network.PeerScope) error { return getLimit(s) })
239 default:
240 return result, fmt.Errorf("invalid scope %q", scope)
241 }
242 }
243
244 // NetSetLimit sets new ResourceManager limits for the given scope. The limits take effect immediately, and are also persisted to the repo config.
282 -func NetSetLimit(mgr network.ResourceManager, repo repo.Repo, scope string, limit rcmgr.BasicLimitConfig) error {
245 +func NetSetLimit(mgr network.ResourceManager, repo repo.Repo, scope string, limit rcmgr.BaseLimit) error {
246 setLimit := func(s network.ResourceScope) error {
247 limiter, ok := s.(rcmgr.ResourceScopeLimiter)
248 if !ok { // NullResourceManager
249 return NoResourceMgrError
250 }
251
289 - var newLimit rcmgr.Limit
290 - if limit.Dynamic {
291 - newLimit = &rcmgr.DynamicLimit{
292 - MemoryLimit: rcmgr.MemoryLimit{
293 - MemoryFraction: limit.MemoryFraction,
294 - MinMemory: limit.MinMemory,
295 - MaxMemory: limit.MaxMemory,
296 - },
297 - BaseLimit: rcmgr.BaseLimit{
298 - Streams: limit.Streams,
299 - StreamsInbound: limit.StreamsInbound,
300 - StreamsOutbound: limit.StreamsOutbound,
301 - Conns: limit.Conns,
302 - ConnsInbound: limit.ConnsInbound,
303 - ConnsOutbound: limit.ConnsOutbound,
304 - FD: limit.FD,
305 - },
306 - }
307 - } else {
308 - newLimit = &rcmgr.StaticLimit{
309 - Memory: limit.Memory,
310 - BaseLimit: rcmgr.BaseLimit{
311 - Streams: limit.Streams,
312 - StreamsInbound: limit.StreamsInbound,
313 - StreamsOutbound: limit.StreamsOutbound,
314 - Conns: limit.Conns,
315 - ConnsInbound: limit.ConnsInbound,
316 - ConnsOutbound: limit.ConnsOutbound,
317 - FD: limit.FD,
318 - },
319 - }
320 - }
321 -
322 - limiter.SetLimit(newLimit)
252 + limiter.SetLimit(&limit)
253 return nil
254 }
255
@@ -329,48 +259,36 @@ func NetSetLimit(mgr network.ResourceManager, repo repo.Repo, scope string, limi
259 }
260
261 if cfg.Swarm.ResourceMgr.Limits == nil {
332 - cfg.Swarm.ResourceMgr.Limits = &rcmgr.BasicLimiterConfig{}
262 + cfg.Swarm.ResourceMgr.Limits = &rcmgr.LimitConfig{}
263 }
264 configLimits := cfg.Swarm.ResourceMgr.Limits
265
266 var setConfigFunc func()
267 switch {
268 case scope == config.ResourceMgrSystemScope:
339 - err = mgr.ViewSystem(func(s network.ResourceScope) error {
340 - return setLimit(s)
341 - })
342 - setConfigFunc = func() { configLimits.System = &limit }
343 -
269 + err = mgr.ViewSystem(func(s network.ResourceScope) error { return setLimit(s) })
270 + setConfigFunc = func() { configLimits.System = limit }
271 case scope == config.ResourceMgrTransientScope:
345 - err = mgr.ViewTransient(func(s network.ResourceScope) error {
346 - return setLimit(s)
347 - })
348 - setConfigFunc = func() { configLimits.Transient = &limit }
349 -
272 + err = mgr.ViewTransient(func(s network.ResourceScope) error { return setLimit(s) })
273 + setConfigFunc = func() { configLimits.Transient = limit }
274 case strings.HasPrefix(scope, config.ResourceMgrServiceScopePrefix):
275 svc := strings.TrimPrefix(scope, config.ResourceMgrServiceScopePrefix)
352 - err = mgr.ViewService(svc, func(s network.ServiceScope) error {
353 - return setLimit(s)
354 - })
276 + err = mgr.ViewService(svc, func(s network.ServiceScope) error { return setLimit(s) })
277 setConfigFunc = func() {
278 if configLimits.Service == nil {
357 - configLimits.Service = map[string]rcmgr.BasicLimitConfig{}
279 + configLimits.Service = map[string]rcmgr.BaseLimit{}
280 }
281 configLimits.Service[svc] = limit
282 }
361 -
283 case strings.HasPrefix(scope, config.ResourceMgrProtocolScopePrefix):
284 proto := strings.TrimPrefix(scope, config.ResourceMgrProtocolScopePrefix)
364 - err = mgr.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error {
365 - return setLimit(s)
366 - })
285 + err = mgr.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { return setLimit(s) })
286 setConfigFunc = func() {
287 if configLimits.Protocol == nil {
369 - configLimits.Protocol = map[string]rcmgr.BasicLimitConfig{}
288 + configLimits.Protocol = map[protocol.ID]rcmgr.BaseLimit{}
289 }
371 - configLimits.Protocol[proto] = limit
290 + configLimits.Protocol[protocol.ID(proto)] = limit
291 }
373 -
292 case strings.HasPrefix(scope, config.ResourceMgrPeerScopePrefix):
293 p := strings.TrimPrefix(scope, config.ResourceMgrPeerScopePrefix)
294 var pid peer.ID
@@ -378,16 +296,13 @@ func NetSetLimit(mgr network.ResourceManager, repo repo.Repo, scope string, limi
296 if err != nil {
297 return fmt.Errorf("invalid peer ID: %q: %w", p, err)
298 }
381 - err = mgr.ViewPeer(pid, func(s network.PeerScope) error {
382 - return setLimit(s)
383 - })
299 + err = mgr.ViewPeer(pid, func(s network.PeerScope) error { return setLimit(s) })
300 setConfigFunc = func() {
301 if configLimits.Peer == nil {
386 - configLimits.Peer = map[string]rcmgr.BasicLimitConfig{}
302 + configLimits.Peer = map[peer.ID]rcmgr.BaseLimit{}
303 }
388 - configLimits.Peer[p] = limit
304 + configLimits.Peer[pid] = limit
305 }
390 -
306 default:
307 return fmt.Errorf("invalid scope %q", scope)
308 }
@@ -397,7 +312,7 @@ func NetSetLimit(mgr network.ResourceManager, repo repo.Repo, scope string, limi
312 }
313
314 if cfg.Swarm.ResourceMgr.Limits == nil {
400 - cfg.Swarm.ResourceMgr.Limits = &rcmgr.BasicLimiterConfig{}
315 + cfg.Swarm.ResourceMgr.Limits = &rcmgr.LimitConfig{}
316 }
317 setConfigFunc()
318
core/node/libp2p/rcmgr_defaults.go
+56 -53
@@ -7,7 +7,7 @@ import (
7 "os"
8 "strings"
9
10 - config "github.com/ipfs/kubo/config"
10 + "github.com/ipfs/kubo/config"
11 "github.com/libp2p/go-libp2p"
12 rcmgr "github.com/libp2p/go-libp2p-resource-manager"
13
@@ -18,63 +18,64 @@ import (
18
19 // adjustedDefaultLimits allows for tweaking defaults based on external factors,
20 // such as values in Swarm.ConnMgr.HiWater config.
21 -func adjustedDefaultLimits(cfg config.SwarmConfig) rcmgr.DefaultLimitConfig {
21 +func adjustedDefaultLimits(cfg config.SwarmConfig) *rcmgr.ScalingLimitConfig {
22 // Run checks to avoid introducing regressions
23 if os.Getenv("IPFS_CHECK_RCMGR_DEFAULTS") != "" {
24 // FIXME: Broken. Being tracked in https://github.com/ipfs/go-ipfs/issues/8949.
25 checkImplicitDefaults()
26 }
27 + return &rcmgr.DefaultLimits
28
28 - // Adjust limits
29 - // (based on https://github.com/filecoin-project/lotus/pull/8318/files)
30 - // - give it more memory, up to 4G, min of 1G
31 - // - if Swarm.ConnMgr.HighWater is too high, adjust Conn/FD/Stream limits
32 - defaultLimits := rcmgr.DefaultLimits.WithSystemMemory(.125, 1<<30, 4<<30)
33 -
34 - // Outbound conns and FDs are set very high to allow for the accelerated DHT client to (re)load its routing table.
35 - // Currently it doesn't gracefully handle RM throttling--once it does we can lower these.
36 - // High outbound conn limits are considered less of a DoS risk than high inbound conn limits.
37 - // Also note that, due to the behavior of the accelerated DHT client, we don't need many streams, just conns.
38 - if minOutbound := 65536; defaultLimits.SystemBaseLimit.ConnsOutbound < minOutbound {
39 - defaultLimits.SystemBaseLimit.ConnsOutbound = minOutbound
40 - }
41 - if minFD := 4096; defaultLimits.SystemBaseLimit.FD < minFD {
42 - defaultLimits.SystemBaseLimit.FD = minFD
43 - }
44 -
29 + // // Adjust limits
30 + // // (based on https://github.com/filecoin-project/lotus/pull/8318/files)
31 + // // - give it more memory, up to 4G, min of 1G
32 + // // - if Swarm.ConnMgr.HighWater is too high, adjust Conn/FD/Stream limits
33 + // defaultLimits := rcmgr.DefaultLimits.WithSystemMemory(.125, 1<<30, 4<<30)
34 + //
35 + // // Outbound conns and FDs are set very high to allow for the accelerated DHT client to (re)load its routing table.
36 + // // Currently it doesn't gracefully handle RM throttling--once it does we can lower these.
37 + // // High outbound conn limits are considered less of a DoS risk than high inbound conn limits.
38 + // // Also note that, due to the behavior of the accelerated DHT client, we don't need many streams, just conns.
39 + // if minOutbound := 65536; defaultLimits.SystemBaseLimit.ConnsOutbound < minOutbound {
40 + // defaultLimits.SystemBaseLimit.ConnsOutbound = minOutbound
41 + // }
42 + // if minFD := 4096; defaultLimits.SystemBaseLimit.FD < minFD {
43 + // defaultLimits.SystemBaseLimit.FD = minFD
44 + // }
45 + //
46 // Do we need to adjust due to Swarm.ConnMgr.HighWater?
46 - if cfg.ConnMgr.Type == "basic" {
47 - maxconns := cfg.ConnMgr.HighWater
48 - if 2*maxconns > defaultLimits.SystemBaseLimit.ConnsInbound {
49 - // Conns should be at least 2x larger than the high water to allow for two conns per peer (TCP+QUIC).
50 - defaultLimits.SystemBaseLimit.ConnsInbound = logScale(2 * maxconns)
51 -
52 - // We want the floor of minOutbound conns to be no less than what was set above.
53 - if minOutbound := logScale(2 * maxconns); minOutbound > defaultLimits.SystemBaseLimit.ConnsOutbound {
54 - defaultLimits.SystemBaseLimit.ConnsOutbound = minOutbound
55 - }
56 -
57 - if 2*maxconns > defaultLimits.SystemBaseLimit.FD {
58 - defaultLimits.SystemBaseLimit.FD = logScale(2 * maxconns)
59 - }
60 -
61 - defaultLimits.SystemBaseLimit.StreamsInbound = logScale(16 * maxconns)
62 - defaultLimits.SystemBaseLimit.StreamsOutbound = logScale(64 * maxconns)
63 - defaultLimits.SystemBaseLimit.Streams = logScale(64 * maxconns)
64 -
65 - defaultLimits.ServiceBaseLimit.StreamsInbound = logScale(8 * maxconns)
66 - defaultLimits.ServiceBaseLimit.StreamsOutbound = logScale(32 * maxconns)
67 - defaultLimits.ServiceBaseLimit.Streams = logScale(32 * maxconns)
68 -
69 - defaultLimits.ProtocolBaseLimit.StreamsInbound = logScale(8 * maxconns)
70 - defaultLimits.ProtocolBaseLimit.StreamsOutbound = logScale(32 * maxconns)
71 - defaultLimits.ProtocolBaseLimit.Streams = logScale(32 * maxconns)
72 - }
73 - }
74 -
75 - defaultLimits.SystemBaseLimit.Conns = defaultLimits.SystemBaseLimit.ConnsOutbound + defaultLimits.SystemBaseLimit.ConnsInbound
76 -
77 - return defaultLimits
47 + // if cfg.ConnMgr.Type == "basic" {
48 + // maxconns := cfg.ConnMgr.HighWater
49 + // if 2*maxconns > defaultLimits.SystemBaseLimit.ConnsInbound {
50 + // // Conns should be at least 2x larger than the high water to allow for two conns per peer (TCP+QUIC).
51 + // defaultLimits.SystemBaseLimit.ConnsInbound = logScale(2 * maxconns)
52 + //
53 + // // We want the floor of minOutbound conns to be no less than what was set above.
54 + // if minOutbound := logScale(2 * maxconns); minOutbound > defaultLimits.SystemBaseLimit.ConnsOutbound {
55 + // defaultLimits.SystemBaseLimit.ConnsOutbound = minOutbound
56 + // }
57 + //
58 + // if 2*maxconns > defaultLimits.SystemBaseLimit.FD {
59 + // defaultLimits.SystemBaseLimit.FD = logScale(2 * maxconns)
60 + // }
61 + //
62 + // defaultLimits.SystemBaseLimit.StreamsInbound = logScale(16 * maxconns)
63 + // defaultLimits.SystemBaseLimit.StreamsOutbound = logScale(64 * maxconns)
64 + // defaultLimits.SystemBaseLimit.Streams = logScale(64 * maxconns)
65 + //
66 + // defaultLimits.ServiceBaseLimit.StreamsInbound = logScale(8 * maxconns)
67 + // defaultLimits.ServiceBaseLimit.StreamsOutbound = logScale(32 * maxconns)
68 + // defaultLimits.ServiceBaseLimit.Streams = logScale(32 * maxconns)
69 + //
70 + // defaultLimits.ProtocolBaseLimit.StreamsInbound = logScale(8 * maxconns)
71 + // defaultLimits.ProtocolBaseLimit.StreamsOutbound = logScale(32 * maxconns)
72 + // defaultLimits.ProtocolBaseLimit.Streams = logScale(32 * maxconns)
73 + // }
74 + // }
75 + //
76 + // defaultLimits.SystemBaseLimit.Conns = defaultLimits.SystemBaseLimit.ConnsOutbound + defaultLimits.SystemBaseLimit.ConnsInbound
77 + //
78 + // return defaultLimits
79 }
80
81 func logScale(val int) int {
@@ -108,8 +109,10 @@ func checkImplicitDefaults() {
109 }
110
111 // Check 2: did go-libp2p's SetDefaultServiceLimits change?
111 - testLimiter := rcmgr.NewStaticLimiter(rcmgr.DefaultLimits)
112 - libp2p.SetDefaultServiceLimits(testLimiter)
112 + l := rcmgr.DefaultLimits
113 + libp2p.SetDefaultServiceLimits(&l)
114 + limits := l.AutoScale()
115 + testLimiter := rcmgr.NewFixedLimiter(limits)
116
117 serviceDefaults, err := json.Marshal(testLimiter)
118 if err != nil {
core/node/libp2p/rcmgr_logging.go
+3 -2
@@ -11,6 +11,7 @@ import (
11 "github.com/libp2p/go-libp2p-core/peer"
12 "github.com/libp2p/go-libp2p-core/protocol"
13 rcmgr "github.com/libp2p/go-libp2p-resource-manager"
14 + ma "github.com/multiformats/go-multiaddr"
15 "go.uber.org/zap"
16 )
17
@@ -88,8 +89,8 @@ func (n *loggingResourceManager) ViewPeer(p peer.ID, f func(network.PeerScope) e
89 return f(&loggingScope{logger: n.logger, delegate: s, countErrs: n.countErrs})
90 })
91 }
91 -func (n *loggingResourceManager) OpenConnection(dir network.Direction, usefd bool) (network.ConnManagementScope, error) {
92 - connMgmtScope, err := n.delegate.OpenConnection(dir, usefd)
92 +func (n *loggingResourceManager) OpenConnection(dir network.Direction, usefd bool, remote ma.Multiaddr) (network.ConnManagementScope, error) {
93 + connMgmtScope, err := n.delegate.OpenConnection(dir, usefd, remote)
94 n.countErrs(err)
95 return connMgmtScope, err
96 }
core/node/libp2p/rcmgr_logging_test.go
+7 -3
@@ -8,6 +8,7 @@ import (
8 "github.com/benbjohnson/clock"
9 "github.com/libp2p/go-libp2p-core/network"
10 rcmgr "github.com/libp2p/go-libp2p-resource-manager"
11 + ma "github.com/multiformats/go-multiaddr"
12 "github.com/stretchr/testify/require"
13 "go.uber.org/zap"
14 "go.uber.org/zap/zaptest/observer"
@@ -15,8 +16,11 @@ import (
16
17 func TestLoggingResourceManager(t *testing.T) {
18 clock := clock.NewMock()
18 - limiter := rcmgr.NewDefaultLimiter()
19 - limiter.SystemLimits = limiter.SystemLimits.WithConnLimit(1, 1, 1)
19 + limits := rcmgr.DefaultLimits.AutoScale()
20 + limits.System.Conns = 1
21 + limits.System.ConnsInbound = 1
22 + limits.System.ConnsOutbound = 1
23 + limiter := rcmgr.NewFixedLimiter(limits)
24 rm, err := rcmgr.NewResourceManager(limiter)
25 if err != nil {
26 t.Fatal(err)
@@ -33,7 +37,7 @@ func TestLoggingResourceManager(t *testing.T) {
37
38 // 2 of these should result in resource limit exceeded errors and subsequent log messages
39 for i := 0; i < 3; i++ {
36 - _, _ = lrm.OpenConnection(network.DirInbound, false)
40 + _, _ = lrm.OpenConnection(network.DirInbound, false, ma.StringCast("/ip4/127.0.0.1/tcp/1234"))
41 }
42
43 // run the logger which will write an entry for those errors
go.mod
+28 -27
@@ -68,33 +68,33 @@ require (
68 github.com/jbenet/go-temp-err-catcher v0.1.0
69 github.com/jbenet/goprocess v0.1.4
70 github.com/libp2p/go-doh-resolver v0.4.0
71 - github.com/libp2p/go-libp2p v0.20.3
72 - github.com/libp2p/go-libp2p-core v0.16.1
71 + github.com/libp2p/go-libp2p v0.20.1-0.20220702110402-59d643acf30f
72 + github.com/libp2p/go-libp2p-core v0.19.0
73 github.com/libp2p/go-libp2p-http v0.2.1
74 - github.com/libp2p/go-libp2p-kad-dht v0.16.0
74 + github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220702124207-e5a723647953
75 github.com/libp2p/go-libp2p-kbucket v0.4.7
76 github.com/libp2p/go-libp2p-loggables v0.1.0
77 - github.com/libp2p/go-libp2p-peerstore v0.6.0
77 + github.com/libp2p/go-libp2p-peerstore v0.7.1
78 github.com/libp2p/go-libp2p-pubsub v0.6.1
79 github.com/libp2p/go-libp2p-pubsub-router v0.5.0
80 github.com/libp2p/go-libp2p-record v0.1.3
81 - github.com/libp2p/go-libp2p-resource-manager v0.3.0
81 + github.com/libp2p/go-libp2p-resource-manager v0.4.1-0.20220702093928-7ceb0b850c67
82 github.com/libp2p/go-libp2p-routing-helpers v0.2.3
83 - github.com/libp2p/go-libp2p-testing v0.9.2
83 + github.com/libp2p/go-libp2p-testing v0.10.0
84 github.com/libp2p/go-socket-activation v0.1.0
85 - github.com/miekg/dns v1.1.48
85 + github.com/miekg/dns v1.1.50
86 github.com/mitchellh/go-homedir v1.1.0
87 github.com/multiformats/go-multiaddr v0.6.0
88 github.com/multiformats/go-multiaddr-dns v0.3.1
89 - github.com/multiformats/go-multibase v0.1.0
89 + github.com/multiformats/go-multibase v0.1.1
90 github.com/multiformats/go-multicodec v0.5.0
91 github.com/multiformats/go-multihash v0.2.1
92 github.com/opentracing/opentracing-go v1.2.0
93 github.com/pkg/errors v0.9.1
94 github.com/prometheus/client_golang v1.12.1
95 - github.com/prometheus/common v0.33.0 // indirect
96 - github.com/stretchr/testify v1.7.1
97 - github.com/syndtr/goleveldb v1.0.0
95 + github.com/prometheus/common v0.35.0 // indirect
96 + github.com/stretchr/testify v1.8.0
97 + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
98 github.com/wI2L/jsondiff v0.2.0
99 github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1
100 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7
@@ -129,13 +129,13 @@ require (
129 github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a // indirect
130 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect
131 github.com/beorn7/perks v1.0.1 // indirect
132 - github.com/btcsuite/btcd v0.22.1 // indirect
133 - github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect
132 + github.com/btcsuite/btcd v0.23.1 // indirect
133 + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
134 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect
135 github.com/cenkalti/backoff v2.2.1+incompatible // indirect
136 github.com/cespare/xxhash/v2 v2.1.2 // indirect
137 github.com/cheekybits/genny v1.0.0 // indirect
138 - github.com/containerd/cgroups v1.0.3 // indirect
138 + github.com/containerd/cgroups v1.0.4 // indirect
139 github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect
140 github.com/cskr/pubsub v1.0.2 // indirect
141 github.com/davecgh/go-spew v1.1.1 // indirect
@@ -175,9 +175,9 @@ require (
175 github.com/ipld/edelweiss v0.1.4 // indirect
176 github.com/jackpal/go-nat-pmp v1.0.2 // indirect
177 github.com/klauspost/compress v1.15.1 // indirect
178 - github.com/klauspost/cpuid/v2 v2.0.12 // indirect
179 - github.com/koron/go-ssdp v0.0.2 // indirect
180 - github.com/libp2p/go-buffer-pool v0.0.2 // indirect
178 + github.com/klauspost/cpuid/v2 v2.0.14 // indirect
179 + github.com/koron/go-ssdp v0.0.3 // indirect
180 + github.com/libp2p/go-buffer-pool v0.1.0 // indirect
181 github.com/libp2p/go-cidranger v1.1.0 // indirect
182 github.com/libp2p/go-eventbus v0.2.1 // indirect
183 github.com/libp2p/go-flow-metrics v0.0.3 // indirect
@@ -194,10 +194,11 @@ require (
194 github.com/libp2p/go-reuseport v0.2.0 // indirect
195 github.com/libp2p/go-yamux/v3 v3.1.2 // indirect
196 github.com/libp2p/zeroconf/v2 v2.1.1 // indirect
197 - github.com/lucas-clemente/quic-go v0.27.1 // indirect
197 + github.com/lucas-clemente/quic-go v0.28.0 // indirect
198 github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect
199 - github.com/marten-seemann/qtls-go1-17 v0.1.1 // indirect
200 - github.com/marten-seemann/qtls-go1-18 v0.1.1 // indirect
199 + github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect
200 + github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect
201 + github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 // indirect
202 github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
203 github.com/mattn/go-colorable v0.1.4 // indirect
204 github.com/mattn/go-isatty v0.0.14 // indirect
@@ -244,22 +245,22 @@ require (
245 go.uber.org/atomic v1.9.0 // indirect
246 go.uber.org/multierr v1.8.0 // indirect
247 go4.org v0.0.0-20200411211856-f5505b9728dd // indirect
247 - golang.org/x/exp v0.0.0-20210615023648-acb5c1269671 // indirect
248 - golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
249 - golang.org/x/net v0.0.0-20220517181318-183a9ca12b87 // indirect
248 + golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 // indirect
249 + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
250 + golang.org/x/net v0.0.0-20220630215102-69896b714898 // indirect
251 golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect
252 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
253 golang.org/x/text v0.3.7 // indirect
253 - golang.org/x/tools v0.1.10 // indirect
254 - golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect
254 + golang.org/x/tools v0.1.11 // indirect
255 + golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
256 google.golang.org/appengine v1.6.6 // indirect
257 google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
257 - google.golang.org/grpc v1.46.0 // indirect
258 + google.golang.org/grpc v1.47.0 // indirect
259 google.golang.org/protobuf v1.28.0 // indirect
260 gopkg.in/square/go-jose.v2 v2.5.1 // indirect
261 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
262 gopkg.in/yaml.v2 v2.4.0 // indirect
262 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
263 + gopkg.in/yaml.v3 v3.0.1 // indirect
264 lukechampine.com/blake3 v1.1.7 // indirect
265 )
266
go.sum
+71 -42
@@ -104,10 +104,16 @@ github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcug
104 github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
105 github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94=
106 github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA=
107 -github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c=
107 +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M=
108 github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y=
109 -github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE=
109 +github.com/btcsuite/btcd v0.23.1 h1:IB8cVQcC2X5mHbnfirLG5IZnkWYNTPlLZVrxUYSotbE=
110 +github.com/btcsuite/btcd v0.23.1/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
111 +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA=
112 github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
113 +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
114 +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
115 +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A=
116 +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE=
117 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
118 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
119 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
@@ -159,8 +165,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH
165 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
166 github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
167 github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
162 -github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4=
163 -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8=
168 +github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
169 +github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA=
170 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
171 github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
172 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
@@ -740,14 +746,15 @@ github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e
746 github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
747 github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
748 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
743 -github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE=
744 -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
749 +github.com/klauspost/cpuid/v2 v2.0.14 h1:QRqdp6bb9M9S5yyKeYteXKuoKE4p0tGlra81fKOpWH8=
750 +github.com/klauspost/cpuid/v2 v2.0.14/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
751 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
752 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
753 github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
754 github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
749 -github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o=
755 github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs=
756 +github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8=
757 +github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA=
758 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
759 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
760 github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -763,8 +770,9 @@ github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpz
770 github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E=
771 github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw=
772 github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
766 -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs=
773 github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
774 +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
775 +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
776 github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
777 github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
778 github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk=
@@ -796,8 +804,9 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m
804 github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4=
805 github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw=
806 github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k=
799 -github.com/libp2p/go-libp2p v0.20.3 h1:tjjDNfp7FqdI/7v1rXtB/BtELaPlAThL2uzlj18kcrw=
800 -github.com/libp2p/go-libp2p v0.20.3/go.mod h1:I+vndVanE/p/SjFbnA+BEmmfAUEpWxrdXZeyQ1Dus5c=
807 +github.com/libp2p/go-libp2p v0.20.1-0.20220702080325-0d7f192a0b2b/go.mod h1:/V/lQvlr89XZv5MKTyl1yb0bPr5rb71m6EZB/j8CUfE=
808 +github.com/libp2p/go-libp2p v0.20.1-0.20220702110402-59d643acf30f h1:5kOxq8Xdt7U+3RFa1KKzeTnFx5BqxqtAp5T1ieDW7cQ=
809 +github.com/libp2p/go-libp2p v0.20.1-0.20220702110402-59d643acf30f/go.mod h1:DcdrxWL9mUmXApMoj4bQh95WiZPT7Uzr7JbfK1lgscI=
810 github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo=
811 github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I=
812 github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw=
@@ -822,7 +831,6 @@ github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk
831 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU=
832 github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo=
833 github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA=
825 -github.com/libp2p/go-libp2p-circuit v0.6.0 h1:rw/HlhmUB3OktS/Ygz6+2XABOmHKzZpPUuMNUMosj8w=
834 github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M=
835 github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w=
836 github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0=
@@ -857,9 +865,9 @@ github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQR
865 github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg=
866 github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg=
867 github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8=
860 -github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs=
861 -github.com/libp2p/go-libp2p-core v0.16.1 h1:bWoiEBqVkpJ13hbv/f69tHODp86t6mvc4fBN4DkK73M=
868 github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c=
869 +github.com/libp2p/go-libp2p-core v0.19.0 h1:KDw7hanmh0EuVdZqsHCAzmkdiYMk5uR5h0UGSCVTxSU=
870 +github.com/libp2p/go-libp2p-core v0.19.0/go.mod h1:AkA+FUKQfYt1FLNef5fOPlo/naAWjKy/RCjkcPjqzYg=
871 github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE=
872 github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I=
873 github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
@@ -882,8 +890,8 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM
890 github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
891 github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k=
892 github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0=
885 -github.com/libp2p/go-libp2p-kad-dht v0.16.0 h1:epVRYl3O8dn47uV3wVD2+IobEvBPapEMVj4sWlvwQHU=
886 -github.com/libp2p/go-libp2p-kad-dht v0.16.0/go.mod h1:YYLlG8AbpWVGbI/zFeSbiGT0n0lluH7IG0sHeounyWA=
893 +github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220702124207-e5a723647953 h1:OODUMM0krnTSgVSLNICQ4TCW8UfPKgomg0eOiUwA3Eo=
894 +github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220702124207-e5a723647953/go.mod h1:vtMxbammvMR5iyLL1tWMDjOgyax7cg24UNYO5MUIuRw=
895 github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
896 github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70=
897 github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk=
@@ -928,8 +936,9 @@ github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD
936 github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s=
937 github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA=
938 github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0=
931 -github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A=
939 github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc=
940 +github.com/libp2p/go-libp2p-peerstore v0.7.1 h1:7FpALlqR+3+oOBXdzm3AVt0vjMYLW1b7jM03E4iEHlw=
941 +github.com/libp2p/go-libp2p-peerstore v0.7.1/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0=
942 github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA=
943 github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s=
944 github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk=
@@ -950,8 +959,10 @@ github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGd
959 github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0=
960 github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4=
961 github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y=
953 -github.com/libp2p/go-libp2p-resource-manager v0.3.0 h1:2+cYxUNi33tcydsVLt6K5Fv2E3OTiVeafltecAj15E0=
962 github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ=
963 +github.com/libp2p/go-libp2p-resource-manager v0.4.0/go.mod h1:+5QPxFLRXYlRDZ0P1bPKE7zyZDvex5TLVOqePwRmwfc=
964 +github.com/libp2p/go-libp2p-resource-manager v0.4.1-0.20220702093928-7ceb0b850c67 h1:LEikdvzrVWpCC+ZiV1nA5xidrWR9w4QJDN0Lk3lJfH4=
965 +github.com/libp2p/go-libp2p-resource-manager v0.4.1-0.20220702093928-7ceb0b850c67/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0=
966 github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys=
967 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY=
968 github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw=
@@ -988,8 +999,9 @@ github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl
999 github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A=
1000 github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E=
1001 github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc=
991 -github.com/libp2p/go-libp2p-testing v0.9.2 h1:dCpODRtRaDZKF8HXT9qqqgON+OMEB423Knrgeod8j84=
1002 github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU=
1003 +github.com/libp2p/go-libp2p-testing v0.10.0 h1:LO7wuUPPNAe1D1s0HZ+9WoROaGIn/MEl1wtugXuTRzg=
1004 +github.com/libp2p/go-libp2p-testing v0.10.0/go.mod h1:jJ4fiJwyZ3UlPTLcnz/sEmPPSviQ79Q0MVD/CykzrP0=
1005 github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M=
1006 github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY=
1007 github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY=
@@ -1133,8 +1145,9 @@ github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0
1145 github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0=
1146 github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0=
1147 github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg=
1136 -github.com/lucas-clemente/quic-go v0.27.1 h1:sOw+4kFSVrdWOYmUjufQ9GBVPqZ+tu+jMtXxXNmRJyk=
1148 github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI=
1149 +github.com/lucas-clemente/quic-go v0.28.0 h1:9eXVRgIkMQQyiyorz/dAaOYIx3TFzXsIFkNFz4cxuJM=
1150 +github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0=
1151 github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
1152 github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
1153 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
@@ -1150,11 +1163,15 @@ github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtU
1163 github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk=
1164 github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8=
1165 github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8=
1153 -github.com/marten-seemann/qtls-go1-17 v0.1.1 h1:DQjHPq+aOzUeh9/lixAGunn6rIOQyWChPSI4+hgW7jc=
1166 github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s=
1167 +github.com/marten-seemann/qtls-go1-17 v0.1.2 h1:JADBlm0LYiVbuSySCHeY863dNkcpMmDR7s0bLKJeYlQ=
1168 +github.com/marten-seemann/qtls-go1-17 v0.1.2/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s=
1169 github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI=
1156 -github.com/marten-seemann/qtls-go1-18 v0.1.1 h1:qp7p7XXUFL7fpBvSS1sWD+uSqPvzNQK43DH+/qEkj0Y=
1170 github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4=
1171 +github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM=
1172 +github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4=
1173 +github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ=
1174 +github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI=
1175 github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
1176 github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
1177 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
@@ -1184,8 +1201,8 @@ github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7
1201 github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
1202 github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
1203 github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
1187 -github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ=
1188 -github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
1204 +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA=
1205 +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
1206 github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
1207 github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
1208 github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -1260,8 +1277,8 @@ github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysj
1277 github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA=
1278 github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
1279 github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
1263 -github.com/multiformats/go-multibase v0.1.0 h1:+cr9718eEwFIUxPP7sQmixYYhD4sRrU9aMXqYb+0diE=
1264 -github.com/multiformats/go-multibase v0.1.0/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8=
1280 +github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI=
1281 +github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8=
1282 github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4=
1283 github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ=
1284 github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ=
@@ -1404,8 +1421,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9
1421 github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
1422 github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
1423 github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
1407 -github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE=
1408 -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
1424 +github.com/prometheus/common v0.35.0 h1:Eyr+Pw2VymWejHqCugNaQXkAi6KayVNxaHeu6khmFBE=
1425 +github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
1426 github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
1427 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
1428 github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
@@ -1501,18 +1518,21 @@ github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3
1518 github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
1519 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
1520 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
1504 -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
1521 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
1522 +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
1523 +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
1524 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
1525 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
1526 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
1527 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
1528 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
1529 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
1512 -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
1530 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
1514 -github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
1531 +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
1532 +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
1533 github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
1534 +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
1535 +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
1536 github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
1537 github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e h1:T5PdfK/M1xyrHwynxMIVMWLS7f/qHwfslZphxtGnw7s=
1538 github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
@@ -1720,8 +1740,9 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
1740 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
1741 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
1742 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
1723 -golang.org/x/exp v0.0.0-20210615023648-acb5c1269671 h1:ddvpKwqE7dm58PoWjRCmaCiA3DANEW0zWGfNYQD212Y=
1743 golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc=
1744 +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E=
1745 +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
1746 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
1747 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
1748 golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1746,8 +1767,10 @@ golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hM
1767 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
1768 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
1769 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
1749 -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
1750 -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
1770 +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
1771 +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
1772 +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
1773 +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
1774 golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
1775 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
1776 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1791,6 +1814,7 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/
1814 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
1815 golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
1816 golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
1817 +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
1818 golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
1819 golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
1820 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@@ -1810,8 +1834,10 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx
1834 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
1835 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
1836 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
1813 -golang.org/x/net v0.0.0-20220517181318-183a9ca12b87 h1:cCR+9mKLOGyX4Zx+uBZDXEDAQsvKQ/XbW4vreG5v1jU=
1814 -golang.org/x/net v0.0.0-20220517181318-183a9ca12b87/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
1837 +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
1838 +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
1839 +golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw=
1840 +golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
1841 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
1842 golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
1843 golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1899,6 +1925,7 @@ golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7w
1925 golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1926 golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1927 golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1928 +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1929 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1930 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1931 golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1926,7 +1953,6 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc
1953 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1954 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1955 golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1929 -golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1956 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
1957 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1958 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
@@ -2005,14 +2031,15 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
2031 golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
2032 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
2033 golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
2008 -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20=
2009 -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
2034 +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
2035 +golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY=
2036 +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
2037 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
2038 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
2039 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
2040 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
2014 -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U=
2015 -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
2041 +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=
2042 +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
2043 google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
2044 google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
2045 google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
@@ -2106,8 +2133,9 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG
2133 google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
2134 google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
2135 google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
2109 -google.golang.org/grpc v1.46.0 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8=
2136 google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
2137 +google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8=
2138 +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
2139 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
2140 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
2141 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -2153,8 +2181,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
2181 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
2182 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
2183 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
2156 -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
2184 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
2185 +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
2186 +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
2187 grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
2188 honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
2189 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=