grpc 1.12.0 → 1.13.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +314 -23
  3. data/include/grpc/impl/codegen/fork.h +4 -4
  4. data/include/grpc/impl/codegen/grpc_types.h +1 -1
  5. data/include/grpc/impl/codegen/port_platform.h +3 -0
  6. data/src/boringssl/err_data.c +256 -246
  7. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
  8. data/src/core/ext/filters/client_channel/client_channel.cc +367 -272
  9. data/src/core/ext/filters/client_channel/lb_policy.h +1 -3
  10. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -9
  11. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +42 -32
  12. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +36 -0
  13. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +36 -102
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +37 -32
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +22 -19
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  17. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
  18. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  19. data/src/core/ext/filters/client_channel/resolver.h +1 -3
  20. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  22. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1
  23. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +4 -4
  24. data/src/core/ext/filters/client_channel/subchannel.cc +3 -3
  25. data/src/core/ext/filters/http/client_authority_filter.cc +5 -4
  26. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -4
  27. data/src/core/ext/filters/http/server/http_server_filter.cc +123 -131
  28. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
  29. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +9 -8
  30. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +19 -19
  31. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +10 -6
  32. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -3
  33. data/src/core/ext/transport/chttp2/transport/parsing.cc +14 -12
  34. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -6
  35. data/src/core/lib/channel/channel_stack.cc +0 -5
  36. data/src/core/lib/channel/channel_stack.h +1 -1
  37. data/src/core/lib/channel/channel_stack_builder.cc +0 -3
  38. data/src/core/lib/channel/channel_stack_builder.h +0 -2
  39. data/src/core/lib/channel/channel_trace.cc +3 -3
  40. data/src/core/lib/channel/channelz_registry.cc +77 -0
  41. data/src/core/lib/channel/channelz_registry.h +99 -0
  42. data/src/core/lib/channel/handshaker.cc +20 -1
  43. data/src/core/lib/debug/stats.h +7 -0
  44. data/src/core/lib/debug/stats_data.cc +5 -0
  45. data/src/core/lib/debug/stats_data.h +120 -0
  46. data/src/core/lib/debug/trace.h +11 -9
  47. data/src/core/lib/gprpp/fork.cc +260 -0
  48. data/src/core/lib/gprpp/fork.h +79 -0
  49. data/src/core/lib/gprpp/memory.h +12 -0
  50. data/src/core/lib/gprpp/orphanable.h +2 -6
  51. data/src/core/lib/gprpp/ref_counted.h +2 -6
  52. data/src/core/lib/gprpp/thd.h +0 -3
  53. data/src/core/lib/gprpp/thd_posix.cc +4 -53
  54. data/src/core/lib/gprpp/thd_windows.cc +0 -7
  55. data/src/core/lib/http/httpcli_security_connector.cc +1 -3
  56. data/src/core/lib/iomgr/combiner.cc +19 -2
  57. data/src/core/lib/iomgr/combiner.h +1 -1
  58. data/src/core/lib/iomgr/ev_epoll1_linux.cc +2 -2
  59. data/src/core/lib/iomgr/ev_epollex_linux.cc +59 -3
  60. data/src/core/lib/iomgr/ev_epollsig_linux.cc +1 -1
  61. data/src/core/lib/iomgr/ev_poll_posix.cc +2 -2
  62. data/src/core/lib/iomgr/ev_posix.cc +11 -4
  63. data/src/core/lib/iomgr/ev_posix.h +6 -0
  64. data/src/core/lib/iomgr/exec_ctx.cc +9 -9
  65. data/src/core/lib/iomgr/exec_ctx.h +39 -20
  66. data/src/core/lib/iomgr/fork_posix.cc +30 -18
  67. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  68. data/src/core/lib/iomgr/polling_entity.cc +11 -2
  69. data/src/core/lib/iomgr/pollset_custom.cc +2 -2
  70. data/src/core/lib/iomgr/port.h +38 -1
  71. data/src/core/lib/iomgr/resolve_address.h +1 -1
  72. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  73. data/src/core/lib/iomgr/resource_quota.cc +1 -1
  74. data/src/core/lib/iomgr/sockaddr_posix.h +1 -1
  75. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  76. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -1
  77. data/src/core/lib/iomgr/tcp_client_custom.cc +3 -3
  78. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -2
  79. data/src/core/lib/iomgr/tcp_custom.cc +1 -1
  80. data/src/core/lib/iomgr/tcp_posix.cc +18 -10
  81. data/src/core/lib/iomgr/tcp_server_posix.cc +9 -8
  82. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  83. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +16 -4
  84. data/src/core/lib/iomgr/timer.h +1 -1
  85. data/src/core/lib/iomgr/timer_generic.cc +113 -41
  86. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  87. data/src/core/lib/security/credentials/credentials.h +1 -0
  88. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +88 -115
  89. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +16 -0
  90. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
  91. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  92. data/src/core/lib/security/security_connector/alts_security_connector.cc +2 -1
  93. data/src/core/lib/security/security_connector/security_connector.cc +7 -7
  94. data/src/core/lib/security/transport/security_handshaker.cc +1 -0
  95. data/src/core/lib/security/util/json_util.cc +4 -0
  96. data/src/core/lib/slice/slice_buffer.cc +15 -3
  97. data/src/core/lib/surface/call.cc +31 -17
  98. data/src/core/lib/surface/call.h +5 -0
  99. data/src/core/lib/surface/channel.cc +2 -5
  100. data/src/core/lib/surface/completion_queue.cc +1 -3
  101. data/src/core/lib/surface/completion_queue.h +0 -1
  102. data/src/core/lib/surface/init.cc +7 -8
  103. data/src/core/lib/surface/version.cc +2 -2
  104. data/src/core/lib/transport/byte_stream.cc +1 -1
  105. data/src/core/lib/transport/transport.cc +2 -1
  106. data/src/core/lib/transport/transport.h +4 -8
  107. data/src/core/lib/transport/transport_op_string.cc +1 -1
  108. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -7
  109. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +10 -0
  110. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +28 -2
  111. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -0
  112. data/src/core/tsi/fake_transport_security.cc +1 -0
  113. data/src/core/tsi/ssl_transport_security.cc +238 -110
  114. data/src/core/tsi/transport_security.cc +14 -0
  115. data/src/core/tsi/transport_security.h +2 -0
  116. data/src/core/tsi/transport_security_interface.h +11 -1
  117. data/src/ruby/bin/math_client.rb +17 -9
  118. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -1
  119. data/src/ruby/lib/grpc/version.rb +1 -1
  120. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +4 -1
  121. data/third_party/boringssl/crypto/asn1/a_int.c +33 -28
  122. data/third_party/boringssl/crypto/asn1/a_mbstr.c +24 -22
  123. data/third_party/boringssl/crypto/asn1/a_utf8.c +13 -11
  124. data/third_party/boringssl/crypto/asn1/asn1_locl.h +3 -0
  125. data/third_party/boringssl/crypto/bio/fd.c +1 -0
  126. data/third_party/boringssl/crypto/bio/file.c +2 -0
  127. data/third_party/boringssl/crypto/bn_extra/convert.c +6 -5
  128. data/third_party/boringssl/crypto/bytestring/ber.c +1 -4
  129. data/third_party/boringssl/crypto/bytestring/cbb.c +116 -16
  130. data/third_party/boringssl/crypto/bytestring/cbs.c +150 -20
  131. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +171 -0
  132. data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +2 -0
  133. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +1 -2
  134. data/third_party/boringssl/crypto/cpu-aarch64-fuchsia.c +55 -0
  135. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +2 -1
  136. data/third_party/boringssl/crypto/dsa/dsa.c +16 -54
  137. data/third_party/boringssl/crypto/fipsmodule/bcm.c +11 -542
  138. data/third_party/boringssl/crypto/fipsmodule/bn/add.c +33 -64
  139. data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +4 -3
  140. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +122 -70
  141. data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +32 -71
  142. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +58 -112
  143. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +198 -122
  144. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +31 -65
  145. data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +2 -1
  146. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +98 -15
  147. data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +1 -1
  148. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +124 -81
  149. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +8 -30
  150. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +303 -347
  151. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +2 -3
  152. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +3 -4
  153. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +199 -222
  154. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +27 -47
  155. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +45 -28
  156. data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +1 -1
  157. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +10 -10
  158. data/third_party/boringssl/crypto/fipsmodule/des/internal.h +2 -0
  159. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +78 -47
  160. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +35 -54
  161. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +3 -10
  162. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +36 -22
  163. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +59 -90
  164. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +29 -48
  165. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +17 -26
  166. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +15 -11
  167. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +45 -51
  168. data/third_party/boringssl/crypto/fipsmodule/ec/{util-64.c → util.c} +0 -5
  169. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +144 -264
  170. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +78 -56
  171. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +256 -0
  172. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +36 -32
  173. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +9 -7
  174. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +16 -10
  175. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +255 -102
  176. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +581 -0
  177. data/third_party/boringssl/crypto/fipsmodule/tls/internal.h +39 -0
  178. data/third_party/boringssl/crypto/fipsmodule/tls/kdf.c +165 -0
  179. data/third_party/boringssl/crypto/internal.h +65 -2
  180. data/third_party/boringssl/crypto/mem.c +0 -2
  181. data/third_party/boringssl/crypto/obj/obj.c +6 -73
  182. data/third_party/boringssl/crypto/thread_pthread.c +35 -5
  183. data/third_party/boringssl/crypto/x509/a_strex.c +11 -11
  184. data/third_party/boringssl/crypto/x509/x_name.c +13 -0
  185. data/third_party/boringssl/include/openssl/aead.h +4 -0
  186. data/third_party/boringssl/include/openssl/asn1.h +1 -3
  187. data/third_party/boringssl/include/openssl/base.h +1 -14
  188. data/third_party/boringssl/include/openssl/bio.h +1 -1
  189. data/third_party/boringssl/include/openssl/bn.h +49 -15
  190. data/third_party/boringssl/include/openssl/bytestring.h +49 -24
  191. data/third_party/boringssl/include/openssl/crypto.h +4 -0
  192. data/third_party/boringssl/include/openssl/ec_key.h +7 -3
  193. data/third_party/boringssl/include/openssl/err.h +9 -9
  194. data/third_party/boringssl/include/openssl/evp.h +1 -1
  195. data/third_party/boringssl/include/openssl/rsa.h +34 -10
  196. data/third_party/boringssl/include/openssl/ssl.h +160 -17
  197. data/third_party/boringssl/include/openssl/stack.h +1 -1
  198. data/third_party/boringssl/include/openssl/tls1.h +10 -2
  199. data/third_party/boringssl/include/openssl/x509.h +3 -0
  200. data/third_party/boringssl/ssl/d1_both.cc +16 -2
  201. data/third_party/boringssl/ssl/dtls_method.cc +1 -1
  202. data/third_party/boringssl/ssl/handoff.cc +285 -0
  203. data/third_party/boringssl/ssl/handshake.cc +26 -12
  204. data/third_party/boringssl/ssl/handshake_client.cc +65 -31
  205. data/third_party/boringssl/ssl/handshake_server.cc +14 -2
  206. data/third_party/boringssl/ssl/internal.h +132 -79
  207. data/third_party/boringssl/ssl/s3_both.cc +2 -2
  208. data/third_party/boringssl/ssl/s3_lib.cc +3 -1
  209. data/third_party/boringssl/ssl/s3_pkt.cc +0 -18
  210. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +1 -4
  211. data/third_party/boringssl/ssl/ssl_asn1.cc +47 -43
  212. data/third_party/boringssl/ssl/ssl_cipher.cc +8 -8
  213. data/third_party/boringssl/ssl/ssl_key_share.cc +3 -1
  214. data/third_party/boringssl/ssl/ssl_lib.cc +83 -14
  215. data/third_party/boringssl/ssl/ssl_privkey.cc +6 -0
  216. data/third_party/boringssl/ssl/ssl_stat.cc +6 -6
  217. data/third_party/boringssl/ssl/ssl_versions.cc +12 -85
  218. data/third_party/boringssl/ssl/ssl_x509.cc +59 -61
  219. data/third_party/boringssl/ssl/t1_enc.cc +73 -124
  220. data/third_party/boringssl/ssl/t1_lib.cc +367 -41
  221. data/third_party/boringssl/ssl/tls13_both.cc +8 -0
  222. data/third_party/boringssl/ssl/tls13_client.cc +98 -184
  223. data/third_party/boringssl/ssl/tls13_enc.cc +88 -158
  224. data/third_party/boringssl/ssl/tls13_server.cc +91 -137
  225. data/third_party/boringssl/ssl/tls_method.cc +0 -17
  226. data/third_party/boringssl/ssl/tls_record.cc +1 -10
  227. data/third_party/boringssl/third_party/fiat/curve25519.c +921 -2753
  228. data/third_party/boringssl/third_party/fiat/curve25519_tables.h +7880 -0
  229. data/third_party/boringssl/third_party/fiat/internal.h +32 -20
  230. data/third_party/boringssl/third_party/fiat/p256.c +1824 -0
  231. metadata +64 -64
  232. data/src/core/lib/channel/channel_trace_registry.cc +0 -80
  233. data/src/core/lib/channel/channel_trace_registry.h +0 -43
  234. data/src/core/lib/gpr/fork.cc +0 -78
  235. data/src/core/lib/gpr/fork.h +0 -35
  236. data/src/core/tsi/transport_security_adapter.cc +0 -235
  237. data/src/core/tsi/transport_security_adapter.h +0 -41
  238. data/src/ruby/bin/apis/google/protobuf/empty.rb +0 -29
  239. data/src/ruby/bin/apis/pubsub_demo.rb +0 -241
  240. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +0 -159
  241. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +0 -88
  242. data/src/ruby/pb/test/client.rb +0 -764
  243. data/src/ruby/pb/test/server.rb +0 -252
  244. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +0 -247
  245. data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +0 -1674
