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.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +418 -126
  3. data/include/grpc/grpc.h +15 -69
  4. data/include/grpc/grpc_security.h +1 -1
  5. data/include/grpc/impl/codegen/compression_types.h +3 -4
  6. data/include/grpc/impl/codegen/gpr_types.h +0 -1
  7. data/include/grpc/impl/codegen/grpc_types.h +69 -3
  8. data/include/grpc/impl/codegen/port_platform.h +6 -0
  9. data/include/grpc/impl/codegen/slice.h +2 -1
  10. data/include/grpc/load_reporting.h +6 -6
  11. data/include/grpc/slice.h +25 -3
  12. data/include/grpc/slice_buffer.h +4 -0
  13. data/src/core/ext/census/context.c +1 -1
  14. data/src/core/ext/census/resource.c +3 -1
  15. data/src/core/ext/filters/client_channel/channel_connectivity.c +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel.c +158 -100
  17. data/src/core/ext/filters/client_channel/client_channel_plugin.c +3 -2
  18. data/src/core/ext/filters/client_channel/lb_policy.c +2 -1
  19. data/src/core/ext/filters/client_channel/lb_policy.h +5 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c +153 -0
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +42 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +344 -88
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c +133 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +65 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +47 -5
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +19 -8
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +63 -34
  29. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +2 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +13 -12
  31. data/src/core/ext/filters/client_channel/lb_policy_factory.c +28 -5
  32. data/src/core/ext/filters/client_channel/lb_policy_factory.h +18 -4
  33. data/src/core/ext/filters/client_channel/parse_address.c +37 -7
  34. data/src/core/ext/filters/client_channel/parse_address.h +11 -8
  35. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +3 -3
  36. data/src/core/ext/filters/client_channel/subchannel.c +19 -16
  37. data/src/core/ext/filters/client_channel/subchannel.h +1 -0
  38. data/src/core/ext/filters/client_channel/uri_parser.c +36 -22
  39. data/src/core/ext/filters/client_channel/uri_parser.h +1 -1
  40. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.c +42 -17
  41. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.h +8 -9
  42. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.c +19 -11
  43. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.h +3 -6
  44. data/src/core/ext/filters/http/http_filters_plugin.c +104 -0
  45. data/src/core/{lib/channel/compress_filter.c → ext/filters/http/message_compress/message_compress_filter.c} +124 -23
  46. data/src/core/{lib/channel/compress_filter.h → ext/filters/http/message_compress/message_compress_filter.h} +5 -6
  47. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.c +4 -6
  48. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.h +3 -3
  49. data/src/core/ext/filters/load_reporting/load_reporting.c +2 -25
  50. data/src/core/ext/filters/load_reporting/load_reporting_filter.c +26 -1
  51. data/src/core/ext/filters/max_age/max_age_filter.c +14 -14
  52. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.c +91 -47
  53. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.h +3 -3
  54. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +1 -1
  55. data/src/core/ext/transport/chttp2/server/chttp2_server.c +2 -2
  56. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +2 -2
  57. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +3 -3
  58. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +296 -172
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
  60. data/src/core/ext/transport/chttp2/transport/frame_data.c +203 -164
  61. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -14
  62. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +1 -1
  63. data/src/core/ext/transport/chttp2/transport/frame_ping.c +1 -1
  64. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +1 -1
  65. data/src/core/ext/transport/chttp2/transport/frame_settings.c +5 -5
  66. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +1 -1
  67. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +4 -4
  68. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +2 -4
  69. data/src/core/ext/transport/chttp2/transport/hpack_table.c +4 -3
  70. data/src/core/ext/transport/chttp2/transport/internal.h +50 -33
  71. data/src/core/ext/transport/chttp2/transport/parsing.c +10 -11
  72. data/src/core/ext/transport/chttp2/transport/writing.c +32 -13
  73. data/src/core/lib/channel/channel_args.c +28 -9
  74. data/src/core/lib/channel/channel_args.h +5 -1
  75. data/src/core/lib/channel/channel_stack.c +1 -1
  76. data/src/core/lib/channel/channel_stack.h +2 -2
  77. data/src/core/lib/channel/channel_stack_builder.c +13 -1
  78. data/src/core/lib/channel/channel_stack_builder.h +5 -1
  79. data/src/core/lib/channel/connected_channel.c +3 -1
  80. data/src/core/lib/channel/context.h +2 -2
  81. data/src/core/lib/compression/message_compress.c +2 -2
  82. data/src/core/lib/debug/trace.c +13 -6
  83. data/src/core/lib/debug/trace.h +27 -1
  84. data/src/core/lib/http/httpcli.c +1 -1
  85. data/src/core/lib/http/httpcli_security_connector.c +6 -10
  86. data/src/core/lib/http/parser.c +2 -2
  87. data/src/core/lib/http/parser.h +2 -1
  88. data/src/core/lib/iomgr/combiner.c +6 -6
  89. data/src/core/lib/iomgr/combiner.h +2 -1
  90. data/src/core/lib/iomgr/error.c +12 -5
  91. data/src/core/lib/iomgr/error.h +13 -13
  92. data/src/core/lib/iomgr/ev_epoll1_linux.c +984 -0
  93. data/src/core/lib/iomgr/ev_epoll1_linux.h +44 -0
  94. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c +2146 -0
  95. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.h +43 -0
  96. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c +1337 -0
  97. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.h +43 -0
  98. data/src/core/lib/iomgr/ev_epollex_linux.c +1511 -0
  99. data/src/core/lib/iomgr/ev_epollex_linux.h +43 -0
  100. data/src/core/lib/iomgr/{ev_epoll_linux.c → ev_epollsig_linux.c} +24 -31
  101. data/src/core/lib/iomgr/{ev_epoll_linux.h → ev_epollsig_linux.h} +4 -4
  102. data/src/core/lib/iomgr/ev_poll_posix.c +12 -27
  103. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  104. data/src/core/lib/iomgr/ev_posix.c +22 -8
  105. data/src/core/lib/iomgr/ev_posix.h +4 -3
  106. data/src/core/lib/iomgr/exec_ctx.c +5 -0
  107. data/src/core/lib/iomgr/exec_ctx.h +2 -0
  108. data/src/core/lib/iomgr/iomgr.c +4 -0
  109. data/src/core/lib/iomgr/iomgr.h +3 -0
  110. data/src/core/lib/iomgr/is_epollexclusive_available.c +116 -0
  111. data/src/core/lib/iomgr/is_epollexclusive_available.h +41 -0
  112. data/src/core/lib/iomgr/lockfree_event.c +16 -0
  113. data/src/core/lib/iomgr/pollset.h +2 -5
  114. data/src/core/lib/iomgr/pollset_uv.c +1 -1
  115. data/src/core/lib/iomgr/pollset_windows.c +3 -3
  116. data/src/core/lib/iomgr/resource_quota.c +9 -8
  117. data/src/core/lib/iomgr/resource_quota.h +2 -1
  118. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  119. data/src/core/lib/iomgr/socket_mutator.h +2 -0
  120. data/src/core/lib/iomgr/sys_epoll_wrapper.h +43 -0
  121. data/src/core/lib/iomgr/tcp_client_posix.c +6 -6
  122. data/src/core/lib/iomgr/tcp_client_uv.c +3 -3
  123. data/src/core/lib/iomgr/tcp_posix.c +7 -7
  124. data/src/core/lib/iomgr/tcp_posix.h +2 -1
  125. data/src/core/lib/iomgr/tcp_server_posix.c +1 -1
  126. data/src/core/lib/iomgr/tcp_uv.c +6 -6
  127. data/src/core/lib/iomgr/tcp_uv.h +2 -1
  128. data/src/core/lib/iomgr/tcp_windows.c +1 -1
  129. data/src/core/lib/iomgr/timer_generic.c +24 -25
  130. data/src/core/lib/iomgr/timer_manager.c +276 -0
  131. data/src/core/lib/iomgr/timer_manager.h +52 -0
  132. data/src/core/lib/iomgr/timer_uv.c +6 -0
  133. data/src/core/lib/iomgr/udp_server.c +42 -9
  134. data/src/core/lib/iomgr/udp_server.h +3 -1
  135. data/src/core/lib/security/credentials/credentials.c +0 -1
  136. data/src/core/lib/security/credentials/fake/fake_credentials.c +23 -0
  137. data/src/core/lib/security/credentials/fake/fake_credentials.h +12 -9
  138. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +1 -1
  139. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +1 -1
  140. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +1 -1
  141. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +24 -53
  142. data/src/core/lib/security/transport/client_auth_filter.c +9 -3
  143. data/src/core/lib/security/transport/secure_endpoint.c +7 -7
  144. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  145. data/src/core/lib/security/transport/security_connector.c +32 -51
  146. data/src/core/lib/security/transport/security_connector.h +10 -14
  147. data/src/core/lib/slice/b64.c +1 -1
  148. data/src/core/lib/slice/percent_encoding.c +3 -3
  149. data/src/core/lib/slice/slice.c +66 -33
  150. data/src/core/lib/slice/slice_buffer.c +25 -6
  151. data/src/core/lib/slice/slice_hash_table.c +33 -35
  152. data/src/core/lib/slice/slice_hash_table.h +7 -12
  153. data/src/core/lib/support/atomic.h +45 -0
  154. data/src/core/lib/support/atomic_with_atm.h +70 -0
  155. data/src/core/lib/support/atomic_with_std.h +48 -0
  156. data/src/core/lib/support/avl.c +14 -14
  157. data/src/core/lib/support/memory.h +74 -0
  158. data/src/core/lib/support/mpscq.c +12 -1
  159. data/src/core/lib/support/mpscq.h +4 -0
  160. data/src/core/lib/support/stack_lockfree.c +3 -36
  161. data/src/core/lib/support/time_posix.c +8 -0
  162. data/src/core/lib/support/tmpfile_posix.c +10 -10
  163. data/src/core/lib/surface/alarm.c +3 -1
  164. data/src/core/lib/surface/api_trace.c +2 -1
  165. data/src/core/lib/surface/api_trace.h +2 -2
  166. data/src/core/lib/surface/byte_buffer_reader.c +1 -1
  167. data/src/core/lib/surface/call.c +65 -22
  168. data/src/core/lib/surface/call.h +4 -2
  169. data/src/core/lib/surface/channel_init.c +2 -19
  170. data/src/core/lib/surface/channel_stack_type.c +18 -0
  171. data/src/core/lib/surface/channel_stack_type.h +2 -0
  172. data/src/core/lib/surface/completion_queue.c +249 -83
  173. data/src/core/lib/surface/completion_queue.h +18 -13
  174. data/src/core/lib/surface/completion_queue_factory.c +24 -9
  175. data/src/core/lib/surface/init.c +1 -52
  176. data/src/core/lib/surface/{lame_client.c → lame_client.cc} +37 -26
  177. data/src/core/lib/surface/server.c +50 -27
  178. data/src/core/lib/surface/server.h +2 -1
  179. data/src/core/lib/surface/version.c +2 -2
  180. data/src/core/lib/transport/bdp_estimator.c +20 -9
  181. data/src/core/lib/transport/bdp_estimator.h +5 -1
  182. data/src/core/lib/transport/byte_stream.c +23 -9
  183. data/src/core/lib/transport/byte_stream.h +15 -6
  184. data/src/core/lib/transport/connectivity_state.c +6 -6
  185. data/src/core/lib/transport/connectivity_state.h +2 -1
  186. data/src/core/lib/transport/service_config.c +6 -13
  187. data/src/core/lib/transport/service_config.h +2 -2
  188. data/src/core/lib/transport/static_metadata.c +403 -389
  189. data/src/core/lib/transport/static_metadata.h +127 -114
  190. data/src/core/plugin_registry/grpc_plugin_registry.c +12 -0
  191. data/src/core/tsi/fake_transport_security.c +5 -4
  192. data/src/core/tsi/ssl_transport_security.c +71 -82
  193. data/src/core/tsi/ssl_transport_security.h +39 -61
  194. data/src/core/tsi/transport_security.c +83 -2
  195. data/src/core/tsi/transport_security.h +27 -2
  196. data/src/core/tsi/transport_security_adapter.c +236 -0
  197. data/src/core/tsi/transport_security_adapter.h +62 -0
  198. data/src/core/tsi/transport_security_interface.h +179 -66
  199. data/src/ruby/ext/grpc/extconf.rb +2 -1
  200. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -6
  201. data/src/ruby/ext/grpc/rb_call.c +56 -48
  202. data/src/ruby/ext/grpc/rb_call.h +3 -4
  203. data/src/ruby/ext/grpc/rb_call_credentials.c +23 -22
  204. data/src/ruby/ext/grpc/rb_channel.c +45 -29
  205. data/src/ruby/ext/grpc/rb_channel_args.c +11 -9
  206. data/src/ruby/ext/grpc/rb_channel_credentials.c +16 -12
  207. data/src/ruby/ext/grpc/rb_completion_queue.c +7 -9
  208. data/src/ruby/ext/grpc/rb_compression_options.c +7 -6
  209. data/src/ruby/ext/grpc/rb_event_thread.c +10 -12
  210. data/src/ruby/ext/grpc/rb_event_thread.h +1 -2
  211. data/src/ruby/ext/grpc/rb_grpc.c +11 -15
  212. data/src/ruby/ext/grpc/rb_grpc.h +2 -2
  213. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +14 -6
  214. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +22 -10
  215. data/src/ruby/ext/grpc/rb_server.c +26 -28
  216. data/src/ruby/lib/grpc/version.rb +1 -1
  217. metadata +40 -18
  218. data/src/ruby/lib/grpc/grpc_c.bundle +0 -0
  219. 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
