mirror of
https://github.com/kvcache-ai/Mooncake.git
synced 2026-11-05 01:17:55 +00:00
[GH-ISSUE #3142] [Bug]: HA etcd clients repeatedly receive too_many_pings GOAWAY since v0.3.12 #805
Labels
No labels
ascend
auto-closed
bug
bug
CI/Build
Common
documentation
enhancement
feature request
good first issue
help wanted
high priority
MetaX
nightly-failure
pull-request
PyTorch Backend
question
RFC
Roadmap
stale
Store
Tests
Transfer Engine
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
kvcache-ai/Mooncake#805
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Icedcoco on GitHub (Jul 27, 2026).
Original GitHub issue: https://github.com/kvcache-ai/Mooncake/issues/3142
Originally assigned to: @Icedcoco on GitHub.
Bug Report
Bug Report
Summary
In prefill/decode disaggregated deployments using etcd as the HA backend, Mooncake clients repeatedly log:
The issue is reproducible with Mooncake
v0.3.12and later. It was not observed withv0.3.11.post1. The apparent regression point is #2383.The errors are usually more frequent shortly after startup and become less frequent over time as gRPC-Go increases the keepalive interval after each GOAWAY.
Environment
v0.3.12and latergo.etcd.io/etcd/client/v3 v3.5.21google.golang.org/grpc v1.79.3v3.3.25Expected Behavior
Idle etcd connections should not be repeatedly closed and re-established during normal HA operation.
Actual Behavior
etcd periodically closes idle gRPC connections with:
gRPC-Go then reconnects the affected SubChannel automatically. Mooncake continues running, but the connection churn produces error logs and unnecessary control-plane activity.
Setting the following etcd option does not resolve the issue:
Reproduction
--grpc-keepalive-min-time=1sis added.too_many_pingserrors in the client logs.To confirm the affected endpoint, enable gRPC-Go logging before starting the client:
Relevant logs can be filtered with:
The resulting sequence shows that the affected channel targets an etcd endpoint:
Root Cause
PR #2383 added transport-level gRPC keepalive to the Store etcd client to detect half-open connections after an etcd leader is suspended with
SIGSTOP:The problematic option is:
It instructs gRPC-Go to send HTTP/2 PING frames even when the underlying transport has no active RPC streams.
etcd configures its gRPC enforcement policy with:
When a transport has an active RPC stream, etcd validates client PING intervals against
--grpc-keepalive-min-time.When a transport has no active streams, etcd does not use that configured minimum. Because
PermitWithoutStreamis false on the server, repeated idle PINGs are treated as policy violations. After enough violations, etcd sends:This also explains why lowering
--grpc-keepalive-min-timedoes not fix the problem.The issue is more visible with multiple endpoints because clientv3 uses
round_robinand creates a SubChannel for each endpoint. A watch or lease stream may be active on one transport while the remaining transports are idle but still send PINGs.After receiving
too_many_pings, gRPC-Go closes the affected transport, reconnects it, and increases the keepalive interval for future connections. This explains why the errors become less frequent over time.Impact
No process crashes, data corruption, or direct interruption of active data-path operations have been observed.
The GOAWAY normally targets a transport with no active RPC streams, so gRPC-Go can reconnect it automatically. However, the issue still causes:
The connection carrying an active leadership lease keepalive or master-view watch is normally not subject to the idle-stream enforcement path.
Proposed Fix
Remove
PermitWithoutStream, or explicitly set it tofalse:DialKeepAliveTimeandDialKeepAliveTimeoutshould remain unchanged.This should preserve the purpose of #2383. Leadership lease keepalive and watch operations use active RPC streams, so transport keepalive can still detect a half-open connection when the etcd leader is suspended. Only PINGs on completely idle transports are disabled.
Validation
The fix should be verified with:
too_many_pingsGOAWAY is received.SIGSTOP/SIGKILLregression test, confirming that the master can still recover.Before submitting...
v0.3.12contains the apparent regressionPermitWithoutStream=true/falsecomparisonBefore submitting...
@github-actions[bot] commented on GitHub (Jul 27, 2026):
Thanks for opening this issue, @Icedcoco!
102317026A maintainer will triage this when possible. To help us respond faster, please include:
Useful links: Documentation · Contributing guide
@whybeyoung commented on GitHub (Aug 4, 2026):
LGTM