Skip to content

Fix fd exhaustion from probe transport leak#297

Merged
simonsmallchua merged 13 commits into
mainfrom
fix/fd-exhaustion-under-load
Apr 5, 2026
Merged

Fix fd exhaustion from probe transport leak#297
simonsmallchua merged 13 commits into
mainfrom
fix/fd-exhaustion-under-load

Conversation

@simonsmallchua
Copy link
Copy Markdown
Contributor

@simonsmallchua simonsmallchua commented Apr 5, 2026

Summary

  • Root cause: CheckCacheStatus() created a new http.Transport + http.Client on every call (up to 3× per URL × thousands of tasks). Each transport held idle connections open indefinitely, exhausting all 10,240 file descriptors under sustained load.
  • Primary fix: Shared probeClient on the Crawler struct, initialised once with proper connection limits (MaxIdleConns: 20, MaxConnsPerHost: 10, IdleConnTimeout: 30s).
  • Added global MaxIdleConns: 150 cap to main crawler and CreateHTTPClient transports.
  • Reduced production DB pool from 70 → 45 via env vars (queue semaphore caps at 40 + 5 reserved).
  • Added fd pressure detection in ensurePoolCapacity — triggers ErrPoolSaturated at >90% fd usage so existing retry/backoff handles it gracefully instead of cryptic DNS errors.
  • Added fd observability gauges for Grafana (bee.process.fd.current, .limit, .pressure).
  • Raised container fd soft limit to hard limit ceiling in Dockerfile as safety net.

Context

Load test over ~24h generated 5.1K pgconn.ConnectError events in Sentry (socket: too many open files). Supabase connections only peaked at 54/90 (60%) — the DB wasn't the bottleneck. The Fly VM's 10,240 fd limit was exhausted by leaked HTTP transports from probe calls.

Test plan

  • go build ./... passes
  • go test ./internal/crawler/... passes
  • go test ./internal/db/... passes
  • go test ./internal/util/... passes
  • gofmt clean on all changed files
  • Deploy and verify: fly ssh consolels /proc/$(pidof main)/fd | wc -l during load
  • Re-run load test (~23K requests) and confirm zero "too many open files" in Sentry
  • Check Grafana for bee.process.fd.* gauges

Summary by CodeRabbit

  • Bug Fixes

    • Prevented file-descriptor exhaustion under sustained load by reusing HTTP connections and adding DB pool backpressure that early-rejects when FD pressure is high.
  • New Features

    • Added real-time gauges for FD usage, FD limit and FD pressure for observability.
  • Chores

    • Tweaked container startup to attempt raising FD soft limits and added environment variables to tune DB pool sizes.

@supabase
Copy link
Copy Markdown

supabase Bot commented Apr 5, 2026

Updates to Preview Branch (fix/fd-exhaustion-under-load) ↗︎

Deployments Status Updated
Database Sun, 05 Apr 2026 11:50:39 UTC
Services Sun, 05 Apr 2026 11:50:39 UTC
APIs Sun, 05 Apr 2026 11:50:39 UTC

Tasks are run on every commit but only new migration files are pushed.
Close and reopen this PR if you want to apply changes from existing seed or migration files.

Tasks Status Updated
Configurations Sun, 05 Apr 2026 11:50:41 UTC
Migrations Sun, 05 Apr 2026 11:50:43 UTC
Seeding Sun, 05 Apr 2026 11:50:45 UTC
Edge Functions Sun, 05 Apr 2026 11:50:45 UTC

View logs for this Workflow Run ↗︎.
Learn more about Supabase for Git ↗︎.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 5, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: a1cb9f7d-7a78-473a-a28f-1bc0eb6a443f

📥 Commits

Reviewing files that changed from the base of the PR and between 9e63412 and 8c15654.

📒 Files selected for processing (1)
  • Dockerfile

📝 Walkthrough

Walkthrough

This change addresses file-descriptor exhaustion by replacing per-request HTTP client creation with a shared, reusable client in the crawler, adding FD usage monitoring and pressure calculation, gating DB pool acquisitions under FD pressure, adding DB pool env vars, and attempting to raise the container FD soft limit at startup.