@@ -21,47 +21,52 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
- #include <stdbool.h>
24
+ #include <grpc/support/atm.h>
25
25
 
26
- #include <grpc/impl/codegen/grpc_types.h>
26
+ #include "src/core/lib/gprpp/inlined_vector.h"
27
+ #include "src/core/lib/gprpp/memory.h"
28
+ #include "src/core/lib/gprpp/ref_counted.h"
27
29
 
28
- typedef struct grpc_grpclb_client_stats grpc_grpclb_client_stats;
30
+ namespace grpc_core {
29
31
 
30
- typedef struct {
31
- char* token;
32
- int64_t count;
33
- } grpc_grpclb_drop_token_count;
32
+ class GrpcLbClientStats : public RefCounted<GrpcLbClientStats> {
33
+ public:
34
+ struct DropTokenCount {
35
+ UniquePtr<char> token;
36
+ int64_t count;
34
37
 
35
- typedef struct {
36
- grpc_grpclb_drop_token_count* token_counts;
37
- size_t num_entries;
38
- } grpc_grpclb_dropped_call_counts;
38
+ DropTokenCount(UniquePtr<char> token, int64_t count)
39
+ : token(std::move(token)), count(count) {}
40
+ };
39
41
 
40
- grpc_grpclb_client_stats* grpc_grpclb_client_stats_create();
41
- grpc_grpclb_client_stats* grpc_grpclb_client_stats_ref(
42
- grpc_grpclb_client_stats* client_stats);
43
- void grpc_grpclb_client_stats_unref(grpc_grpclb_client_stats* client_stats);
42
+ typedef InlinedVector<DropTokenCount, 10> DroppedCallCounts;
44
43
 
45
- void grpc_grpclb_client_stats_add_call_started(
46
- grpc_grpclb_client_stats* client_stats);
47
- void grpc_grpclb_client_stats_add_call_finished(
48
- bool finished_with_client_failed_to_send, bool finished_known_received,
49
- grpc_grpclb_client_stats* client_stats);
44
+ GrpcLbClientStats() {}
50
45
 
51
- // This method is not thread-safe; caller must synchronize.
52
- void grpc_grpclb_client_stats_add_call_dropped_locked(
53
- char* token, grpc_grpclb_client_stats* client_stats);
46
+ void AddCallStarted();
47
+ void AddCallFinished(bool finished_with_client_failed_to_send,
48
+ bool finished_known_received);
54
49
 
55
- // This method is not thread-safe; caller must synchronize.
56
- void grpc_grpclb_client_stats_get_locked(
57
- grpc_grpclb_client_stats* client_stats, int64_t* num_calls_started,
58
- int64_t* num_calls_finished,
59
- int64_t* num_calls_finished_with_client_failed_to_send,
60
- int64_t* num_calls_finished_known_received,
61
- grpc_grpclb_dropped_call_counts** drop_token_counts);
50
+ // This method is not thread-safe; caller must synchronize.
51
+ void AddCallDroppedLocked(char* token);
62
52
 
63
- void grpc_grpclb_dropped_call_counts_destroy(
64
- grpc_grpclb_dropped_call_counts* drop_entries);
53
+ // This method is not thread-safe; caller must synchronize.
54
+ void GetLocked(int64_t* num_calls_started, int64_t* num_calls_finished,
55
+ int64_t* num_calls_finished_with_client_failed_to_send,
56
+ int64_t* num_calls_finished_known_received,
57
+ UniquePtr<DroppedCallCounts>* drop_token_counts);
58
+
59
+ private:
60
+ // This field must only be accessed via *_locked() methods.
61
+ UniquePtr<DroppedCallCounts> drop_token_counts_;
62
+ // These fields may be accessed from multiple threads at a time.
63
+ gpr_atm num_calls_started_ = 0;
64
+ gpr_atm num_calls_finished_ = 0;
65
+ gpr_atm num_calls_finished_with_client_failed_to_send_ = 0;
66
+ gpr_atm num_calls_finished_known_received_ = 0;
67
+ };
68
+
69
+ } // namespace grpc_core
65
70
 