- int grpc_compression_trace = 0;
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
- /** If true, contents of \a compression_algorithm are authoritative */
63
- int has_compression_algorithm;
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 int skip_compression(grpc_call_element *elem, uint32_t flags) {
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 (calld->has_compression_algorithm) {
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) GRPC_MUST_USE_RESULT;
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
- calld->has_compression_algorithm = 1;
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
- calld->has_compression_algorithm = 1; /* GPR_TRUE */
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->incoming_slice, ~(size_t)0, &calld->got_slice)) {
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
- !skip_compression(elem, op->payload->send_message.send_message->flags)) {
264
- calld->send_op = op;
265
- calld->send_length = op->payload->send_message.send_message->length;
266
- calld->send_flags = op->payload->send_message.send_message->flags;
267
- continue_send_message(exec_ctx, elem);
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 grpc_compress_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 GRPC_CORE_LIB_CHANNEL_COMPRESS_FILTER_H
35
- #define GRPC_CORE_LIB_CHANNEL_COMPRESS_FILTER_H
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 grpc_compress_filter;
63
+ extern const grpc_channel_filter grpc_message_compress_filter;
66
64
 
67
- #endif /* GRPC_CORE_LIB_CHANNEL_COMPRESS_FILTER_H */
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/lib/channel/http_server_filter.h"
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
- grpc_base64_decode(exec_ctx,
244
- (const char *)GRPC_SLICE_START_PTR(query_slice),
245
- k_url_safe));
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 GRPC_CORE_LIB_CHANNEL_HTTP_SERVER_FILTER_H
35
- #define GRPC_CORE_LIB_CHANNEL_HTTP_SERVER_FILTER_H
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 /* GRPC_CORE_LIB_CHANNEL_HTTP_SERVER_FILTER_H */
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
- if (a == NULL) return false;
69
- for (size_t i = 0; i < a->num_args; i++) {
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
- const grpc_arg* a =
416
- grpc_channel_args_find(channel_args, GRPC_ARG_MAX_CONNECTION_AGE_MS);
417
- bool enable = false;
418
- if (a != NULL && a->type == GRPC_ARG_INTEGER && a->value.integer != INT_MAX) {
419
- enable = true;
420
- }
421
- a = grpc_channel_args_find(channel_args, GRPC_ARG_MAX_CONNECTION_IDLE_MS);
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);