grpc 1.1.2 → 1.2.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +1257 -404
- data/etc/roots.pem +189 -102
- data/include/grpc/census.h +7 -7
- data/include/grpc/compression.h +4 -4
- data/include/grpc/grpc.h +13 -7
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +26 -9
- data/include/grpc/impl/codegen/grpc_types.h +39 -30
- data/include/grpc/impl/codegen/slice.h +24 -6
- data/include/grpc/impl/codegen/sync.h +8 -0
- data/include/grpc/load_reporting.h +63 -0
- data/include/grpc/slice.h +37 -1
- data/include/grpc/slice_buffer.h +7 -0
- data/include/grpc/support/alloc.h +3 -0
- data/include/grpc/support/useful.h +3 -0
- data/src/core/ext/census/gen/census.pb.h +1 -1
- data/src/core/ext/census/gen/trace_context.pb.c +9 -36
- data/src/core/ext/census/gen/trace_context.pb.h +20 -26
- data/src/core/ext/census/grpc_filter.c +3 -5
- data/src/core/ext/census/trace_context.c +1 -1
- data/src/core/ext/census/trace_context.h +3 -0
- data/src/core/ext/census/trace_label.h +61 -0
- data/src/core/ext/census/trace_propagation.h +63 -0
- data/src/core/ext/census/trace_status.h +45 -0
- data/src/core/ext/census/trace_string.h +50 -0
- data/src/core/ext/census/tracing.c +31 -11
- data/src/core/ext/census/tracing.h +124 -0
- data/src/core/ext/client_channel/client_channel.c +456 -368
- data/src/core/ext/client_channel/client_channel.h +4 -0
- data/src/core/ext/client_channel/client_channel_plugin.c +6 -1
- data/src/core/ext/client_channel/connector.c +3 -3
- data/src/core/ext/client_channel/connector.h +4 -3
- data/src/core/ext/client_channel/http_connect_handshaker.c +62 -72
- data/src/core/ext/client_channel/http_connect_handshaker.h +7 -10
- data/src/core/ext/client_channel/http_proxy.c +125 -0
- data/src/core/ext/client_channel/http_proxy.h +39 -0
- data/src/core/ext/client_channel/lb_policy.c +56 -35
- data/src/core/ext/client_channel/lb_policy.h +46 -39
- data/src/core/ext/client_channel/lb_policy_factory.h +1 -0
- data/src/core/ext/client_channel/parse_address.c +32 -6
- data/src/core/ext/client_channel/proxy_mapper.c +63 -0
- data/src/core/ext/client_channel/proxy_mapper.h +89 -0
- data/src/core/ext/client_channel/proxy_mapper_registry.c +133 -0
- data/src/core/ext/client_channel/proxy_mapper_registry.h +59 -0
- data/src/core/ext/client_channel/resolver.c +16 -9
- data/src/core/ext/client_channel/resolver.h +23 -12
- data/src/core/ext/client_channel/resolver_factory.h +1 -0
- data/src/core/ext/client_channel/resolver_registry.c +15 -11
- data/src/core/ext/client_channel/resolver_registry.h +5 -3
- data/src/core/ext/client_channel/subchannel.c +44 -27
- data/src/core/ext/client_channel/subchannel.h +6 -2
- data/src/core/ext/client_channel/uri_parser.c +26 -14
- data/src/core/ext/client_channel/uri_parser.h +3 -1
- data/src/core/ext/lb_policy/grpclb/grpclb.c +220 -209
- data/src/core/ext/lb_policy/grpclb/grpclb_channel.h +56 -0
- data/src/core/ext/lb_policy/grpclb/grpclb_channel_secure.c +107 -0
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +3 -6
- data/src/core/ext/lb_policy/pick_first/pick_first.c +71 -116
- data/src/core/ext/lb_policy/round_robin/round_robin.c +52 -67
- data/src/core/ext/load_reporting/load_reporting.c +20 -0
- data/src/core/ext/load_reporting/load_reporting.h +1 -16
- data/src/core/ext/load_reporting/load_reporting_filter.c +28 -54
- data/src/core/ext/resolver/dns/native/dns_resolver.c +31 -45
- data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +20 -29
- data/src/core/ext/transport/chttp2/client/chttp2_connector.c +11 -8
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +11 -2
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +143 -46
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +12 -50
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +1 -1
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +1 -1
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +7 -7
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +1 -2
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -2
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +606 -374
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +17 -5
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +9 -13
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +12 -11
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +100 -53
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +126 -70
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +13 -7
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +22 -19
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +6 -6
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +23 -11
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +6 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +169 -42
- data/src/core/ext/transport/chttp2/transport/parsing.c +98 -41
- data/src/core/ext/transport/chttp2/transport/stream_lists.c +29 -14
- data/src/core/ext/transport/chttp2/transport/writing.c +137 -15
- data/src/core/lib/channel/channel_stack.c +14 -44
- data/src/core/lib/channel/channel_stack.h +10 -17
- data/src/core/lib/channel/channel_stack_builder.c +2 -3
- data/src/core/lib/channel/compress_filter.c +54 -46
- data/src/core/lib/channel/connected_channel.c +4 -4
- data/src/core/lib/channel/connected_channel.h +5 -0
- data/src/core/lib/channel/context.h +3 -0
- data/src/core/lib/channel/deadline_filter.c +61 -61
- data/src/core/lib/channel/deadline_filter.h +8 -5
- data/src/core/lib/channel/handshaker.c +47 -7
- data/src/core/lib/channel/handshaker.h +21 -3
- data/src/core/lib/channel/http_client_filter.c +149 -99
- data/src/core/lib/channel/http_server_filter.c +163 -147
- data/src/core/lib/channel/message_size_filter.c +15 -10
- data/src/core/lib/compression/algorithm_metadata.h +4 -4
- data/src/core/lib/compression/compression.c +17 -23
- data/src/core/lib/http/httpcli.c +3 -2
- data/src/core/lib/http/httpcli.h +2 -1
- data/src/core/lib/http/httpcli_security_connector.c +2 -3
- data/src/core/lib/http/parser.c +2 -2
- data/src/core/lib/iomgr/closure.c +6 -3
- data/src/core/lib/iomgr/closure.h +4 -2
- data/src/core/lib/iomgr/combiner.c +35 -5
- data/src/core/lib/iomgr/combiner.h +21 -2
- data/src/core/lib/iomgr/endpoint.c +3 -2
- data/src/core/lib/iomgr/endpoint.h +3 -2
- data/src/core/lib/iomgr/error.c +60 -94
- data/src/core/lib/iomgr/error.h +7 -10
- data/src/core/lib/iomgr/error_internal.h +54 -0
- data/src/core/lib/iomgr/ev_epoll_linux.c +253 -109
- data/src/core/lib/iomgr/ev_poll_posix.c +61 -29
- data/src/core/lib/iomgr/ev_posix.c +7 -8
- data/src/core/lib/iomgr/ev_posix.h +4 -4
- data/src/core/lib/iomgr/exec_ctx.c +11 -6
- data/src/core/lib/iomgr/exec_ctx.h +11 -14
- data/src/core/lib/iomgr/executor.c +2 -2
- data/src/core/lib/iomgr/load_file.c +1 -1
- data/src/core/lib/iomgr/network_status_tracker.c +5 -81
- data/src/core/lib/iomgr/pollset.h +1 -3
- data/src/core/lib/iomgr/pollset_set.h +2 -1
- data/src/core/lib/iomgr/pollset_set_uv.c +2 -1
- data/src/core/lib/iomgr/pollset_set_windows.c +2 -1
- data/src/core/lib/iomgr/pollset_uv.c +25 -11
- data/src/core/lib/iomgr/pollset_windows.c +0 -11
- data/src/core/lib/iomgr/resolve_address_uv.c +50 -2
- data/src/core/lib/iomgr/resource_quota.c +41 -11
- data/src/core/lib/iomgr/resource_quota.h +6 -0
- data/src/core/lib/iomgr/sockaddr_utils.c +33 -17
- data/src/core/lib/iomgr/sockaddr_utils.h +4 -0
- data/src/core/lib/iomgr/tcp_client_posix.c +2 -3
- data/src/core/lib/iomgr/tcp_client_uv.c +1 -3
- data/src/core/lib/iomgr/tcp_client_windows.c +21 -6
- data/src/core/lib/iomgr/tcp_posix.c +4 -5
- data/src/core/lib/iomgr/tcp_server_posix.c +269 -94
- data/src/core/lib/iomgr/tcp_server_windows.c +1 -1
- data/src/core/lib/iomgr/tcp_uv.c +11 -5
- data/src/core/lib/iomgr/tcp_windows.c +20 -7
- data/src/core/lib/iomgr/timer_generic.c +15 -22
- data/src/core/lib/iomgr/timer_generic.h +1 -1
- data/src/core/lib/iomgr/timer_uv.c +10 -6
- data/src/core/lib/iomgr/timer_uv.h +1 -1
- data/src/core/lib/iomgr/udp_server.c +45 -6
- data/src/core/lib/iomgr/udp_server.h +7 -1
- data/src/core/lib/iomgr/unix_sockets_posix.c +11 -1
- data/src/core/lib/json/json.c +1 -2
- data/src/core/lib/profiling/basic_timers.c +17 -3
- data/src/core/lib/security/context/security_context.c +3 -10
- data/src/core/lib/security/credentials/composite/composite_credentials.c +4 -8
- data/src/core/lib/security/credentials/credentials.c +48 -2
- data/src/core/lib/security/credentials/credentials.h +13 -0
- data/src/core/lib/security/credentials/credentials_metadata.c +1 -2
- data/src/core/lib/security/credentials/fake/fake_credentials.c +6 -8
- data/src/core/lib/security/credentials/fake/fake_credentials.h +15 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +3 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.c +1 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +1 -2
- data/src/core/lib/security/credentials/jwt/jwt_verifier.c +5 -8
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +3 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.c +15 -13
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +2 -4
- data/src/core/lib/security/transport/client_auth_filter.c +72 -47
- data/src/core/lib/security/transport/lb_targets_info.c +70 -0
- data/src/core/lib/security/transport/lb_targets_info.h +47 -0
- data/src/core/lib/security/transport/secure_endpoint.c +3 -3
- data/src/core/lib/security/transport/security_connector.c +125 -28
- data/src/core/lib/security/transport/security_connector.h +4 -3
- data/src/core/lib/security/transport/security_handshaker.c +13 -9
- data/src/core/lib/security/transport/server_auth_filter.c +31 -40
- data/src/core/lib/security/util/b64.c +1 -1
- data/src/core/lib/slice/slice.c +110 -20
- data/src/core/lib/slice/slice_buffer.c +92 -39
- data/src/core/lib/{transport/mdstr_hash_table.c → slice/slice_hash_table.c} +40 -33
- data/src/core/lib/{transport/mdstr_hash_table.h → slice/slice_hash_table.h} +21 -21
- data/src/core/lib/slice/slice_intern.c +346 -0
- data/src/core/lib/slice/slice_internal.h +15 -0
- data/src/core/lib/slice/slice_string_helpers.c +5 -0
- data/src/core/lib/slice/slice_string_helpers.h +5 -0
- data/src/core/lib/support/alloc.c +26 -1
- data/src/core/lib/support/cmdline.c +2 -4
- data/src/core/lib/support/cpu_posix.c +2 -7
- data/src/core/lib/support/histogram.c +1 -2
- data/src/core/lib/support/log_posix.c +8 -4
- data/src/core/lib/support/spinlock.h +52 -0
- data/src/core/lib/support/subprocess_posix.c +1 -2
- data/src/core/lib/support/sync.c +7 -1
- data/src/core/lib/support/sync_posix.c +9 -0
- data/src/core/lib/support/time_windows.c +7 -1
- data/src/core/lib/surface/call.c +647 -629
- data/src/core/lib/surface/call.h +4 -1
- data/src/core/lib/surface/call_details.c +8 -2
- data/src/core/lib/surface/call_log_batch.c +17 -6
- data/src/core/lib/surface/channel.c +49 -59
- data/src/core/lib/surface/channel.h +5 -6
- data/src/core/lib/surface/completion_queue.c +16 -45
- data/src/core/lib/surface/completion_queue.h +0 -3
- data/src/core/lib/surface/init.c +6 -2
- data/src/core/lib/surface/init_secure.c +1 -1
- data/src/core/lib/surface/lame_client.c +14 -4
- data/src/core/lib/surface/server.c +79 -82
- data/src/core/lib/surface/validate_metadata.c +46 -15
- data/src/core/lib/surface/validate_metadata.h +43 -0
- data/src/core/lib/surface/version.c +2 -2
- data/src/core/lib/transport/bdp_estimator.c +104 -0
- data/src/core/lib/transport/bdp_estimator.h +76 -0
- data/src/core/lib/transport/connectivity_state.c +33 -13
- data/src/core/lib/transport/connectivity_state.h +15 -5
- data/src/core/lib/transport/error_utils.c +124 -0
- data/src/core/lib/transport/error_utils.h +56 -0
- data/src/core/{ext/transport/chttp2 → lib}/transport/http2_errors.h +18 -18
- data/src/core/lib/transport/metadata.c +259 -503
- data/src/core/lib/transport/metadata.h +69 -68
- data/src/core/lib/transport/metadata_batch.c +183 -63
- data/src/core/lib/transport/metadata_batch.h +50 -26
- data/src/core/lib/transport/pid_controller.c +28 -8
- data/src/core/lib/transport/pid_controller.h +15 -2
- data/src/core/lib/transport/service_config.c +21 -18
- data/src/core/lib/transport/service_config.h +5 -5
- data/src/core/lib/transport/static_metadata.c +753 -112
- data/src/core/lib/transport/static_metadata.h +403 -264
- data/src/core/{ext/transport/chttp2 → lib}/transport/status_conversion.c +18 -20
- data/src/core/{ext/transport/chttp2 → lib}/transport/status_conversion.h +9 -10
- data/src/core/lib/transport/timeout_encoding.c +11 -9
- data/src/core/lib/transport/timeout_encoding.h +3 -1
- data/src/core/lib/transport/transport.c +47 -87
- data/src/core/lib/transport/transport.h +20 -25
- data/src/core/lib/transport/transport_op_string.c +7 -19
- data/src/core/lib/tsi/fake_transport_security.c +2 -4
- data/src/core/lib/tsi/ssl_transport_security.c +7 -16
- data/src/core/lib/tsi/transport_security.c +2 -4
- data/src/ruby/ext/grpc/extconf.rb +4 -1
- data/src/ruby/ext/grpc/rb_byte_buffer.c +7 -0
- data/src/ruby/ext/grpc/rb_byte_buffer.h +3 -0
- data/src/ruby/ext/grpc/rb_call.c +47 -46
- data/src/ruby/ext/grpc/rb_channel.c +21 -6
- data/src/ruby/ext/grpc/rb_compression_options.c +9 -6
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +59 -8
- data/src/ruby/ext/grpc/rb_server.c +6 -4
- data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- metadata +33 -9
data/src/core/lib/surface/call.h
CHANGED
|
@@ -61,7 +61,7 @@ typedef struct grpc_call_create_args {
|
|
|
61
61
|
|
|
62
62
|
const void *server_transport_data;
|
|
63
63
|
|
|
64
|
-
grpc_mdelem
|
|
64
|
+
grpc_mdelem *add_initial_metadata;
|
|
65
65
|
size_t add_initial_metadata_count;
|
|
66
66
|
|
|
67
67
|
gpr_timespec send_deadline;
|
|
@@ -110,6 +110,7 @@ void grpc_call_log_batch(char *file, int line, gpr_log_severity severity,
|
|
|
110
110
|
|
|
111
111
|
/* Set a context pointer.
|
|
112
112
|
No thread safety guarantees are made wrt this value. */
|
|
113
|
+
/* TODO(#9731): add exec_ctx to destroy */
|
|
113
114
|
void grpc_call_context_set(grpc_call *call, grpc_context_index elem,
|
|
114
115
|
void *value, void (*destroy)(void *value));
|
|
115
116
|
/* Get a context pointer. */
|
|
@@ -125,6 +126,8 @@ uint8_t grpc_call_is_client(grpc_call *call);
|
|
|
125
126
|
grpc_compression_algorithm grpc_call_compression_for_level(
|
|
126
127
|
grpc_call *call, grpc_compression_level level);
|
|
127
128
|
|
|
129
|
+
extern int grpc_call_error_trace;
|
|
130
|
+
|
|
128
131
|
#ifdef __cplusplus
|
|
129
132
|
}
|
|
130
133
|
#endif
|
|
@@ -36,15 +36,21 @@
|
|
|
36
36
|
|
|
37
37
|
#include <string.h>
|
|
38
38
|
|
|
39
|
+
#include "src/core/lib/iomgr/exec_ctx.h"
|
|
40
|
+
#include "src/core/lib/slice/slice_internal.h"
|
|
39
41
|
#include "src/core/lib/surface/api_trace.h"
|
|
40
42
|
|
|
41
43
|
void grpc_call_details_init(grpc_call_details* cd) {
|
|
42
44
|
GRPC_API_TRACE("grpc_call_details_init(cd=%p)", 1, (cd));
|
|
43
45
|
memset(cd, 0, sizeof(*cd));
|
|
46
|
+
cd->method = grpc_empty_slice();
|
|
47
|
+
cd->host = grpc_empty_slice();
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
void grpc_call_details_destroy(grpc_call_details* cd) {
|
|
47
51
|
GRPC_API_TRACE("grpc_call_details_destroy(cd=%p)", 1, (cd));
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
|
53
|
+
grpc_slice_unref_internal(&exec_ctx, cd->method);
|
|
54
|
+
grpc_slice_unref_internal(&exec_ctx, cd->host);
|
|
55
|
+
grpc_exec_ctx_finish(&exec_ctx);
|
|
50
56
|
}
|
|
@@ -35,17 +35,22 @@
|
|
|
35
35
|
|
|
36
36
|
#include <grpc/support/alloc.h>
|
|
37
37
|
#include <grpc/support/string_util.h>
|
|
38
|
+
#include "src/core/lib/slice/slice_string_helpers.h"
|
|
38
39
|
#include "src/core/lib/support/string.h"
|
|
39
40
|
|
|
40
41
|
static void add_metadata(gpr_strvec *b, const grpc_metadata *md, size_t count) {
|
|
41
42
|
size_t i;
|
|
43
|
+
if (md == NULL) {
|
|
44
|
+
gpr_strvec_add(b, gpr_strdup("(nil)"));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
42
47
|
for (i = 0; i < count; i++) {
|
|
43
48
|
gpr_strvec_add(b, gpr_strdup("\nkey="));
|
|
44
|
-
gpr_strvec_add(b,
|
|
49
|
+
gpr_strvec_add(b, grpc_slice_to_c_string(md[i].key));
|
|
45
50
|
|
|
46
51
|
gpr_strvec_add(b, gpr_strdup(" value="));
|
|
47
|
-
gpr_strvec_add(b,
|
|
48
|
-
|
|
52
|
+
gpr_strvec_add(b,
|
|
53
|
+
grpc_dump_slice(md[i].value, GPR_DUMP_HEX | GPR_DUMP_ASCII));
|
|
49
54
|
}
|
|
50
55
|
}
|
|
51
56
|
|
|
@@ -71,10 +76,16 @@ char *grpc_op_string(const grpc_op *op) {
|
|
|
71
76
|
gpr_strvec_add(&b, gpr_strdup("SEND_CLOSE_FROM_CLIENT"));
|
|
72
77
|
break;
|
|
73
78
|
case GRPC_OP_SEND_STATUS_FROM_SERVER:
|
|
74
|
-
gpr_asprintf(&tmp, "SEND_STATUS_FROM_SERVER status=%d details
|
|
75
|
-
op->data.send_status_from_server.status
|
|
76
|
-
op->data.send_status_from_server.status_details);
|
|
79
|
+
gpr_asprintf(&tmp, "SEND_STATUS_FROM_SERVER status=%d details=",
|
|
80
|
+
op->data.send_status_from_server.status);
|
|
77
81
|
gpr_strvec_add(&b, tmp);
|
|
82
|
+
if (op->data.send_status_from_server.status_details != NULL) {
|
|
83
|
+
gpr_strvec_add(&b, grpc_dump_slice(
|
|
84
|
+
*op->data.send_status_from_server.status_details,
|
|
85
|
+
GPR_DUMP_ASCII));
|
|
86
|
+
} else {
|
|
87
|
+
gpr_strvec_add(&b, gpr_strdup("(null)"));
|
|
88
|
+
}
|
|
78
89
|
add_metadata(&b, op->data.send_status_from_server.trailing_metadata,
|
|
79
90
|
op->data.send_status_from_server.trailing_metadata_count);
|
|
80
91
|
break;
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
|
|
44
44
|
#include "src/core/lib/channel/channel_args.h"
|
|
45
45
|
#include "src/core/lib/iomgr/iomgr.h"
|
|
46
|
+
#include "src/core/lib/slice/slice_internal.h"
|
|
46
47
|
#include "src/core/lib/support/string.h"
|
|
47
48
|
#include "src/core/lib/surface/api_trace.h"
|
|
48
49
|
#include "src/core/lib/surface/call.h"
|
|
@@ -57,15 +58,15 @@
|
|
|
57
58
|
#define NUM_CACHED_STATUS_ELEMS 3
|
|
58
59
|
|
|
59
60
|
typedef struct registered_call {
|
|
60
|
-
grpc_mdelem
|
|
61
|
-
grpc_mdelem
|
|
61
|
+
grpc_mdelem path;
|
|
62
|
+
grpc_mdelem authority;
|
|
62
63
|
struct registered_call *next;
|
|
63
64
|
} registered_call;
|
|
64
65
|
|
|
65
66
|
struct grpc_channel {
|
|
66
67
|
int is_client;
|
|
67
68
|
grpc_compression_options compression_options;
|
|
68
|
-
grpc_mdelem
|
|
69
|
+
grpc_mdelem default_authority;
|
|
69
70
|
|
|
70
71
|
gpr_mu registered_call_mu;
|
|
71
72
|
registered_call *registered_calls;
|
|
@@ -102,9 +103,8 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target,
|
|
|
102
103
|
exec_ctx, builder, sizeof(grpc_channel), 1, destroy_channel, NULL,
|
|
103
104
|
(void **)&channel);
|
|
104
105
|
if (error != GRPC_ERROR_NONE) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
grpc_error_free_string(msg);
|
|
106
|
+
gpr_log(GPR_ERROR, "channel stack builder failed: %s",
|
|
107
|
+
grpc_error_string(error));
|
|
108
108
|
GRPC_ERROR_UNREF(error);
|
|
109
109
|
goto done;
|
|
110
110
|
}
|
|
@@ -116,19 +116,20 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target,
|
|
|
116
116
|
channel->registered_calls = NULL;
|
|
117
117
|
|
|
118
118
|
grpc_compression_options_init(&channel->compression_options);
|
|
119
|
-
|
|
120
119
|
for (size_t i = 0; i < args->num_args; i++) {
|
|
121
120
|
if (0 == strcmp(args->args[i].key, GRPC_ARG_DEFAULT_AUTHORITY)) {
|
|
122
121
|
if (args->args[i].type != GRPC_ARG_STRING) {
|
|
123
122
|
gpr_log(GPR_ERROR, "%s ignored: it must be a string",
|
|
124
123
|
GRPC_ARG_DEFAULT_AUTHORITY);
|
|
125
124
|
} else {
|
|
126
|
-
if (channel->default_authority) {
|
|
125
|
+
if (!GRPC_MDISNULL(channel->default_authority)) {
|
|
127
126
|
/* setting this takes precedence over anything else */
|
|
128
127
|
GRPC_MDELEM_UNREF(exec_ctx, channel->default_authority);
|
|
129
128
|
}
|
|
130
|
-
channel->default_authority =
|
|
131
|
-
exec_ctx,
|
|
129
|
+
channel->default_authority = grpc_mdelem_from_slices(
|
|
130
|
+
exec_ctx, GRPC_MDSTR_AUTHORITY,
|
|
131
|
+
grpc_slice_intern(
|
|
132
|
+
grpc_slice_from_static_string(args->args[i].value.string)));
|
|
132
133
|
}
|
|
133
134
|
} else if (0 ==
|
|
134
135
|
strcmp(args->args[i].key, GRPC_SSL_TARGET_NAME_OVERRIDE_ARG)) {
|
|
@@ -136,14 +137,16 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target,
|
|
|
136
137
|
gpr_log(GPR_ERROR, "%s ignored: it must be a string",
|
|
137
138
|
GRPC_SSL_TARGET_NAME_OVERRIDE_ARG);
|
|
138
139
|
} else {
|
|
139
|
-
if (channel->default_authority) {
|
|
140
|
+
if (!GRPC_MDISNULL(channel->default_authority)) {
|
|
140
141
|
/* other ways of setting this (notably ssl) take precedence */
|
|
141
142
|
gpr_log(GPR_ERROR,
|
|
142
143
|
"%s ignored: default host already set some other way",
|
|
143
144
|
GRPC_SSL_TARGET_NAME_OVERRIDE_ARG);
|
|
144
145
|
} else {
|
|
145
|
-
channel->default_authority =
|
|
146
|
-
exec_ctx,
|
|
146
|
+
channel->default_authority = grpc_mdelem_from_slices(
|
|
147
|
+
exec_ctx, GRPC_MDSTR_AUTHORITY,
|
|
148
|
+
grpc_slice_intern(
|
|
149
|
+
grpc_slice_from_static_string(args->args[i].value.string)));
|
|
147
150
|
}
|
|
148
151
|
}
|
|
149
152
|
} else if (0 == strcmp(args->args[i].key,
|
|
@@ -191,18 +194,18 @@ void grpc_channel_get_info(grpc_channel *channel,
|
|
|
191
194
|
static grpc_call *grpc_channel_create_call_internal(
|
|
192
195
|
grpc_exec_ctx *exec_ctx, grpc_channel *channel, grpc_call *parent_call,
|
|
193
196
|
uint32_t propagation_mask, grpc_completion_queue *cq,
|
|
194
|
-
grpc_pollset_set *pollset_set_alternative, grpc_mdelem
|
|
195
|
-
grpc_mdelem
|
|
196
|
-
grpc_mdelem
|
|
197
|
+
grpc_pollset_set *pollset_set_alternative, grpc_mdelem path_mdelem,
|
|
198
|
+
grpc_mdelem authority_mdelem, gpr_timespec deadline) {
|
|
199
|
+
grpc_mdelem send_metadata[2];
|
|
197
200
|
size_t num_metadata = 0;
|
|
198
201
|
|
|
199
202
|
GPR_ASSERT(channel->is_client);
|
|
200
203
|
GPR_ASSERT(!(cq != NULL && pollset_set_alternative != NULL));
|
|
201
204
|
|
|
202
205
|
send_metadata[num_metadata++] = path_mdelem;
|
|
203
|
-
if (authority_mdelem
|
|
206
|
+
if (!GRPC_MDISNULL(authority_mdelem)) {
|
|
204
207
|
send_metadata[num_metadata++] = authority_mdelem;
|
|
205
|
-
} else if (channel->default_authority
|
|
208
|
+
} else if (!GRPC_MDISNULL(channel->default_authority)) {
|
|
206
209
|
send_metadata[num_metadata++] = GRPC_MDELEM_REF(channel->default_authority);
|
|
207
210
|
}
|
|
208
211
|
|
|
@@ -227,27 +230,17 @@ grpc_call *grpc_channel_create_call(grpc_channel *channel,
|
|
|
227
230
|
grpc_call *parent_call,
|
|
228
231
|
uint32_t propagation_mask,
|
|
229
232
|
grpc_completion_queue *cq,
|
|
230
|
-
|
|
233
|
+
grpc_slice method, const grpc_slice *host,
|
|
231
234
|
gpr_timespec deadline, void *reserved) {
|
|
232
|
-
GRPC_API_TRACE(
|
|
233
|
-
"grpc_channel_create_call("
|
|
234
|
-
"channel=%p, parent_call=%p, propagation_mask=%x, cq=%p, method=%s, "
|
|
235
|
-
"host=%s, "
|
|
236
|
-
"deadline=gpr_timespec { tv_sec: %" PRId64
|
|
237
|
-
", tv_nsec: %d, clock_type: %d }, "
|
|
238
|
-
"reserved=%p)",
|
|
239
|
-
10,
|
|
240
|
-
(channel, parent_call, (unsigned)propagation_mask, cq, method, host,
|
|
241
|
-
deadline.tv_sec, deadline.tv_nsec, (int)deadline.clock_type, reserved));
|
|
242
235
|
GPR_ASSERT(!reserved);
|
|
243
236
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
|
244
237
|
grpc_call *call = grpc_channel_create_call_internal(
|
|
245
238
|
&exec_ctx, channel, parent_call, propagation_mask, cq, NULL,
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
host ?
|
|
249
|
-
|
|
250
|
-
|
|
239
|
+
grpc_mdelem_from_slices(&exec_ctx, GRPC_MDSTR_PATH,
|
|
240
|
+
grpc_slice_ref_internal(method)),
|
|
241
|
+
host != NULL ? grpc_mdelem_from_slices(&exec_ctx, GRPC_MDSTR_AUTHORITY,
|
|
242
|
+
grpc_slice_ref_internal(*host))
|
|
243
|
+
: GRPC_MDNULL,
|
|
251
244
|
deadline);
|
|
252
245
|
grpc_exec_ctx_finish(&exec_ctx);
|
|
253
246
|
return call;
|
|
@@ -255,17 +248,16 @@ grpc_call *grpc_channel_create_call(grpc_channel *channel,
|
|
|
255
248
|
|
|
256
249
|
grpc_call *grpc_channel_create_pollset_set_call(
|
|
257
250
|
grpc_exec_ctx *exec_ctx, grpc_channel *channel, grpc_call *parent_call,
|
|
258
|
-
uint32_t propagation_mask, grpc_pollset_set *pollset_set,
|
|
259
|
-
const
|
|
260
|
-
void *reserved) {
|
|
251
|
+
uint32_t propagation_mask, grpc_pollset_set *pollset_set, grpc_slice method,
|
|
252
|
+
const grpc_slice *host, gpr_timespec deadline, void *reserved) {
|
|
261
253
|
GPR_ASSERT(!reserved);
|
|
262
254
|
return grpc_channel_create_call_internal(
|
|
263
255
|
exec_ctx, channel, parent_call, propagation_mask, NULL, pollset_set,
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
host ?
|
|
267
|
-
|
|
268
|
-
|
|
256
|
+
grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_PATH,
|
|
257
|
+
grpc_slice_ref_internal(method)),
|
|
258
|
+
host != NULL ? grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_AUTHORITY,
|
|
259
|
+
grpc_slice_ref_internal(*host))
|
|
260
|
+
: GRPC_MDNULL,
|
|
269
261
|
deadline);
|
|
270
262
|
}
|
|
271
263
|
|
|
@@ -277,12 +269,15 @@ void *grpc_channel_register_call(grpc_channel *channel, const char *method,
|
|
|
277
269
|
4, (channel, method, host, reserved));
|
|
278
270
|
GPR_ASSERT(!reserved);
|
|
279
271
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
|
280
|
-
|
|
281
|
-
|
|
272
|
+
|
|
273
|
+
rc->path = grpc_mdelem_from_slices(
|
|
274
|
+
&exec_ctx, GRPC_MDSTR_PATH,
|
|
275
|
+
grpc_slice_intern(grpc_slice_from_static_string(method)));
|
|
282
276
|
rc->authority =
|
|
283
|
-
host ?
|
|
284
|
-
|
|
285
|
-
|
|
277
|
+
host ? grpc_mdelem_from_slices(
|
|
278
|
+
&exec_ctx, GRPC_MDSTR_AUTHORITY,
|
|
279
|
+
grpc_slice_intern(grpc_slice_from_static_string(host)))
|
|
280
|
+
: GRPC_MDNULL;
|
|
286
281
|
gpr_mu_lock(&channel->registered_call_mu);
|
|
287
282
|
rc->next = channel->registered_calls;
|
|
288
283
|
channel->registered_calls = rc;
|
|
@@ -310,8 +305,7 @@ grpc_call *grpc_channel_create_registered_call(
|
|
|
310
305
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
|
311
306
|
grpc_call *call = grpc_channel_create_call_internal(
|
|
312
307
|
&exec_ctx, channel, parent_call, propagation_mask, completion_queue, NULL,
|
|
313
|
-
GRPC_MDELEM_REF(rc->path),
|
|
314
|
-
rc->authority ? GRPC_MDELEM_REF(rc->authority) : NULL, deadline);
|
|
308
|
+
GRPC_MDELEM_REF(rc->path), GRPC_MDELEM_REF(rc->authority), deadline);
|
|
315
309
|
grpc_exec_ctx_finish(&exec_ctx);
|
|
316
310
|
return call;
|
|
317
311
|
}
|
|
@@ -340,14 +334,10 @@ static void destroy_channel(grpc_exec_ctx *exec_ctx, void *arg,
|
|
|
340
334
|
registered_call *rc = channel->registered_calls;
|
|
341
335
|
channel->registered_calls = rc->next;
|
|
342
336
|
GRPC_MDELEM_UNREF(exec_ctx, rc->path);
|
|
343
|
-
|
|
344
|
-
GRPC_MDELEM_UNREF(exec_ctx, rc->authority);
|
|
345
|
-
}
|
|
337
|
+
GRPC_MDELEM_UNREF(exec_ctx, rc->authority);
|
|
346
338
|
gpr_free(rc);
|
|
347
339
|
}
|
|
348
|
-
|
|
349
|
-
GRPC_MDELEM_UNREF(exec_ctx, channel->default_authority);
|
|
350
|
-
}
|
|
340
|
+
GRPC_MDELEM_UNREF(exec_ctx, channel->default_authority);
|
|
351
341
|
gpr_mu_destroy(&channel->registered_call_mu);
|
|
352
342
|
gpr_free(channel->target);
|
|
353
343
|
gpr_free(channel);
|
|
@@ -376,8 +366,8 @@ grpc_compression_options grpc_channel_compression_options(
|
|
|
376
366
|
return channel->compression_options;
|
|
377
367
|
}
|
|
378
368
|
|
|
379
|
-
grpc_mdelem
|
|
380
|
-
|
|
369
|
+
grpc_mdelem grpc_channel_get_reffed_status_elem(grpc_exec_ctx *exec_ctx,
|
|
370
|
+
grpc_channel *channel, int i) {
|
|
381
371
|
char tmp[GPR_LTOA_MIN_BUFSIZE];
|
|
382
372
|
switch (i) {
|
|
383
373
|
case 0:
|
|
@@ -388,6 +378,6 @@ grpc_mdelem *grpc_channel_get_reffed_status_elem(grpc_exec_ctx *exec_ctx,
|
|
|
388
378
|
return GRPC_MDELEM_GRPC_STATUS_2;
|
|
389
379
|
}
|
|
390
380
|
gpr_ltoa(i, tmp);
|
|
391
|
-
return
|
|
392
|
-
|
|
381
|
+
return grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_GRPC_STATUS,
|
|
382
|
+
grpc_slice_from_copied_string(tmp));
|
|
393
383
|
}
|
|
@@ -52,9 +52,8 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target,
|
|
|
52
52
|
value of \a propagation_mask (see propagation_bits.h for possible values) */
|
|
53
53
|
grpc_call *grpc_channel_create_pollset_set_call(
|
|
54
54
|
grpc_exec_ctx *exec_ctx, grpc_channel *channel, grpc_call *parent_call,
|
|
55
|
-
uint32_t propagation_mask, grpc_pollset_set *pollset_set,
|
|
56
|
-
const
|
|
57
|
-
void *reserved);
|
|
55
|
+
uint32_t propagation_mask, grpc_pollset_set *pollset_set, grpc_slice method,
|
|
56
|
+
const grpc_slice *host, gpr_timespec deadline, void *reserved);
|
|
58
57
|
|
|
59
58
|
/** Get a (borrowed) pointer to this channels underlying channel stack */
|
|
60
59
|
grpc_channel_stack *grpc_channel_get_channel_stack(grpc_channel *channel);
|
|
@@ -63,9 +62,9 @@ grpc_channel_stack *grpc_channel_get_channel_stack(grpc_channel *channel);
|
|
|
63
62
|
status_code.
|
|
64
63
|
|
|
65
64
|
The returned elem is owned by the caller. */
|
|
66
|
-
grpc_mdelem
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
grpc_mdelem grpc_channel_get_reffed_status_elem(grpc_exec_ctx *exec_ctx,
|
|
66
|
+
grpc_channel *channel,
|
|
67
|
+
int status_code);
|
|
69
68
|
|
|
70
69
|
#ifdef GRPC_STREAM_REFCOUNT_DEBUG
|
|
71
70
|
void grpc_channel_internal_ref(grpc_channel *channel, const char *reason);
|
|
@@ -96,9 +96,6 @@ struct grpc_completion_queue {
|
|
|
96
96
|
#define POLLSET_FROM_CQ(cq) ((grpc_pollset *)(cq + 1))
|
|
97
97
|
#define CQ_FROM_POLLSET(ps) (((grpc_completion_queue *)ps) - 1)
|
|
98
98
|
|
|
99
|
-
static gpr_mu g_freelist_mu;
|
|
100
|
-
static grpc_completion_queue *g_freelist;
|
|
101
|
-
|
|
102
99
|
int grpc_cq_pluck_trace;
|
|
103
100
|
int grpc_cq_event_timeout_trace;
|
|
104
101
|
|
|
@@ -113,21 +110,6 @@ int grpc_cq_event_timeout_trace;
|
|
|
113
110
|
static void on_pollset_shutdown_done(grpc_exec_ctx *exec_ctx, void *cc,
|
|
114
111
|
grpc_error *error);
|
|
115
112
|
|
|
116
|
-
void grpc_cq_global_init(void) { gpr_mu_init(&g_freelist_mu); }
|
|
117
|
-
|
|
118
|
-
void grpc_cq_global_shutdown(void) {
|
|
119
|
-
gpr_mu_destroy(&g_freelist_mu);
|
|
120
|
-
while (g_freelist) {
|
|
121
|
-
grpc_completion_queue *next = g_freelist->next_free;
|
|
122
|
-
grpc_pollset_destroy(POLLSET_FROM_CQ(g_freelist));
|
|
123
|
-
#ifndef NDEBUG
|
|
124
|
-
gpr_free(g_freelist->outstanding_tags);
|
|
125
|
-
#endif
|
|
126
|
-
gpr_free(g_freelist);
|
|
127
|
-
g_freelist = next;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
113
|
grpc_completion_queue *grpc_completion_queue_create(void *reserved) {
|
|
132
114
|
grpc_completion_queue *cc;
|
|
133
115
|
GPR_ASSERT(!reserved);
|
|
@@ -136,22 +118,12 @@ grpc_completion_queue *grpc_completion_queue_create(void *reserved) {
|
|
|
136
118
|
|
|
137
119
|
GRPC_API_TRACE("grpc_completion_queue_create(reserved=%p)", 1, (reserved));
|
|
138
120
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
gpr_mu_unlock(&g_freelist_mu);
|
|
142
|
-
|
|
143
|
-
cc = gpr_malloc(sizeof(grpc_completion_queue) + grpc_pollset_size());
|
|
144
|
-
grpc_pollset_init(POLLSET_FROM_CQ(cc), &cc->mu);
|
|
121
|
+
cc = gpr_zalloc(sizeof(grpc_completion_queue) + grpc_pollset_size());
|
|
122
|
+
grpc_pollset_init(POLLSET_FROM_CQ(cc), &cc->mu);
|
|
145
123
|
#ifndef NDEBUG
|
|
146
|
-
|
|
147
|
-
|
|
124
|
+
cc->outstanding_tags = NULL;
|
|
125
|
+
cc->outstanding_tag_capacity = 0;
|
|
148
126
|
#endif
|
|
149
|
-
} else {
|
|
150
|
-
cc = g_freelist;
|
|
151
|
-
g_freelist = g_freelist->next_free;
|
|
152
|
-
gpr_mu_unlock(&g_freelist_mu);
|
|
153
|
-
/* pollset already initialized */
|
|
154
|
-
}
|
|
155
127
|
|
|
156
128
|
/* Initial ref is dropped by grpc_completion_queue_shutdown */
|
|
157
129
|
gpr_ref_init(&cc->pending_events, 1);
|
|
@@ -203,11 +175,11 @@ void grpc_cq_internal_unref(grpc_completion_queue *cc) {
|
|
|
203
175
|
#endif
|
|
204
176
|
if (gpr_unref(&cc->owning_refs)) {
|
|
205
177
|
GPR_ASSERT(cc->completed_head.next == (uintptr_t)&cc->completed_head);
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
cc->
|
|
209
|
-
|
|
210
|
-
|
|
178
|
+
grpc_pollset_destroy(POLLSET_FROM_CQ(cc));
|
|
179
|
+
#ifndef NDEBUG
|
|
180
|
+
gpr_free(cc->outstanding_tags);
|
|
181
|
+
#endif
|
|
182
|
+
gpr_free(cc);
|
|
211
183
|
}
|
|
212
184
|
}
|
|
213
185
|
|
|
@@ -253,7 +225,6 @@ void grpc_cq_end_op(grpc_exec_ctx *exec_ctx, grpc_completion_queue *cc,
|
|
|
253
225
|
if (grpc_trace_operation_failures && error != GRPC_ERROR_NONE) {
|
|
254
226
|
gpr_log(GPR_ERROR, "Operation failed: tag=%p, error=%s", tag, errmsg);
|
|
255
227
|
}
|
|
256
|
-
grpc_error_free_string(errmsg);
|
|
257
228
|
}
|
|
258
229
|
|
|
259
230
|
storage->tag = tag;
|
|
@@ -294,7 +265,7 @@ void grpc_cq_end_op(grpc_exec_ctx *exec_ctx, grpc_completion_queue *cc,
|
|
|
294
265
|
if (kick_error != GRPC_ERROR_NONE) {
|
|
295
266
|
const char *msg = grpc_error_string(kick_error);
|
|
296
267
|
gpr_log(GPR_ERROR, "Kick failed: %s", msg);
|
|
297
|
-
|
|
268
|
+
|
|
298
269
|
GRPC_ERROR_UNREF(kick_error);
|
|
299
270
|
}
|
|
300
271
|
} else {
|
|
@@ -403,8 +374,8 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
|
|
|
403
374
|
.stolen_completion = NULL,
|
|
404
375
|
.tag = NULL,
|
|
405
376
|
.first_loop = true};
|
|
406
|
-
grpc_exec_ctx exec_ctx =
|
|
407
|
-
cq_is_next_finished, &is_finished_arg);
|
|
377
|
+
grpc_exec_ctx exec_ctx =
|
|
378
|
+
GRPC_EXEC_CTX_INITIALIZER(0, cq_is_next_finished, &is_finished_arg);
|
|
408
379
|
for (;;) {
|
|
409
380
|
if (is_finished_arg.stolen_completion != NULL) {
|
|
410
381
|
gpr_mu_unlock(cc->mu);
|
|
@@ -461,7 +432,7 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
|
|
|
461
432
|
gpr_mu_unlock(cc->mu);
|
|
462
433
|
const char *msg = grpc_error_string(err);
|
|
463
434
|
gpr_log(GPR_ERROR, "Completion queue next failed: %s", msg);
|
|
464
|
-
|
|
435
|
+
|
|
465
436
|
GRPC_ERROR_UNREF(err);
|
|
466
437
|
memset(&ret, 0, sizeof(ret));
|
|
467
438
|
ret.type = GRPC_QUEUE_TIMEOUT;
|
|
@@ -572,8 +543,8 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag,
|
|
|
572
543
|
.stolen_completion = NULL,
|
|
573
544
|
.tag = tag,
|
|
574
545
|
.first_loop = true};
|
|
575
|
-
grpc_exec_ctx exec_ctx =
|
|
576
|
-
cq_is_pluck_finished, &is_finished_arg);
|
|
546
|
+
grpc_exec_ctx exec_ctx =
|
|
547
|
+
GRPC_EXEC_CTX_INITIALIZER(0, cq_is_pluck_finished, &is_finished_arg);
|
|
577
548
|
for (;;) {
|
|
578
549
|
if (is_finished_arg.stolen_completion != NULL) {
|
|
579
550
|
gpr_mu_unlock(cc->mu);
|
|
@@ -647,7 +618,7 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag,
|
|
|
647
618
|
gpr_mu_unlock(cc->mu);
|
|
648
619
|
const char *msg = grpc_error_string(err);
|
|
649
620
|
gpr_log(GPR_ERROR, "Completion queue next failed: %s", msg);
|
|
650
|
-
|
|
621
|
+
|
|
651
622
|
GRPC_ERROR_UNREF(err);
|
|
652
623
|
memset(&ret, 0, sizeof(ret));
|
|
653
624
|
ret.type = GRPC_QUEUE_TIMEOUT;
|