2 years ago

#53986

test-img

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:

https://grpc.github.io/grpc/cpp/md_doc_keepalive.html

grpc

http2

grpc-c++

0 Answers

Your Answer

Accepted video resources