Skip to content

grpc: fix plan9 build by moving errno matching to a !plan9 file - #9255

Merged
arjan-bal merged 2 commits into
grpc:masterfrom
Yusufihsangorgel:fix/plan9-disconnect-errno
Jul 23, 2026
Merged

grpc: fix plan9 build by moving errno matching to a !plan9 file#9255
arjan-bal merged 2 commits into
grpc:masterfrom
Yusufihsangorgel:fix/plan9-disconnect-errno

Conversation

@Yusufihsangorgel

Copy link
Copy Markdown
Contributor

Fixes #9253

disconnectErrorString (added for gRFC A94 in #8973) references syscall.Errno, syscall.ECONNRESET and syscall.ECONNABORTED, none of which exist on plan9, so GOOS=plan9 go build fails on every release since v1.81.0.

This moves the error-to-label classification into disconnectErrorLabel with two implementations: a !plan9 file with the existing errno matching, unchanged in behavior, and a plan9 file that keeps the portable classifications (subchannel shutdown, connection timed out, unknown). Only plan9 is excluded so the errno granularity on js/wasm and wasip1, where syscall.Errno exists, stays as it is today.

Verified GOOS=plan9 GOARCH=amd64 go build ./... fails on master and passes with this change, and go build plus the root package tests still pass on linux and darwin.

RELEASE NOTES:

  • grpc: fix compilation on plan9, broken since v1.81.0

@linux-foundation-easycla

linux-foundation-easycla Bot commented Jul 20, 2026

Copy link
Copy Markdown

CLA Signed
The committers listed above are authorized under a signed CLA.

  • ✅ login: Yusufihsangorgel / name: Yusuf İhsan Görgel (9dc35c3)

@codecov

codecov Bot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 88.23529% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 83.23%. Comparing base (75f3c0b) to head (ca96650).
⚠️ Report is 3 commits behind head on master.

Files with missing lines Patch % Lines
clientconn_disconnect_reason_noplan9.go 86.66% 2 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##           master    #9255   +/-   ##
=======================================
  Coverage   83.23%   83.23%           
=======================================
  Files         421      421           
  Lines       34086    34107   +21     
=======================================
+ Hits        28370    28390   +20     
+ Misses       4281     4274    -7     
- Partials     1435     1443    +8     
Files with missing lines Coverage Δ
clientconn.go 90.13% <100.00%> (-0.49%) ⬇️
clientconn_disconnect_reason_noplan9.go 86.66% <86.66%> (ø)

... and 23 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ncw

ncw commented Jul 22, 2026

Copy link
Copy Markdown

Thanks for fixing this @Yusufihsangorgel - this is stopping us upgrading rclone to 1.82.1 to pick up the security fix.

@Yusufihsangorgel

Copy link
Copy Markdown
Contributor Author

Thanks Nick, glad it unblocks the rclone upgrade. The change passes all the test and build checks; the only red is the Validate PR label gate, which is waiting on a grpc-go maintainer to add a Type: label. Happy to adjust anything a reviewer wants.

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.

Nit: Can we name this file clientconn_disconnect_reason.go and similarly for the file below. Thanks.

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.

We should use the _noplan9.go suffix to remain consistent with other OS-specific code in the repository. Note that, practically speaking, _noOS.go suffixes have no effect on compilation.

@easwars easwars added this to the 1.83 Release milestone Jul 23, 2026
@easwars

easwars commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

@mbissa For second set of eyes

We would also need this to be cherry-picked before we push the 1.83 release.

Comment thread clientconn_errors_plan9.go Outdated

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.

We should use the _noplan9.go suffix to remain consistent with other OS-specific code in the repository. Note that, practically speaking, _noOS.go suffixes have no effect on compilation.

@Yusufihsangorgel

Copy link
Copy Markdown
Contributor Author

Done. Renamed both files to clientconn_disconnect_reason_plan9.go and clientconn_disconnect_reason_noplan9.go, and dropped the //go:build plan9 constraint since the _plan9.go suffix already implies it. I kept the //go:build !plan9 constraint on the noplan9 file, since as you noted the _noplan9.go suffix has no effect on compilation. GOOS=plan9 GOARCH=amd64 go build ./... still passes.

@arjan-bal

Copy link
Copy Markdown
Contributor

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

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.

Code Review

This pull request refactors the error labeling logic in clientconn.go by extracting platform-specific error handling into separate files (clientconn_disconnect_reason_noplan9.go and clientconn_disconnect_reason_plan9.go). This addresses the absence of syscall.Errno on the plan9 platform. The feedback suggests adding an explicit //go:build plan9 build tag to the plan9-specific file for consistency and compatibility.

Comment thread clientconn_disconnect_reason_plan9.go

@arjan-bal arjan-bal left a comment

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.

LGTM, thanks for the contribution!

@arjan-bal
arjan-bal merged commit b6eac42 into grpc:master Jul 23, 2026
14 checks passed
easwars pushed a commit to easwars/grpc-go that referenced this pull request Jul 24, 2026
…#9255)

Fixes grpc#9253

`disconnectErrorString` (added for gRFC A94 in grpc#8973) references
`syscall.Errno`, `syscall.ECONNRESET` and `syscall.ECONNABORTED`, none
of which exist on plan9, so `GOOS=plan9 go build` fails on every release
since v1.81.0.

This moves the error-to-label classification into `disconnectErrorLabel`
with two implementations: a `!plan9` file with the existing errno
matching, unchanged in behavior, and a plan9 file that keeps the
portable classifications (`subchannel shutdown`, `connection timed out`,
`unknown`). Only plan9 is excluded so the errno granularity on js/wasm
and wasip1, where `syscall.Errno` exists, stays as it is today.

Verified `GOOS=plan9 GOARCH=amd64 go build ./...` fails on master and
passes with this change, and `go build` plus the root package tests
still pass on linux and darwin.

RELEASE NOTES:

* grpc: fix compilation on plan9, broken since v1.81.0.
eleboucher pushed a commit to eleboucher/runner-k8s-plugin that referenced this pull request Aug 19, 2026
…(#83)

This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [google.golang.org/grpc](https://github.com/grpc/grpc-go) | `v1.82.0` → `v1.83.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fgrpc/v1.83.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fgrpc/v1.82.0/v1.83.1?slim=true) |

---

### Release Notes

<details>
<summary>grpc/grpc-go (google.golang.org/grpc)</summary>

### [`v1.83.1`](https://github.com/grpc/grpc-go/releases/tag/v1.83.1): Release 1.83.1

[Compare Source](grpc/grpc-go@v1.83.0...v1.83.1)

### Security

- xds/rbac: Fix a bug where nested `Principal` or `Permission` rules with `:scheme` or `grpc-` prefixed header matchers were not rejected, which could cause DENY rules to fail open. ([#&#8203;9258](grpc/grpc-go#9258))
  - Special Thanks: [@&#8203;nvxbug](https://github.com/nvxbug)
- xds/rbac: Fix a bug where the `host` header matcher was not being replaced with `:authority` in nested `Principal` or `Permission` rules. ([#&#8203;9258](grpc/grpc-go#9258))
  - Special Thanks: [@&#8203;nvxbug](https://github.com/nvxbug)
- xds/rbac: Fix a bug where a header matcher whose name was not lowercase, such as `X-Role`, matched no header, which could cause DENY rules to fail open. ([#&#8203;9332](grpc/grpc-go#9332))
  - Special Thanks: [@&#8203;alimony](https://github.com/alimony)
- xds/rbac: Fix a bug where a `:scheme` or `grpc-` prefixed header matcher was accepted when its name was not lowercase. ([#&#8203;9332](grpc/grpc-go#9332))
  - Special Thanks: [@&#8203;alimony](https://github.com/alimony)
- xds/rbac: Fix a bug where a `Host` header matcher was not replaced with `:authority`. ([#&#8203;9332](grpc/grpc-go#9332))
  - Special Thanks: [@&#8203;alimony](https://github.com/alimony)

### Performance

- transport: Restrict memory overhead of buffering small data frames. ([#&#8203;9331](grpc/grpc-go#9331))

### [`v1.83.0`](https://github.com/grpc/grpc-go/releases/tag/v1.83.0): Release 1.83.0

[Compare Source](grpc/grpc-go@v1.82.1...v1.83.0)

### Security

- server: Stop reading from connections when flooded by HTTP/2 frames to mitigate resource exhaustion. The default value for this limit is 100 frames, excluding DATA and HEADERS, and may be changed by setting environment variable `GRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMIT`.
- xds/rbac: Support `Metadata` and `RequestedServerName` permissions matcher fields.  If present in a DENY rule, previously these would be ignored and fail-open.
- xds/rbac: Fix panic when parsing unsupported fields in `NotRule`/`NotId` permissions.
- xds/rbac: Support the deprecated `source_ip` principal identifier by treating it as equivalent to `direct_remote_ip`.
- xds: Fix panic when parsing route header matchers configured with empty `exact_match`, `prefix_match`, or `suffix_match` strings. ([#&#8203;9223](grpc/grpc-go#9223))

### New Features

- xds/googlec2p: Enable DirectPath over Interconnect support for on-premises clients via the `force-xds` target URI query parameter. ([#&#8203;9133](grpc/grpc-go#9133))
- xds: Enable xDS configuration to control which fields get propagated from ORCA backend metric reports to LRS load reports. ([#&#8203;9145](grpc/grpc-go#9145))
- authz: Add `OnPolicyUpdate` callback to `FileWatcherOptions` to notify when an authz policy is loaded or updated. ([#&#8203;9142](grpc/grpc-go#9142))
  - Special Thanks: [@&#8203;hnefatl](https://github.com/hnefatl)
- xds: Add support for the GCP Authentication HTTP Filter, which automatically fetches and attaches GCP Service Account Identity JWT tokens to outgoing RPCs.
  - This feature can be enabled by setting environment variable `GRPC_EXPERIMENTAL_XDS_GCP_AUTHENTICATION_FILTER=true`. ([#&#8203;9119](grpc/grpc-go#9119))
- xds: Add support for xDS-based HTTP CONNECT proxies.
  - This feature can be enabled by setting environment variable `GRPC_EXPERIMENTAL_XDS_HTTP_CONNECT=true`. ([#&#8203;9151](grpc/grpc-go#9151))
- xds: Add support for `contains_match` in route header matchers. ([#&#8203;9223](grpc/grpc-go#9223))

### Bug Fixes

- credentials/alts: Fix panic when processing malformed frames by validating that the message frame length exceeds the message type field size. ([#&#8203;9197](grpc/grpc-go#9197))
- grpc: Fix compilation on Plan 9 targets (`GOOS=plan9`), broken since v1.81.0. ([#&#8203;9255](grpc/grpc-go#9255))
  - Special Thanks: [@&#8203;Yusufihsangorgel](https://github.com/Yusufihsangorgel)

### [`v1.82.1`](https://github.com/grpc/grpc-go/releases/tag/v1.82.1): Release 1.82.1

[Compare Source](grpc/grpc-go@v1.82.0...v1.82.1)

### Security

- server: Stop reading from the connection when flooded by HTTP/2 frames.  The default value for this limit is 100 frames, excluding DATA and HEADERS, and may be changed by setting environment variable `GRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMIT`.
- xds/rbac: Support `Metadata` and `RequestedServerName` permissions matcher fields.  If present in a DENY rule, previously these would be ignored and fail-open.
- xds/rbac: Fix panic when parsing unsupported fields in `NotRule`/`NotId` permissions.
- xds/rbac: Support the deprecated `source_ip` principal identifier by treating it as equivalent to `direct_remote_ip`.

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Paris)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjMxLjAiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbInR5cGUvbWlub3IiXX0=-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/runner-k8s-plugin/pulls/83
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

clientconn.go does not compile on plan9 since v1.81.0: undefined syscall.Errno

5 participants