wearefair-grpc 1.3.1.pre.c → 1.4.0.fair
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +418 -126
- data/include/grpc/grpc.h +15 -69
- data/include/grpc/grpc_security.h +1 -1
- data/include/grpc/impl/codegen/compression_types.h +3 -4
- data/include/grpc/impl/codegen/gpr_types.h +0 -1
- data/include/grpc/impl/codegen/grpc_types.h +69 -3
- data/include/grpc/impl/codegen/port_platform.h +6 -0
- data/include/grpc/impl/codegen/slice.h +2 -1
- data/include/grpc/load_reporting.h +6 -6
- data/include/grpc/slice.h +25 -3
- data/include/grpc/slice_buffer.h +4 -0
- data/src/core/ext/census/context.c +1 -1
- data/src/core/ext/census/resource.c +3 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.c +1 -1
- data/src/core/ext/filters/client_channel/client_channel.c +158 -100
- data/src/core/ext/filters/client_channel/client_channel_plugin.c +3 -2
- data/src/core/ext/filters/client_channel/lb_policy.c +2 -1
- data/src/core/ext/filters/client_channel/lb_policy.h +5 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c +153 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +42 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +344 -88
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c +133 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +65 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +47 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +19 -8
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +63 -34
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +13 -12
- data/src/core/ext/filters/client_channel/lb_policy_factory.c +28 -5
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +18 -4
- data/src/core/ext/filters/client_channel/parse_address.c +37 -7
- data/src/core/ext/filters/client_channel/parse_address.h +11 -8
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +3 -3
- data/src/core/ext/filters/client_channel/subchannel.c +19 -16
- data/src/core/ext/filters/client_channel/subchannel.h +1 -0
- data/src/core/ext/filters/client_channel/uri_parser.c +36 -22
- data/src/core/ext/filters/client_channel/uri_parser.h +1 -1
- data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.c +42 -17
- data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.h +8 -9
- data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.c +19 -11
- data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.h +3 -6
- data/src/core/ext/filters/http/http_filters_plugin.c +104 -0
- data/src/core/{lib/channel/compress_filter.c → ext/filters/http/message_compress/message_compress_filter.c} +124 -23
- data/src/core/{lib/channel/compress_filter.h → ext/filters/http/message_compress/message_compress_filter.h} +5 -6
- data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.c +4 -6
- data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.h +3 -3
- data/src/core/ext/filters/load_reporting/load_reporting.c +2 -25
- data/src/core/ext/filters/load_reporting/load_reporting_filter.c +26 -1
- data/src/core/ext/filters/max_age/max_age_filter.c +14 -14
- data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.c +91 -47
- data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.h +3 -3
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +2 -2
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +2 -2
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +3 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +296 -172
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
- data/src/core/ext/transport/chttp2/transport/frame_data.c +203 -164
- data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -14
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +5 -5
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +4 -4
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +2 -4
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +4 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +50 -33
- data/src/core/ext/transport/chttp2/transport/parsing.c +10 -11
- data/src/core/ext/transport/chttp2/transport/writing.c +32 -13
- data/src/core/lib/channel/channel_args.c +28 -9
- data/src/core/lib/channel/channel_args.h +5 -1
- data/src/core/lib/channel/channel_stack.c +1 -1
- data/src/core/lib/channel/channel_stack.h +2 -2
- data/src/core/lib/channel/channel_stack_builder.c +13 -1
- data/src/core/lib/channel/channel_stack_builder.h +5 -1
- data/src/core/lib/channel/connected_channel.c +3 -1
- data/src/core/lib/channel/context.h +2 -2
- data/src/core/lib/compression/message_compress.c +2 -2
- data/src/core/lib/debug/trace.c +13 -6
- data/src/core/lib/debug/trace.h +27 -1
- data/src/core/lib/http/httpcli.c +1 -1
- data/src/core/lib/http/httpcli_security_connector.c +6 -10
- data/src/core/lib/http/parser.c +2 -2
- data/src/core/lib/http/parser.h +2 -1
- data/src/core/lib/iomgr/combiner.c +6 -6
- data/src/core/lib/iomgr/combiner.h +2 -1
- data/src/core/lib/iomgr/error.c +12 -5
- data/src/core/lib/iomgr/error.h +13 -13
- data/src/core/lib/iomgr/ev_epoll1_linux.c +984 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.h +44 -0
- data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c +2146 -0
- data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.h +43 -0
- data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c +1337 -0
- data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.h +43 -0
- data/src/core/lib/iomgr/ev_epollex_linux.c +1511 -0
- data/src/core/lib/iomgr/ev_epollex_linux.h +43 -0
- data/src/core/lib/iomgr/{ev_epoll_linux.c → ev_epollsig_linux.c} +24 -31
- data/src/core/lib/iomgr/{ev_epoll_linux.h → ev_epollsig_linux.h} +4 -4
- data/src/core/lib/iomgr/ev_poll_posix.c +12 -27
- data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
- data/src/core/lib/iomgr/ev_posix.c +22 -8
- data/src/core/lib/iomgr/ev_posix.h +4 -3
- data/src/core/lib/iomgr/exec_ctx.c +5 -0
- data/src/core/lib/iomgr/exec_ctx.h +2 -0
- data/src/core/lib/iomgr/iomgr.c +4 -0
- data/src/core/lib/iomgr/iomgr.h +3 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.c +116 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.h +41 -0
- data/src/core/lib/iomgr/lockfree_event.c +16 -0
- data/src/core/lib/iomgr/pollset.h +2 -5
- data/src/core/lib/iomgr/pollset_uv.c +1 -1
- data/src/core/lib/iomgr/pollset_windows.c +3 -3
- data/src/core/lib/iomgr/resource_quota.c +9 -8
- data/src/core/lib/iomgr/resource_quota.h +2 -1
- data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
- data/src/core/lib/iomgr/socket_mutator.h +2 -0
- data/src/core/lib/iomgr/sys_epoll_wrapper.h +43 -0
- data/src/core/lib/iomgr/tcp_client_posix.c +6 -6
- data/src/core/lib/iomgr/tcp_client_uv.c +3 -3
- data/src/core/lib/iomgr/tcp_posix.c +7 -7
- data/src/core/lib/iomgr/tcp_posix.h +2 -1
- data/src/core/lib/iomgr/tcp_server_posix.c +1 -1
- data/src/core/lib/iomgr/tcp_uv.c +6 -6
- data/src/core/lib/iomgr/tcp_uv.h +2 -1
- data/src/core/lib/iomgr/tcp_windows.c +1 -1
- data/src/core/lib/iomgr/timer_generic.c +24 -25
- data/src/core/lib/iomgr/timer_manager.c +276 -0
- data/src/core/lib/iomgr/timer_manager.h +52 -0
- data/src/core/lib/iomgr/timer_uv.c +6 -0
- data/src/core/lib/iomgr/udp_server.c +42 -9
- data/src/core/lib/iomgr/udp_server.h +3 -1
- data/src/core/lib/security/credentials/credentials.c +0 -1
- data/src/core/lib/security/credentials/fake/fake_credentials.c +23 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.h +12 -9
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +1 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +24 -53
- data/src/core/lib/security/transport/client_auth_filter.c +9 -3
- data/src/core/lib/security/transport/secure_endpoint.c +7 -7
- data/src/core/lib/security/transport/secure_endpoint.h +1 -1
- data/src/core/lib/security/transport/security_connector.c +32 -51
- data/src/core/lib/security/transport/security_connector.h +10 -14
- data/src/core/lib/slice/b64.c +1 -1
- data/src/core/lib/slice/percent_encoding.c +3 -3
- data/src/core/lib/slice/slice.c +66 -33
- data/src/core/lib/slice/slice_buffer.c +25 -6
- data/src/core/lib/slice/slice_hash_table.c +33 -35
- data/src/core/lib/slice/slice_hash_table.h +7 -12
- data/src/core/lib/support/atomic.h +45 -0
- data/src/core/lib/support/atomic_with_atm.h +70 -0
- data/src/core/lib/support/atomic_with_std.h +48 -0
- data/src/core/lib/support/avl.c +14 -14
- data/src/core/lib/support/memory.h +74 -0
- data/src/core/lib/support/mpscq.c +12 -1
- data/src/core/lib/support/mpscq.h +4 -0
- data/src/core/lib/support/stack_lockfree.c +3 -36
- data/src/core/lib/support/time_posix.c +8 -0
- data/src/core/lib/support/tmpfile_posix.c +10 -10
- data/src/core/lib/surface/alarm.c +3 -1
- data/src/core/lib/surface/api_trace.c +2 -1
- data/src/core/lib/surface/api_trace.h +2 -2
- data/src/core/lib/surface/byte_buffer_reader.c +1 -1
- data/src/core/lib/surface/call.c +65 -22
- data/src/core/lib/surface/call.h +4 -2
- data/src/core/lib/surface/channel_init.c +2 -19
- data/src/core/lib/surface/channel_stack_type.c +18 -0
- data/src/core/lib/surface/channel_stack_type.h +2 -0
- data/src/core/lib/surface/completion_queue.c +249 -83
- data/src/core/lib/surface/completion_queue.h +18 -13
- data/src/core/lib/surface/completion_queue_factory.c +24 -9
- data/src/core/lib/surface/init.c +1 -52
- data/src/core/lib/surface/{lame_client.c → lame_client.cc} +37 -26
- data/src/core/lib/surface/server.c +50 -27
- data/src/core/lib/surface/server.h +2 -1
- data/src/core/lib/surface/version.c +2 -2
- data/src/core/lib/transport/bdp_estimator.c +20 -9
- data/src/core/lib/transport/bdp_estimator.h +5 -1
- data/src/core/lib/transport/byte_stream.c +23 -9
- data/src/core/lib/transport/byte_stream.h +15 -6
- data/src/core/lib/transport/connectivity_state.c +6 -6
- data/src/core/lib/transport/connectivity_state.h +2 -1
- data/src/core/lib/transport/service_config.c +6 -13
- data/src/core/lib/transport/service_config.h +2 -2
- data/src/core/lib/transport/static_metadata.c +403 -389
- data/src/core/lib/transport/static_metadata.h +127 -114
- data/src/core/plugin_registry/grpc_plugin_registry.c +12 -0
- data/src/core/tsi/fake_transport_security.c +5 -4
- data/src/core/tsi/ssl_transport_security.c +71 -82
- data/src/core/tsi/ssl_transport_security.h +39 -61
- data/src/core/tsi/transport_security.c +83 -2
- data/src/core/tsi/transport_security.h +27 -2
- data/src/core/tsi/transport_security_adapter.c +236 -0
- data/src/core/tsi/transport_security_adapter.h +62 -0
- data/src/core/tsi/transport_security_interface.h +179 -66
- data/src/ruby/ext/grpc/extconf.rb +2 -1
- data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -6
- data/src/ruby/ext/grpc/rb_call.c +56 -48
- data/src/ruby/ext/grpc/rb_call.h +3 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +23 -22
- data/src/ruby/ext/grpc/rb_channel.c +45 -29
- data/src/ruby/ext/grpc/rb_channel_args.c +11 -9
- data/src/ruby/ext/grpc/rb_channel_credentials.c +16 -12
- data/src/ruby/ext/grpc/rb_completion_queue.c +7 -9
- data/src/ruby/ext/grpc/rb_compression_options.c +7 -6
- data/src/ruby/ext/grpc/rb_event_thread.c +10 -12
- data/src/ruby/ext/grpc/rb_event_thread.h +1 -2
- data/src/ruby/ext/grpc/rb_grpc.c +11 -15
- data/src/ruby/ext/grpc/rb_grpc.h +2 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +14 -6
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +22 -10
- data/src/ruby/ext/grpc/rb_server.c +26 -28
- data/src/ruby/lib/grpc/version.rb +1 -1
- metadata +40 -18
- data/src/ruby/lib/grpc/grpc_c.bundle +0 -0
- data/src/ruby/lib/grpc/grpc_c.so +0 -0
@@ -39,17 +39,22 @@
|
|
39
39
|
#include <grpc/support/alloc.h>
|
40
40
|
#include <grpc/support/log.h>
|
41
41
|
|
42
|
+
#include "src/core/ext/filters/http/message_compress/message_compress_filter.h"
|
42
43
|
#include "src/core/lib/channel/channel_args.h"
|
43
|
-
#include "src/core/lib/channel/compress_filter.h"
|
44
44
|
#include "src/core/lib/compression/algorithm_metadata.h"
|
45
45
|
#include "src/core/lib/compression/message_compress.h"
|
46
46
|
#include "src/core/lib/profiling/timers.h"
|
47
47
|
#include "src/core/lib/slice/slice_internal.h"
|
48
48
|
#include "src/core/lib/slice/slice_string_helpers.h"
|
49
49
|
#include "src/core/lib/support/string.h"
|
50
|
+
#include "src/core/lib/surface/call.h"
|
50
51
|
#include "src/core/lib/transport/static_metadata.h"
|
51
52
|
|
52
|
-
|
53
|
+
#define INITIAL_METADATA_UNSEEN 0
|
54
|
+
#define HAS_COMPRESSION_ALGORITHM 2
|
55
|
+
#define NO_COMPRESSION_ALGORITHM 4
|
56
|
+
|
57
|
+
#define CANCELLED_BIT ((gpr_atm)1)
|
53
58
|
|
54
59
|
typedef struct call_data {
|
55
60
|
grpc_slice_buffer slices; /**< Buffers up input slices to be compressed */
|
@@ -59,8 +64,17 @@ typedef struct call_data {
|
|
59
64
|
/** Compression algorithm we'll try to use. It may be given by incoming
|
60
65
|
* metadata, or by the channel's default compression settings. */
|
61
66
|
grpc_compression_algorithm compression_algorithm;
|
62
|
-
|
63
|
-
|
67
|
+
|
68
|
+
/* Atomic recording the state of initial metadata; allowed values:
|
69
|
+
INITIAL_METADATA_UNSEEN - initial metadata op not seen
|
70
|
+
HAS_COMPRESSION_ALGORITHM - initial metadata seen; compression algorithm
|
71
|
+
set
|
72
|
+
NO_COMPRESSION_ALGORITHM - initial metadata seen; no compression algorithm
|
73
|
+
set
|
74
|
+
pointer - a stalled op containing a send_message that's waiting on initial
|
75
|
+
metadata
|
76
|
+
pointer | CANCELLED_BIT - request was cancelled with error pointed to */
|
77
|
+
gpr_atm send_initial_metadata_state;
|
64
78
|
|
65
79
|
grpc_transport_stream_op_batch *send_op;
|
66
80
|
uint32_t send_length;
|
@@ -81,14 +95,15 @@ typedef struct channel_data {
|
|
81
95
|
uint32_t supported_compression_algorithms;
|
82
96
|
} channel_data;
|
83
97
|
|
84
|
-
static
|
98
|
+
static bool skip_compression(grpc_call_element *elem, uint32_t flags,
|
99
|
+
bool has_compression_algorithm) {
|
85
100
|
call_data *calld = elem->call_data;
|
86
101
|
channel_data *channeld = elem->channel_data;
|
87
102
|
|
88
103
|
if (flags & (GRPC_WRITE_NO_COMPRESS | GRPC_WRITE_INTERNAL_COMPRESS)) {
|
89
104
|
return 1;
|
90
105
|
}
|
91
|
-
if (
|
106
|
+
if (has_compression_algorithm) {
|
92
107
|
if (calld->compression_algorithm == GRPC_COMPRESS_NONE) {
|
93
108
|
return 1;
|
94
109
|
}
|
@@ -101,12 +116,14 @@ static int skip_compression(grpc_call_element *elem, uint32_t flags) {
|
|
101
116
|
/** Filter initial metadata */
|
102
117
|
static grpc_error *process_send_initial_metadata(
|
103
118
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
104
|
-
grpc_metadata_batch *initial_metadata
|
119
|
+
grpc_metadata_batch *initial_metadata,
|
120
|
+
bool *has_compression_algorithm) GRPC_MUST_USE_RESULT;
|
105
121
|
static grpc_error *process_send_initial_metadata(
|
106
122
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
107
|
-
grpc_metadata_batch *initial_metadata) {
|
123
|
+
grpc_metadata_batch *initial_metadata, bool *has_compression_algorithm) {
|
108
124
|
call_data *calld = elem->call_data;
|
109
125
|
channel_data *channeld = elem->channel_data;
|
126
|
+
*has_compression_algorithm = false;
|
110
127
|
/* Parse incoming request for compression. If any, it'll be available
|
111
128
|
* at calld->compression_algorithm */
|
112
129
|
if (initial_metadata->idx.named.grpc_internal_encoding_request != NULL) {
|
@@ -130,7 +147,7 @@ static grpc_error *process_send_initial_metadata(
|
|
130
147
|
gpr_free(val);
|
131
148
|
calld->compression_algorithm = GRPC_COMPRESS_NONE;
|
132
149
|
}
|
133
|
-
|
150
|
+
*has_compression_algorithm = true;
|
134
151
|
|
135
152
|
grpc_metadata_batch_remove(
|
136
153
|
exec_ctx, initial_metadata,
|
@@ -140,7 +157,7 @@ static grpc_error *process_send_initial_metadata(
|
|
140
157
|
* exceptionally skipping compression, fall back to the channel
|
141
158
|
* default */
|
142
159
|
calld->compression_algorithm = channeld->default_compression_algorithm;
|
143
|
-
|
160
|
+
*has_compression_algorithm = true;
|
144
161
|
}
|
145
162
|
|
146
163
|
grpc_error *error = GRPC_ERROR_NONE;
|
@@ -181,7 +198,7 @@ static void finish_send_message(grpc_exec_ctx *exec_ctx,
|
|
181
198
|
did_compress = grpc_msg_compress(exec_ctx, calld->compression_algorithm,
|
182
199
|
&calld->slices, &tmp);
|
183
200
|
if (did_compress) {
|
184
|
-
if (grpc_compression_trace) {
|
201
|
+
if (GRPC_TRACER_ON(grpc_compression_trace)) {
|
185
202
|
char *algo_name;
|
186
203
|
const size_t before_size = calld->slices.length;
|
187
204
|
const size_t after_size = tmp.length;
|
@@ -195,7 +212,7 @@ static void finish_send_message(grpc_exec_ctx *exec_ctx,
|
|
195
212
|
grpc_slice_buffer_swap(&calld->slices, &tmp);
|
196
213
|
calld->send_flags |= GRPC_WRITE_INTERNAL_COMPRESS;
|
197
214
|
} else {
|
198
|
-
if (grpc_compression_trace) {
|
215
|
+
if (GRPC_TRACER_ON(grpc_compression_trace)) {
|
199
216
|
char *algo_name;
|
200
217
|
GPR_ASSERT(grpc_compression_algorithm_name(calld->compression_algorithm,
|
201
218
|
&algo_name));
|
@@ -221,6 +238,13 @@ static void finish_send_message(grpc_exec_ctx *exec_ctx,
|
|
221
238
|
static void got_slice(grpc_exec_ctx *exec_ctx, void *elemp, grpc_error *error) {
|
222
239
|
grpc_call_element *elem = elemp;
|
223
240
|
call_data *calld = elem->call_data;
|
241
|
+
if (GRPC_ERROR_NONE !=
|
242
|
+
grpc_byte_stream_pull(exec_ctx,
|
243
|
+
calld->send_op->payload->send_message.send_message,
|
244
|
+
&calld->incoming_slice)) {
|
245
|
+
/* Should never reach here */
|
246
|
+
abort();
|
247
|
+
}
|
224
248
|
grpc_slice_buffer_add(&calld->slices, calld->incoming_slice);
|
225
249
|
if (calld->send_length == calld->slices.length) {
|
226
250
|
finish_send_message(exec_ctx, elem);
|
@@ -233,8 +257,11 @@ static void continue_send_message(grpc_exec_ctx *exec_ctx,
|
|
233
257
|
grpc_call_element *elem) {
|
234
258
|
call_data *calld = elem->call_data;
|
235
259
|
while (grpc_byte_stream_next(
|
236
|
-
exec_ctx, calld->send_op->payload->send_message.send_message,
|
237
|
-
&calld->
|
260
|
+
exec_ctx, calld->send_op->payload->send_message.send_message, ~(size_t)0,
|
261
|
+
&calld->got_slice)) {
|
262
|
+
grpc_byte_stream_pull(exec_ctx,
|
263
|
+
calld->send_op->payload->send_message.send_message,
|
264
|
+
&calld->incoming_slice);
|
238
265
|
grpc_slice_buffer_add(&calld->slices, calld->incoming_slice);
|
239
266
|
if (calld->send_length == calld->slices.length) {
|
240
267
|
finish_send_message(exec_ctx, elem);
|
@@ -250,21 +277,91 @@ static void compress_start_transport_stream_op_batch(
|
|
250
277
|
|
251
278
|
GPR_TIMER_BEGIN("compress_start_transport_stream_op_batch", 0);
|
252
279
|
|
280
|
+
if (op->cancel_stream) {
|
281
|
+
GRPC_ERROR_REF(op->payload->cancel_stream.cancel_error);
|
282
|
+
gpr_atm cur = gpr_atm_full_xchg(
|
283
|
+
&calld->send_initial_metadata_state,
|
284
|
+
CANCELLED_BIT | (gpr_atm)op->payload->cancel_stream.cancel_error);
|
285
|
+
switch (cur) {
|
286
|
+
case HAS_COMPRESSION_ALGORITHM:
|
287
|
+
case NO_COMPRESSION_ALGORITHM:
|
288
|
+
case INITIAL_METADATA_UNSEEN:
|
289
|
+
break;
|
290
|
+
default:
|
291
|
+
if ((cur & CANCELLED_BIT) == 0) {
|
292
|
+
grpc_transport_stream_op_batch_finish_with_failure(
|
293
|
+
exec_ctx, (grpc_transport_stream_op_batch *)cur,
|
294
|
+
GRPC_ERROR_REF(op->payload->cancel_stream.cancel_error));
|
295
|
+
} else {
|
296
|
+
GRPC_ERROR_UNREF((grpc_error *)(cur & ~CANCELLED_BIT));
|
297
|
+
}
|
298
|
+
break;
|
299
|
+
}
|
300
|
+
}
|
301
|
+
|
253
302
|
if (op->send_initial_metadata) {
|
303
|
+
bool has_compression_algorithm;
|
254
304
|
grpc_error *error = process_send_initial_metadata(
|
255
305
|
exec_ctx, elem,
|
256
|
-
op->payload->send_initial_metadata.send_initial_metadata
|
306
|
+
op->payload->send_initial_metadata.send_initial_metadata,
|
307
|
+
&has_compression_algorithm);
|
257
308
|
if (error != GRPC_ERROR_NONE) {
|
258
309
|
grpc_transport_stream_op_batch_finish_with_failure(exec_ctx, op, error);
|
259
310
|
return;
|
260
311
|
}
|
312
|
+
gpr_atm cur;
|
313
|
+
retry_send_im:
|
314
|
+
cur = gpr_atm_acq_load(&calld->send_initial_metadata_state);
|
315
|
+
GPR_ASSERT(cur != HAS_COMPRESSION_ALGORITHM &&
|
316
|
+
cur != NO_COMPRESSION_ALGORITHM);
|
317
|
+
if ((cur & CANCELLED_BIT) == 0) {
|
318
|
+
if (!gpr_atm_rel_cas(&calld->send_initial_metadata_state, cur,
|
319
|
+
has_compression_algorithm
|
320
|
+
? HAS_COMPRESSION_ALGORITHM
|
321
|
+
: NO_COMPRESSION_ALGORITHM)) {
|
322
|
+
goto retry_send_im;
|
323
|
+
}
|
324
|
+
if (cur != INITIAL_METADATA_UNSEEN) {
|
325
|
+
grpc_call_next_op(exec_ctx, elem,
|
326
|
+
(grpc_transport_stream_op_batch *)cur);
|
327
|
+
}
|
328
|
+
}
|
261
329
|
}
|
262
|
-
if (op->send_message
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
330
|
+
if (op->send_message) {
|
331
|
+
gpr_atm cur;
|
332
|
+
retry_send:
|
333
|
+
cur = gpr_atm_acq_load(&calld->send_initial_metadata_state);
|
334
|
+
switch (cur) {
|
335
|
+
case INITIAL_METADATA_UNSEEN:
|
336
|
+
if (!gpr_atm_rel_cas(&calld->send_initial_metadata_state, cur,
|
337
|
+
(gpr_atm)op)) {
|
338
|
+
goto retry_send;
|
339
|
+
}
|
340
|
+
break;
|
341
|
+
case HAS_COMPRESSION_ALGORITHM:
|
342
|
+
case NO_COMPRESSION_ALGORITHM:
|
343
|
+
if (!skip_compression(elem,
|
344
|
+
op->payload->send_message.send_message->flags,
|
345
|
+
cur == HAS_COMPRESSION_ALGORITHM)) {
|
346
|
+
calld->send_op = op;
|
347
|
+
calld->send_length = op->payload->send_message.send_message->length;
|
348
|
+
calld->send_flags = op->payload->send_message.send_message->flags;
|
349
|
+
continue_send_message(exec_ctx, elem);
|
350
|
+
} else {
|
351
|
+
/* pass control down the stack */
|
352
|
+
grpc_call_next_op(exec_ctx, elem, op);
|
353
|
+
}
|
354
|
+
break;
|
355
|
+
default:
|
356
|
+
if (cur & CANCELLED_BIT) {
|
357
|
+
grpc_transport_stream_op_batch_finish_with_failure(
|
358
|
+
exec_ctx, op,
|
359
|
+
GRPC_ERROR_REF((grpc_error *)(cur & ~CANCELLED_BIT)));
|
360
|
+
} else {
|
361
|
+
/* >1 send_message concurrently */
|
362
|
+
GPR_UNREACHABLE_CODE(break);
|
363
|
+
}
|
364
|
+
}
|
268
365
|
} else {
|
269
366
|
/* pass control down the stack */
|
270
367
|
grpc_call_next_op(exec_ctx, elem, op);
|
@@ -282,7 +379,6 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
|
282
379
|
|
283
380
|
/* initialize members */
|
284
381
|
grpc_slice_buffer_init(&calld->slices);
|
285
|
-
calld->has_compression_algorithm = 0;
|
286
382
|
grpc_closure_init(&calld->got_slice, got_slice, elem,
|
287
383
|
grpc_schedule_on_exec_ctx);
|
288
384
|
grpc_closure_init(&calld->send_done, send_done, elem,
|
@@ -298,6 +394,11 @@ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
|
298
394
|
/* grab pointers to our data from the call element */
|
299
395
|
call_data *calld = elem->call_data;
|
300
396
|
grpc_slice_buffer_destroy_internal(exec_ctx, &calld->slices);
|
397
|
+
gpr_atm imstate =
|
398
|
+
gpr_atm_no_barrier_load(&calld->send_initial_metadata_state);
|
399
|
+
if (imstate & CANCELLED_BIT) {
|
400
|
+
GRPC_ERROR_UNREF((grpc_error *)(imstate & ~CANCELLED_BIT));
|
401
|
+
}
|
301
402
|
}
|
302
403
|
|
303
404
|
/* Constructor for channel_data */
|
@@ -338,7 +439,7 @@ static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
|
|
338
439
|
static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
|
339
440
|
grpc_channel_element *elem) {}
|
340
441
|
|
341
|
-
const grpc_channel_filter
|
442
|
+
const grpc_channel_filter grpc_message_compress_filter = {
|
342
443
|
compress_start_transport_stream_op_batch,
|
343
444
|
grpc_channel_next_op,
|
344
445
|
sizeof(call_data),
|
@@ -31,15 +31,13 @@
|
|
31
31
|
*
|
32
32
|
*/
|
33
33
|
|
34
|
-
#ifndef
|
35
|
-
#define
|
34
|
+
#ifndef GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_COMPRESS_MESSAGE_COMPRESS_FILTER_H
|
35
|
+
#define GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_COMPRESS_MESSAGE_COMPRESS_FILTER_H
|
36
36
|
|
37
37
|
#include <grpc/impl/codegen/compression_types.h>
|
38
38
|
|
39
39
|
#include "src/core/lib/channel/channel_stack.h"
|
40
40
|
|
41
|
-
extern int grpc_compression_trace;
|
42
|
-
|
43
41
|
/** Compression filter for outgoing data.
|
44
42
|
*
|
45
43
|
* See <grpc/compression.h> for the available compression settings.
|
@@ -62,6 +60,7 @@ extern int grpc_compression_trace;
|
|
62
60
|
* aforementioned 'grpc-encoding' metadata value, data will pass through
|
63
61
|
* uncompressed. */
|
64
62
|
|
65
|
-
extern const grpc_channel_filter
|
63
|
+
extern const grpc_channel_filter grpc_message_compress_filter;
|
66
64
|
|
67
|
-
#endif /*
|
65
|
+
#endif /* GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_COMPRESS_MESSAGE_COMPRESS_FILTER_H \
|
66
|
+
*/
|
@@ -31,7 +31,7 @@
|
|
31
31
|
*
|
32
32
|
*/
|
33
33
|
|
34
|
-
#include "src/core/
|
34
|
+
#include "src/core/ext/filters/http/server/http_server_filter.h"
|
35
35
|
|
36
36
|
#include <grpc/support/alloc.h>
|
37
37
|
#include <grpc/support/log.h>
|
@@ -46,8 +46,6 @@
|
|
46
46
|
#define EXPECTED_CONTENT_TYPE "application/grpc"
|
47
47
|
#define EXPECTED_CONTENT_TYPE_LENGTH sizeof(EXPECTED_CONTENT_TYPE) - 1
|
48
48
|
|
49
|
-
extern int grpc_http_trace;
|
50
|
-
|
51
49
|
typedef struct call_data {
|
52
50
|
grpc_linked_mdelem status;
|
53
51
|
grpc_linked_mdelem content_type;
|
@@ -240,9 +238,9 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx,
|
|
240
238
|
const int k_url_safe = 1;
|
241
239
|
grpc_slice_buffer_add(
|
242
240
|
&calld->read_slice_buffer,
|
243
|
-
|
244
|
-
|
245
|
-
|
241
|
+
grpc_base64_decode_with_len(
|
242
|
+
exec_ctx, (const char *)GRPC_SLICE_START_PTR(query_slice),
|
243
|
+
GRPC_SLICE_LENGTH(query_slice), k_url_safe));
|
246
244
|
grpc_slice_buffer_stream_init(&calld->read_stream,
|
247
245
|
&calld->read_slice_buffer, 0);
|
248
246
|
calld->seen_path_with_query = true;
|
@@ -31,12 +31,12 @@
|
|
31
31
|
*
|
32
32
|
*/
|
33
33
|
|
34
|
-
#ifndef
|
35
|
-
#define
|
34
|
+
#ifndef GRPC_CORE_EXT_FILTERS_HTTP_SERVER_HTTP_SERVER_FILTER_H
|
35
|
+
#define GRPC_CORE_EXT_FILTERS_HTTP_SERVER_HTTP_SERVER_FILTER_H
|
36
36
|
|
37
37
|
#include "src/core/lib/channel/channel_stack.h"
|
38
38
|
|
39
39
|
/* Processes metadata on the client side for HTTP2 transports */
|
40
40
|
extern const grpc_channel_filter grpc_http_server_filter;
|
41
41
|
|
42
|
-
#endif /*
|
42
|
+
#endif /* GRPC_CORE_EXT_FILTERS_HTTP_SERVER_HTTP_SERVER_FILTER_H */
|
@@ -47,32 +47,9 @@
|
|
47
47
|
#include "src/core/lib/surface/call.h"
|
48
48
|
#include "src/core/lib/surface/channel_init.h"
|
49
49
|
|
50
|
-
static void destroy_lr_cost_context(void *c) {
|
51
|
-
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
52
|
-
grpc_load_reporting_cost_context *cost_ctx = c;
|
53
|
-
for (size_t i = 0; i < cost_ctx->values_count; ++i) {
|
54
|
-
grpc_slice_unref_internal(&exec_ctx, cost_ctx->values[i]);
|
55
|
-
}
|
56
|
-
grpc_exec_ctx_finish(&exec_ctx);
|
57
|
-
gpr_free(cost_ctx->values);
|
58
|
-
gpr_free(cost_ctx);
|
59
|
-
}
|
60
|
-
|
61
|
-
void grpc_call_set_load_reporting_cost_context(
|
62
|
-
grpc_call *call, grpc_load_reporting_cost_context *ctx) {
|
63
|
-
grpc_call_context_set(call, GRPC_CONTEXT_LR_COST, ctx,
|
64
|
-
destroy_lr_cost_context);
|
65
|
-
}
|
66
|
-
|
67
50
|
static bool is_load_reporting_enabled(const grpc_channel_args *a) {
|
68
|
-
|
69
|
-
|
70
|
-
if (0 == strcmp(a->args[i].key, GRPC_ARG_ENABLE_LOAD_REPORTING)) {
|
71
|
-
return a->args[i].type == GRPC_ARG_INTEGER &&
|
72
|
-
a->args[i].value.integer != 0;
|
73
|
-
}
|
74
|
-
}
|
75
|
-
return false;
|
51
|
+
return grpc_channel_arg_get_bool(
|
52
|
+
grpc_channel_args_find(a, GRPC_ARG_ENABLE_LOAD_REPORTING), false);
|
76
53
|
}
|
77
54
|
|
78
55
|
static bool maybe_add_load_reporting_filter(grpc_exec_ctx *exec_ctx,
|
@@ -48,6 +48,8 @@
|
|
48
48
|
|
49
49
|
typedef struct call_data {
|
50
50
|
intptr_t id; /**< an id unique to the call */
|
51
|
+
bool have_trailing_md_string;
|
52
|
+
grpc_slice trailing_md_string;
|
51
53
|
bool have_initial_md_string;
|
52
54
|
grpc_slice initial_md_string;
|
53
55
|
bool have_service_method;
|
@@ -140,6 +142,9 @@ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
|
140
142
|
if (calld->have_initial_md_string) {
|
141
143
|
grpc_slice_unref_internal(exec_ctx, calld->initial_md_string);
|
142
144
|
}
|
145
|
+
if (calld->have_trailing_md_string) {
|
146
|
+
grpc_slice_unref_internal(exec_ctx, calld->trailing_md_string);
|
147
|
+
}
|
143
148
|
if (calld->have_service_method) {
|
144
149
|
grpc_slice_unref_internal(exec_ctx, calld->service_method);
|
145
150
|
}
|
@@ -183,6 +188,18 @@ static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
|
|
183
188
|
*/
|
184
189
|
}
|
185
190
|
|
191
|
+
static grpc_filtered_mdelem lr_trailing_md_filter(grpc_exec_ctx *exec_ctx,
|
192
|
+
void *user_data,
|
193
|
+
grpc_mdelem md) {
|
194
|
+
grpc_call_element *elem = user_data;
|
195
|
+
call_data *calld = elem->call_data;
|
196
|
+
if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_LB_COST_BIN)) {
|
197
|
+
calld->trailing_md_string = GRPC_MDVALUE(md);
|
198
|
+
return GRPC_FILTERED_REMOVE();
|
199
|
+
}
|
200
|
+
return GRPC_FILTERED_MDELEM(md);
|
201
|
+
}
|
202
|
+
|
186
203
|
static void lr_start_transport_stream_op_batch(
|
187
204
|
grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
188
205
|
grpc_transport_stream_op_batch *op) {
|
@@ -190,13 +207,21 @@ static void lr_start_transport_stream_op_batch(
|
|
190
207
|
call_data *calld = elem->call_data;
|
191
208
|
|
192
209
|
if (op->recv_initial_metadata) {
|
210
|
+
/* substitute our callback for the higher callback */
|
193
211
|
calld->recv_initial_metadata =
|
194
212
|
op->payload->recv_initial_metadata.recv_initial_metadata;
|
195
|
-
/* substitute our callback for the higher callback */
|
196
213
|
calld->ops_recv_initial_metadata_ready =
|
197
214
|
op->payload->recv_initial_metadata.recv_initial_metadata_ready;
|
198
215
|
op->payload->recv_initial_metadata.recv_initial_metadata_ready =
|
199
216
|
&calld->on_initial_md_ready;
|
217
|
+
} else if (op->send_trailing_metadata) {
|
218
|
+
GRPC_LOG_IF_ERROR(
|
219
|
+
"grpc_metadata_batch_filter",
|
220
|
+
grpc_metadata_batch_filter(
|
221
|
+
exec_ctx,
|
222
|
+
op->payload->send_trailing_metadata.send_trailing_metadata,
|
223
|
+
lr_trailing_md_filter, elem,
|
224
|
+
"LR trailing metadata filtering error"));
|
200
225
|
}
|
201
226
|
grpc_call_next_op(exec_ctx, elem, op);
|
202
227
|
|
@@ -47,6 +47,11 @@
|
|
47
47
|
#define DEFAULT_MAX_CONNECTION_IDLE_MS INT_MAX
|
48
48
|
#define MAX_CONNECTION_AGE_JITTER 0.1
|
49
49
|
|
50
|
+
#define MAX_CONNECTION_AGE_INTEGER_OPTIONS \
|
51
|
+
(grpc_integer_options) { DEFAULT_MAX_CONNECTION_AGE_MS, 1, INT_MAX }
|
52
|
+
#define MAX_CONNECTION_IDLE_INTEGER_OPTIONS \
|
53
|
+
(grpc_integer_options) { DEFAULT_MAX_CONNECTION_IDLE_MS, 1, INT_MAX }
|
54
|
+
|
50
55
|
typedef struct channel_data {
|
51
56
|
/* We take a reference to the channel stack for the timer callback */
|
52
57
|
grpc_channel_stack* channel_stack;
|
@@ -315,8 +320,7 @@ static grpc_error* init_channel_elem(grpc_exec_ctx* exec_ctx,
|
|
315
320
|
if (0 == strcmp(args->channel_args->args[i].key,
|
316
321
|
GRPC_ARG_MAX_CONNECTION_AGE_MS)) {
|
317
322
|
const int value = grpc_channel_arg_get_integer(
|
318
|
-
&args->channel_args->args[i],
|
319
|
-
(grpc_integer_options){DEFAULT_MAX_CONNECTION_AGE_MS, 1, INT_MAX});
|
323
|
+
&args->channel_args->args[i], MAX_CONNECTION_AGE_INTEGER_OPTIONS);
|
320
324
|
chand->max_connection_age =
|
321
325
|
value == INT_MAX
|
322
326
|
? gpr_inf_future(GPR_TIMESPAN)
|
@@ -334,8 +338,7 @@ static grpc_error* init_channel_elem(grpc_exec_ctx* exec_ctx,
|
|
334
338
|
} else if (0 == strcmp(args->channel_args->args[i].key,
|
335
339
|
GRPC_ARG_MAX_CONNECTION_IDLE_MS)) {
|
336
340
|
const int value = grpc_channel_arg_get_integer(
|
337
|
-
&args->channel_args->args[i],
|
338
|
-
(grpc_integer_options){DEFAULT_MAX_CONNECTION_IDLE_MS, 1, INT_MAX});
|
341
|
+
&args->channel_args->args[i], MAX_CONNECTION_IDLE_INTEGER_OPTIONS);
|
339
342
|
chand->max_connection_idle =
|
340
343
|
value == INT_MAX ? gpr_inf_future(GPR_TIMESPAN)
|
341
344
|
: gpr_time_from_millis(value, GPR_TIMESPAN);
|
@@ -412,16 +415,13 @@ static bool maybe_add_max_age_filter(grpc_exec_ctx* exec_ctx,
|
|
412
415
|
void* arg) {
|
413
416
|
const grpc_channel_args* channel_args =
|
414
417
|
grpc_channel_stack_builder_get_channel_arguments(builder);
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
if (a != NULL && a->type == GRPC_ARG_INTEGER && a->value.integer != INT_MAX) {
|
423
|
-
enable = true;
|
424
|
-
}
|
418
|
+
bool enable =
|
419
|
+
grpc_channel_arg_get_integer(
|
420
|
+
grpc_channel_args_find(channel_args, GRPC_ARG_MAX_CONNECTION_AGE_MS),
|
421
|
+
MAX_CONNECTION_AGE_INTEGER_OPTIONS) != INT_MAX &&
|
422
|
+
grpc_channel_arg_get_integer(
|
423
|
+
grpc_channel_args_find(channel_args, GRPC_ARG_MAX_CONNECTION_IDLE_MS),
|
424
|
+
MAX_CONNECTION_IDLE_INTEGER_OPTIONS) != INT_MAX;
|
425
425
|
if (enable) {
|
426
426
|
return grpc_channel_stack_builder_prepend_filter(
|
427
427
|
builder, &grpc_max_age_filter, NULL, NULL);
|