client: replace net/rpc with lightweight gob-based RPC client#191
Open
sverdlov93 wants to merge 2 commits into
Open
client: replace net/rpc with lightweight gob-based RPC client#191sverdlov93 wants to merge 2 commits into
sverdlov93 wants to merge 2 commits into
Conversation
net/rpc is deprecated (frozen since Go 1.20) and imports html/template via its debug HTTP handler. html/template triggers reflect.MethodByName which disables the Go linker's method dead code elimination (DCE) optimization for any binary that transitively imports this package. This affects all users of google-api-go-client and cloud.google.com/go libraries, as they pull in enterprise-certificate-proxy as a dependency. Datadog reported up to 20% binary size reduction from enabling DCE (https://www.datadoghq.com/blog/engineering/agent-go-binaries/), and the Kubernetes project saw 16-37% reductions. The fix replaces net/rpc.Client with a minimal gob-based RPC client (rpclite.go) that speaks the exact same wire protocol. This maintains full compatibility with existing signer subprocesses — only the client side changes, and the on-wire encoding (gob-encoded Request/Response headers) is identical. Tests pass with no changes required.
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
Tests verify that rpclite speaks the same gob-based wire protocol as net/rpc by connecting an rpclite client to a real net/rpc server over in-memory pipes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
net/rpcis deprecated (frozen since Go 1.20) and importshtml/templatevia its debug HTTP handler.html/templatecallsreflect.Value.MethodByName, which disables the Go linker's method dead code elimination (DCE) optimization for any binary that transitively imports this package.This affects all users of
google-api-go-clientandcloud.google.com/golibraries, as they pull inenterprise-certificate-proxyas a dependency — even when enterprise certificates are not used.Datadog reported up to 20% binary size reduction from enabling DCE, and the Kubernetes project saw 16–37% reductions on their binaries.
Changes
rpclite.go: a minimal gob-based RPC client (~60 lines of logic) that speaks the exact same wire protocol asnet/rpc(gob-encodedRequest/Responseheaders)client.goto userpcliteinstead ofnet/rpcWire protocol compatibility
The
requestandresponsestructs inrpclite.gomirrornet/rpc.Requestandnet/rpc.Responsefield-for-field, so gob encoding produces identical bytes. Existing signer binaries (which usenet/rpcserver) work without any changes.Test plan
go test ./client/...— all existing tests passgo listconfirmsnet/rpcis no longer in the dependency treego build ./client/...compiles cleanly