2 years ago
#53986
SIY1121
gRPC keepalive ping fail after the second time
I've tested grpc keepalive using official c++ helloworld sample. However keepalive ping fail after the second time.
Client says Keepalive watchdog fired. Closing transport.
https://github.com/grpc/grpc/blob/master/examples/cpp/helloworld/greeter_client.cc https://github.com/grpc/grpc/blob/master/examples/cpp/helloworld/greeter_server.cc
I've modified client and server code as follows:
// client main()
// ....
// keepalive configuration
grpc::ChannelArguments args;
args.SetInt(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS, 1);
args.SetInt(GRPC_ARG_KEEPALIVE_TIME_MS, 10000);
args.SetInt(GRPC_ARG_KEEPALIVE_TIMEOUT_MS, 3000);
args.SetInt(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA, 0);
GreeterClient greeter(grpc::CreateCustomChannel(
target_str, grpc::InsecureChannelCredentials(), args));
std::string user("world");
// send rpc request at 1 minute interval
while (true) {
std::string reply = greeter.SayHello(user);
std::cout << "Greeter received: " << reply << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(60 * 1000));
}
// server main()
// ....
// keepalive configuration
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS, 1);
builder.AddChannelArgument(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA, 0);
builder.AddChannelArgument(GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS, 10000);
// ....
After build, run in terminal:
$ export GRPC_VERBOSITY=debug
$ export GRPC_TRACE=http_keepalive,connectivity_state,http
$ ./greeter_server
$ ./greeter_client # in other terminal
client output:
...
I0115 17:09:27.910828000 123145533800448 chttp2_transport.cc:2821] ipv6:[::1]:50051: Start keepalive ping
I0115 17:09:27.912454000 123145534337024 chttp2_transport.cc:2845] ipv6:[::1]:50051: Finish keepalive ping
I0115 17:09:37.916751000 123145533800448 chttp2_transport.cc:806] W:0x7ffc2c010200 CLIENT [ipv6:[::1]:50051] state IDLE -> WRITING [KEEPALIVE_PING]
I0115 17:09:37.916792000 123145533800448 writing.cc:129] CLIENT: Ping sent [ipv6:[::1]:50051]: 0/0
I0115 17:09:37.916800000 123145533800448 chttp2_transport.cc:806] W:0x7ffc2c010200 CLIENT [ipv6:[::1]:50051] state WRITING -> WRITING [begin write in current thread]
I0115 17:09:37.916844000 123145533800448 chttp2_transport.cc:806] W:0x7ffc2c010200 CLIENT [ipv6:[::1]:50051] state WRITING -> IDLE [finish writing]
I0115 17:09:37.916851000 123145533800448 chttp2_transport.cc:2821] ipv6:[::1]:50051: Start keepalive ping
I0115 17:09:40.921260000 123145534337024 chttp2_transport.cc:2883] ipv6:[::1]:50051: Keepalive watchdog fired. Closing transport.
I0115 17:09:40.921305000 123145534337024 chttp2_transport.cc:2912] transport 0x7ffc2c010200 set connectivity_state=4
I0115 17:09:40.921316000 123145534337024 connectivity_state.cc:159] ConnectivityStateTracker client_transport[0x7ffc2c0104a0]: READY -> SHUTDOWN (close_transport, OK)
I0115 17:09:40.921325000 123145534337024 connectivity_state.cc:167] ConnectivityStateTracker client_transport[0x7ffc2c0104a0]: notifying watcher 0x7ffc2b606490: READY -> SHUTDOWN
I0115 17:09:40.921521000 123145534337024 connectivity_state.cc:79] watcher 0x7ffc2b606490: delivering async notification for SHUTDOWN (OK)
I0115 17:09:40.921595000 123145534337024 connectivity_state.cc:159] ConnectivityStateTracker client_channel[0x7ffc2b607958]: READY -> IDLE (helper, OK)
server output:
...
I0115 17:09:27.910972000 123145419530240 chttp2_transport.cc:806] W:0x7ffb1a809000 SERVER [ipv6:[::1]:52295] state IDLE -> WRITING [PING_RESPONSE]
I0115 17:09:27.911006000 123145419530240 chttp2_transport.cc:806] W:0x7ffb1a809000 SERVER [ipv6:[::1]:52295] state WRITING -> WRITING [begin write in current thread]
I0115 17:09:27.911030000 123145419530240 chttp2_transport.cc:806] W:0x7ffb1a809000 SERVER [ipv6:[::1]:52295] state WRITING -> IDLE [finish writing]
I0115 17:09:37.916957000 123145420066816 chttp2_transport.cc:806] W:0x7ffb1a809000 SERVER [ipv6:[::1]:52295] state IDLE -> WRITING [PING_RESPONSE]
I0115 17:09:37.916989000 123145420066816 chttp2_transport.cc:806] W:0x7ffb1a809000 SERVER [ipv6:[::1]:52295] state WRITING -> WRITING [begin write in current thread]
I0115 17:09:37.917010000 123145420066816 chttp2_transport.cc:806] W:0x7ffb1a809000 SERVER [ipv6:[::1]:52295] state WRITING -> IDLE [finish writing]
I0115 17:09:40.921613000 123145419530240 chttp2_transport.cc:2912] transport 0x7ffb1a809000 set connectivity_state=4
I0115 17:09:40.921664000 123145419530240 connectivity_state.cc:159] ConnectivityStateTracker server_transport[0x7ffb1a8092a0]: READY -> SHUTDOWN (close_transport, OK)
I0115 17:09:40.921674000 123145419530240 connectivity_state.cc:167] ConnectivityStateTracker server_transport[0x7ffb1a8092a0]: notifying watcher 0x7ffb19905040: READY -> SHUTDOWN
I0115 17:09:40.921743000 123145419530240 connectivity_state.cc:79] watcher 0x7ffb19905040: delivering async notification for SHUTDOWN (OK)
I0115 17:09:40.921758000 123145419530240 chttp2_transport.cc:1837] perform_transport_op[t=0x7ffb1a809000]: SET_ACCEPT_STREAM:(nil)((nil),...)
environment:
grpc 1.42.0
macOS(intel) 11.6
gRPC C++ keepalive document:
grpc
http2
grpc-c++
0 Answers
Your Answer