@cryptotaxi247 / kubo / commits / 64c47c374

feat(config): `Gateway.RetrievalTimeout|MaxConcurrentRequests` (#10905)

* feat(gateway): concurrency and timeout limits Depends on https://github.com/ipfs/boxo/pull/994 * chore: boxo master with final boxo#994 this includes race-condition fixes from ipfs/boxo#994 and increased `DefaultMaxConcurrentRequests = 4096` * docs: concise config.md and changelog

Marcin Rataj committed Aug 15, 2025 at 02:36 UTC 64c47c374a263ee9f8ab5e50a548332862cef749
14 files changed +348 -48
.github/workflows/docker-build.yml
+1 -1
@@ -26,9 +26,9 @@ jobs:
26 run:
27 shell: bash
28 steps:
29 + - uses: actions/checkout@v5
30 - uses: actions/setup-go@v5
31 with:
32 go-version: 1.25.x
32 - - uses: actions/checkout@v5
33 - run: docker build -t $IMAGE_NAME:$WIP_IMAGE_TAG .
34 - run: docker run --rm $IMAGE_NAME:$WIP_IMAGE_TAG --version
config/gateway.go
+25
@@ -1,10 +1,18 @@
1 package config
2
3 +import (
4 + "github.com/ipfs/boxo/gateway"
5 +)
6 +
7 const (
8 DefaultInlineDNSLink = false
9 DefaultDeserializedResponses = true
10 DefaultDisableHTMLErrors = false
11 DefaultExposeRoutingAPI = false
12 +
13 + // Gateway limit defaults from boxo
14 + DefaultRetrievalTimeout = gateway.DefaultRetrievalTimeout
15 + DefaultMaxConcurrentRequests = gateway.DefaultMaxConcurrentRequests
16 )
17
18 type GatewaySpec struct {
@@ -73,4 +81,21 @@ type Gateway struct {
81 // ExposeRoutingAPI configures the gateway port to expose
82 // routing system as HTTP API at /routing/v1 (https://specs.ipfs.tech/routing/http-routing-v1/).
83 ExposeRoutingAPI Flag
84 +
85 + // RetrievalTimeout enforces a maximum duration for content retrieval:
86 + // - Time to first byte: If the gateway cannot start writing the response within
87 + // this duration (e.g., stuck searching for providers), a 504 Gateway Timeout
88 + // is returned.
89 + // - Time between writes: After the first byte, the timeout resets each time new
90 + // bytes are written to the client. If the gateway cannot write additional data
91 + // within this duration after the last successful write, the response is terminated.
92 + // This helps free resources when the gateway gets stuck looking for providers
93 + // or cannot retrieve the requested content.
94 + // A value of 0 disables this timeout.
95 + RetrievalTimeout *OptionalDuration `json:",omitempty"`
96 +
97 + // MaxConcurrentRequests limits concurrent HTTP requests handled by the gateway.
98 + // Requests beyond this limit receive 429 Too Many Requests with Retry-After header.
99 + // A value of 0 disables the limit.
100 + MaxConcurrentRequests *OptionalInteger `json:",omitempty"`
101 }
core/corehttp/gateway.go
+14 -2
@@ -97,11 +97,21 @@ func Libp2pGatewayOption() ServeOption {
97 return nil, err
98 }
99
100 + // Get gateway configuration from the node's config
101 + cfg, err := n.Repo.Config()
102 + if err != nil {
103 + return nil, err
104 + }
105 +
106 gwConfig := gateway.Config{
101 - DeserializedResponses: false,
102 - NoDNSLink: true,
107 + // Keep these constraints for security
108 + DeserializedResponses: false, // Trustless-only
109 + NoDNSLink: true, // No DNS resolution
110 PublicGateways: nil,
111 Menu: nil,
112 + // Apply timeout and concurrency limits from user config
113 + RetrievalTimeout: cfg.Gateway.RetrievalTimeout.WithDefault(config.DefaultRetrievalTimeout),
114 + MaxConcurrentRequests: int(cfg.Gateway.MaxConcurrentRequests.WithDefault(int64(config.DefaultMaxConcurrentRequests))),
115 }
116
117 handler := gateway.NewHandler(gwConfig, &offlineGatewayErrWrapper{gwimpl: backend})
@@ -258,6 +268,8 @@ func getGatewayConfig(n *core.IpfsNode) (gateway.Config, map[string][]string, er
268 DisableHTMLErrors: cfg.Gateway.DisableHTMLErrors.WithDefault(config.DefaultDisableHTMLErrors),
269 NoDNSLink: cfg.Gateway.NoDNSLink,
270 PublicGateways: map[string]*gateway.PublicGateway{},
271 + RetrievalTimeout: cfg.Gateway.RetrievalTimeout.WithDefault(config.DefaultRetrievalTimeout),
272 + MaxConcurrentRequests: int(cfg.Gateway.MaxConcurrentRequests.WithDefault(int64(config.DefaultMaxConcurrentRequests))),
273 }
274
275 // Add default implicit known gateways, such as subdomain gateway on localhost.
core/corehttp/metrics.go
+1
@@ -87,6 +87,7 @@ func MetricsCollectionOption(handlerName string) ServeOption {
87 Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
88 }
89
90 + // Legacy metric - new metrics are provided by boxo/gateway as gw_http_responses_total
91 reqCnt := prometheus.NewCounterVec(
92 prometheus.CounterOpts{
93 Namespace: opts.Namespace,
docs/changelogs/v0.37.md
+20
@@ -10,6 +10,7 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
10
11 - [Overview](#overview)
12 - [🔦 Highlights](#-highlights)
13 + - [🚦 Gateway concurrent request limits and retrieval timeouts](#-gateway-concurrent-request-limits-and-retrieval-timeouts)
14 - [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
15 - [🪵 Revamped `ipfs log level` command](#-revamped-ipfs-log-level-command)
16 - [📌 Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
@@ -27,6 +28,25 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
28
29 ### 🔦 Highlights
30
31 +#### 🚦 Gateway concurrent request limits and retrieval timeouts
32 +
33 +New configurable limits protect gateway resources during high load:
34 +
35 +- **[`Gateway.RetrievalTimeout`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewayretrievaltimeout)** (default: 30s): Maximum duration for content retrieval. Returns 504 Gateway Timeout when exceeded - applies to both initial retrieval (time to first byte) and between subsequent writes.
36 +- **[`Gateway.MaxConcurrentRequests`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaymaxconcurrentrequests)** (default: 4096): Limits concurrent HTTP requests. Returns 429 Too Many Requests when exceeded. Protects nodes from traffic spikes and resource exhaustion, especially useful behind reverse proxies without rate-limiting.
37 +
38 +New Prometheus metrics for monitoring:
39 +
40 +- `ipfs_http_gw_concurrent_requests`: Current requests being processed
41 +- `ipfs_http_gw_responses_total`: HTTP responses by status code
42 +- `ipfs_http_gw_retrieval_timeouts_total`: Timeouts by status code and truncation status
43 +
44 +Tuning tips:
45 +
46 +- Monitor metrics to understand gateway behavior and adjust based on observations
47 +- Watch `ipfs_http_gw_concurrent_requests` for saturation
48 +- Track `ipfs_http_gw_retrieval_timeouts_total` vs success rates to identify timeout patterns indicating routing or storage provider issues
49 +
50 #### Clear provide queue when reprovide strategy changes
51
52 Your content sharing strategy changes now take effect cleanly, without interference from previously queued items.
docs/config.md
+51
@@ -60,6 +60,8 @@ config file at runtime.
60 - [`Gateway.DeserializedResponses`](#gatewaydeserializedresponses)
61 - [`Gateway.DisableHTMLErrors`](#gatewaydisablehtmlerrors)
62 - [`Gateway.ExposeRoutingAPI`](#gatewayexposeroutingapi)
63 + - [`Gateway.RetrievalTimeout`](#gatewayretrievaltimeout)
64 + - [`Gateway.MaxConcurrentRequests`](#gatewaymaxconcurrentrequests)
65 - [`Gateway.HTTPHeaders`](#gatewayhttpheaders)
66 - [`Gateway.RootRedirect`](#gatewayrootredirect)
67 - [`Gateway.FastDirIndexThreshold`](#gatewayfastdirindexthreshold)
@@ -947,6 +949,55 @@ Default: `false`
949
950 Type: `flag`
951
952 +### `Gateway.RetrievalTimeout`
953 +
954 +Maximum duration Kubo will wait for content retrieval (new bytes to arrive).
955 +
956 +**Timeout behavior:**
957 +- **Time to first byte**: Returns 504 Gateway Timeout if the gateway cannot start writing within this duration (e.g., stuck searching for providers)
958 +- **Time between writes**: After first byte, timeout resets with each write. Response terminates if no new data can be written within this duration
959 +
960 +**Truncation handling:** When timeout occurs after HTTP 200 headers are sent (e.g., during CAR streams), the gateway:
961 +- Appends error message to indicate truncation
962 +- Forces TCP reset (RST) to prevent caching incomplete responses
963 +- Records in metrics with original status code and `truncated=true` flag
964 +
965 +**Monitoring:** Track `ipfs_http_gw_retrieval_timeouts_total` by status code and truncation status.
966 +
967 +**Tuning guidance:**
968 +- Compare timeout rates (`ipfs_http_gw_retrieval_timeouts_total`) with success rates (`ipfs_http_gw_responses_total{status="200"}`)
969 +- High timeout rate: consider increasing timeout or scaling horizontally if hardware is constrained
970 +- Many 504s may indicate routing problems - check requested CIDs and provider availability using https://check.ipfs.network/
971 +- `truncated=true` timeouts indicate retrieval stalled mid-file with no new bytes for the timeout duration
972 +
973 +A value of 0 disables this timeout.
974 +
975 +Default: `30s`
976 +
977 +Type: `optionalDuration`
978 +
979 +### `Gateway.MaxConcurrentRequests`
980 +
981 +Limits concurrent HTTP requests. Requests beyond limit receive 429 Too Many Requests.
982 +
983 +Protects nodes from traffic spikes and resource exhaustion, especially behind reverse proxies without rate-limiting. Default (4096) aligns with common reverse proxy configurations (e.g., nginx: 8 workers × 1024 connections).
984 +
985 +**Monitoring:** `ipfs_http_gw_concurrent_requests` tracks current requests in flight.
986 +
987 +**Tuning guidance:**
988 +- Monitor `ipfs_http_gw_concurrent_requests` gauge for usage patterns
989 +- Track 429s (`ipfs_http_gw_responses_total{status="429"}`) and success rate (`{status="200"}`)
990 +- Near limit with low resource usage → increase value
991 +- Memory pressure or OOMs → decrease value and consider scaling
992 +- Set slightly below reverse proxy limit for graceful degradation
993 +- Start with default, adjust based on observed performance for your hardware
994 +
995 +A value of 0 disables the limit.
996 +
997 +Default: `4096`
998 +
999 +Type: `optionalInteger`
1000 +
1001 ### `Gateway.HTTPHeaders`
1002
1003 Headers to set on gateway responses.
docs/examples/kubo-as-a-library/go.mod
+5 -5
@@ -7,7 +7,7 @@ go 1.25
7 replace github.com/ipfs/kubo => ./../../..
8
9 require (
10 - github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e
10 + github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf
11 github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
12 github.com/libp2p/go-libp2p v0.43.0
13 github.com/multiformats/go-multiaddr v0.16.1
@@ -52,7 +52,7 @@ require (
52 github.com/fsnotify/fsnotify v1.7.0 // indirect
53 github.com/gabriel-vasile/mimetype v1.4.9 // indirect
54 github.com/gammazero/chanqueue v1.1.1 // indirect
55 - github.com/gammazero/deque v1.0.0 // indirect
55 + github.com/gammazero/deque v1.1.0 // indirect
56 github.com/getsentry/sentry-go v0.27.0 // indirect
57 github.com/go-jose/go-jose/v4 v4.0.5 // indirect
58 github.com/go-logr/logr v1.4.3 // indirect
@@ -75,7 +75,7 @@ require (
75 github.com/ipfs/go-block-format v0.2.2 // indirect
76 github.com/ipfs/go-cid v0.5.0 // indirect
77 github.com/ipfs/go-cidutil v0.1.0 // indirect
78 - github.com/ipfs/go-datastore v0.8.2 // indirect
78 + github.com/ipfs/go-datastore v0.8.3 // indirect
79 github.com/ipfs/go-ds-badger v0.3.4 // indirect
80 github.com/ipfs/go-ds-flatfs v0.5.5 // indirect
81 github.com/ipfs/go-ds-leveldb v0.5.2 // indirect
@@ -90,7 +90,7 @@ require (
90 github.com/ipfs/go-ipld-format v0.6.2 // indirect
91 github.com/ipfs/go-ipld-git v0.1.1 // indirect
92 github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
93 - github.com/ipfs/go-log/v2 v2.8.0 // indirect
93 + github.com/ipfs/go-log/v2 v2.8.1 // indirect
94 github.com/ipfs/go-metrics-interface v0.3.0 // indirect
95 github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
96 github.com/ipfs/go-unixfsnode v1.10.1 // indirect
@@ -206,7 +206,7 @@ require (
206 go.uber.org/zap/exp v0.3.0 // indirect
207 go4.org v0.0.0-20230225012048-214862532bf5 // indirect
208 golang.org/x/crypto v0.41.0 // indirect
209 - golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect
209 + golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect
210 golang.org/x/mod v0.27.0 // indirect
211 golang.org/x/net v0.43.0 // indirect
212 golang.org/x/sync v0.16.0 // indirect
docs/examples/kubo-as-a-library/go.sum
+10 -10
@@ -163,8 +163,8 @@ github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBv
163 github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
164 github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
165 github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
166 -github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
167 -github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
166 +github.com/gammazero/deque v1.1.0 h1:OyiyReBbnEG2PP0Bnv1AASLIYvyKqIFN5xfl1t8oGLo=
167 +github.com/gammazero/deque v1.1.0/go.mod h1:JVrR+Bj1NMQbPnYclvDlvSX0nVGReLrQZ0aUMuWLctg=
168 github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
169 github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
170 github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
@@ -287,8 +287,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
287 github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
288 github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
289 github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
290 -github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e h1:A2zSzpyrerCtdN69iDxt9S9z27cD1R4Uw3l1ctLTxX0=
291 -github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e/go.mod h1:ehi6uM9NBRkAaB7Q7u2kZgGArXPfbNRe0X/CYTqUwq8=
290 +github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf h1:W3iHiK3PaaayhoQQUgh3zvz7nbVfi/srJSgWi7HyM9s=
291 +github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
292 github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
293 github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
294 github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -303,8 +303,8 @@ github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q
303 github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
304 github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
305 github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
306 -github.com/ipfs/go-datastore v0.8.2 h1:Jy3wjqQR6sg/LhyY0NIePZC3Vux19nLtg7dx0TVqr6U=
307 -github.com/ipfs/go-datastore v0.8.2/go.mod h1:W+pI1NsUsz3tcsAACMtfC+IZdnQTnC/7VfPoJBQuts0=
306 +github.com/ipfs/go-datastore v0.8.3 h1:z391GsQyGKUIUof2tPoaZVeDknbt7fNHs6Gqjcw5Jo4=
307 +github.com/ipfs/go-datastore v0.8.3/go.mod h1:raxQ/CreIy9L6MxT71ItfMX12/ASN6EhXJoUFjICQ2M=
308 github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
309 github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
310 github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk=
@@ -345,8 +345,8 @@ github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7
345 github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
346 github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
347 github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
348 -github.com/ipfs/go-log/v2 v2.8.0 h1:SptNTPJQV3s5EF4FdrTu/yVdOKfGbDgn1EBZx4til2o=
349 -github.com/ipfs/go-log/v2 v2.8.0/go.mod h1:2LEEhdv8BGubPeSFTyzbqhCqrwqxCbuTNTLWqgNAipo=
348 +github.com/ipfs/go-log/v2 v2.8.1 h1:Y/X36z7ASoLJaYIJAL4xITXgwf7RVeqb1+/25aq/Xk0=
349 +github.com/ipfs/go-log/v2 v2.8.1/go.mod h1:NyhTBcZmh2Y55eWVjOeKf8M7e4pnJYM3yDZNxQBWEEY=
350 github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
351 github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
352 github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
@@ -842,8 +842,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
842 golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
843 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
844 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
845 -golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
846 -golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
845 +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
846 +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
847 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
848 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
849 golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
go.mod
+5 -5
@@ -22,11 +22,11 @@ require (
22 github.com/hashicorp/go-version v1.7.0
23 github.com/ipfs-shipyard/nopfs v0.0.14
24 github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
25 - github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e
25 + github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf
26 github.com/ipfs/go-block-format v0.2.2
27 github.com/ipfs/go-cid v0.5.0
28 github.com/ipfs/go-cidutil v0.1.0
29 - github.com/ipfs/go-datastore v0.8.2
29 + github.com/ipfs/go-datastore v0.8.3
30 github.com/ipfs/go-detect-race v0.0.1
31 github.com/ipfs/go-ds-badger v0.3.4
32 github.com/ipfs/go-ds-flatfs v0.5.5
@@ -39,7 +39,7 @@ require (
39 github.com/ipfs/go-ipld-format v0.6.2
40 github.com/ipfs/go-ipld-git v0.1.1
41 github.com/ipfs/go-ipld-legacy v0.2.2
42 - github.com/ipfs/go-log/v2 v2.8.0
42 + github.com/ipfs/go-log/v2 v2.8.1
43 github.com/ipfs/go-metrics-interface v0.3.0
44 github.com/ipfs/go-metrics-prometheus v0.1.0
45 github.com/ipfs/go-test v0.2.2
@@ -85,7 +85,7 @@ require (
85 go.uber.org/fx v1.24.0
86 go.uber.org/zap v1.27.0
87 golang.org/x/crypto v0.41.0
88 - golang.org/x/exp v0.0.0-20250811191247-51f88131bc50
88 + golang.org/x/exp v0.0.0-20250813145105-42675adae3e6
89 golang.org/x/mod v0.27.0
90 golang.org/x/sync v0.16.0
91 golang.org/x/sys v0.35.0
@@ -125,7 +125,7 @@ require (
125 github.com/francoispqt/gojay v1.2.13 // indirect
126 github.com/gabriel-vasile/mimetype v1.4.9 // indirect
127 github.com/gammazero/chanqueue v1.1.1 // indirect
128 - github.com/gammazero/deque v1.0.0 // indirect
128 + github.com/gammazero/deque v1.1.0 // indirect
129 github.com/getsentry/sentry-go v0.27.0 // indirect
130 github.com/go-jose/go-jose/v4 v4.0.5 // indirect
131 github.com/go-kit/log v0.2.1 // indirect
go.sum
+10 -10
@@ -201,8 +201,8 @@ github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBv
201 github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
202 github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
203 github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
204 -github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
205 -github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
204 +github.com/gammazero/deque v1.1.0 h1:OyiyReBbnEG2PP0Bnv1AASLIYvyKqIFN5xfl1t8oGLo=
205 +github.com/gammazero/deque v1.1.0/go.mod h1:JVrR+Bj1NMQbPnYclvDlvSX0nVGReLrQZ0aUMuWLctg=
206 github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
207 github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
208 github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
@@ -354,8 +354,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
354 github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
355 github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
356 github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
357 -github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e h1:A2zSzpyrerCtdN69iDxt9S9z27cD1R4Uw3l1ctLTxX0=
358 -github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e/go.mod h1:ehi6uM9NBRkAaB7Q7u2kZgGArXPfbNRe0X/CYTqUwq8=
357 +github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf h1:W3iHiK3PaaayhoQQUgh3zvz7nbVfi/srJSgWi7HyM9s=
358 +github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
359 github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
360 github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
361 github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -370,8 +370,8 @@ github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q
370 github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
371 github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
372 github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
373 -github.com/ipfs/go-datastore v0.8.2 h1:Jy3wjqQR6sg/LhyY0NIePZC3Vux19nLtg7dx0TVqr6U=
374 -github.com/ipfs/go-datastore v0.8.2/go.mod h1:W+pI1NsUsz3tcsAACMtfC+IZdnQTnC/7VfPoJBQuts0=
373 +github.com/ipfs/go-datastore v0.8.3 h1:z391GsQyGKUIUof2tPoaZVeDknbt7fNHs6Gqjcw5Jo4=
374 +github.com/ipfs/go-datastore v0.8.3/go.mod h1:raxQ/CreIy9L6MxT71ItfMX12/ASN6EhXJoUFjICQ2M=
375 github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
376 github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
377 github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk=
@@ -414,8 +414,8 @@ github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7
414 github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
415 github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
416 github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
417 -github.com/ipfs/go-log/v2 v2.8.0 h1:SptNTPJQV3s5EF4FdrTu/yVdOKfGbDgn1EBZx4til2o=
418 -github.com/ipfs/go-log/v2 v2.8.0/go.mod h1:2LEEhdv8BGubPeSFTyzbqhCqrwqxCbuTNTLWqgNAipo=
417 +github.com/ipfs/go-log/v2 v2.8.1 h1:Y/X36z7ASoLJaYIJAL4xITXgwf7RVeqb1+/25aq/Xk0=
418 +github.com/ipfs/go-log/v2 v2.8.1/go.mod h1:NyhTBcZmh2Y55eWVjOeKf8M7e4pnJYM3yDZNxQBWEEY=
419 github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
420 github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
421 github.com/ipfs/go-metrics-prometheus v0.1.0 h1:bApWOHkrH3VTBHzTHrZSfq4n4weOZDzZFxUXv+HyKcA=
@@ -1009,8 +1009,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
1009 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
1010 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
1011 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
1012 -golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
1013 -golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
1012 +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
1013 +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
1014 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
1015 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
1016 golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
test/cli/gateway_limits_test.go new
+132
@@ -0,0 +1,132 @@
1 +package cli
2 +
3 +import (
4 + "net/http"
5 + "testing"
6 + "time"
7 +
8 + "github.com/ipfs/kubo/config"
9 + "github.com/ipfs/kubo/test/cli/harness"
10 + "github.com/stretchr/testify/assert"
11 +)
12 +
13 +// TestGatewayLimits tests the gateway request limiting and timeout features.
14 +// These are basic integration tests that verify the configuration works.
15 +// For comprehensive tests, see:
16 +// - github.com/ipfs/boxo/gateway/middleware_retrieval_timeout_test.go
17 +// - github.com/ipfs/boxo/gateway/middleware_ratelimit_test.go
18 +func TestGatewayLimits(t *testing.T) {
19 + t.Parallel()
20 +
21 + t.Run("RetrievalTimeout", func(t *testing.T) {
22 + t.Parallel()
23 +
24 + // Create a node with a short retrieval timeout
25 + node := harness.NewT(t).NewNode().Init()
26 + node.UpdateConfig(func(cfg *config.Config) {
27 + // Set a 1 second timeout for retrieval
28 + cfg.Gateway.RetrievalTimeout = config.NewOptionalDuration(1 * time.Second)
29 + })
30 + node.StartDaemon()
31 +
32 + // Add content that can be retrieved quickly
33 + cid := node.IPFSAddStr("test content")
34 +
35 + client := node.GatewayClient()
36 +
37 + // Normal request should succeed (content is local)
38 + resp := client.Get("/ipfs/" + cid)
39 + assert.Equal(t, http.StatusOK, resp.StatusCode)
40 + assert.Equal(t, "test content", resp.Body)
41 +
42 + // Request for non-existent content should timeout
43 + // Using a CID that has no providers (generated with ipfs add -n)
44 + nonExistentCID := "bafkreif6lrhgz3fpiwypdk65qrqiey7svgpggruhbylrgv32l3izkqpsc4"
45 +
46 + // Create a client with longer timeout than the gateway's retrieval timeout
47 + // to ensure we get the gateway's 504 response
48 + clientWithTimeout := &harness.HTTPClient{
49 + Client: &http.Client{
50 + Timeout: 5 * time.Second,
51 + },
52 + BaseURL: client.BaseURL,
53 + }
54 +
55 + resp = clientWithTimeout.Get("/ipfs/" + nonExistentCID)
56 + assert.Equal(t, http.StatusGatewayTimeout, resp.StatusCode, "Expected 504 Gateway Timeout for stuck retrieval")
57 + assert.Contains(t, resp.Body, "Unable to retrieve content within timeout period")
58 + })
59 +
60 + t.Run("MaxConcurrentRequests", func(t *testing.T) {
61 + t.Parallel()
62 +
63 + // Create a node with a low concurrent request limit
64 + node := harness.NewT(t).NewNode().Init()
65 + node.UpdateConfig(func(cfg *config.Config) {
66 + // Allow only 1 concurrent request to make test deterministic
67 + cfg.Gateway.MaxConcurrentRequests = config.NewOptionalInteger(1)
68 + // Set retrieval timeout so blocking requests don't hang forever
69 + cfg.Gateway.RetrievalTimeout = config.NewOptionalDuration(2 * time.Second)
70 + })
71 + node.StartDaemon()
72 +
73 + // Add some content - use a non-existent CID that will block during retrieval
74 + // to ensure we can control timing
75 + blockingCID := "bafkreif6lrhgz3fpiwypdk65qrqiey7svgpggruhbylrgv32l3izkqpsc4"
76 + normalCID := node.IPFSAddStr("test content for concurrent request limiting")
77 +
78 + client := node.GatewayClient()
79 +
80 + // First, verify single request succeeds
81 + resp := client.Get("/ipfs/" + normalCID)
82 + assert.Equal(t, http.StatusOK, resp.StatusCode)
83 +
84 + // Now test deterministic 429 response:
85 + // Start a blocking request that will occupy the single slot,
86 + // then make another request that MUST get 429
87 +
88 + blockingStarted := make(chan bool)
89 + blockingDone := make(chan bool)
90 +
91 + // Start a request that will block (searching for non-existent content)
92 + go func() {
93 + blockingStarted <- true
94 + // This will block until timeout looking for providers
95 + client.Get("/ipfs/" + blockingCID)
96 + blockingDone <- true
97 + }()
98 +
99 + // Wait for blocking request to start and occupy the slot
100 + <-blockingStarted
101 + time.Sleep(1 * time.Second) // Ensure it has acquired the semaphore
102 +
103 + // This request MUST get 429 because the slot is occupied
104 + resp = client.Get("/ipfs/" + normalCID + "?must-get-429=true")
105 + assert.Equal(t, http.StatusTooManyRequests, resp.StatusCode, "Second request must get 429 when slot is occupied")
106 +
107 + // Verify 429 response headers
108 + retryAfter := resp.Headers.Get("Retry-After")
109 + assert.NotEmpty(t, retryAfter, "Retry-After header must be set on 429 response")
110 + assert.Equal(t, "60", retryAfter, "Retry-After must be 60 seconds")
111 +
112 + cacheControl := resp.Headers.Get("Cache-Control")
113 + assert.Equal(t, "no-store", cacheControl, "Cache-Control must be no-store on 429 response")
114 +
115 + assert.Contains(t, resp.Body, "Too many requests", "429 response must contain error message")
116 +
117 + // Clean up: wait for blocking request to timeout (it will timeout due to gateway retrieval timeout)
118 + select {
119 + case <-blockingDone:
120 + // Good, it completed
121 + case <-time.After(10 * time.Second):
122 + // Give it more time if needed
123 + }
124 +
125 + // Wait a bit more to ensure slot is fully released
126 + time.Sleep(1 * time.Second)
127 +
128 + // After blocking request completes, new request should succeed
129 + resp = client.Get("/ipfs/" + normalCID + "?after-limit-cleared=true")
130 + assert.Equal(t, http.StatusOK, resp.StatusCode, "Request must succeed after slot is freed")
131 + })
132 +}
test/dependencies/go.mod
+19 -5
@@ -8,7 +8,7 @@ require (
8 github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd
9 github.com/golangci/golangci-lint v1.64.8
10 github.com/ipfs/go-cidutil v0.1.0
11 - github.com/ipfs/go-log/v2 v2.8.0
11 + github.com/ipfs/go-log/v2 v2.8.1
12 github.com/ipfs/go-test v0.2.2
13 github.com/ipfs/hang-fds v0.1.0
14 github.com/ipfs/iptb v1.4.1
@@ -77,17 +77,20 @@ require (
77 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
78 github.com/denis-tingaikin/go-header v0.5.0 // indirect
79 github.com/dnephin/pflag v1.0.7 // indirect
80 + github.com/dustin/go-humanize v1.0.1 // indirect
81 github.com/ettle/strcase v0.2.0 // indirect
82 github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
83 github.com/fatih/color v1.18.0 // indirect
84 github.com/fatih/structtag v1.2.0 // indirect
85 + github.com/felixge/httpsnoop v1.0.4 // indirect
86 github.com/filecoin-project/go-clock v0.1.0 // indirect
87 github.com/firefart/nonamedreturns v1.0.5 // indirect
88 github.com/flynn/noise v1.1.0 // indirect
89 github.com/francoispqt/gojay v1.2.13 // indirect
90 github.com/fsnotify/fsnotify v1.8.0 // indirect
91 github.com/fzipp/gocyclo v0.6.0 // indirect
90 - github.com/gammazero/deque v1.0.0 // indirect
92 + github.com/gabriel-vasile/mimetype v1.4.9 // indirect
93 + github.com/gammazero/deque v1.1.0 // indirect
94 github.com/getsentry/sentry-go v0.27.0 // indirect
95 github.com/ghostiam/protogetter v0.3.9 // indirect
96 github.com/go-critic/go-critic v0.12.0 // indirect
@@ -131,15 +134,19 @@ require (
134 github.com/huin/goupnp v1.3.0 // indirect
135 github.com/inconshreveable/mousetrap v1.1.0 // indirect
136 github.com/ipfs/bbloom v0.0.4 // indirect
134 - github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e // indirect
137 + github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf // indirect
138 github.com/ipfs/go-bitfield v1.1.0 // indirect
139 github.com/ipfs/go-block-format v0.2.2 // indirect
140 github.com/ipfs/go-cid v0.5.0 // indirect
138 - github.com/ipfs/go-datastore v0.8.2 // indirect
141 + github.com/ipfs/go-datastore v0.8.3 // indirect
142 + github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
143 + github.com/ipfs/go-ipld-cbor v0.2.1 // indirect
144 github.com/ipfs/go-ipld-format v0.6.2 // indirect
145 github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
146 github.com/ipfs/go-metrics-interface v0.3.0 // indirect
147 + github.com/ipfs/go-unixfsnode v1.10.1 // indirect
148 github.com/ipfs/kubo v0.31.0 // indirect
149 + github.com/ipld/go-car/v2 v2.14.3 // indirect
150 github.com/ipld/go-codec-dagpb v1.7.0 // indirect
151 github.com/ipld/go-ipld-prime v0.21.0 // indirect
152 github.com/ipshipyard/p2p-forge v0.6.1 // indirect
@@ -169,6 +176,7 @@ require (
176 github.com/libdns/libdns v1.0.0-beta.1 // indirect
177 github.com/libp2p/go-buffer-pool v0.1.0 // indirect
178 github.com/libp2p/go-cidranger v1.1.0 // indirect
179 + github.com/libp2p/go-doh-resolver v0.5.0 // indirect
180 github.com/libp2p/go-flow-metrics v0.3.0 // indirect
181 github.com/libp2p/go-libp2p v0.43.0 // indirect
182 github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
@@ -212,6 +220,7 @@ require (
220 github.com/olekukonko/tablewriter v0.0.5 // indirect
221 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
222 github.com/pelletier/go-toml/v2 v2.2.3 // indirect
223 + github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
224 github.com/pion/datachannel v1.5.10 // indirect
225 github.com/pion/dtls/v2 v2.2.12 // indirect
226 github.com/pion/dtls/v3 v3.0.6 // indirect
@@ -283,12 +292,15 @@ require (
292 github.com/timonwong/loggercheck v0.10.1 // indirect
293 github.com/tomarrell/wrapcheck/v2 v2.10.0 // indirect
294 github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
295 + github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect
296 github.com/ultraware/funlen v0.2.0 // indirect
297 github.com/ultraware/whitespace v0.2.0 // indirect
298 github.com/urfave/cli v1.22.16 // indirect
299 github.com/uudashr/gocognit v1.2.0 // indirect
300 github.com/uudashr/iface v1.3.1 // indirect
301 github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
302 + github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
303 + github.com/whyrusleeping/cbor-gen v0.3.1 // indirect
304 github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
305 github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
306 github.com/wlynxg/anet v0.0.5 // indirect
@@ -301,6 +313,7 @@ require (
313 go-simpler.org/musttag v0.13.0 // indirect
314 go-simpler.org/sloglint v0.9.0 // indirect
315 go.opentelemetry.io/auto/sdk v1.1.0 // indirect
316 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect
317 go.opentelemetry.io/otel v1.37.0 // indirect
318 go.opentelemetry.io/otel/metric v1.37.0 // indirect
319 go.opentelemetry.io/otel/trace v1.37.0 // indirect
@@ -312,7 +325,7 @@ require (
325 go.uber.org/zap v1.27.0 // indirect
326 go.uber.org/zap/exp v0.3.0 // indirect
327 golang.org/x/crypto v0.41.0 // indirect
315 - golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect
328 + golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect
329 golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect
330 golang.org/x/mod v0.27.0 // indirect
331 golang.org/x/net v0.43.0 // indirect
@@ -322,6 +335,7 @@ require (
335 golang.org/x/text v0.28.0 // indirect
336 golang.org/x/time v0.12.0 // indirect
337 golang.org/x/tools v0.36.0 // indirect
338 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
339 gonum.org/v1/gonum v0.16.0 // indirect
340 google.golang.org/protobuf v1.36.7 // indirect
341 gopkg.in/ini.v1 v1.67.0 // indirect
test/dependencies/go.sum
+54 -10
@@ -155,6 +155,8 @@ github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cn
155 github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
156 github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
157 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
158 +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
159 +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
160 github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q=
161 github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A=
162 github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A=
@@ -163,6 +165,8 @@ github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
165 github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
166 github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
167 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
168 +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
169 +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
170 github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
171 github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
172 github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA=
@@ -179,10 +183,12 @@ github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/
183 github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
184 github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
185 github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
186 +github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
187 +github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
188 github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
189 github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
184 -github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
185 -github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
190 +github.com/gammazero/deque v1.1.0 h1:OyiyReBbnEG2PP0Bnv1AASLIYvyKqIFN5xfl1t8oGLo=
191 +github.com/gammazero/deque v1.1.0/go.mod h1:JVrR+Bj1NMQbPnYclvDlvSX0nVGReLrQZ0aUMuWLctg=
192 github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
193 github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
194 github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
@@ -326,8 +332,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
332 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
333 github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
334 github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
329 -github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e h1:A2zSzpyrerCtdN69iDxt9S9z27cD1R4Uw3l1ctLTxX0=
330 -github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e/go.mod h1:ehi6uM9NBRkAaB7Q7u2kZgGArXPfbNRe0X/CYTqUwq8=
335 +github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf h1:W3iHiK3PaaayhoQQUgh3zvz7nbVfi/srJSgWi7HyM9s=
336 +github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
337 github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
338 github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
339 github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
@@ -336,36 +342,52 @@ github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
342 github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk=
343 github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
344 github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
339 -github.com/ipfs/go-datastore v0.8.2 h1:Jy3wjqQR6sg/LhyY0NIePZC3Vux19nLtg7dx0TVqr6U=
340 -github.com/ipfs/go-datastore v0.8.2/go.mod h1:W+pI1NsUsz3tcsAACMtfC+IZdnQTnC/7VfPoJBQuts0=
345 +github.com/ipfs/go-datastore v0.8.3 h1:z391GsQyGKUIUof2tPoaZVeDknbt7fNHs6Gqjcw5Jo4=
346 +github.com/ipfs/go-datastore v0.8.3/go.mod h1:raxQ/CreIy9L6MxT71ItfMX12/ASN6EhXJoUFjICQ2M=
347 github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
348 github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
349 +github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
350 +github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE=
351 github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ=
352 github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
353 +github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw=
354 +github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo=
355 github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
356 github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
357 +github.com/ipfs/go-ipfs-redirects-file v0.1.2 h1:QCK7VtL91FH17KROVVy5KrzDx2hu68QvB2FTWk08ZQk=
358 +github.com/ipfs/go-ipfs-redirects-file v0.1.2/go.mod h1:yIiTlLcDEM/8lS6T3FlCEXZktPPqSOyuY6dEzVqw7Fw=
359 +github.com/ipfs/go-ipld-cbor v0.2.1 h1:H05yEJbK/hxg0uf2AJhyerBDbjOuHX4yi+1U/ogRa7E=
360 +github.com/ipfs/go-ipld-cbor v0.2.1/go.mod h1:x9Zbeq8CoE5R2WicYgBMcr/9mnkQ0lHddYWJP2sMV3A=
361 github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
362 github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
363 github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
364 github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
351 -github.com/ipfs/go-log/v2 v2.8.0 h1:SptNTPJQV3s5EF4FdrTu/yVdOKfGbDgn1EBZx4til2o=
352 -github.com/ipfs/go-log/v2 v2.8.0/go.mod h1:2LEEhdv8BGubPeSFTyzbqhCqrwqxCbuTNTLWqgNAipo=
365 +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
366 +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
367 +github.com/ipfs/go-log/v2 v2.8.1 h1:Y/X36z7ASoLJaYIJAL4xITXgwf7RVeqb1+/25aq/Xk0=
368 +github.com/ipfs/go-log/v2 v2.8.1/go.mod h1:NyhTBcZmh2Y55eWVjOeKf8M7e4pnJYM3yDZNxQBWEEY=
369 github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
370 github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
371 github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
372 github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
373 github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
374 github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
375 +github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM=
376 +github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY=
377 github.com/ipfs/hang-fds v0.1.0 h1:deBiFlWHsVGzJ0ZMaqscEqRM1r2O1rFZ59UiQXb1Xko=
378 github.com/ipfs/hang-fds v0.1.0/go.mod h1:29VLWOn3ftAgNNgXg/al7b11UzuQ+w7AwtCGcTaWkbM=
379 github.com/ipfs/iptb v1.4.1 h1:faXd3TKGPswbHyZecqqg6UfbES7RDjTKQb+6VFPKDUo=
380 github.com/ipfs/iptb v1.4.1/go.mod h1:nTsBMtVYFEu0FjC5DgrErnABm3OG9ruXkFXGJoTV5OA=
381 github.com/ipfs/iptb-plugins v0.5.1 h1:11PNTNEt2+SFxjUcO5qpyCTXqDj6T8Tx9pU/G4ytCIQ=
382 github.com/ipfs/iptb-plugins v0.5.1/go.mod h1:mscJAjRnu4g16QK6oUBn9RGpcp8ueJmLfmPxIG/At78=
383 +github.com/ipld/go-car/v2 v2.14.3 h1:1Mhl82/ny8MVP+w1M4LXbj4j99oK3gnuZG2GmG1IhC8=
384 +github.com/ipld/go-car/v2 v2.14.3/go.mod h1:/vpSvPngOX8UnvmdFJ3o/mDgXa9LuyXsn7wxOzHDYQE=
385 github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0=
386 github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
387 github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
388 github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
389 +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
390 +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
391 github.com/ipshipyard/p2p-forge v0.6.1 h1:987/hUC1YxI56CcMX6iTB+9BLjFV0d2SJnig9Z1pf8A=
392 github.com/ipshipyard/p2p-forge v0.6.1/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
393 github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
@@ -432,6 +454,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6
454 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
455 github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
456 github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
457 +github.com/libp2p/go-doh-resolver v0.5.0 h1:4h7plVVW+XTS+oUBw2+8KfoM1jF6w8XmO7+skhePFdE=
458 +github.com/libp2p/go-doh-resolver v0.5.0/go.mod h1:aPDxfiD2hNURgd13+hfo29z9IC22fv30ee5iM31RzxU=
459 github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
460 github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
461 github.com/libp2p/go-libp2p v0.43.0 h1:b2bg2cRNmY4HpLK8VHYQXLX2d3iND95OjodLFymvqXU=
@@ -549,6 +573,8 @@ github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus
573 github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
574 github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
575 github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
576 +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
577 +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
578 github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
579 github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
580 github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
@@ -561,6 +587,8 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D
587 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
588 github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
589 github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
590 +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk=
591 +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw=
592 github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
593 github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
594 github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
@@ -771,6 +799,8 @@ github.com/tomarrell/wrapcheck/v2 v2.10.0 h1:SzRCryzy4IrAH7bVGG4cK40tNUhmVmMDuJu
799 github.com/tomarrell/wrapcheck/v2 v2.10.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo=
800 github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw=
801 github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
802 +github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb h1:Ywfo8sUltxogBpFuMOFRrrSifO788kAFxmvVw31PtQQ=
803 +github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb/go.mod h1:ikPs9bRWicNw3S7XpJ8sK/smGwU9WcSVU3dy9qahYBM=
804 github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI=
805 github.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA=
806 github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g=
@@ -790,6 +820,10 @@ github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSD
820 github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
821 github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4=
822 github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM=
823 +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0=
824 +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ=
825 +github.com/whyrusleeping/cbor-gen v0.3.1 h1:82ioxmhEYut7LBVGhGq8xoRkXPLElVuh5mV67AFfdv0=
826 +github.com/whyrusleeping/cbor-gen v0.3.1/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so=
827 github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
828 github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
829 github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
@@ -829,12 +863,20 @@ go-simpler.org/sloglint v0.9.0/go.mod h1:G/OrAF6uxj48sHahCzrbarVMptL2kjWTaUeC8+f
863 go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
864 go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
865 go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
866 +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
867 +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
868 go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
869 go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
870 go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
871 go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
872 +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
873 +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
874 +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
875 +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
876 go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
877 go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
878 +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
879 +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
880 go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
881 go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
882 go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
@@ -870,8 +912,8 @@ golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1m
912 golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
913 golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
914 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
873 -golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
874 -golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
915 +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
916 +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
917 golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
918 golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
919 golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac h1:TSSpLIG4v+p0rPv1pNOQtl1I8knsO4S9trOxNMOLVP4=
@@ -1042,6 +1084,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
1084 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
1085 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
1086 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
1087 +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
1088 +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
1089 gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
1090 gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
1091 google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
test/sharness/t0119-prometheus-data/prometheus_metrics
+1
@@ -157,6 +157,7 @@ ipfs_fsrepo_datastore_sync_latency_seconds_bucket
157 ipfs_fsrepo_datastore_sync_latency_seconds_count
158 ipfs_fsrepo_datastore_sync_latency_seconds_sum
159 ipfs_fsrepo_datastore_sync_total
160 +ipfs_http_gw_concurrent_requests
161 ipfs_http_request_duration_seconds
162 ipfs_http_request_duration_seconds_count
163 ipfs_http_request_duration_seconds_sum