Title: [BUG] Intermittent EOF errors calling S3 ListObjects from GitHub Actions due to Go HTTP keep-alive / HTTP2 interaction · Issue #599 · stackql/stackql · GitHub
Open Graph Title: [BUG] Intermittent EOF errors calling S3 ListObjects from GitHub Actions due to Go HTTP keep-alive / HTTP2 interaction · Issue #599 · stackql/stackql
X Title: [BUG] Intermittent EOF errors calling S3 ListObjects from GitHub Actions due to Go HTTP keep-alive / HTTP2 interaction · Issue #599 · stackql/stackql
Description: SUMMARY StackQL intermittently fails when listing S3 bucket objects only in GitHub Actions, while the same credentials and queries work reliably from a local laptop. Example failure: Get "https://s3.ap-southeast-2.amazonaws.com/stackql-t...
Open Graph Description: SUMMARY StackQL intermittently fails when listing S3 bucket objects only in GitHub Actions, while the same credentials and queries work reliably from a local laptop. Example failure: Get "https://s...
X Description: SUMMARY StackQL intermittently fails when listing S3 bucket objects only in GitHub Actions, while the same credentials and queries work reliably from a local laptop. Example failure: Get "http...
Opengraph URL: https://github.com/stackql/stackql/issues/599
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[BUG] Intermittent EOF errors calling S3 ListObjects from GitHub Actions due to Go HTTP keep-alive / HTTP2 interaction","articleBody":"SUMMARY\n\nStackQL intermittently fails when listing S3 bucket objects only in GitHub Actions, while the same credentials and queries work reliably from a local laptop.\n\nExample failure:\n\nGet \"https://s3.ap-southeast-2.amazonaws.com/stackql-trial-bucket-02?max-keys=1000\n\": EOF\n\nThis is not an AWS service defect and not a credentials issue.\nThe root cause is Go’s default HTTP client connection reuse behavior (keep-alive / HTTP2) interacting poorly with the GitHub Actions network environment when using raw HTTP + SigV4 signing (no AWS SDK).\n\nENVIRONMENT\n\nStackQL using any-sdk HTTP client\n\nAWS SigV4 signing only (no AWS SDK HTTP client usage)\n\nSame AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY locally and in GitHub Actions\n\nRegion explicitly provided to SigV4 signer\n\nFails only in GitHub Actions\n\nError manifests as immediate EOF while reading response\n\nWHY THIS HAPPENS\n\nGitHub Actions runners aggressively reuse TCP connections\n\nNAT, proxying, and idle connection reaping are common\n\nServer-side connection close is legal and frequent\n\nGo net/http default transport enables:\n\nHTTP keep-alives\n\nHTTP/2\n\nIdle connection reuse\n\nA reused but half-dead connection results in:\n\nConnection closed by server\n\nClient receives EOF before response body\n\nAWS S3 is behaving within specification\n\nEarly connection close is permitted\n\nThis is a client-side transport robustness issue\n\nThis does not reproduce locally\n\nLocal networks are more tolerant of connection reuse\n\nCI networking is not\n\nRetrying is not a viable solution\n\nStackQL fans out across tens or hundreds of endpoints\n\nRetrying on EOF causes request amplification and latency explosion\n\nThis is a transport correctness problem, not a transient API failure\n\nEVIDENCE\n\nSame credentials, same query, same endpoint succeed locally\n\nFailures occur only in GitHub Actions\n\nDisabling HTTP/2 via GODEBUG reduces failures\n\nEliminating connection reuse eliminates failures entirely\n\nCORRECT FIX (VENDOR-AGNOSTIC)\n\nExplicitly control the Go HTTP transport used by any-sdk / StackQL and disable connection reuse for AWS endpoints.\n\nProposed transport configuration:\n\ntransport := \u0026http.Transport{\n DisableKeepAlives: true,\n ForceAttemptHTTP2: false,\n}\n\nclient := \u0026http.Client{\n Transport: transport,\n}\n\n\nEffects:\n\nOne request per TCP connection\n\nNo reuse of half-closed sockets\n\nDeterministic behavior in CI\n\nNo AWS SDK dependency\n\nNo retries required\n\nSCOPE\n\nApply to AWS providers (or make configurable per provider)\n\nDoes not require AWS environment variables\n\nPreserves StackQL vendor-independence\n\nAcceptable performance tradeoff for control-plane style queries\n\nNON-SOLUTIONS (INTENTIONALLY AVOIDED)\n\nAdding retries on EOF\n\nIntroducing AWS SDK HTTP client\n\nRequiring AWS_REGION / AWS_DEFAULT_REGION\n\nCI-specific bash hacks\n\nTreating this as an AWS outage or service bug\n\nACTION ITEMS\n\nAdd explicit HTTP transport ownership in any-sdk\n\nDisable keep-alives and HTTP/2 for AWS providers\n\nDocument rationale (CI + NAT behavior)\n\nAdd CI regression coverage if possible","author":{"url":"https://github.com/general-kroll-4-life","@type":"Person","name":"general-kroll-4-life"},"datePublished":"2025-12-21T23:45:59.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/599/stackql/issues/599"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:ef8eec21-efa5-9b69-633e-0e3eeb0002ef |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 97BA:8709C:104A1F:164208:6A4D54C9 |
| html-safe-nonce | aae7737739776df4ca855d1d8e7f8dddf420e38b7050b822503d879d12cace6b |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5N0JBOjg3MDlDOjEwNEExRjoxNjQyMDg6NkE0RDU0QzkiLCJ2aXNpdG9yX2lkIjoiNzE2OTcxMTU5OTAzMjAzMDQwOSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 78229119f90079e56997cfbe459618147a4b87ce1318842e8a34ec2a40b46f60 |
| hovercard-subject-tag | issue:3751766729 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/stackql/stackql/599/issue_layout |
| twitter:image | https://opengraph.githubassets.com/14f0d079db63537d301c819b9bc21fca864ca98885a3216398a103b850410363/stackql/stackql/issues/599 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/14f0d079db63537d301c819b9bc21fca864ca98885a3216398a103b850410363/stackql/stackql/issues/599 |
| og:image:alt | SUMMARY StackQL intermittently fails when listing S3 bucket objects only in GitHub Actions, while the same credentials and queries work reliably from a local laptop. Example failure: Get "https://s... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | general-kroll-4-life |
| hostname | github.com |
| expected-hostname | github.com |
| None | 92571a8944142227b7e19cd10918b1ddd06e5066c1ad5bc7e4769cf6140a87e6 |
| turbo-cache-control | no-preview |
| go-import | github.com/stackql/stackql git https://github.com/stackql/stackql.git |
| octolytics-dimension-user_id | 95105302 |
| octolytics-dimension-user_login | stackql |
| octolytics-dimension-repository_id | 443987542 |
| octolytics-dimension-repository_nwo | stackql/stackql |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 443987542 |
| octolytics-dimension-repository_network_root_nwo | stackql/stackql |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 56fc8347865a14e2ec811533d68f929cf4e0ec19 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width