Changes

Cohort / File(s) Summary
Configuration
fly.toml, Dockerfile
Added DB_MAX_OPEN_CONNS=45 and DB_MAX_IDLE_CONNS=15 env vars. Updated container CMD to run sh -c that tries ulimit -n 65536, falls back to hard limit on failure, echoes the soft limit, then exec ./main.
HTTP client reuse
internal/crawler/crawler.go
Replaced per-call http.Transport/http.Client creation in CheckCacheStatus() with a shared probeClient on Crawler; set MaxIdleConns: 150 on main/probe transports and use ssrfSafeDialContext() when applicable.
FD monitoring & metrics
internal/util/fdlimit.go, internal/observability/observability.go
Added /proc-based FD utilities: FDUsage(), FDPressureFrom(), FDPressure() with memoised soft-limit parsing. Added gauges bee.process.fd.current, bee.process.fd.limit, bee.process.fd.pressure and RecordFDStats(ctx, current, limit, pressure).
DB pool saturation gate
internal/db/queue.go
ensurePoolCapacity now reads FD usage after acquiring a semaphore slot, records gauges via observability.RecordFDStats, and returns ErrPoolSaturated (releasing slot) when fdPressure >= 0.90; skips check if FD read fails.
Changelog
CHANGELOG.md
Changed ## [Unreleased] to ## [Unreleased:patch], added ### Fixed entries describing FD exhaustion fixes and DB pool adjustments, and ### Added entries for new FD gauges.
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Fix fd exhaustion from probe transport leak' directly and clearly describes the primary change: addressing file-descriptor exhaustion caused by HTTP transport leaks in the probe client.
Docstring Coverage ✅ Passed Docstring coverage is 88.89% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 5, 2026

Release Versions

App patch: v0.31.3v0.31.4

Changelog

Fixed

  • Fix file descriptor exhaustion under load caused by per-request HTTP transport
    leak in CheckCacheStatus() — each probe call created a new http.Transport
    that held idle connections open indefinitely, exhausting 10240 fds during
    sustained crawling
  • Add shared probeClient to Crawler struct, reused across all cache probe
    requests with proper idle connection limits
  • Add global MaxIdleConns cap (150) to main crawler and CreateHTTPClient
    transports to prevent unbounded idle socket accumulation across hosts
  • Reduce production DB pool from 70 → 45 open connections via env vars to match
    actual queue semaphore usage (40 concurrent ops + 5 reserved)
  • Add file descriptor pressure detection in ensurePoolCapacity — rejects DB
    operations early with ErrPoolSaturated (triggering existing retry/backoff)
    when fd usage exceeds 90%, instead of failing with cryptic DNS errors
  • Raise container fd soft limit to hard limit ceiling in Dockerfile as safety
    net

Added

  • File descriptor observability gauges (bee.process.fd.current,
    bee.process.fd.limit, bee.process.fd.pressure) for Grafana monitoring

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 5, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-297.fly.dev
Dashboard: https://hover-pr-297.fly.dev/dashboard

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 5, 2026

Codecov Report

