grpc 1.20.0 → 1.21.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +500 -29
- data/etc/roots.pem +146 -0
- data/include/grpc/grpc_security.h +1 -1
- data/include/grpc/impl/codegen/grpc_types.h +10 -7
- data/include/grpc/impl/codegen/port_platform.h +11 -1
- data/include/grpc/impl/codegen/slice.h +1 -21
- data/include/grpc/impl/codegen/status.h +2 -1
- data/include/grpc/slice.h +1 -1
- data/src/core/ext/filters/client_channel/backup_poller.cc +19 -13
- data/src/core/ext/filters/client_channel/backup_poller.h +3 -0
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +2084 -1673
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +2 -3
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +54 -49
- data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -2
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy.cc +3 -30
- data/src/core/ext/filters/client_channel/lb_policy.h +16 -25
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +106 -81
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +8 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +57 -49
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +47 -41
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +24 -20
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +989 -284
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +105 -2
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +9 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +79 -36
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +15 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +80 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +29 -0
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +4 -4
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +367 -232
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +55 -76
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +50 -39
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +18 -12
- data/src/core/ext/filters/client_channel/service_config.cc +247 -27
- data/src/core/ext/filters/client_channel/service_config.h +119 -166
- data/src/core/ext/filters/client_channel/subchannel.cc +46 -84
- data/src/core/ext/filters/client_channel/subchannel.h +7 -7
- data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
- data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
- data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
- data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
- data/src/core/ext/filters/message_size/message_size_filter.cc +118 -76
- data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +93 -60
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +8 -2
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +3 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +35 -23
- data/src/core/ext/transport/chttp2/transport/parsing.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +61 -27
- data/src/core/ext/transport/inproc/inproc_transport.cc +18 -18
- data/src/core/lib/channel/channel_args.cc +0 -101
- data/src/core/lib/channel/channel_args.h +0 -37
- data/src/core/lib/channel/channel_stack.h +9 -5
- data/src/core/lib/channel/channelz_registry.cc +1 -1
- data/src/core/lib/channel/connected_channel.cc +2 -2
- data/src/core/lib/channel/context.h +3 -0
- data/src/core/lib/channel/handshaker.cc +4 -4
- data/src/core/lib/channel/handshaker.h +1 -1
- data/src/core/lib/compression/compression_args.cc +127 -0
- data/src/core/lib/compression/compression_args.h +55 -0
- data/src/core/lib/debug/trace.cc +13 -7
- data/src/core/lib/debug/trace.h +12 -0
- data/src/core/lib/gpr/arena.h +13 -9
- data/src/core/lib/gpr/env.h +2 -5
- data/src/core/lib/gpr/env_linux.cc +6 -1
- data/src/core/lib/gpr/env_posix.cc +5 -0
- data/src/core/lib/gpr/env_windows.cc +7 -5
- data/src/core/lib/gpr/log.cc +9 -13
- data/src/core/lib/gpr/string.cc +12 -6
- data/src/core/lib/gpr/string.h +4 -2
- data/src/core/lib/gpr/time_posix.cc +13 -0
- data/src/core/lib/gprpp/arena.cc +103 -0
- data/src/core/lib/gprpp/arena.h +121 -0
- data/src/core/lib/gprpp/fork.cc +12 -29
- data/src/core/lib/gprpp/global_config.h +87 -0
- data/src/core/lib/gprpp/global_config_custom.h +29 -0
- data/src/core/lib/gprpp/global_config_env.cc +135 -0
- data/src/core/lib/gprpp/global_config_env.h +131 -0
- data/src/core/lib/gprpp/global_config_generic.h +44 -0
- data/src/core/lib/gprpp/map.h +419 -0
- data/src/core/lib/gprpp/optional.h +1 -0
- data/src/core/lib/gprpp/orphanable.h +2 -2
- data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
- data/src/core/lib/gprpp/ref_counted.h +18 -2
- data/src/core/lib/gprpp/sync.h +126 -0
- data/src/core/lib/http/parser.cc +1 -1
- data/src/core/lib/iomgr/call_combiner.cc +84 -90
- data/src/core/lib/iomgr/call_combiner.h +75 -82
- data/src/core/lib/iomgr/cfstream_handle.cc +202 -0
- data/src/core/lib/iomgr/cfstream_handle.h +82 -0
- data/src/core/lib/iomgr/combiner.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
- data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
- data/src/core/lib/iomgr/error.h +23 -0
- data/src/core/lib/iomgr/error_cfstream.cc +52 -0
- data/src/core/lib/iomgr/error_cfstream.h +31 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +34 -27
- data/src/core/lib/iomgr/ev_epollex_linux.cc +33 -33
- data/src/core/lib/iomgr/ev_poll_posix.cc +7 -7
- data/src/core/lib/iomgr/ev_posix.cc +15 -13
- data/src/core/lib/iomgr/ev_posix.h +4 -1
- data/src/core/lib/iomgr/executor.cc +13 -9
- data/src/core/lib/iomgr/fork_posix.cc +0 -1
- data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
- data/src/core/lib/iomgr/iomgr.cc +6 -5
- data/src/core/lib/iomgr/iomgr_custom.cc +3 -0
- data/src/core/lib/iomgr/iomgr_custom.h +2 -0
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
- data/src/core/lib/iomgr/iomgr_windows.cc +1 -0
- data/src/core/lib/iomgr/lockfree_event.cc +3 -3
- data/src/core/lib/iomgr/port.h +11 -0
- data/src/core/lib/iomgr/resource_quota.cc +40 -37
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
- data/src/core/lib/iomgr/socket_windows.cc +19 -0
- data/src/core/lib/iomgr/socket_windows.h +8 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_client_windows.cc +1 -1
- data/src/core/lib/iomgr/tcp_custom.cc +9 -9
- data/src/core/lib/iomgr/tcp_posix.cc +41 -41
- data/src/core/lib/iomgr/tcp_server_custom.cc +3 -3
- data/src/core/lib/iomgr/tcp_server_posix.cc +14 -1
- data/src/core/lib/iomgr/tcp_server_windows.cc +2 -2
- data/src/core/lib/iomgr/tcp_windows.cc +7 -9
- data/src/core/lib/iomgr/timer_generic.cc +16 -16
- data/src/core/lib/iomgr/timer_manager.cc +12 -11
- data/src/core/lib/profiling/basic_timers.cc +10 -4
- data/src/core/lib/security/context/security_context.cc +6 -7
- data/src/core/lib/security/context/security_context.h +3 -4
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +2 -3
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +7 -7
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
- data/src/core/lib/security/security_connector/security_connector.cc +0 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +3 -2
- data/src/core/lib/security/security_connector/ssl_utils.cc +30 -26
- data/src/core/lib/security/security_connector/ssl_utils.h +5 -1
- data/src/core/lib/security/transport/client_auth_filter.cc +7 -11
- data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
- data/src/core/lib/security/transport/server_auth_filter.cc +2 -3
- data/src/core/lib/slice/slice.cc +99 -116
- data/src/core/lib/slice/slice_buffer.cc +5 -0
- data/src/core/lib/slice/slice_intern.cc +38 -95
- data/src/core/lib/slice/slice_internal.h +200 -2
- data/src/core/lib/surface/api_trace.h +1 -1
- data/src/core/lib/surface/call.cc +41 -35
- data/src/core/lib/surface/call.h +7 -2
- data/src/core/lib/surface/call_details.cc +0 -1
- data/src/core/lib/surface/completion_queue.cc +36 -27
- data/src/core/lib/surface/init.cc +3 -4
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/server.cc +18 -25
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/bdp_estimator.cc +3 -3
- data/src/core/lib/transport/bdp_estimator.h +2 -2
- data/src/core/lib/transport/connectivity_state.cc +10 -40
- data/src/core/lib/transport/connectivity_state.h +0 -8
- data/src/core/lib/transport/error_utils.cc +12 -0
- data/src/core/lib/transport/metadata.cc +206 -278
- data/src/core/lib/transport/metadata.h +205 -10
- data/src/core/lib/transport/static_metadata.cc +108 -116
- data/src/core/lib/transport/static_metadata.h +1 -2
- data/src/core/lib/transport/status_metadata.cc +3 -3
- data/src/core/lib/transport/transport.cc +29 -66
- data/src/core/lib/transport/transport.h +36 -8
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/tsi/fake_transport_security.cc +4 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +1 -1
- data/src/ruby/lib/grpc/errors.rb +22 -3
- data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
- data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/errors_spec.rb +141 -0
- metadata +57 -33
- data/src/core/lib/gpr/arena.cc +0 -192
@@ -30,7 +30,11 @@
|
|
30
30
|
#include <fcntl.h>
|
31
31
|
#include <limits.h>
|
32
32
|
#include <netinet/in.h>
|
33
|
+
#ifdef GRPC_LINUX_TCP_H
|
34
|
+
#include <linux/tcp.h>
|
35
|
+
#else
|
33
36
|
#include <netinet/tcp.h>
|
37
|
+
#endif
|
34
38
|
#include <stdio.h>
|
35
39
|
#include <string.h>
|
36
40
|
#include <sys/socket.h>
|
@@ -288,7 +292,7 @@ grpc_error* grpc_set_socket_tcp_user_timeout(
|
|
288
292
|
}
|
289
293
|
if (enable) {
|
290
294
|
extern grpc_core::TraceFlag grpc_tcp_trace;
|
291
|
-
if (grpc_tcp_trace
|
295
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
292
296
|
gpr_log(GPR_INFO, "Enabling TCP_USER_TIMEOUT with a timeout of %d ms",
|
293
297
|
timeout);
|
294
298
|
}
|
@@ -311,7 +315,7 @@ grpc_error* grpc_set_socket_tcp_user_timeout(
|
|
311
315
|
}
|
312
316
|
#else
|
313
317
|
extern grpc_core::TraceFlag grpc_tcp_trace;
|
314
|
-
if (grpc_tcp_trace
|
318
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
315
319
|
gpr_log(GPR_INFO, "TCP_USER_TIMEOUT not supported for this platform");
|
316
320
|
}
|
317
321
|
#endif /* GRPC_HAVE_TCP_USER_TIMEOUT */
|
@@ -39,6 +39,8 @@
|
|
39
39
|
#include "src/core/lib/iomgr/sockaddr_windows.h"
|
40
40
|
#include "src/core/lib/iomgr/socket_windows.h"
|
41
41
|
|
42
|
+
static DWORD s_wsa_socket_flags;
|
43
|
+
|
42
44
|
grpc_winsocket* grpc_winsocket_create(SOCKET socket, const char* name) {
|
43
45
|
char* final_name;
|
44
46
|
grpc_winsocket* r = (grpc_winsocket*)gpr_malloc(sizeof(grpc_winsocket));
|
@@ -181,4 +183,21 @@ int grpc_ipv6_loopback_available(void) {
|
|
181
183
|
return g_ipv6_loopback_available;
|
182
184
|
}
|
183
185
|
|
186
|
+
DWORD grpc_get_default_wsa_socket_flags() { return s_wsa_socket_flags; }
|
187
|
+
|
188
|
+
void grpc_wsa_socket_flags_init() {
|
189
|
+
s_wsa_socket_flags = WSA_FLAG_OVERLAPPED;
|
190
|
+
/* WSA_FLAG_NO_HANDLE_INHERIT may be not supported on the older Windows
|
191
|
+
versions, see
|
192
|
+
https://msdn.microsoft.com/en-us/library/windows/desktop/ms742212(v=vs.85).aspx
|
193
|
+
for details. */
|
194
|
+
SOCKET sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
|
195
|
+
s_wsa_socket_flags | WSA_FLAG_NO_HANDLE_INHERIT);
|
196
|
+
if (sock != INVALID_SOCKET) {
|
197
|
+
/* Windows 7, Windows 2008 R2 with SP1 or later */
|
198
|
+
s_wsa_socket_flags |= WSA_FLAG_NO_HANDLE_INHERIT;
|
199
|
+
closesocket(sock);
|
200
|
+
}
|
201
|
+
}
|
202
|
+
|
184
203
|
#endif /* GRPC_WINSOCK_SOCKET */
|
@@ -32,6 +32,10 @@
|
|
32
32
|
#include "src/core/lib/iomgr/closure.h"
|
33
33
|
#include "src/core/lib/iomgr/iomgr_internal.h"
|
34
34
|
|
35
|
+
#ifndef WSA_FLAG_NO_HANDLE_INHERIT
|
36
|
+
#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
|
37
|
+
#endif
|
38
|
+
|
35
39
|
/* This holds the data for an outstanding read or write on a socket.
|
36
40
|
The mutex to protect the concurrent access to that data is the one
|
37
41
|
inside the winsocket wrapper. */
|
@@ -114,6 +118,10 @@ void grpc_socket_become_ready(grpc_winsocket* winsocket,
|
|
114
118
|
The value is probed once, and cached for the life of the process. */
|
115
119
|
int grpc_ipv6_loopback_available(void);
|
116
120
|
|
121
|
+
void grpc_wsa_socket_flags_init();
|
122
|
+
|
123
|
+
DWORD grpc_get_default_wsa_socket_flags();
|
124
|
+
|
117
125
|
#endif
|
118
126
|
|
119
127
|
#endif /* GRPC_CORE_LIB_IOMGR_SOCKET_WINDOWS_H */
|
@@ -0,0 +1,216 @@
|
|
1
|
+
|
2
|
+
/*
|
3
|
+
*
|
4
|
+
* Copyright 2018 gRPC authors.
|
5
|
+
*
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
* you may not use this file except in compliance with the License.
|
8
|
+
* You may obtain a copy of the License at
|
9
|
+
*
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
*
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
* See the License for the specific language governing permissions and
|
16
|
+
* limitations under the License.
|
17
|
+
*
|
18
|
+
*/
|
19
|
+
|
20
|
+
#include <grpc/support/port_platform.h>
|
21
|
+
|
22
|
+
#include "src/core/lib/iomgr/port.h"
|
23
|
+
|
24
|
+
#ifdef GRPC_CFSTREAM_CLIENT
|
25
|
+
|
26
|
+
#include <CoreFoundation/CoreFoundation.h>
|
27
|
+
|
28
|
+
#include <string.h>
|
29
|
+
|
30
|
+
#include <grpc/support/alloc.h>
|
31
|
+
#include <grpc/support/log.h>
|
32
|
+
#include <grpc/support/sync.h>
|
33
|
+
|
34
|
+
#include <netinet/in.h>
|
35
|
+
|
36
|
+
#include "src/core/lib/channel/channel_args.h"
|
37
|
+
#include "src/core/lib/gpr/host_port.h"
|
38
|
+
#include "src/core/lib/iomgr/cfstream_handle.h"
|
39
|
+
#include "src/core/lib/iomgr/closure.h"
|
40
|
+
#include "src/core/lib/iomgr/endpoint_cfstream.h"
|
41
|
+
#include "src/core/lib/iomgr/error.h"
|
42
|
+
#include "src/core/lib/iomgr/error_cfstream.h"
|
43
|
+
#include "src/core/lib/iomgr/sockaddr_utils.h"
|
44
|
+
#include "src/core/lib/iomgr/tcp_client.h"
|
45
|
+
#include "src/core/lib/iomgr/timer.h"
|
46
|
+
|
47
|
+
extern grpc_core::TraceFlag grpc_tcp_trace;
|
48
|
+
|
49
|
+
typedef struct CFStreamConnect {
|
50
|
+
gpr_mu mu;
|
51
|
+
gpr_refcount refcount;
|
52
|
+
|
53
|
+
CFReadStreamRef read_stream;
|
54
|
+
CFWriteStreamRef write_stream;
|
55
|
+
CFStreamHandle* stream_handle;
|
56
|
+
|
57
|
+
grpc_timer alarm;
|
58
|
+
grpc_closure on_alarm;
|
59
|
+
grpc_closure on_open;
|
60
|
+
|
61
|
+
bool read_stream_open;
|
62
|
+
bool write_stream_open;
|
63
|
+
bool failed;
|
64
|
+
|
65
|
+
grpc_closure* closure;
|
66
|
+
grpc_endpoint** endpoint;
|
67
|
+
int refs;
|
68
|
+
char* addr_name;
|
69
|
+
grpc_resource_quota* resource_quota;
|
70
|
+
} CFStreamConnect;
|
71
|
+
|
72
|
+
static void CFStreamConnectCleanup(CFStreamConnect* connect) {
|
73
|
+
grpc_resource_quota_unref_internal(connect->resource_quota);
|
74
|
+
CFSTREAM_HANDLE_UNREF(connect->stream_handle, "async connect clean up");
|
75
|
+
CFRelease(connect->read_stream);
|
76
|
+
CFRelease(connect->write_stream);
|
77
|
+
gpr_mu_destroy(&connect->mu);
|
78
|
+
gpr_free(connect->addr_name);
|
79
|
+
gpr_free(connect);
|
80
|
+
}
|
81
|
+
|
82
|
+
static void OnAlarm(void* arg, grpc_error* error) {
|
83
|
+
CFStreamConnect* connect = static_cast<CFStreamConnect*>(arg);
|
84
|
+
if (grpc_tcp_trace.enabled()) {
|
85
|
+
gpr_log(GPR_DEBUG, "CLIENT_CONNECT :%p OnAlarm, error:%p", connect, error);
|
86
|
+
}
|
87
|
+
gpr_mu_lock(&connect->mu);
|
88
|
+
grpc_closure* closure = connect->closure;
|
89
|
+
connect->closure = nil;
|
90
|
+
const bool done = (--connect->refs == 0);
|
91
|
+
gpr_mu_unlock(&connect->mu);
|
92
|
+
// Only schedule a callback once, by either OnAlarm or OnOpen. The
|
93
|
+
// first one issues callback while the second one does cleanup.
|
94
|
+
if (done) {
|
95
|
+
CFStreamConnectCleanup(connect);
|
96
|
+
} else {
|
97
|
+
grpc_error* error =
|
98
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("connect() timed out");
|
99
|
+
GRPC_CLOSURE_SCHED(closure, error);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
static void OnOpen(void* arg, grpc_error* error) {
|
104
|
+
CFStreamConnect* connect = static_cast<CFStreamConnect*>(arg);
|
105
|
+
if (grpc_tcp_trace.enabled()) {
|
106
|
+
gpr_log(GPR_DEBUG, "CLIENT_CONNECT :%p OnOpen, error:%p", connect, error);
|
107
|
+
}
|
108
|
+
gpr_mu_lock(&connect->mu);
|
109
|
+
grpc_timer_cancel(&connect->alarm);
|
110
|
+
grpc_closure* closure = connect->closure;
|
111
|
+
connect->closure = nil;
|
112
|
+
|
113
|
+
bool done = (--connect->refs == 0);
|
114
|
+
grpc_endpoint** endpoint = connect->endpoint;
|
115
|
+
|
116
|
+
// Only schedule a callback once, by either OnAlarm or OnOpen. The
|
117
|
+
// first one issues callback while the second one does cleanup.
|
118
|
+
if (done) {
|
119
|
+
gpr_mu_unlock(&connect->mu);
|
120
|
+
CFStreamConnectCleanup(connect);
|
121
|
+
} else {
|
122
|
+
if (error == GRPC_ERROR_NONE) {
|
123
|
+
CFErrorRef stream_error = CFReadStreamCopyError(connect->read_stream);
|
124
|
+
if (stream_error == NULL) {
|
125
|
+
stream_error = CFWriteStreamCopyError(connect->write_stream);
|
126
|
+
}
|
127
|
+
if (stream_error) {
|
128
|
+
error = GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "connect() error");
|
129
|
+
CFRelease(stream_error);
|
130
|
+
}
|
131
|
+
if (error == GRPC_ERROR_NONE) {
|
132
|
+
*endpoint = grpc_cfstream_endpoint_create(
|
133
|
+
connect->read_stream, connect->write_stream, connect->addr_name,
|
134
|
+
connect->resource_quota, connect->stream_handle);
|
135
|
+
}
|
136
|
+
} else {
|
137
|
+
GRPC_ERROR_REF(error);
|
138
|
+
}
|
139
|
+
gpr_mu_unlock(&connect->mu);
|
140
|
+
GRPC_CLOSURE_SCHED(closure, error);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
static void ParseResolvedAddress(const grpc_resolved_address* addr,
|
145
|
+
CFStringRef* host, int* port) {
|
146
|
+
char *host_port, *host_string, *port_string;
|
147
|
+
grpc_sockaddr_to_string(&host_port, addr, 1);
|
148
|
+
gpr_split_host_port(host_port, &host_string, &port_string);
|
149
|
+
*host = CFStringCreateWithCString(NULL, host_string, kCFStringEncodingUTF8);
|
150
|
+
gpr_free(host_string);
|
151
|
+
gpr_free(port_string);
|
152
|
+
gpr_free(host_port);
|
153
|
+
*port = grpc_sockaddr_get_port(addr);
|
154
|
+
}
|
155
|
+
|
156
|
+
static void CFStreamClientConnect(grpc_closure* closure, grpc_endpoint** ep,
|
157
|
+
grpc_pollset_set* interested_parties,
|
158
|
+
const grpc_channel_args* channel_args,
|
159
|
+
const grpc_resolved_address* resolved_addr,
|
160
|
+
grpc_millis deadline) {
|
161
|
+
CFStreamConnect* connect;
|
162
|
+
|
163
|
+
connect = (CFStreamConnect*)gpr_zalloc(sizeof(CFStreamConnect));
|
164
|
+
connect->closure = closure;
|
165
|
+
connect->endpoint = ep;
|
166
|
+
connect->addr_name = grpc_sockaddr_to_uri(resolved_addr);
|
167
|
+
// connect->resource_quota = resource_quota;
|
168
|
+
connect->refs = 2; // One for the connect operation, one for the timer.
|
169
|
+
gpr_ref_init(&connect->refcount, 1);
|
170
|
+
gpr_mu_init(&connect->mu);
|
171
|
+
|
172
|
+
if (grpc_tcp_trace.enabled()) {
|
173
|
+
gpr_log(GPR_DEBUG, "CLIENT_CONNECT: %p, %s: asynchronously connecting",
|
174
|
+
connect, connect->addr_name);
|
175
|
+
}
|
176
|
+
|
177
|
+
grpc_resource_quota* resource_quota = grpc_resource_quota_create(NULL);
|
178
|
+
if (channel_args != NULL) {
|
179
|
+
for (size_t i = 0; i < channel_args->num_args; i++) {
|
180
|
+
if (0 == strcmp(channel_args->args[i].key, GRPC_ARG_RESOURCE_QUOTA)) {
|
181
|
+
grpc_resource_quota_unref_internal(resource_quota);
|
182
|
+
resource_quota = grpc_resource_quota_ref_internal(
|
183
|
+
(grpc_resource_quota*)channel_args->args[i].value.pointer.p);
|
184
|
+
}
|
185
|
+
}
|
186
|
+
}
|
187
|
+
connect->resource_quota = resource_quota;
|
188
|
+
|
189
|
+
CFReadStreamRef read_stream;
|
190
|
+
CFWriteStreamRef write_stream;
|
191
|
+
|
192
|
+
CFStringRef host;
|
193
|
+
int port;
|
194
|
+
ParseResolvedAddress(resolved_addr, &host, &port);
|
195
|
+
CFStreamCreatePairWithSocketToHost(NULL, host, port, &read_stream,
|
196
|
+
&write_stream);
|
197
|
+
CFRelease(host);
|
198
|
+
connect->read_stream = read_stream;
|
199
|
+
connect->write_stream = write_stream;
|
200
|
+
connect->stream_handle =
|
201
|
+
CFStreamHandle::CreateStreamHandle(read_stream, write_stream);
|
202
|
+
GRPC_CLOSURE_INIT(&connect->on_open, OnOpen, static_cast<void*>(connect),
|
203
|
+
grpc_schedule_on_exec_ctx);
|
204
|
+
connect->stream_handle->NotifyOnOpen(&connect->on_open);
|
205
|
+
GRPC_CLOSURE_INIT(&connect->on_alarm, OnAlarm, connect,
|
206
|
+
grpc_schedule_on_exec_ctx);
|
207
|
+
gpr_mu_lock(&connect->mu);
|
208
|
+
CFReadStreamOpen(read_stream);
|
209
|
+
CFWriteStreamOpen(write_stream);
|
210
|
+
grpc_timer_init(&connect->alarm, deadline, &connect->on_alarm);
|
211
|
+
gpr_mu_unlock(&connect->mu);
|
212
|
+
}
|
213
|
+
|
214
|
+
grpc_tcp_client_vtable grpc_cfstream_client_vtable = {CFStreamClientConnect};
|
215
|
+
|
216
|
+
#endif /* GRPC_CFSTREAM_CLIENT */
|
@@ -64,7 +64,7 @@ static void on_alarm(void* acp, grpc_error* error) {
|
|
64
64
|
int done;
|
65
65
|
grpc_custom_socket* socket = (grpc_custom_socket*)acp;
|
66
66
|
grpc_custom_tcp_connect* connect = socket->connector;
|
67
|
-
if (grpc_tcp_trace
|
67
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
68
68
|
const char* str = grpc_error_string(error);
|
69
69
|
gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_alarm: error=%s",
|
70
70
|
connect->addr_name, str);
|
@@ -146,7 +146,7 @@ static void tcp_connect(grpc_closure* closure, grpc_endpoint** ep,
|
|
146
146
|
socket->listener = nullptr;
|
147
147
|
connect->refs = 2;
|
148
148
|
|
149
|
-
if (grpc_tcp_trace
|
149
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
150
150
|
gpr_log(GPR_INFO, "CLIENT_CONNECT: %p %s: asynchronously connecting",
|
151
151
|
socket, connect->addr_name);
|
152
152
|
}
|
@@ -108,7 +108,7 @@ done:
|
|
108
108
|
static void tc_on_alarm(void* acp, grpc_error* error) {
|
109
109
|
int done;
|
110
110
|
async_connect* ac = static_cast<async_connect*>(acp);
|
111
|
-
if (grpc_tcp_trace
|
111
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
112
112
|
const char* str = grpc_error_string(error);
|
113
113
|
gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_alarm: error=%s", ac->addr_str,
|
114
114
|
str);
|
@@ -145,7 +145,7 @@ static void on_writable(void* acp, grpc_error* error) {
|
|
145
145
|
|
146
146
|
GRPC_ERROR_REF(error);
|
147
147
|
|
148
|
-
if (grpc_tcp_trace
|
148
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
149
149
|
const char* str = grpc_error_string(error);
|
150
150
|
gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_writable: error=%s", ac->addr_str,
|
151
151
|
str);
|
@@ -328,7 +328,7 @@ void grpc_tcp_client_create_from_prepared_fd(
|
|
328
328
|
grpc_schedule_on_exec_ctx);
|
329
329
|
ac->channel_args = grpc_channel_args_copy(channel_args);
|
330
330
|
|
331
|
-
if (grpc_tcp_trace
|
331
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
332
332
|
gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: asynchronously connecting fd %p",
|
333
333
|
ac->addr_str, fdobj);
|
334
334
|
}
|
@@ -148,7 +148,7 @@ static void tcp_connect(grpc_closure* on_done, grpc_endpoint** endpoint,
|
|
148
148
|
}
|
149
149
|
|
150
150
|
sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
|
151
|
-
|
151
|
+
grpc_get_default_wsa_socket_flags());
|
152
152
|
if (sock == INVALID_SOCKET) {
|
153
153
|
error = GRPC_WSA_ERROR(WSAGetLastError(), "WSASocket");
|
154
154
|
goto failure;
|
@@ -88,7 +88,7 @@ static void tcp_free(grpc_custom_socket* s) {
|
|
88
88
|
#define TCP_REF(tcp, reason) tcp_ref((tcp), (reason), __FILE__, __LINE__)
|
89
89
|
static void tcp_unref(custom_tcp_endpoint* tcp, const char* reason,
|
90
90
|
const char* file, int line) {
|
91
|
-
if (grpc_tcp_trace
|
91
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
92
92
|
gpr_atm val = gpr_atm_no_barrier_load(&tcp->refcount.count);
|
93
93
|
gpr_log(file, line, GPR_LOG_SEVERITY_ERROR,
|
94
94
|
"TCP unref %p : %s %" PRIdPTR " -> %" PRIdPTR, tcp->socket, reason,
|
@@ -101,7 +101,7 @@ static void tcp_unref(custom_tcp_endpoint* tcp, const char* reason,
|
|
101
101
|
|
102
102
|
static void tcp_ref(custom_tcp_endpoint* tcp, const char* reason,
|
103
103
|
const char* file, int line) {
|
104
|
-
if (grpc_tcp_trace
|
104
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
105
105
|
gpr_atm val = gpr_atm_no_barrier_load(&tcp->refcount.count);
|
106
106
|
gpr_log(file, line, GPR_LOG_SEVERITY_ERROR,
|
107
107
|
"TCP ref %p : %s %" PRIdPTR " -> %" PRIdPTR, tcp->socket, reason,
|
@@ -123,7 +123,7 @@ static void tcp_ref(custom_tcp_endpoint* tcp) { gpr_ref(&tcp->refcount); }
|
|
123
123
|
|
124
124
|
static void call_read_cb(custom_tcp_endpoint* tcp, grpc_error* error) {
|
125
125
|
grpc_closure* cb = tcp->read_cb;
|
126
|
-
if (grpc_tcp_trace
|
126
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
127
127
|
gpr_log(GPR_INFO, "TCP:%p call_cb %p %p:%p", tcp->socket, cb, cb->cb,
|
128
128
|
cb->cb_arg);
|
129
129
|
size_t i;
|
@@ -169,7 +169,7 @@ static void custom_read_callback(grpc_custom_socket* socket, size_t nread,
|
|
169
169
|
|
170
170
|
static void tcp_read_allocation_done(void* tcpp, grpc_error* error) {
|
171
171
|
custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)tcpp;
|
172
|
-
if (grpc_tcp_trace
|
172
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
173
173
|
gpr_log(GPR_INFO, "TCP:%p read_allocation_done: %s", tcp->socket,
|
174
174
|
grpc_error_string(error));
|
175
175
|
}
|
@@ -185,7 +185,7 @@ static void tcp_read_allocation_done(void* tcpp, grpc_error* error) {
|
|
185
185
|
grpc_slice_buffer_reset_and_unref_internal(tcp->read_slices);
|
186
186
|
call_read_cb(tcp, GRPC_ERROR_REF(error));
|
187
187
|
}
|
188
|
-
if (grpc_tcp_trace
|
188
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
189
189
|
const char* str = grpc_error_string(error);
|
190
190
|
gpr_log(GPR_INFO, "Initiating read on %p: error=%s", tcp->socket, str);
|
191
191
|
}
|
@@ -211,7 +211,7 @@ static void custom_write_callback(grpc_custom_socket* socket,
|
|
211
211
|
custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)socket->endpoint;
|
212
212
|
grpc_closure* cb = tcp->write_cb;
|
213
213
|
tcp->write_cb = nullptr;
|
214
|
-
if (grpc_tcp_trace
|
214
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
215
215
|
const char* str = grpc_error_string(error);
|
216
216
|
gpr_log(GPR_INFO, "write complete on %p: error=%s", tcp->socket, str);
|
217
217
|
}
|
@@ -224,7 +224,7 @@ static void endpoint_write(grpc_endpoint* ep, grpc_slice_buffer* write_slices,
|
|
224
224
|
custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)ep;
|
225
225
|
GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD();
|
226
226
|
|
227
|
-
if (grpc_tcp_trace
|
227
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
228
228
|
size_t j;
|
229
229
|
|
230
230
|
for (j = 0; j < write_slices->count; j++) {
|
@@ -280,7 +280,7 @@ static void endpoint_delete_from_pollset_set(grpc_endpoint* ep,
|
|
280
280
|
static void endpoint_shutdown(grpc_endpoint* ep, grpc_error* why) {
|
281
281
|
custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)ep;
|
282
282
|
if (!tcp->shutting_down) {
|
283
|
-
if (grpc_tcp_trace
|
283
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
284
284
|
const char* str = grpc_error_string(why);
|
285
285
|
gpr_log(GPR_INFO, "TCP %p shutdown why=%s", tcp->socket, str);
|
286
286
|
}
|
@@ -345,7 +345,7 @@ grpc_endpoint* custom_tcp_endpoint_create(grpc_custom_socket* socket,
|
|
345
345
|
(custom_tcp_endpoint*)gpr_malloc(sizeof(custom_tcp_endpoint));
|
346
346
|
grpc_core::ExecCtx exec_ctx;
|
347
347
|
|
348
|
-
if (grpc_tcp_trace
|
348
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
349
349
|
gpr_log(GPR_INFO, "Creating TCP endpoint %p", socket);
|
350
350
|
}
|
351
351
|
memset(tcp, 0, sizeof(custom_tcp_endpoint));
|
@@ -163,7 +163,7 @@ static void tcp_drop_uncovered_then_handle_write(void* arg /* grpc_tcp */,
|
|
163
163
|
|
164
164
|
static void done_poller(void* bp, grpc_error* error_ignored) {
|
165
165
|
backup_poller* p = static_cast<backup_poller*>(bp);
|
166
|
-
if (grpc_tcp_trace
|
166
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
167
167
|
gpr_log(GPR_INFO, "BACKUP_POLLER:%p destroy", p);
|
168
168
|
}
|
169
169
|
grpc_pollset_destroy(BACKUP_POLLER_POLLSET(p));
|
@@ -172,7 +172,7 @@ static void done_poller(void* bp, grpc_error* error_ignored) {
|
|
172
172
|
|
173
173
|
static void run_poller(void* bp, grpc_error* error_ignored) {
|
174
174
|
backup_poller* p = static_cast<backup_poller*>(bp);
|
175
|
-
if (grpc_tcp_trace
|
175
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
176
176
|
gpr_log(GPR_INFO, "BACKUP_POLLER:%p run", p);
|
177
177
|
}
|
178
178
|
gpr_mu_lock(p->pollset_mu);
|
@@ -188,18 +188,18 @@ static void run_poller(void* bp, grpc_error* error_ignored) {
|
|
188
188
|
gpr_atm_full_cas(&g_uncovered_notifications_pending, 1, 0)) {
|
189
189
|
gpr_mu_lock(p->pollset_mu);
|
190
190
|
bool cas_ok = gpr_atm_full_cas(&g_backup_poller, (gpr_atm)p, 0);
|
191
|
-
if (grpc_tcp_trace
|
191
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
192
192
|
gpr_log(GPR_INFO, "BACKUP_POLLER:%p done cas_ok=%d", p, cas_ok);
|
193
193
|
}
|
194
194
|
gpr_mu_unlock(p->pollset_mu);
|
195
|
-
if (grpc_tcp_trace
|
195
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
196
196
|
gpr_log(GPR_INFO, "BACKUP_POLLER:%p shutdown", p);
|
197
197
|
}
|
198
198
|
grpc_pollset_shutdown(BACKUP_POLLER_POLLSET(p),
|
199
199
|
GRPC_CLOSURE_INIT(&p->run_poller, done_poller, p,
|
200
200
|
grpc_schedule_on_exec_ctx));
|
201
201
|
} else {
|
202
|
-
if (grpc_tcp_trace
|
202
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
203
203
|
gpr_log(GPR_INFO, "BACKUP_POLLER:%p reschedule", p);
|
204
204
|
}
|
205
205
|
GRPC_CLOSURE_SCHED(&p->run_poller, GRPC_ERROR_NONE);
|
@@ -210,7 +210,7 @@ static void drop_uncovered(grpc_tcp* tcp) {
|
|
210
210
|
backup_poller* p = (backup_poller*)gpr_atm_acq_load(&g_backup_poller);
|
211
211
|
gpr_atm old_count =
|
212
212
|
gpr_atm_full_fetch_add(&g_uncovered_notifications_pending, -1);
|
213
|
-
if (grpc_tcp_trace
|
213
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
214
214
|
gpr_log(GPR_INFO, "BACKUP_POLLER:%p uncover cnt %d->%d", p,
|
215
215
|
static_cast<int>(old_count), static_cast<int>(old_count) - 1);
|
216
216
|
}
|
@@ -228,7 +228,7 @@ static void cover_self(grpc_tcp* tcp) {
|
|
228
228
|
backup_poller* p;
|
229
229
|
gpr_atm old_count =
|
230
230
|
gpr_atm_no_barrier_fetch_add(&g_uncovered_notifications_pending, 2);
|
231
|
-
if (grpc_tcp_trace
|
231
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
232
232
|
gpr_log(GPR_INFO, "BACKUP_POLLER: cover cnt %d->%d",
|
233
233
|
static_cast<int>(old_count), 2 + static_cast<int>(old_count));
|
234
234
|
}
|
@@ -236,7 +236,7 @@ static void cover_self(grpc_tcp* tcp) {
|
|
236
236
|
GRPC_STATS_INC_TCP_BACKUP_POLLERS_CREATED();
|
237
237
|
p = static_cast<backup_poller*>(
|
238
238
|
gpr_zalloc(sizeof(*p) + grpc_pollset_size()));
|
239
|
-
if (grpc_tcp_trace
|
239
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
240
240
|
gpr_log(GPR_INFO, "BACKUP_POLLER:%p create", p);
|
241
241
|
}
|
242
242
|
grpc_pollset_init(BACKUP_POLLER_POLLSET(p), &p->pollset_mu);
|
@@ -251,7 +251,7 @@ static void cover_self(grpc_tcp* tcp) {
|
|
251
251
|
// spin waiting for backup poller
|
252
252
|
}
|
253
253
|
}
|
254
|
-
if (grpc_tcp_trace
|
254
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
255
255
|
gpr_log(GPR_INFO, "BACKUP_POLLER:%p add %p", p, tcp);
|
256
256
|
}
|
257
257
|
grpc_pollset_add_fd(BACKUP_POLLER_POLLSET(p), tcp->em_fd);
|
@@ -261,32 +261,24 @@ static void cover_self(grpc_tcp* tcp) {
|
|
261
261
|
}
|
262
262
|
|
263
263
|
static void notify_on_read(grpc_tcp* tcp) {
|
264
|
-
if (grpc_tcp_trace
|
264
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
265
265
|
gpr_log(GPR_INFO, "TCP:%p notify_on_read", tcp);
|
266
266
|
}
|
267
267
|
grpc_fd_notify_on_read(tcp->em_fd, &tcp->read_done_closure);
|
268
268
|
}
|
269
269
|
|
270
270
|
static void notify_on_write(grpc_tcp* tcp) {
|
271
|
-
if (grpc_tcp_trace
|
271
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
272
272
|
gpr_log(GPR_INFO, "TCP:%p notify_on_write", tcp);
|
273
273
|
}
|
274
|
-
if (grpc_event_engine_run_in_background()) {
|
275
|
-
// If there is a polling engine always running in the background, there is
|
276
|
-
// no need to run the backup poller.
|
277
|
-
GRPC_CLOSURE_INIT(&tcp->write_done_closure, tcp_handle_write, tcp,
|
278
|
-
grpc_schedule_on_exec_ctx);
|
279
|
-
} else {
|
274
|
+
if (!grpc_event_engine_run_in_background()) {
|
280
275
|
cover_self(tcp);
|
281
|
-
GRPC_CLOSURE_INIT(&tcp->write_done_closure,
|
282
|
-
tcp_drop_uncovered_then_handle_write, tcp,
|
283
|
-
grpc_schedule_on_exec_ctx);
|
284
276
|
}
|
285
277
|
grpc_fd_notify_on_write(tcp->em_fd, &tcp->write_done_closure);
|
286
278
|
}
|
287
279
|
|
288
280
|
static void tcp_drop_uncovered_then_handle_write(void* arg, grpc_error* error) {
|
289
|
-
if (grpc_tcp_trace
|
281
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
290
282
|
gpr_log(GPR_INFO, "TCP:%p got_write: %s", arg, grpc_error_string(error));
|
291
283
|
}
|
292
284
|
drop_uncovered(static_cast<grpc_tcp*>(arg));
|
@@ -371,7 +363,7 @@ static void tcp_free(grpc_tcp* tcp) {
|
|
371
363
|
#define TCP_REF(tcp, reason) tcp_ref((tcp), (reason), __FILE__, __LINE__)
|
372
364
|
static void tcp_unref(grpc_tcp* tcp, const char* reason, const char* file,
|
373
365
|
int line) {
|
374
|
-
if (grpc_tcp_trace
|
366
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
375
367
|
gpr_atm val = gpr_atm_no_barrier_load(&tcp->refcount.count);
|
376
368
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
377
369
|
"TCP unref %p : %s %" PRIdPTR " -> %" PRIdPTR, tcp, reason, val,
|
@@ -384,7 +376,7 @@ static void tcp_unref(grpc_tcp* tcp, const char* reason, const char* file,
|
|
384
376
|
|
385
377
|
static void tcp_ref(grpc_tcp* tcp, const char* reason, const char* file,
|
386
378
|
int line) {
|
387
|
-
if (grpc_tcp_trace
|
379
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
388
380
|
gpr_atm val = gpr_atm_no_barrier_load(&tcp->refcount.count);
|
389
381
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
390
382
|
"TCP ref %p : %s %" PRIdPTR " -> %" PRIdPTR, tcp, reason, val,
|
@@ -417,7 +409,7 @@ static void tcp_destroy(grpc_endpoint* ep) {
|
|
417
409
|
static void call_read_cb(grpc_tcp* tcp, grpc_error* error) {
|
418
410
|
grpc_closure* cb = tcp->read_cb;
|
419
411
|
|
420
|
-
if (grpc_tcp_trace
|
412
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
421
413
|
gpr_log(GPR_INFO, "TCP:%p call_cb %p %p:%p", tcp, cb, cb->cb, cb->cb_arg);
|
422
414
|
size_t i;
|
423
415
|
const char* str = grpc_error_string(error);
|
@@ -581,7 +573,7 @@ static void tcp_do_read(grpc_tcp* tcp) {
|
|
581
573
|
|
582
574
|
static void tcp_read_allocation_done(void* tcpp, grpc_error* error) {
|
583
575
|
grpc_tcp* tcp = static_cast<grpc_tcp*>(tcpp);
|
584
|
-
if (grpc_tcp_trace
|
576
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
585
577
|
gpr_log(GPR_INFO, "TCP:%p read_allocation_done: %s", tcp,
|
586
578
|
grpc_error_string(error));
|
587
579
|
}
|
@@ -600,13 +592,13 @@ static void tcp_continue_read(grpc_tcp* tcp) {
|
|
600
592
|
/* Wait for allocation only when there is no buffer left. */
|
601
593
|
if (tcp->incoming_buffer->length == 0 &&
|
602
594
|
tcp->incoming_buffer->count < MAX_READ_IOVEC) {
|
603
|
-
if (grpc_tcp_trace
|
595
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
604
596
|
gpr_log(GPR_INFO, "TCP:%p alloc_slices", tcp);
|
605
597
|
}
|
606
598
|
grpc_resource_user_alloc_slices(&tcp->slice_allocator, target_read_size, 1,
|
607
599
|
tcp->incoming_buffer);
|
608
600
|
} else {
|
609
|
-
if (grpc_tcp_trace
|
601
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
610
602
|
gpr_log(GPR_INFO, "TCP:%p do_read", tcp);
|
611
603
|
}
|
612
604
|
tcp_do_read(tcp);
|
@@ -615,7 +607,7 @@ static void tcp_continue_read(grpc_tcp* tcp) {
|
|
615
607
|
|
616
608
|
static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error* error) {
|
617
609
|
grpc_tcp* tcp = static_cast<grpc_tcp*>(arg);
|
618
|
-
if (grpc_tcp_trace
|
610
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
619
611
|
gpr_log(GPR_INFO, "TCP:%p got_read: %s", tcp, grpc_error_string(error));
|
620
612
|
}
|
621
613
|
|
@@ -694,7 +686,7 @@ static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg,
|
|
694
686
|
if (setsockopt(tcp->fd, SOL_SOCKET, SO_TIMESTAMPING,
|
695
687
|
static_cast<void*>(&opt), sizeof(opt)) != 0) {
|
696
688
|
grpc_slice_buffer_reset_and_unref_internal(tcp->outgoing_buffer);
|
697
|
-
if (grpc_tcp_trace
|
689
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
698
690
|
gpr_log(GPR_ERROR, "Failed to set timestamping options on the socket.");
|
699
691
|
}
|
700
692
|
return false;
|
@@ -743,7 +735,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg,
|
|
743
735
|
auto next_cmsg = CMSG_NXTHDR(msg, cmsg);
|
744
736
|
cmsghdr* opt_stats = nullptr;
|
745
737
|
if (next_cmsg == nullptr) {
|
746
|
-
if (grpc_tcp_trace
|
738
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
747
739
|
gpr_log(GPR_ERROR, "Received timestamp without extended error");
|
748
740
|
}
|
749
741
|
return cmsg;
|
@@ -755,7 +747,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg,
|
|
755
747
|
opt_stats = next_cmsg;
|
756
748
|
next_cmsg = CMSG_NXTHDR(msg, opt_stats);
|
757
749
|
if (next_cmsg == nullptr) {
|
758
|
-
if (grpc_tcp_trace
|
750
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
759
751
|
gpr_log(GPR_ERROR, "Received timestamp without extended error");
|
760
752
|
}
|
761
753
|
return opt_stats;
|
@@ -765,7 +757,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg,
|
|
765
757
|
if (!(next_cmsg->cmsg_level == SOL_IP || next_cmsg->cmsg_level == SOL_IPV6) ||
|
766
758
|
!(next_cmsg->cmsg_type == IP_RECVERR ||
|
767
759
|
next_cmsg->cmsg_type == IPV6_RECVERR)) {
|
768
|
-
if (grpc_tcp_trace
|
760
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
769
761
|
gpr_log(GPR_ERROR, "Unexpected control message");
|
770
762
|
}
|
771
763
|
return cmsg;
|
@@ -847,7 +839,7 @@ static void process_errors(grpc_tcp* tcp) {
|
|
847
839
|
cmsg->cmsg_type != SCM_TIMESTAMPING) {
|
848
840
|
/* Got a control message that is not a timestamp. Don't know how to
|
849
841
|
* handle this. */
|
850
|
-
if (grpc_tcp_trace
|
842
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
851
843
|
gpr_log(GPR_INFO,
|
852
844
|
"unknown control message cmsg_level:%d cmsg_type:%d",
|
853
845
|
cmsg->cmsg_level, cmsg->cmsg_type);
|
@@ -865,7 +857,7 @@ static void process_errors(grpc_tcp* tcp) {
|
|
865
857
|
|
866
858
|
static void tcp_handle_error(void* arg /* grpc_tcp */, grpc_error* error) {
|
867
859
|
grpc_tcp* tcp = static_cast<grpc_tcp*>(arg);
|
868
|
-
if (grpc_tcp_trace
|
860
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
869
861
|
gpr_log(GPR_INFO, "TCP:%p got_error: %s", tcp, grpc_error_string(error));
|
870
862
|
}
|
871
863
|
|
@@ -884,8 +876,6 @@ static void tcp_handle_error(void* arg /* grpc_tcp */, grpc_error* error) {
|
|
884
876
|
* ready. */
|
885
877
|
grpc_fd_set_readable(tcp->em_fd);
|
886
878
|
grpc_fd_set_writable(tcp->em_fd);
|
887
|
-
GRPC_CLOSURE_INIT(&tcp->error_closure, tcp_handle_error, tcp,
|
888
|
-
grpc_schedule_on_exec_ctx);
|
889
879
|
grpc_fd_notify_on_error(tcp->em_fd, &tcp->error_closure);
|
890
880
|
}
|
891
881
|
|
@@ -1044,14 +1034,14 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, grpc_error* error) {
|
|
1044
1034
|
}
|
1045
1035
|
|
1046
1036
|
if (!tcp_flush(tcp, &error)) {
|
1047
|
-
if (grpc_tcp_trace
|
1037
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
1048
1038
|
gpr_log(GPR_INFO, "write: delayed");
|
1049
1039
|
}
|
1050
1040
|
notify_on_write(tcp);
|
1051
1041
|
} else {
|
1052
1042
|
cb = tcp->write_cb;
|
1053
1043
|
tcp->write_cb = nullptr;
|
1054
|
-
if (grpc_tcp_trace
|
1044
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
1055
1045
|
const char* str = grpc_error_string(error);
|
1056
1046
|
gpr_log(GPR_INFO, "write: %s", str);
|
1057
1047
|
}
|
@@ -1066,7 +1056,7 @@ static void tcp_write(grpc_endpoint* ep, grpc_slice_buffer* buf,
|
|
1066
1056
|
grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
|
1067
1057
|
grpc_error* error = GRPC_ERROR_NONE;
|
1068
1058
|
|
1069
|
-
if (grpc_tcp_trace
|
1059
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
1070
1060
|
size_t i;
|
1071
1061
|
|
1072
1062
|
for (i = 0; i < buf->count; i++) {
|
@@ -1101,12 +1091,12 @@ static void tcp_write(grpc_endpoint* ep, grpc_slice_buffer* buf,
|
|
1101
1091
|
if (!tcp_flush(tcp, &error)) {
|
1102
1092
|
TCP_REF(tcp, "write");
|
1103
1093
|
tcp->write_cb = cb;
|
1104
|
-
if (grpc_tcp_trace
|
1094
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
1105
1095
|
gpr_log(GPR_INFO, "write: delayed");
|
1106
1096
|
}
|
1107
1097
|
notify_on_write(tcp);
|
1108
1098
|
} else {
|
1109
|
-
if (grpc_tcp_trace
|
1099
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
|
1110
1100
|
const char* str = grpc_error_string(error);
|
1111
1101
|
gpr_log(GPR_INFO, "write: %s", str);
|
1112
1102
|
}
|
@@ -1248,6 +1238,16 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
|
|
1248
1238
|
tcp->tb_head = nullptr;
|
1249
1239
|
GRPC_CLOSURE_INIT(&tcp->read_done_closure, tcp_handle_read, tcp,
|
1250
1240
|
grpc_schedule_on_exec_ctx);
|
1241
|
+
if (grpc_event_engine_run_in_background()) {
|
1242
|
+
// If there is a polling engine always running in the background, there is
|
1243
|
+
// no need to run the backup poller.
|
1244
|
+
GRPC_CLOSURE_INIT(&tcp->write_done_closure, tcp_handle_write, tcp,
|
1245
|
+
grpc_schedule_on_exec_ctx);
|
1246
|
+
} else {
|
1247
|
+
GRPC_CLOSURE_INIT(&tcp->write_done_closure,
|
1248
|
+
tcp_drop_uncovered_then_handle_write, tcp,
|
1249
|
+
grpc_schedule_on_exec_ctx);
|
1250
|
+
}
|
1251
1251
|
/* Always assume there is something on the queue to read. */
|
1252
1252
|
tcp->inq = 1;
|
1253
1253
|
#ifdef GRPC_HAVE_TCP_INQ
|