66
71
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H \
67
72
  */
@@ -29,7 +29,7 @@ static bool count_serverlist(pb_istream_t* stream, const pb_field_t* field,
29
29
  void** arg) {
30
30
  grpc_grpclb_serverlist* sl = static_cast<grpc_grpclb_serverlist*>(*arg);
31
31
  grpc_grpclb_server server;
32
- if (!pb_decode(stream, grpc_lb_v1_Server_fields, &server)) {
32
+ if (GPR_UNLIKELY(!pb_decode(stream, grpc_lb_v1_Server_fields, &server))) {
33
33
  gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
34
34
  return false;
35
35
  }
@@ -52,7 +52,7 @@ static bool decode_serverlist(pb_istream_t* stream, const pb_field_t* field,
52
52
  GPR_ASSERT(dec_arg->serverlist->num_servers >= dec_arg->decoding_idx);
53
53
  grpc_grpclb_server* server =
54
54
  static_cast<grpc_grpclb_server*>(gpr_zalloc(sizeof(grpc_grpclb_server)));
55
- if (!pb_decode(stream, grpc_lb_v1_Server_fields, server)) {
55
+ if (GPR_UNLIKELY(!pb_decode(stream, grpc_lb_v1_Server_fields, server))) {
56
56
  gpr_free(server);
57
57
  gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
58
58
  return false;
@@ -89,16 +89,16 @@ static bool encode_string(pb_ostream_t* stream, const pb_field_t* field,
89
89
 
90
90
  static bool encode_drops(pb_ostream_t* stream, const pb_field_t* field,
91
91
  void* const* arg) {
92
- grpc_grpclb_dropped_call_counts* drop_entries =
93
- static_cast<grpc_grpclb_dropped_call_counts*>(*arg);
92
+ grpc_core::GrpcLbClientStats::DroppedCallCounts* drop_entries =
93
+ static_cast<grpc_core::GrpcLbClientStats::DroppedCallCounts*>(*arg);
94
94
  if (drop_entries == nullptr) return true;
95
- for (size_t i = 0; i < drop_entries->num_entries; ++i) {
95
+ for (size_t i = 0; i < drop_entries->size(); ++i) {
96
96
  if (!pb_encode_tag_for_field(stream, field)) return false;
97
97
  grpc_lb_v1_ClientStatsPerToken drop_message;
98
98
  drop_message.load_balance_token.funcs.encode = encode_string;
99
- drop_message.load_balance_token.arg = drop_entries->token_counts[i].token;
99
+ drop_message.load_balance_token.arg = (*drop_entries)[i].token.get();
100
100
  drop_message.has_num_calls = true;
101
- drop_message.num_calls = drop_entries->token_counts[i].count;
101
+ drop_message.num_calls = (*drop_entries)[i].count;
102
102
  if (!pb_encode_submessage(stream, grpc_lb_v1_ClientStatsPerToken_fields,
103
103
  &drop_message)) {
104
104
  return false;
@@ -108,7 +108,7 @@ static bool encode_drops(pb_ostream_t* stream, const pb_field_t* field,
108
108
  }
109
109
 
110
110
  grpc_grpclb_request* grpc_grpclb_load_report_request_create_locked(
111
- grpc_grpclb_client_stats* client_stats) {
111
+ grpc_core::GrpcLbClientStats* client_stats) {
112
112
  grpc_grpclb_request* req = static_cast<grpc_grpclb_request*>(
113
113
  gpr_zalloc(sizeof(grpc_grpclb_request)));
114
114
  req->has_client_stats = true;
@@ -120,13 +120,15 @@ grpc_grpclb_request* grpc_grpclb_load_report_request_create_locked(
120
120
  req->client_stats.has_num_calls_finished_with_client_failed_to_send = true;
121
121
  req->client_stats.has_num_calls_finished_known_received = true;
122
122
  req->client_stats.calls_finished_with_drop.funcs.encode = encode_drops;
123
- grpc_grpclb_client_stats_get_locked(
124
- client_stats, &req->client_stats.num_calls_started,
123
+ grpc_core::UniquePtr<grpc_core::GrpcLbClientStats::DroppedCallCounts>
124
+ drop_counts;
125
+ client_stats->GetLocked(
126
+ &req->client_stats.num_calls_started,
125
127
  &req->client_stats.num_calls_finished,
126
128
  &req->client_stats.num_calls_finished_with_client_failed_to_send,
127
- &req->client_stats.num_calls_finished_known_received,
128
- reinterpret_cast<grpc_grpclb_dropped_call_counts**>(
129
- &req->client_stats.calls_finished_with_drop.arg));
129
+ &req->client_stats.num_calls_finished_known_received, &drop_counts);
130
+ // Will be deleted in grpc_grpclb_request_destroy().
131
+ req->client_stats.calls_finished_with_drop.arg = drop_counts.release();
130
132
  return req;
131
133
  }
132
134
 
@@ -149,10 +151,10 @@ grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request* request) {
149
151
 
150
152
  void grpc_grpclb_request_destroy(grpc_grpclb_request* request) {
151
153
  if (request->has_client_stats) {
152
- grpc_grpclb_dropped_call_counts* drop_entries =
153
- static_cast<grpc_grpclb_dropped_call_counts*>(
154
+ grpc_core::GrpcLbClientStats::DroppedCallCounts* drop_entries =
155
+ static_cast<grpc_core::GrpcLbClientStats::DroppedCallCounts*>(
154
156
  request->client_stats.calls_finished_with_drop.arg);
155
- grpc_grpclb_dropped_call_counts_destroy(drop_entries);
157
+ grpc_core::Delete(drop_entries);
156
158
  }
157
159
  gpr_free(request);
158
160
  }
@@ -165,7 +167,8 @@ grpc_grpclb_initial_response* grpc_grpclb_initial_response_parse(
165
167
  GRPC_SLICE_LENGTH(encoded_grpc_grpclb_response));
166
168
  grpc_grpclb_response res;
167
169
  memset(&res, 0, sizeof(grpc_grpclb_response));
168
- if (!pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, &res)) {
170
+ if (GPR_UNLIKELY(
171
+ !pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, &res))) {
169
172
  gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
170
173
  return nullptr;
171
174
  }
@@ -195,7 +198,7 @@ grpc_grpclb_serverlist* grpc_grpclb_response_parse_serverlist(
195
198
  res.server_list.servers.funcs.decode = count_serverlist;
196
199
  res.server_list.servers.arg = sl;
197
200
  bool status = pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, &res);
198
- if (!status) {
201
+ if (GPR_UNLIKELY(!status)) {
199
202
  gpr_free(sl);
200
203
  gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
201
204
  return nullptr;
@@ -211,7 +214,7 @@ grpc_grpclb_serverlist* grpc_grpclb_response_parse_serverlist(
211
214
  res.server_list.servers.arg = &decode_arg;
212
215
  status = pb_decode(&stream_at_start, grpc_lb_v1_LoadBalanceResponse_fields,
213
216
  &res);
214
- if (!status) {
217
+ if (GPR_UNLIKELY(!status)) {
215
218
  grpc_grpclb_destroy_serverlist(sl);
216
219
  gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
217
220
  return nullptr;
@@ -42,7 +42,7 @@ typedef struct {
42
42
  /** Create a request for a gRPC LB service under \a lb_service_name */
43
43
  grpc_grpclb_request* grpc_grpclb_request_create(const char* lb_service_name);
44
44
  grpc_grpclb_request* grpc_grpclb_load_report_request_create_locked(
45
- grpc_grpclb_client_stats* client_stats);
45
+ grpc_core::GrpcLbClientStats* client_stats);
46
46
 
47
47
  /** Protocol Buffers v3-encode \a request */
48
48
  grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request* request);
@@ -490,7 +490,7 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
490
490
  if (grpc_lb_pick_first_trace.enabled()) {
491
491
  gpr_log(GPR_INFO,
492
492
  "Servicing pending pick with selected subchannel %p",
493
- p->selected_);
493
+ p->selected_->subchannel());
494
494
  }
495
495
  GRPC_CLOSURE_SCHED(pick->on_complete, GRPC_ERROR_NONE);
496
496
  }
@@ -608,7 +608,7 @@ void RoundRobin::PingOneLocked(grpc_closure* on_initiate,
608
608
 
609
609
  void RoundRobin::UpdateLocked(const grpc_channel_args& args) {
610
610
  const grpc_arg* arg = grpc_channel_args_find(&args, GRPC_ARG_LB_ADDRESSES);
611
- if (arg == nullptr || arg->type != GRPC_ARG_POINTER) {
611
+ if (GPR_UNLIKELY(arg == nullptr || arg->type != GRPC_ARG_POINTER)) {
612
612
  gpr_log(GPR_ERROR, "[RR %p] update provided no addresses; ignoring", this);
613
613
  // If we don't have a current subchannel list, go into TRANSIENT_FAILURE.
614
614
  // Otherwise, keep using the current subchannel list (ignore this update).
@@ -105,9 +105,7 @@ class Resolver : public InternallyRefCountedWithTracing<Resolver> {
105
105
  GRPC_ABSTRACT_BASE_CLASS
106
106
 
107
107
  protected:
108
- // So Delete() can access our protected dtor.
109
- template <typename T>
110
- friend void Delete(T*);
108
+ GPRC_ALLOW_CLASS_TO_USE_NON_PUBLIC_DELETE
111
109
 
112
110
  /// Does NOT take ownership of the reference to \a combiner.
113
111
  // TODO(roth): Once we have a C++-like interface for combiners, this
@@ -346,7 +346,7 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
346
346
  RefCountedPtr<Resolver> self = r->Ref(DEBUG_LOCATION, "retry-timer");
347
347
  self.release();
348
348
  if (timeout > 0) {
349
- gpr_log(GPR_DEBUG, "retrying in %" PRIdPTR " milliseconds", timeout);
349
+ gpr_log(GPR_DEBUG, "retrying in %" PRId64 " milliseconds", timeout);
350
350
  } else {
351
351
  gpr_log(GPR_DEBUG, "retrying immediately");
352
352
  }
@@ -381,8 +381,8 @@ void AresDnsResolver::MaybeStartResolvingLocked() {
381
381
  const grpc_millis last_resolution_ago =
382
382
  grpc_core::ExecCtx::Get()->Now() - last_resolution_timestamp_;
383
383
  gpr_log(GPR_DEBUG,
384
- "In cooldown from last resolution (from %" PRIdPTR
385
- " ms ago). Will resolve again in %" PRIdPTR " ms",
384
+ "In cooldown from last resolution (from %" PRId64
385
+ " ms ago). Will resolve again in %" PRId64 " ms",
386
386
  last_resolution_ago, ms_until_next_resolution);
387
387
  have_next_resolution_timer_ = true;
388
388
  // TODO(roth): We currently deal with this ref manually. Once the
@@ -18,7 +18,7 @@
18
18
  #include <grpc/support/port_platform.h>
19
19
 
20
20
  #include "src/core/lib/iomgr/port.h"
21
- #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET)
21
+ #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
22
22
 
23
23
  #include <ares.h>
24
24
  #include <sys/ioctl.h>
@@ -348,4 +348,4 @@ void grpc_ares_ev_driver_start(grpc_ares_ev_driver* ev_driver) {
348
348
  gpr_mu_unlock(&ev_driver->mu);
349
349
  }
350
350
 
351
- #endif /* GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET) */
351
+ #endif /* GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER) */
@@ -270,7 +270,6 @@ static void on_hostbyname_done_cb(void* arg, int status, int timeouts,
270
270
  static void on_srv_query_done_cb(void* arg, int status, int timeouts,
271
271
  unsigned char* abuf, int alen) {
272
272
  grpc_ares_request* r = static_cast<grpc_ares_request*>(arg);
273
- grpc_core::ExecCtx exec_ctx;
274
273
  gpr_log(GPR_DEBUG, "on_query_srv_done_cb");
275
274
  if (status == ARES_SUCCESS) {
276
275
  gpr_log(GPR_DEBUG, "on_query_srv_done_cb ARES_SUCCESS");
@@ -218,7 +218,7 @@ void NativeDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
218
218
  r->Ref(DEBUG_LOCATION, "next_resolution_timer");
219
219
  self.release();
220
220
  if (timeout > 0) {
221
- gpr_log(GPR_DEBUG, "retrying in %" PRIdPTR " milliseconds", timeout);
221
+ gpr_log(GPR_DEBUG, "retrying in %" PRId64 " milliseconds", timeout);
222
222
  } else {
223
223
  gpr_log(GPR_DEBUG, "retrying immediately");
224
224
  }
@@ -254,8 +254,8 @@ void NativeDnsResolver::MaybeStartResolvingLocked() {
254
254
  const grpc_millis last_resolution_ago =
255
255
  grpc_core::ExecCtx::Get()->Now() - last_resolution_timestamp_;
256
256
  gpr_log(GPR_DEBUG,
257
- "In cooldown from last resolution (from %" PRIdPTR
258
- " ms ago). Will resolve again in %" PRIdPTR " ms",
257
+ "In cooldown from last resolution (from %" PRId64
258
+ " ms ago). Will resolve again in %" PRId64 " ms",
259
259
  last_resolution_ago, ms_until_next_resolution);
260
260
  have_next_resolution_timer_ = true;
261
261
  // TODO(roth): We currently deal with this ref manually. Once the
@@ -310,7 +310,7 @@ class NativeDnsResolverFactory : public ResolverFactory {
310
310
  public:
311
311
  OrphanablePtr<Resolver> CreateResolver(
312
312
  const ResolverArgs& args) const override {
313
- if (0 != strcmp(args.uri->authority, "")) {
313
+ if (GPR_UNLIKELY(0 != strcmp(args.uri->authority, ""))) {
314
314
  gpr_log(GPR_ERROR, "authority based dns uri's not supported");
315
315
  return OrphanablePtr<Resolver>(nullptr);
316
316
  }
@@ -408,7 +408,7 @@ static void on_external_state_watcher_done(void* arg, grpc_error* error) {
408
408
  gpr_mu_unlock(&w->subchannel->mu);
409
409
  GRPC_SUBCHANNEL_WEAK_UNREF(w->subchannel, "external_state_watcher");
410
410
  gpr_free(w);
411
- GRPC_CLOSURE_RUN(follow_up, GRPC_ERROR_REF(error));
411
+ GRPC_CLOSURE_SCHED(follow_up, GRPC_ERROR_REF(error));
412
412
  }
413
413
 
414
414
  static void on_alarm(void* arg, grpc_error* error) {
@@ -467,7 +467,7 @@ static void maybe_start_connecting_locked(grpc_subchannel* c) {
467
467
  if (time_til_next <= 0) {
468
468
  gpr_log(GPR_INFO, "Subchannel %p: Retry immediately", c);
469
469
  } else {
470
- gpr_log(GPR_INFO, "Subchannel %p: Retry in %" PRIdPTR " milliseconds", c,
470
+ gpr_log(GPR_INFO, "Subchannel %p: Retry in %" PRId64 " milliseconds", c,
471
471
  time_til_next);
472
472
  }
473
473
  GRPC_CLOSURE_INIT(&c->on_alarm, on_alarm, c, grpc_schedule_on_exec_ctx);
@@ -803,7 +803,7 @@ grpc_error* ConnectedSubchannel::CreateCall(const CallArgs& args,
803
803
  };
804
804
  grpc_error* error = grpc_call_stack_init(
805
805
  channel_stack_, 1, subchannel_call_destroy, *call, &call_args);
806
- if (error != GRPC_ERROR_NONE) {
806
+ if (GPR_UNLIKELY(error != GRPC_ERROR_NONE)) {
807
807
  const char* error_string = grpc_error_string(error);
808
808
  gpr_log(GPR_ERROR, "error: %s", error_string);
809
809
  return error;
@@ -59,8 +59,9 @@ void authority_start_transport_stream_op_batch(
59
59
  initial_metadata->idx.named.authority == nullptr) {
60
60
  grpc_error* error = grpc_metadata_batch_add_head(
61
61
  initial_metadata, &calld->authority_storage,
62
- grpc_mdelem_from_slices(GRPC_MDSTR_AUTHORITY,
63
- grpc_slice_ref(chand->default_authority)));
62
+ grpc_mdelem_from_slices(
63
+ GRPC_MDSTR_AUTHORITY,
64
+ grpc_slice_ref_internal(chand->default_authority)));
64
65
  if (error != GRPC_ERROR_NONE) {
65
66
  grpc_transport_stream_op_batch_finish_with_failure(batch, error,
66
67
  calld->call_combiner);
@@ -102,7 +103,7 @@ grpc_error* init_channel_elem(grpc_channel_element* elem,
102
103
  "GRPC_ARG_DEFAULT_AUTHORITY channel arg. must be a string");
103
104
  }
104
105
  chand->default_authority =
105
- grpc_slice_from_copied_string(default_authority_str);
106
+ grpc_slice_intern(grpc_slice_from_static_string(default_authority_str));
106
107
  GPR_ASSERT(!args->is_last);
107
108
  return GRPC_ERROR_NONE;
108
109
  }
@@ -110,7 +111,7 @@ grpc_error* init_channel_elem(grpc_channel_element* elem,
110
111
  /* Destructor for channel data */
111
112
  void destroy_channel_elem(grpc_channel_element* elem) {
112
113
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
113
- grpc_slice_unref(chand->default_authority);
114
+ grpc_slice_unref_internal(chand->default_authority);
114
115
  }
115
116
  } // namespace
116
117
 
@@ -116,8 +116,8 @@ static grpc_error* process_send_initial_metadata(
116
116
  if (initial_metadata->idx.named.grpc_internal_encoding_request != nullptr) {
117
117
  grpc_mdelem md =
118
118
  initial_metadata->idx.named.grpc_internal_encoding_request->md;
119
- if (!grpc_compression_algorithm_parse(GRPC_MDVALUE(md),
120
- &compression_algorithm)) {
119
+ if (GPR_UNLIKELY(!grpc_compression_algorithm_parse(
120
+ GRPC_MDVALUE(md), &compression_algorithm))) {
121
121
  char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
122
122
  gpr_log(GPR_ERROR,
123
123
  "Invalid compression algorithm: '%s' (unknown). Ignoring.", val);
@@ -125,8 +125,8 @@ static grpc_error* process_send_initial_metadata(
125
125
  calld->message_compression_algorithm = GRPC_MESSAGE_COMPRESS_NONE;
126
126
  stream_compression_algorithm = GRPC_STREAM_COMPRESS_NONE;
127
127
  }
128
- if (!GPR_BITGET(channeld->enabled_algorithms_bitset,
129
- compression_algorithm)) {
128
+ if (GPR_UNLIKELY(!GPR_BITGET(channeld->enabled_algorithms_bitset,
129
+ compression_algorithm))) {
130
130
  char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
131
131
  gpr_log(GPR_ERROR,
132
132
  "Invalid compression algorithm: '%s' (previously disabled). "
@@ -35,43 +35,37 @@
35
35
  #define EXPECTED_CONTENT_TYPE_LENGTH sizeof(EXPECTED_CONTENT_TYPE) - 1
36
36
 
37
37
  namespace {
38
+
38
39
  struct call_data {
39
40
  grpc_call_combiner* call_combiner;
40
41
 
42
+ // Outgoing headers to add to send_initial_metadata.
41
43
  grpc_linked_mdelem status;
42
44
  grpc_linked_mdelem content_type;
43
45
 
44
- /* did this request come with path query containing request payload */
45
- bool seen_path_with_query;
46
- /* flag to ensure payload_bin is delivered only once */
47
- bool payload_bin_delivered;
46
+ // If we see the recv_message contents in the GET query string, we
47
+ // store it here.
48
+ grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> read_stream;
49
+ bool have_read_stream;
48
50
 
51
+ // State for intercepting recv_initial_metadata.
52
+ grpc_closure recv_initial_metadata_ready;
53
+ grpc_closure* original_recv_initial_metadata_ready;
49
54
  grpc_metadata_batch* recv_initial_metadata;
50
55
  uint32_t* recv_initial_metadata_flags;
51
- /** Closure to call when finished with the hs_on_recv hook */
52
- grpc_closure* on_done_recv;
53
- /** Closure to call when we retrieve read message from the path URI
54
- */
55
- grpc_closure* recv_message_ready;
56
- grpc_closure* on_complete;
57
- grpc_core::OrphanablePtr<grpc_core::ByteStream>* pp_recv_message;
58
- grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> read_stream;
56
+ bool seen_recv_initial_metadata_ready;
59
57
 
60
- /** Receive closures are chained: we inject this closure as the on_done_recv
61
- up-call on transport_op, and remember to call our on_done_recv member
62
- after handling it. */
63
- grpc_closure hs_on_recv;
64
- grpc_closure hs_on_complete;
65
- grpc_closure hs_recv_message_ready;
58
+ // State for intercepting recv_message.
59
+ grpc_closure* original_recv_message_ready;
60
+ grpc_closure recv_message_ready;
61
+ grpc_core::OrphanablePtr<grpc_core::ByteStream>* recv_message;
62
+ bool seen_recv_message_ready;
66
63
  };
67
64
 
68
- struct channel_data {
69
- uint8_t unused;
70
- };
71
65
  } // namespace
72
66
 
73
- static grpc_error* server_filter_outgoing_metadata(grpc_call_element* elem,
74
- grpc_metadata_batch* b) {
67
+ static grpc_error* hs_filter_outgoing_metadata(grpc_call_element* elem,
68
+ grpc_metadata_batch* b) {
75
69
  if (b->idx.named.grpc_message != nullptr) {
76
70
  grpc_slice pct_encoded_msg = grpc_percent_encode_slice(
77
71
  GRPC_MDVALUE(b->idx.named.grpc_message->md),
@@ -86,8 +80,8 @@ static grpc_error* server_filter_outgoing_metadata(grpc_call_element* elem,
86
80
  return GRPC_ERROR_NONE;
87
81
  }
88
82
 
89
- static void add_error(const char* error_name, grpc_error** cumulative,
90
- grpc_error* new_err) {
83
+ static void hs_add_error(const char* error_name, grpc_error** cumulative,
84
+ grpc_error* new_err) {
91
85
  if (new_err == GRPC_ERROR_NONE) return;
92
86
  if (*cumulative == GRPC_ERROR_NONE) {
93
87
  *cumulative = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_name);
@@ -95,8 +89,8 @@ static void add_error(const char* error_name, grpc_error** cumulative,
95
89
  *cumulative = grpc_error_add_child(*cumulative, new_err);
96
90
  }
97
91
 
98
- static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
99
- grpc_metadata_batch* b) {
92
+ static grpc_error* hs_filter_incoming_metadata(grpc_call_element* elem,
93
+ grpc_metadata_batch* b) {
100
94
  call_data* calld = static_cast<call_data*>(elem->call_data);
101
95
  grpc_error* error = GRPC_ERROR_NONE;
102
96
  static const char* error_name = "Failed processing incoming headers";
@@ -119,14 +113,14 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
119
113
  *calld->recv_initial_metadata_flags &=
120
114
  ~GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST;
121
115
  } else {
122
- add_error(error_name, &error,
123
- grpc_attach_md_to_error(
124
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"),
125
- b->idx.named.method->md));
116
+ hs_add_error(error_name, &error,
117
+ grpc_attach_md_to_error(
118
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"),
119
+ b->idx.named.method->md));
126
120
  }
127
121
  grpc_metadata_batch_remove(b, b->idx.named.method);
128
122
  } else {
129
- add_error(
123
+ hs_add_error(
130
124
  error_name, &error,
131
125
  grpc_error_set_str(
132
126
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
@@ -135,31 +129,31 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
135
129
 
136
130
  if (b->idx.named.te != nullptr) {
137
131
  if (!grpc_mdelem_eq(b->idx.named.te->md, GRPC_MDELEM_TE_TRAILERS)) {
138
- add_error(error_name, &error,
139
- grpc_attach_md_to_error(
140
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"),
141
- b->idx.named.te->md));
132
+ hs_add_error(error_name, &error,
133
+ grpc_attach_md_to_error(
134
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"),
135
+ b->idx.named.te->md));
142
136
  }
143
137
  grpc_metadata_batch_remove(b, b->idx.named.te);
144
138
  } else {
145
- add_error(error_name, &error,
146
- grpc_error_set_str(
147
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
148
- GRPC_ERROR_STR_KEY, grpc_slice_from_static_string("te")));
139
+ hs_add_error(error_name, &error,
140
+ grpc_error_set_str(
141
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
142
+ GRPC_ERROR_STR_KEY, grpc_slice_from_static_string("te")));
149
143
  }
150
144
 
151
145
  if (b->idx.named.scheme != nullptr) {
152
146
  if (!grpc_mdelem_eq(b->idx.named.scheme->md, GRPC_MDELEM_SCHEME_HTTP) &&
153
147
  !grpc_mdelem_eq(b->idx.named.scheme->md, GRPC_MDELEM_SCHEME_HTTPS) &&
154
148
  !grpc_mdelem_eq(b->idx.named.scheme->md, GRPC_MDELEM_SCHEME_GRPC)) {
155
- add_error(error_name, &error,
156
- grpc_attach_md_to_error(
157
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"),
158
- b->idx.named.scheme->md));
149
+ hs_add_error(error_name, &error,
150
+ grpc_attach_md_to_error(
151
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"),
152
+ b->idx.named.scheme->md));
159
153
  }
160
154
  grpc_metadata_batch_remove(b, b->idx.named.scheme);
161
155
  } else {
162
- add_error(
156
+ hs_add_error(
163
157
  error_name, &error,
164
158
  grpc_error_set_str(
165
159
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
@@ -196,10 +190,11 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
196
190
  }
197
191
 
198
192
  if (b->idx.named.path == nullptr) {
199
- add_error(error_name, &error,
200
- grpc_error_set_str(
201
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
202
- GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":path")));
193
+ hs_add_error(
194
+ error_name, &error,
195
+ grpc_error_set_str(
196
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
197
+ GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":path")));
203
198
  } else if (*calld->recv_initial_metadata_flags &
204
199
  GRPC_INITIAL_METADATA_CACHEABLE_REQUEST) {
205
200
  /* We have a cacheable request made with GET verb. The path contains the
@@ -235,7 +230,7 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
235
230
  GRPC_SLICE_LENGTH(query_slice), k_url_safe));
236
231
  calld->read_stream.Init(&read_slice_buffer, 0);
237
232
  grpc_slice_buffer_destroy_internal(&read_slice_buffer);
238
- calld->seen_path_with_query = true;
233
+ calld->have_read_stream = true;
239
234
  grpc_slice_unref_internal(query_slice);
240
235
  } else {
241
236
  gpr_log(GPR_ERROR, "GET request without QUERY");
@@ -246,17 +241,17 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
246
241
  grpc_linked_mdelem* el = b->idx.named.host;
247
242
  grpc_mdelem md = GRPC_MDELEM_REF(el->md);
248
243
  grpc_metadata_batch_remove(b, el);
249
- add_error(error_name, &error,
250
- grpc_metadata_batch_add_head(
251
- b, el,
252
- grpc_mdelem_from_slices(
253
- GRPC_MDSTR_AUTHORITY,
254
- grpc_slice_ref_internal(GRPC_MDVALUE(md)))));
244
+ hs_add_error(error_name, &error,
245
+ grpc_metadata_batch_add_head(
246
+ b, el,
247
+ grpc_mdelem_from_slices(
248
+ GRPC_MDSTR_AUTHORITY,
249
+ grpc_slice_ref_internal(GRPC_MDVALUE(md)))));
255
250
  GRPC_MDELEM_UNREF(md);
256
251
  }
257
252
 
258
253
  if (b->idx.named.authority == nullptr) {
259
- add_error(
254
+ hs_add_error(
260
255
  error_name, &error,
261
256
  grpc_error_set_str(
262
257
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
@@ -266,49 +261,55 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
266
261
  return error;
267
262
  }
268
263
 
269
- static void hs_on_recv(void* user_data, grpc_error* err) {
264
+ static void hs_recv_initial_metadata_ready(void* user_data, grpc_error* err) {
270
265
  grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
271
266
  call_data* calld = static_cast<call_data*>(elem->call_data);
267
+ calld->seen_recv_initial_metadata_ready = true;
272
268
  if (err == GRPC_ERROR_NONE) {
273
- err = server_filter_incoming_metadata(elem, calld->recv_initial_metadata);
269
+ err = hs_filter_incoming_metadata(elem, calld->recv_initial_metadata);
270
+ if (calld->seen_recv_message_ready) {
271
+ // We've already seen the recv_message callback, but we previously
272
+ // deferred it, so we need to return it here.
273
+ // Replace the recv_message byte stream if needed.
274
+ if (calld->have_read_stream) {
275
+ calld->recv_message->reset(calld->read_stream.get());
276
+ calld->have_read_stream = false;
277
+ }
278
+ // Re-enter call combiner for original_recv_message_ready, since the
279
+ // surface code will release the call combiner for each callback it
280
+ // receives.
281
+ GRPC_CALL_COMBINER_START(
282
+ calld->call_combiner, calld->original_recv_message_ready,
283
+ GRPC_ERROR_REF(err),
284
+ "resuming recv_message_ready from recv_initial_metadata_ready");
285
+ }
274
286
  } else {
275
287
  GRPC_ERROR_REF(err);
276
288
  }
277
- GRPC_CLOSURE_RUN(calld->on_done_recv, err);
278
- }
279
-
280
- static void hs_on_complete(void* user_data, grpc_error* err) {
281
- grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
282
- call_data* calld = static_cast<call_data*>(elem->call_data);
283
- /* Call recv_message_ready if we got the payload via the path field */
284
- if (calld->seen_path_with_query && calld->recv_message_ready != nullptr) {
285
- calld->pp_recv_message->reset(
286
- calld->payload_bin_delivered ? nullptr
287
- : reinterpret_cast<grpc_core::ByteStream*>(
288
- calld->read_stream.get()));
289
- // Re-enter call combiner for recv_message_ready, since the surface
290
- // code will release the call combiner for each callback it receives.
291
- GRPC_CALL_COMBINER_START(calld->call_combiner, calld->recv_message_ready,
292
- GRPC_ERROR_REF(err),
293
- "resuming recv_message_ready from on_complete");
294
- calld->recv_message_ready = nullptr;
295
- calld->payload_bin_delivered = true;
296
- }
297
- GRPC_CLOSURE_RUN(calld->on_complete, GRPC_ERROR_REF(err));
289
+ GRPC_CLOSURE_RUN(calld->original_recv_initial_metadata_ready, err);
298
290
  }
299
291
 
300
292
  static void hs_recv_message_ready(void* user_data, grpc_error* err) {
301
293
  grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
302
294
  call_data* calld = static_cast<call_data*>(elem->call_data);
303
- if (calld->seen_path_with_query) {
304
- // Do nothing. This is probably a GET request, and payload will be
305
- // returned in hs_on_complete callback.
295
+ calld->seen_recv_message_ready = true;
296
+ if (calld->seen_recv_initial_metadata_ready) {
297
+ // We've already seen the recv_initial_metadata callback, so
298
+ // replace the recv_message byte stream if needed and invoke the
299
+ // original recv_message callback immediately.
300
+ if (calld->have_read_stream) {
301
+ calld->recv_message->reset(calld->read_stream.get());
302
+ calld->have_read_stream = false;
303
+ }
304
+ GRPC_CLOSURE_RUN(calld->original_recv_message_ready, GRPC_ERROR_REF(err));
305
+ } else {
306
+ // We have not yet seen the recv_initial_metadata callback, so we
307
+ // need to wait to see if this is a GET request.
306
308
  // Note that we release the call combiner here, so that other
307
309
  // callbacks can run.
308
- GRPC_CALL_COMBINER_STOP(calld->call_combiner,
309
- "pausing recv_message_ready until on_complete");
310
- } else {
311
- GRPC_CLOSURE_RUN(calld->recv_message_ready, GRPC_ERROR_REF(err));
310
+ GRPC_CALL_COMBINER_STOP(
311
+ calld->call_combiner,
312
+ "pausing recv_message_ready until recv_initial_metadata_ready");
312
313
  }
313
314
  }
314
315
 
@@ -320,18 +321,18 @@ static grpc_error* hs_mutate_op(grpc_call_element* elem,
320
321
  if (op->send_initial_metadata) {
321
322
  grpc_error* error = GRPC_ERROR_NONE;
322
323
  static const char* error_name = "Failed sending initial metadata";
323
- add_error(error_name, &error,
324
- grpc_metadata_batch_add_head(
325
- op->payload->send_initial_metadata.send_initial_metadata,
326
- &calld->status, GRPC_MDELEM_STATUS_200));
327
- add_error(error_name, &error,
328
- grpc_metadata_batch_add_tail(
329
- op->payload->send_initial_metadata.send_initial_metadata,
330
- &calld->content_type,
331
- GRPC_MDELEM_CONTENT_TYPE_APPLICATION_SLASH_GRPC));
332
- add_error(
324
+ hs_add_error(error_name, &error,
325
+ grpc_metadata_batch_add_head(
326
+ op->payload->send_initial_metadata.send_initial_metadata,
327
+ &calld->status, GRPC_MDELEM_STATUS_200));
328
+ hs_add_error(error_name, &error,
329
+ grpc_metadata_batch_add_tail(
330
+ op->payload->send_initial_metadata.send_initial_metadata,
331
+ &calld->content_type,
332
+ GRPC_MDELEM_CONTENT_TYPE_APPLICATION_SLASH_GRPC));
333
+ hs_add_error(
333
334
  error_name, &error,
334
- server_filter_outgoing_metadata(
335
+ hs_filter_outgoing_metadata(
335
336
  elem, op->payload->send_initial_metadata.send_initial_metadata));
336
337
  if (error != GRPC_ERROR_NONE) return error;
337
338
  }
@@ -343,27 +344,21 @@ static grpc_error* hs_mutate_op(grpc_call_element* elem,
343
344
  op->payload->recv_initial_metadata.recv_initial_metadata;
344
345
  calld->recv_initial_metadata_flags =
345
346
  op->payload->recv_initial_metadata.recv_flags;
346
- calld->on_done_recv =
347
+ calld->original_recv_initial_metadata_ready =
347
348
  op->payload->recv_initial_metadata.recv_initial_metadata_ready;
348
349
  op->payload->recv_initial_metadata.recv_initial_metadata_ready =
349
- &calld->hs_on_recv;
350
+ &calld->recv_initial_metadata_ready;
350
351
  }
351
352
 
352
353
  if (op->recv_message) {
353
- calld->recv_message_ready = op->payload->recv_message.recv_message_ready;
354
- calld->pp_recv_message = op->payload->recv_message.recv_message;
355
- if (op->payload->recv_message.recv_message_ready) {
356
- op->payload->recv_message.recv_message_ready =
357
- &calld->hs_recv_message_ready;
358
- }
359
- if (op->on_complete) {
360
- calld->on_complete = op->on_complete;
361
- op->on_complete = &calld->hs_on_complete;
362
- }
354
+ calld->recv_message = op->payload->recv_message.recv_message;
355
+ calld->original_recv_message_ready =
356
+ op->payload->recv_message.recv_message_ready;
357
+ op->payload->recv_message.recv_message_ready = &calld->recv_message_ready;
363
358
  }
364
359
 
365
360
  if (op->send_trailing_metadata) {
366
- grpc_error* error = server_filter_outgoing_metadata(
361
+ grpc_error* error = hs_filter_outgoing_metadata(
367
362
  elem, op->payload->send_trailing_metadata.send_trailing_metadata);
368
363
  if (error != GRPC_ERROR_NONE) return error;
369
364
  }
@@ -385,50 +380,47 @@ static void hs_start_transport_stream_op_batch(
385
380
  }
386
381
 
387
382
  /* Constructor for call_data */
388
- static grpc_error* init_call_elem(grpc_call_element* elem,
389
- const grpc_call_element_args* args) {
390
- /* grab pointers to our data from the call element */
383
+ static grpc_error* hs_init_call_elem(grpc_call_element* elem,
384
+ const grpc_call_element_args* args) {
391
385
  call_data* calld = static_cast<call_data*>(elem->call_data);
392
- /* initialize members */
393
386
  calld->call_combiner = args->call_combiner;
394
- GRPC_CLOSURE_INIT(&calld->hs_on_recv, hs_on_recv, elem,
395
- grpc_schedule_on_exec_ctx);
396
- GRPC_CLOSURE_INIT(&calld->hs_on_complete, hs_on_complete, elem,
387
+ GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
388
+ hs_recv_initial_metadata_ready, elem,
397
389
  grpc_schedule_on_exec_ctx);
398
- GRPC_CLOSURE_INIT(&calld->hs_recv_message_ready, hs_recv_message_ready, elem,
390
+ GRPC_CLOSURE_INIT(&calld->recv_message_ready, hs_recv_message_ready, elem,
399
391
  grpc_schedule_on_exec_ctx);
400
392
  return GRPC_ERROR_NONE;
401
393
  }
402
394
 
403
395
  /* Destructor for call_data */
404
- static void destroy_call_elem(grpc_call_element* elem,
405
- const grpc_call_final_info* final_info,
406
- grpc_closure* ignored) {
396
+ static void hs_destroy_call_elem(grpc_call_element* elem,
397
+ const grpc_call_final_info* final_info,
398
+ grpc_closure* ignored) {
407
399
  call_data* calld = static_cast<call_data*>(elem->call_data);
408
- if (calld->seen_path_with_query && !calld->payload_bin_delivered) {
400
+ if (calld->have_read_stream) {
409
401
  calld->read_stream->Orphan();
410
402
  }
411
403
  }
412
404
 
413
405
  /* Constructor for channel_data */
414
- static grpc_error* init_channel_elem(grpc_channel_element* elem,
415
- grpc_channel_element_args* args) {
406
+ static grpc_error* hs_init_channel_elem(grpc_channel_element* elem,
407
+ grpc_channel_element_args* args) {
416
408
  GPR_ASSERT(!args->is_last);
417
409
  return GRPC_ERROR_NONE;
418
410
  }
419
411
 
420
412
  /* Destructor for channel data */
421
- static void destroy_channel_elem(grpc_channel_element* elem) {}
413
+ static void hs_destroy_channel_elem(grpc_channel_element* elem) {}
422
414
 
423
415
  const grpc_channel_filter grpc_http_server_filter = {
424
416
  hs_start_transport_stream_op_batch,
425
417
  grpc_channel_next_op,
426
418
  sizeof(call_data),
427
- init_call_elem,
419
+ hs_init_call_elem,
428
420
  grpc_call_stack_ignore_set_pollset_or_pollset_set,
429
- destroy_call_elem,
430
- sizeof(channel_data),
431
- init_channel_elem,
432
- destroy_channel_elem,
421
+ hs_destroy_call_elem,
422
+ 0,
423
+ hs_init_channel_elem,
424
+ hs_destroy_channel_elem,
433
425
  grpc_channel_next_get_info,
434
426
  "http-server"};