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