❌ Patch coverage is 15.73034% with 75 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
internal/util/fdlimit.go 0.00% 37 Missing ⚠️
internal/observability/observability.go 0.00% 25 Missing ⚠️
internal/db/queue.go 0.00% 12 Missing ⚠️
internal/crawler/crawler.go 93.33% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 5, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-297.fly.dev
Dashboard: https://hover-pr-297.fly.dev/dashboard

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@CHANGELOG.md`:
- Around line 29-51: Run Prettier on the modified changelog hunk to fix CI
formatting errors: reformat the "Unreleased:patch" section (the headings and
bullet list items shown) using the project's Prettier config (e.g., run prettier
--write or your editor integration) so the Markdown spacing/line breaks and list
wrapping match the repo's formatting rules before merging.

In `@internal/crawler/crawler.go`:
- Around line 413-435: The probe HTTP client is using probeTransport directly so
HEAD cache-status probes skip the AIA chain-repair layer; wrap the probe
transport with the same AIA transport used by the main client (use
newAIATransport) before assigning it to Crawler.probeClient so probes use the
aia layer (i.e., pass probeTransport and the existing aiaRT into newAIATransport
and set that as the probe client's Transport in the Crawler constructor).

In `@internal/util/fdlimit.go`:
- Around line 3-7: The parser that reads the "Max open files" line currently
calls strconv.Atoi and silently leaves limit==0 on parse failure; change that
parsing logic to return a non-nil error when strconv.Atoi fails (do not treat 0
as success), and propagate that error back to callers so they can explicitly
disable FD-pressure guards/gauges; specifically update the code that locates the
"Max open files" line and the strconv.Atoi invocation to check and return the
parse error, and update any callers that assume a nil error on unparsable input
to handle the error path instead.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: da87cba9-4409-4d0a-97ad-91fd2724ef61

📥 Commits

Reviewing files that changed from the base of the PR and between a38d7cd and 2916e92.

📒 Files selected for processing (7)
  • CHANGELOG.md
  • Dockerfile
  • fly.toml
  • internal/crawler/crawler.go
  • internal/db/queue.go
  • internal/observability/observability.go
  • internal/util/fdlimit.go

Comment thread CHANGELOG.md
Comment on lines +29 to +51
## [Unreleased:patch]

### Fixed

- Fix file descriptor exhaustion under load caused by per-request HTTP transport
leak in `CheckCacheStatus()` — each probe call created a new `http.Transport`
that held idle connections open indefinitely, exhausting 10240 fds during
sustained crawling
- Add shared `probeClient` to `Crawler` struct, reused across all cache probe
requests with proper idle connection limits
- Add global `MaxIdleConns` cap (150) to main crawler and `CreateHTTPClient`
transports to prevent unbounded idle socket accumulation across hosts
- Reduce production DB pool from 70 → 45 open connections via env vars to match
actual queue semaphore usage (40 concurrent ops + 5 reserved)
- Add file descriptor pressure detection in `ensurePoolCapacity` — rejects DB
operations early with `ErrPoolSaturated` (triggering existing retry/backoff)
when fd usage exceeds 90%, instead of failing with cryptic DNS errors
- Raise container fd soft limit to hard limit ceiling in Dockerfile as safety net

### Added

- File descriptor observability gauges (`bee.process.fd.current`,
`bee.process.fd.limit`, `bee.process.fd.pressure`) for Grafana monitoring
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Run Prettier on this changelog hunk before merge.

CI is already reporting a Prettier formatting warning, and this is the only touched Markdown file in the patch.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CHANGELOG.md` around lines 29 - 51, Run Prettier on the modified changelog
hunk to fix CI formatting errors: reformat the "Unreleased:patch" section (the
headings and bullet list items shown) using the project's Prettier config (e.g.,
run prettier --write or your editor integration) so the Markdown spacing/line
breaks and list wrapping match the repo's formatting rules before merging.

Comment thread internal/crawler/crawler.go
Comment thread internal/util/fdlimit.go
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
internal/crawler/crawler.go (1)

363-367: 🧹 Nitpick | 🔵 Trivial

Extract transport limits into shared constants/config to prevent drift.

MaxIdleConns, IdleConnTimeout, and TLS timeout values are now tuned in multiple places. Centralising these values will reduce future config skew between New and CreateHTTPClient.

