chttp2_server.cc:298:断言失败:*port_num == port_temp在



只有在citrix服务器上运行我们的应用程序时才会出现问题,我们很难找到问题的原因。

这个应用程序是一个windows GUI应用程序,在动态端口上启动2个grpc服务——一个是c++服务,另一个是用c#实现的。net组件。这两个服务在同一台机器上的同一进程中运行。c++服务首先启动,并使用127.0.0.1:0或localhost:0运行良好。当c#服务开始使用127.0.0.1:0时,它在我们的机器和一些客户的机器上工作,但在他们的citrix服务器上失败,我现在知道是什么原因导致的了。

我们正在使用grpc v1.12.0. 该代码块末尾的断言触发并终止我们的进程。

grpc_error* grpc_chttp2_server_add_port(grpc_server* server, const char* addr,
grpc_channel_args* args,
int* port_num) {
grpc_resolved_addresses* resolved = nullptr;
grpc_tcp_server* tcp_server = nullptr;
size_t i;
size_t count = 0;
int port_temp;
grpc_error* err = GRPC_ERROR_NONE;
server_state* state = nullptr;
grpc_error** errors = nullptr;
size_t naddrs = 0;
*port_num = -1;
/* resolve address */
err = grpc_blocking_resolve_address(addr, "https", &resolved);
if (err != GRPC_ERROR_NONE) {
goto error;
}
state = static_cast<server_state*>(gpr_zalloc(sizeof(*state)));
GRPC_CLOSURE_INIT(&state->tcp_server_shutdown_complete,
tcp_server_shutdown_complete, state,
grpc_schedule_on_exec_ctx);
err = grpc_tcp_server_create(&state->tcp_server_shutdown_complete, args,
&tcp_server);
if (err != GRPC_ERROR_NONE) {
goto error;
}
state->server = server;
state->tcp_server = tcp_server;
state->args = args;
state->shutdown = true;
gpr_mu_init(&state->mu);
naddrs = resolved->naddrs;
errors = static_cast<grpc_error**>(gpr_malloc(sizeof(*errors) * naddrs));
for (i = 0; i < naddrs; i++) {
errors[i] =
grpc_tcp_server_add_port(tcp_server, &resolved->addrs[i], &port_temp);
if (errors[i] == GRPC_ERROR_NONE) {
if (*port_num == -1) {
*port_num = port_temp;
} else {
GPR_ASSERT(*port_num == port_temp);
}
count++;
}
}

即使使用GRPC_VERBOSITY=debug和GRPC_TRACE=all,我也看不到任何错误或有用的提示。

日志只显示如下:

I0727 10:10:51.045681 0 T:srcgithubgrpcworkspace_csharp_ext_windows_x64srccorelibsurfaceinit.cc:155: grpc_init(void)
I0727 10:10:51.045681 0 T:srcgithubgrpcworkspace_csharp_ext_windows_x64srccorelibsurfaceserver.cc:944: grpc_server_create(0000009E5A5AA470, 0000000000000000)
I0727 10:10:51.045681 0 T:srcgithubgrpcworkspace_csharp_ext_windows_x64srccorelibsurfaceserver.cc:930: grpc_server_register_completion_queue(server=0000009E5A40CAA0, cq=0000009E59D52FD0, reserved=0000000000000000)
I0727 10:10:51.045681 0 T:srcgithubgrpcworkspace_csharp_ext_windows_x64srccorelibsurfaceserver.cc:930: grpc_server_register_completion_queue(server=0000009E5A40CAA0, cq=0000009E59D53490, reserved=0000000000000000)
I0727 10:10:51.045681 0 T:srcgithubgrpcworkspace_csharp_ext_windows_x64srccorelibsurfaceserver.cc:930: grpc_server_register_completion_queue(server=0000009E5A40CAA0, cq=0000009E59D52D70, reserved=0000000000000000)
I0727 10:10:51.045681 0 T:srcgithubgrpcworkspace_csharp_ext_windows_x64srccorelibsurfaceserver.cc:930: grpc_server_register_completion_queue(server=0000009E5A40CAA0, cq=0000009E59D536F0, reserved=0000000000000000)
I0727 10:10:51.061313 0 T:srcgithubgrpcworkspace_csharp_ext_windows_x64srccoreexttransportchttp2serverinsecureserver_chttp2.cc:34: grpc_server_add_insecure_http2_port(server=0000009E5A40CAA0, addr=localhost:0)
E0727 10:10:51.061313 0 T:srcgithubgrpcworkspace_csharp_ext_windows_x64srccoreexttransportchttp2serverchttp2_server.cc:298: assertion failed: *port_num == port_temp

任何可能原因的提示都是非常受欢迎的。

在向grpc添加更多的日志消息后,我可以看到实际上有两个不同的地址和不同的端口([::1]:20530和[::ffff:127.0.0.1]:20532)

I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccoreexttransportchttp2serverinsecureserver_chttp2.cc:34: grpc_server_add_insecure_http2_port(server=000000DA0EF73120, addr=localhost:0)
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccoreexttransportchttp2serverchttp2_server.cc:291: WARNING: Zk, grpc_chttp2_server_add_port: naddrs = 2
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccoreexttransportchttp2serverchttp2_server.cc:298: WARNING: Zk, before grpc_tcp_server_add_port: port_temp = 484827504, resolved->addrs[0] = [::1]:0
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:501: Warning: Zk: grpc_sockaddr_to_v4mapped returned false
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:513: Warning: Zk: grpc_sockaddr_is_wildcard returned false
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:194: Warning: Zk: before grpc_tcp_prepare_socket
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:200: Warning: Zk: before bind
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:207: Warning: Zk: before listen
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:213: Warning: Zk: before getsockname
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:222: Warning: Zk: before grpc_sockaddr_get_port
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:226: Warning: Zk: sockname_temp: [::1]:20530
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccoreexttransportchttp2serverchttp2_server.cc:306: WARNING: Zk, after grpc_tcp_server_add_port: port_temp = 20530, errors[i] = 0
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccoreexttransportchttp2serverchttp2_server.cc:298: WARNING: Zk, before grpc_tcp_server_add_port: port_temp = 20530, resolved->addrs[1] = 127.0.0.1:0
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:496: Warning: Zk: grpc_sockaddr_to_v4mapped returned true
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:513: Warning: Zk: grpc_sockaddr_is_wildcard returned false
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:194: Warning: Zk: before grpc_tcp_prepare_socket
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:200: Warning: Zk: before bind
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:207: Warning: Zk: before listen
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:213: Warning: Zk: before getsockname
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:222: Warning: Zk: before grpc_sockaddr_get_port
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccorelibiomgrtcp_server_windows.cc:226: Warning: Zk: sockname_temp: [::ffff:127.0.0.1]:20532
I0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccoreexttransportchttp2serverchttp2_server.cc:306: WARNING: Zk, after grpc_tcp_server_add_port: port_temp = 20532, errors[i] = 0
E0727 14:22:16.875600 0 E:grpc-v1.12.0grpcsrccoreexttransportchttp2serverchttp2_server.cc:313: assertion failed: *port_num == port_temp

原因是我们使用的是。net grpc服务的localhost而不是127.0.0.1.

ports = new ServerPort("localhost", 0, ServerCredentials.Insecure);

Grpc_blocking_resolve_address因此提供了ipv4和ipv6的地址。然后为这两个地址调用Grpc_tcp_server_add_port,并传递导致断言的2个不同端口。不幸的是,这里没有Grpc的诊断选项。

将localhost更改为127.0.0.1后,我们的应用程序可以正常工作。

ports = new ServerPort("127.0.0.1", 0, ServerCredentials.Insecure);

相关内容

最新更新