Skip to content

fserrors: make http2 "server sent GOAWAY" a retriable error - fixes #9664 - #9693

Merged
ncw merged 1 commit into
rclone:masterfrom
hsdfat:fserrors-retry-http2-goaway
Jul 29, 2026
Merged

ncw merged 1 commit into
rclone:masterfrom
hsdfat:fserrors-retry-http2-goaway

Conversation

@hsdfat

@hsdfat hsdfat commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

When an HTTP/2 server retires a connection with GOAWAY after it has already sent successful response headers, Go's http2 transport fails the read of the response body with

http2: server sent GOAWAY and closed the connection; LastStreamID=..., ErrCode=NO_ERROR, debug=""

This was not recognised as a retriable networking error, so a transient connection retirement aborted the whole command instead of consuming a low level retry. It was reported against a large S3 check, where an interrupted ListObjectsV2 page made rclone report destination objects as missing and exit unsuccessfully.

The concrete error type is unexported by net/http, so match on the message as we already do for the other http2 transport errors.

What does this change do?

Linked issue

Fixes #9664

For new or changed backends

Checklist

  • This change is trivial OR it has been discussed and agreed in the linked issue.
  • I have read the contribution guidelines.
  • (If I used AI tools to help write this code) I have read and understood the AI-assisted contributions guidance, and I have tested and take ownership of this change myself.
  • I have added tests for all changes in this PR if appropriate.
  • I have added documentation for the changes if appropriate.
  • All commit messages are in house style.
  • (Backend changes only) test_all passes for this backend and if submitting a new backend can provide a test account for the integration tester - see CONTRIBUTING.md.
  • This Pull Request is ready for review.

…clone#9664

When an HTTP/2 server retires a connection with GOAWAY after it has
already sent successful response headers, Go's http2 transport fails the
read of the response body with

    http2: server sent GOAWAY and closed the connection; LastStreamID=..., ErrCode=NO_ERROR, debug=""

This was not recognised as a retriable networking error, so a transient
connection retirement aborted the whole command instead of consuming a
low level retry. It was reported against a large S3 check, where an
interrupted ListObjectsV2 page made rclone report destination objects as
missing and exit unsuccessfully.

The concrete error type is unexported by net/http, so match on the
message as we already do for the other http2 transport errors.
@hsdfat
hsdfat requested a review from ncw as a code owner July 29, 2026 01:55

@ncw ncw left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It is annoying that the error isn't exported properly but I shall merge this as it will fix the problem!

Thank you :-)

@ncw
ncw merged commit ab93058 into rclone:master Jul 29, 2026
9 checks passed
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.

S3: retry HTTP/2 GOAWAY while decoding successful ListObjectsV2 responses

2 participants