You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Node.js QPS worker closes socket abruptly at the end of tests #3060
When running the Node.js QPS worker in a load test scenario managed by the C++ driver (qps_json_driver), the worker closes its connection to the driver abruptly at the end of the test. This prevents the driver from sending a clean quit signal and receiving confirmation, resulting in an error at the end of the benchmark run.
Reproduction steps
Start the Node.js QPS worker (part of the gRPC testing images).
Run a load test scenario (e.g., node-to-node-generic-async-streaming-qps-unconstrained-secure) using the C++ driver qps_json_driver targeting the Node worker.
Observe the error log at the very end of the test execution when the driver attempts to shut down the servers.
Environment
OS name, version and architecture: Linux (amd64, running inside us-docker.pkg.dev/grpc-testing/e2etest-prebuilt/node:20260528114749 container)
Node version: [Version included in the above prebuilt image]
Package name and version: grpc or @grpc/grpc-js (version used in gRPC QPS workers at lastest version)
Additional context
These issues were also observed after updating to Ruby 3.3. The test runs and produces results, but fails during the cleanup phase with the following error in the driver logs:
E0528 13:23:56.383525 20 driver.cc:668] Worker 1 could not be properly quit because Socket closed
The cleanup contract should keep the worker control stream alive until it receives the driver's quit request and sends the corresponding acknowledgement, even after benchmark RPCs finish. A focused interop test can complete one scenario, wait for results, then issue QuitWorker and assert a clean status before either side closes the socket. Logging the final control RPC/state transition would also distinguish a Node worker lifecycle bug from the driver's Ruby-related cleanup observation.
Activity
hiSandog commentedon Jul 15, 2026
The cleanup contract should keep the worker control stream alive until it receives the driver's quit request and sends the corresponding acknowledgement, even after benchmark RPCs finish. A focused interop test can complete one scenario, wait for results, then issue
QuitWorkerand assert a clean status before either side closes the socket. Logging the final control RPC/state transition would also distinguish a Node worker lifecycle bug from the driver's Ruby-related cleanup observation.