♻️ Proposed refactor
+const (
+	mainMaxIdleConns        = 150
+	mainIdleConnTimeout     = 120 * time.Second
+	probeMaxIdleConns       = 20
+	probeIdleConnTimeout    = 30 * time.Second
+	defaultTLSHandshakeTime = 10 * time.Second
+)
...
 	baseTransport := &http.Transport{
-		MaxIdleConns:        150, // Global cap — prevents idle socket accumulation across hosts
+		MaxIdleConns:        mainMaxIdleConns, // Global cap — prevents idle socket accumulation across hosts
 		MaxIdleConnsPerHost: 25,
 		MaxConnsPerHost:     50,
-		IdleConnTimeout:     120 * time.Second,
-		TLSHandshakeTimeout: 10 * time.Second,
+		IdleConnTimeout:     mainIdleConnTimeout,
+		TLSHandshakeTimeout: defaultTLSHandshakeTime,
...
 	probeTransport := &http.Transport{
-		MaxIdleConns:        20,
+		MaxIdleConns:        probeMaxIdleConns,
 		MaxIdleConnsPerHost: 5,
 		MaxConnsPerHost:     10,
-		IdleConnTimeout:     30 * time.Second,
-		TLSHandshakeTimeout: 10 * time.Second,
+		IdleConnTimeout:     probeIdleConnTimeout,
+		TLSHandshakeTimeout: defaultTLSHandshakeTime,
 	}
...
 	transport := &http.Transport{
-		MaxIdleConns:        150, // Global cap — prevents idle socket accumulation across hosts
+		MaxIdleConns:        mainMaxIdleConns, // Global cap — prevents idle socket accumulation across hosts
 		MaxIdleConnsPerHost: 25,
 		MaxConnsPerHost:     50,
-		IdleConnTimeout:     120 * time.Second,
-		TLSHandshakeTimeout: 10 * time.Second,
+		IdleConnTimeout:     mainIdleConnTimeout,
+		TLSHandshakeTimeout: defaultTLSHandshakeTime,

Also applies to: 416-420, 1070-1075

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/crawler/crawler.go` around lines 363 - 367, Extract the repeated
transport tuning values into package-level shared constants (e.g.,
DefaultMaxIdleConns, DefaultMaxIdleConnsPerHost, DefaultMaxConnsPerHost,
DefaultIdleConnTimeout, DefaultTLSHandshakeTimeout) or a small config struct in
the crawler package, then replace the hard-coded literals used in New (the
transport initialization block) and CreateHTTPClient with those constants/config
fields so both functions read the same source of truth; update any other places
referenced in the review (the other transport init sites) to use the same
constants/config to avoid drift and keep behavior identical across New and
CreateHTTPClient.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@internal/util/fdlimit.go`:
- Line 37: The error string returned in the function that parses
/proc/self/limits (the return statement returning current, 0, fmt.Errorf("Max
open files line not found in /proc/self/limits")) starts with an uppercase
letter and fails staticcheck ST1005; change that fmt.Errorf message to start
with a lowercase letter (e.g., "max open files line not found in
/proc/self/limits") so the error string conforms to the lint rule while keeping
the same contextual text and location in the function that reads/parses open
file limits.

---

Outside diff comments:
In `@internal/crawler/crawler.go`:
- Around line 363-367: Extract the repeated transport tuning values into
package-level shared constants (e.g., DefaultMaxIdleConns,
DefaultMaxIdleConnsPerHost, DefaultMaxConnsPerHost, DefaultIdleConnTimeout,
DefaultTLSHandshakeTimeout) or a small config struct in the crawler package,
then replace the hard-coded literals used in New (the transport initialization
block) and CreateHTTPClient with those constants/config fields so both functions
read the same source of truth; update any other places referenced in the review
(the other transport init sites) to use the same constants/config to avoid drift
and keep behavior identical across New and CreateHTTPClient.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1a3e64b0-5a9a-42b8-ac1a-555af4691c93

📥 Commits

Reviewing files that changed from the base of the PR and between 9c65505 and 43f0816.

📒 Files selected for processing (2)
  • internal/crawler/crawler.go
  • internal/util/fdlimit.go

Comment thread internal/util/fdlimit.go Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@internal/util/fdlimit.go`:
- Around line 42-48: FDPressure currently computes fail-open semantics itself
but other code (internal/db/queue.go) recomputes pressure inline causing drift;
add a shared helper function FDPressureFrom(current, limit) that implements the
canonical logic (return 0 when limit <= 0 or on error-equivalent inputs,
otherwise current/limit as float64), change FDPressure() to call
FDPressureFrom(FDUsage() results) and update the inline pressure computation in
internal/db/queue.go to call FDPressureFrom instead so both places share
identical edge-case handling.
- Around line 19-37: The code currently re-reads and reparses /proc/self/limits
on every FDUsage() call; add a concurrency-safe cache for the parsed soft FD
limit so we only parse once. Introduce a package-level cachedSoftLimit int (and
a sync.Once or atomic flag) and move the /proc/self/limits parsing logic into an
init-once helper (e.g., populateCachedSoftLimit or getCachedSoftLimit) that
stores the parsed soft limit into cachedSoftLimit; then have FDUsage() call that
helper and return the cached soft limit on subsequent calls. Make sure the
caching is safe for concurrent callers and that errors during the first parse
are handled and propagated appropriately.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 32274ec3-f629-458f-b472-a7c6b91c0c91

📥 Commits

Reviewing files that changed from the base of the PR and between 43f0816 and 5b468ca.

📒 Files selected for processing (1)
  • internal/util/fdlimit.go

Comment thread internal/util/fdlimit.go Outdated
Comment thread internal/util/fdlimit.go
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 5, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-297.fly.dev
Dashboard: https://hover-pr-297.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 5, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-297.fly.dev
Dashboard: https://hover-pr-297.fly.dev/dashboard

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@internal/db/queue.go`:
- Around line 769-770: Replace the magic literal 0.90 used in the fd pressure
check with a named constant (e.g., fdPressureThreshold or maxFDPressure)
declared in the same package const block; update the condition that uses
fdPressure (the line calling log.Warn()) to compare against this constant, add a
short comment documenting the threshold purpose, and search for other
occurrences of 0.90 related to fd pressure to reuse the constant so tuning is
centralized.
🪄 Autofix (Beta)

✅ Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: a46d9412-304a-4432-b6f9-edc0c53da17f

📥 Commits

Reviewing files that changed from the base of the PR and between 5b468ca and 42fcec2.

📒 Files selected for processing (2)
  • internal/db/queue.go
  • internal/util/fdlimit.go

Comment thread internal/db/queue.go Outdated
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 5, 2026

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 1 file(s) based on 1 unresolved review comment.

Files modified:

  • internal/db/queue.go

Commit: 6e39773b529375e38b323e6f7214421316731e81

The changes have been pushed to the fix/fd-exhaustion-under-load branch.

Time taken: 2m 30s

Fixed 1 file(s) based on 1 unresolved review comment.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 5, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-297.fly.dev
Dashboard: https://hover-pr-297.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 5, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-297.fly.dev
Dashboard: https://hover-pr-297.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 5, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-297.fly.dev
Dashboard: https://hover-pr-297.fly.dev/dashboard

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Dockerfile`:
- Line 58: The startup currently runs ulimit in the Dockerfile CMD with stderr
discarded, so there's no visibility whether the file descriptor limit was raised
and internal/util/fdlimit.go caches the soft limit via sync.Once; either add an
observable step to the startup (e.g., change the CMD to emit the resulting
ulimit -n value or an explicit echo/log of the ulimit outcome before exec
./main) or add a short log in Go at startup (in main.main or an init) that reads
and logs the cached FD limit from the code in internal/util/fdlimit.go (the
function that retrieves/caches the soft limit) so operators can see the
effective FD limit at boot.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: fa2716ef-0801-4c95-92cc-2500cf88d1ac

📥 Commits

Reviewing files that changed from the base of the PR and between 5b468ca and 9e63412.

📒 Files selected for processing (3)
  • Dockerfile
  • internal/db/queue.go
  • internal/util/fdlimit.go

Comment thread Dockerfile Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 5, 2026

🐝 Review App Deployed

Homepage: https://hover-pr-297.fly.dev
Dashboard: https://hover-pr-297.fly.dev/dashboard

@simonsmallchua simonsmallchua merged commit 63590a0 into main Apr 5, 2026
11 checks passed
@simonsmallchua simonsmallchua deleted the fix/fd-exhaustion-under-load branch April 5, 2026 11:56
simonsmallchua added a commit that referenced this pull request Apr 5, 2026
Fix fd exhaustion from probe transport leak
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant