grpc 1.18.0 → 1.22.0

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

Potentially problematic release.


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

Files changed (428) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4731 -7404
  3. data/etc/roots.pem +146 -0
  4. data/include/grpc/grpc.h +11 -6
  5. data/include/grpc/grpc_security.h +297 -4
  6. data/include/grpc/grpc_security_constants.h +1 -1
  7. data/include/grpc/impl/codegen/byte_buffer.h +13 -0
  8. data/include/grpc/impl/codegen/gpr_types.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +30 -7
  10. data/include/grpc/impl/codegen/port_platform.h +88 -7
  11. data/include/grpc/impl/codegen/slice.h +2 -22
  12. data/include/grpc/impl/codegen/status.h +2 -1
  13. data/include/grpc/impl/codegen/sync_posix.h +18 -0
  14. data/include/grpc/slice.h +3 -3
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
  16. data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
  19. data/src/core/ext/filters/client_channel/client_channel.h +2 -10
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
  26. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
  27. data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
  28. data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
  29. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
  30. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
  47. data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
  48. data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
  50. data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
  51. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
  52. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
  53. data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
  65. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
  66. data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
  67. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
  68. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
  69. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
  70. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
  71. data/src/core/ext/filters/client_channel/resolver.cc +54 -1
  72. data/src/core/ext/filters/client_channel/resolver.h +52 -23
  73. data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
  74. data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
  75. data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
  76. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
  77. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
  78. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
  79. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
  80. data/src/core/ext/filters/client_channel/server_address.cc +4 -54
  81. data/src/core/ext/filters/client_channel/server_address.h +1 -13
  82. data/src/core/ext/filters/client_channel/service_config.cc +329 -0
  83. data/src/core/ext/filters/client_channel/service_config.h +205 -0
  84. data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
  85. data/src/core/ext/filters/client_channel/subchannel.h +295 -128
  86. data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
  87. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
  88. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
  89. data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
  90. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  91. data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
  92. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  93. data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
  94. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
  95. data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
  96. data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
  97. data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
  98. data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
  99. data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
  102. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
  104. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
  106. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
  107. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
  110. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  111. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
  113. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  114. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
  116. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
  118. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
  120. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  122. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
  124. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
  131. data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
  133. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
  136. data/src/core/lib/channel/channel_args.cc +2 -101
  137. data/src/core/lib/channel/channel_args.h +3 -37
  138. data/src/core/lib/channel/channel_stack.h +10 -6
  139. data/src/core/lib/channel/channel_trace.cc +4 -4
  140. data/src/core/lib/channel/channel_trace.h +4 -4
  141. data/src/core/lib/channel/channelz.cc +168 -38
  142. data/src/core/lib/channel/channelz.h +40 -44
  143. data/src/core/lib/channel/channelz_registry.cc +75 -107
  144. data/src/core/lib/channel/channelz_registry.h +10 -28
  145. data/src/core/lib/channel/connected_channel.cc +2 -2
  146. data/src/core/lib/channel/context.h +2 -2
  147. data/src/core/lib/channel/handshaker.cc +151 -218
  148. data/src/core/lib/channel/handshaker.h +110 -101
  149. data/src/core/lib/channel/handshaker_factory.h +11 -19
  150. data/src/core/lib/channel/handshaker_registry.cc +67 -51
  151. data/src/core/lib/channel/handshaker_registry.h +21 -16
  152. data/src/core/lib/compression/algorithm_metadata.h +3 -3
  153. data/src/core/lib/compression/compression.cc +14 -9
  154. data/src/core/lib/compression/compression_args.cc +127 -0
  155. data/src/core/lib/compression/compression_args.h +55 -0
  156. data/src/core/lib/compression/compression_internal.cc +16 -12
  157. data/src/core/lib/compression/compression_internal.h +1 -1
  158. data/src/core/lib/compression/stream_compression.cc +3 -2
  159. data/src/core/lib/compression/stream_compression.h +2 -2
  160. data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
  161. data/src/core/lib/debug/trace.cc +13 -7
  162. data/src/core/lib/debug/trace.h +14 -1
  163. data/src/core/lib/gpr/arena.h +13 -9
  164. data/src/core/lib/gpr/cpu_posix.cc +5 -3
  165. data/src/core/lib/gpr/env.h +3 -6
  166. data/src/core/lib/gpr/env_linux.cc +6 -1
  167. data/src/core/lib/gpr/env_posix.cc +5 -0
  168. data/src/core/lib/gpr/env_windows.cc +7 -5
  169. data/src/core/lib/gpr/log.cc +9 -13
  170. data/src/core/lib/gpr/log_posix.cc +2 -1
  171. data/src/core/lib/gpr/string.cc +20 -7
  172. data/src/core/lib/gpr/string.h +10 -3
  173. data/src/core/lib/gpr/sync_posix.cc +65 -4
  174. data/src/core/lib/gpr/time.cc +8 -0
  175. data/src/core/lib/gpr/time_posix.cc +21 -2
  176. data/src/core/lib/gprpp/arena.cc +103 -0
  177. data/src/core/lib/gprpp/arena.h +121 -0
  178. data/src/core/lib/gprpp/atomic.h +75 -5
  179. data/src/core/lib/gprpp/fork.cc +13 -32
  180. data/src/core/lib/gprpp/fork.h +5 -1
  181. data/src/core/lib/gprpp/global_config.h +96 -0
  182. data/src/core/lib/gprpp/global_config_custom.h +29 -0
  183. data/src/core/lib/gprpp/global_config_env.cc +135 -0
  184. data/src/core/lib/gprpp/global_config_env.h +131 -0
  185. data/src/core/lib/gprpp/global_config_generic.h +44 -0
  186. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  187. data/src/core/lib/gprpp/map.h +436 -0
  188. data/src/core/lib/gprpp/memory.h +2 -2
  189. data/src/core/lib/gprpp/optional.h +48 -0
  190. data/src/core/lib/gprpp/orphanable.h +6 -5
  191. data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
  192. data/src/core/lib/gprpp/ref_counted.h +36 -17
  193. data/src/core/lib/gprpp/sync.h +126 -0
  194. data/src/core/lib/gprpp/thd.h +42 -7
  195. data/src/core/lib/gprpp/thd_posix.cc +31 -13
  196. data/src/core/lib/gprpp/thd_windows.cc +47 -34
  197. data/src/core/lib/http/httpcli.cc +6 -5
  198. data/src/core/lib/http/httpcli_security_connector.cc +13 -15
  199. data/src/core/lib/http/parser.cc +3 -2
  200. data/src/core/lib/http/parser.h +2 -1
  201. data/src/core/lib/iomgr/buffer_list.cc +182 -24
  202. data/src/core/lib/iomgr/buffer_list.h +72 -10
  203. data/src/core/lib/iomgr/call_combiner.cc +84 -90
  204. data/src/core/lib/iomgr/call_combiner.h +75 -82
  205. data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
  206. data/src/core/lib/iomgr/cfstream_handle.h +86 -0
  207. data/src/core/lib/iomgr/combiner.cc +11 -3
  208. data/src/core/lib/iomgr/combiner.h +1 -1
  209. data/src/core/lib/iomgr/endpoint.cc +2 -2
  210. data/src/core/lib/iomgr/endpoint.h +3 -2
  211. data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
  212. data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
  213. data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
  214. data/src/core/lib/iomgr/error.cc +21 -17
  215. data/src/core/lib/iomgr/error.h +36 -6
  216. data/src/core/lib/iomgr/error_cfstream.cc +52 -0
  217. data/src/core/lib/iomgr/error_cfstream.h +31 -0
  218. data/src/core/lib/iomgr/error_internal.h +1 -1
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
  222. data/src/core/lib/iomgr/ev_posix.cc +29 -19
  223. data/src/core/lib/iomgr/ev_posix.h +19 -3
  224. data/src/core/lib/iomgr/ev_windows.cc +2 -2
  225. data/src/core/lib/iomgr/exec_ctx.cc +1 -0
  226. data/src/core/lib/iomgr/exec_ctx.h +137 -8
  227. data/src/core/lib/iomgr/executor.cc +147 -95
  228. data/src/core/lib/iomgr/executor.h +55 -49
  229. data/src/core/lib/iomgr/fork_posix.cc +6 -5
  230. data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
  231. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
  232. data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
  233. data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
  234. data/src/core/lib/iomgr/internal_errqueue.h +105 -3
  235. data/src/core/lib/iomgr/iomgr.cc +20 -13
  236. data/src/core/lib/iomgr/iomgr.h +15 -0
  237. data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
  238. data/src/core/lib/iomgr/iomgr_custom.h +2 -0
  239. data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
  240. data/src/core/lib/iomgr/iomgr_internal.h +12 -0
  241. data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
  242. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
  243. data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
  244. data/src/core/lib/iomgr/lockfree_event.cc +4 -4
  245. data/src/core/lib/iomgr/port.h +35 -0
  246. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  247. data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
  248. data/src/core/lib/iomgr/resource_quota.cc +40 -37
  249. data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
  250. data/src/core/lib/iomgr/socket_windows.cc +19 -0
  251. data/src/core/lib/iomgr/socket_windows.h +8 -0
  252. data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
  253. data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
  254. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  255. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  256. data/src/core/lib/iomgr/tcp_custom.cc +10 -14
  257. data/src/core/lib/iomgr/tcp_posix.cc +256 -140
  258. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  259. data/src/core/lib/iomgr/tcp_server.h +24 -0
  260. data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
  261. data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
  262. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  263. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
  264. data/src/core/lib/iomgr/tcp_uv.cc +5 -7
  265. data/src/core/lib/iomgr/tcp_windows.cc +8 -14
  266. data/src/core/lib/iomgr/timer.h +2 -1
  267. data/src/core/lib/iomgr/timer_generic.cc +16 -16
  268. data/src/core/lib/iomgr/timer_manager.cc +20 -11
  269. data/src/core/lib/iomgr/udp_server.cc +8 -6
  270. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
  271. data/src/core/lib/json/json.cc +1 -4
  272. data/src/core/lib/profiling/basic_timers.cc +10 -4
  273. data/src/core/lib/security/context/security_context.cc +6 -7
  274. data/src/core/lib/security/context/security_context.h +3 -4
  275. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  276. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  277. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
  278. data/src/core/lib/security/credentials/credentials.h +9 -1
  279. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
  280. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
  281. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  282. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
  284. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  285. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
  286. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
  287. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
  288. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  289. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
  290. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
  291. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
  292. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
  293. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
  294. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
  295. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
  296. data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
  297. data/src/core/lib/security/security_connector/security_connector.cc +0 -1
  298. data/src/core/lib/security/security_connector/security_connector.h +3 -3
  299. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
  300. data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
  301. data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
  302. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
  303. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
  304. data/src/core/lib/security/transport/auth_filters.h +5 -2
  305. data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
  306. data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
  307. data/src/core/lib/security/transport/security_handshaker.cc +271 -303
  308. data/src/core/lib/security/transport/security_handshaker.h +11 -2
  309. data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
  310. data/src/core/lib/slice/b64.h +2 -2
  311. data/src/core/lib/slice/percent_encoding.cc +3 -3
  312. data/src/core/lib/slice/percent_encoding.h +3 -3
  313. data/src/core/lib/slice/slice.cc +174 -122
  314. data/src/core/lib/slice/slice_buffer.cc +54 -21
  315. data/src/core/lib/slice/slice_hash_table.h +4 -4
  316. data/src/core/lib/slice/slice_intern.cc +49 -107
  317. data/src/core/lib/slice/slice_internal.h +264 -3
  318. data/src/core/lib/slice/slice_string_helpers.cc +10 -1
  319. data/src/core/lib/slice/slice_string_helpers.h +3 -1
  320. data/src/core/lib/slice/slice_utils.h +50 -0
  321. data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
  322. data/src/core/lib/surface/api_trace.h +1 -1
  323. data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
  324. data/src/core/lib/surface/call.cc +67 -46
  325. data/src/core/lib/surface/call.h +7 -2
  326. data/src/core/lib/surface/call_details.cc +0 -1
  327. data/src/core/lib/surface/channel.cc +89 -97
  328. data/src/core/lib/surface/channel.h +60 -6
  329. data/src/core/lib/surface/channel_init.h +5 -0
  330. data/src/core/lib/surface/completion_queue.cc +221 -216
  331. data/src/core/lib/surface/completion_queue.h +2 -1
  332. data/src/core/lib/surface/init.cc +82 -33
  333. data/src/core/lib/surface/init.h +1 -0
  334. data/src/core/lib/surface/init_secure.cc +1 -1
  335. data/src/core/lib/surface/lame_client.cc +5 -7
  336. data/src/core/lib/surface/server.cc +42 -47
  337. data/src/core/lib/surface/validate_metadata.cc +14 -8
  338. data/src/core/lib/surface/validate_metadata.h +13 -2
  339. data/src/core/lib/surface/version.cc +1 -1
  340. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  341. data/src/core/lib/transport/bdp_estimator.h +2 -2
  342. data/src/core/lib/transport/connectivity_state.cc +10 -40
  343. data/src/core/lib/transport/connectivity_state.h +0 -8
  344. data/src/core/lib/transport/error_utils.cc +12 -0
  345. data/src/core/lib/transport/metadata.cc +258 -267
  346. data/src/core/lib/transport/metadata.h +227 -16
  347. data/src/core/lib/transport/metadata_batch.cc +1 -1
  348. data/src/core/lib/transport/metadata_batch.h +1 -1
  349. data/src/core/lib/transport/static_metadata.cc +477 -399
  350. data/src/core/lib/transport/static_metadata.h +273 -182
  351. data/src/core/lib/transport/status_metadata.cc +3 -3
  352. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  353. data/src/core/lib/transport/timeout_encoding.h +1 -1
  354. data/src/core/lib/transport/transport.cc +39 -72
  355. data/src/core/lib/transport/transport.h +59 -24
  356. data/src/core/lib/transport/transport_impl.h +1 -1
  357. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  358. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  359. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
  360. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
  361. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  362. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
  363. data/src/core/tsi/fake_transport_security.cc +4 -4
  364. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  365. data/src/core/tsi/ssl_transport_security.cc +12 -10
  366. data/src/core/tsi/ssl_transport_security.h +24 -4
  367. data/src/ruby/bin/math_pb.rb +18 -16
  368. data/src/ruby/ext/grpc/extconf.rb +12 -4
  369. data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
  370. data/src/ruby/ext/grpc/rb_channel.c +14 -10
  371. data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
  372. data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
  373. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  374. data/src/ruby/ext/grpc/rb_grpc.c +23 -24
  375. data/src/ruby/ext/grpc/rb_grpc.h +4 -2
  376. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
  377. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
  378. data/src/ruby/ext/grpc/rb_server.c +8 -4
  379. data/src/ruby/lib/grpc/errors.rb +22 -3
  380. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  381. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
  382. data/src/ruby/lib/grpc/version.rb +1 -1
  383. data/src/ruby/pb/README.md +1 -1
  384. data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
  385. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
  386. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
  387. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
  388. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
  389. data/src/ruby/spec/errors_spec.rb +141 -0
  390. data/third_party/cares/cares/ares.h +12 -0
  391. data/third_party/cares/cares/ares_create_query.c +5 -1
  392. data/third_party/cares/cares/ares_data.c +74 -73
  393. data/third_party/cares/cares/ares_destroy.c +6 -1
  394. data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
  395. data/third_party/cares/cares/ares_gethostbyname.c +15 -4
  396. data/third_party/cares/cares/ares_getnameinfo.c +11 -0
  397. data/third_party/cares/cares/ares_init.c +274 -173
  398. data/third_party/cares/cares/ares_library_init.c +21 -3
  399. data/third_party/cares/cares/ares_options.c +6 -2
  400. data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
  401. data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
  402. data/third_party/cares/cares/ares_platform.c +7 -0
  403. data/third_party/cares/cares/ares_private.h +19 -11
  404. data/third_party/cares/cares/ares_process.c +27 -2
  405. data/third_party/cares/cares/ares_rules.h +1 -1
  406. data/third_party/cares/cares/ares_search.c +7 -0
  407. data/third_party/cares/cares/ares_send.c +6 -0
  408. data/third_party/cares/cares/ares_strsplit.c +174 -0
  409. data/third_party/cares/cares/ares_strsplit.h +43 -0
  410. data/third_party/cares/cares/ares_version.h +4 -4
  411. data/third_party/cares/cares/config-win32.h +1 -1
  412. data/third_party/cares/cares/inet_ntop.c +2 -3
  413. data/third_party/cares/config_darwin/ares_config.h +3 -0
  414. data/third_party/cares/config_freebsd/ares_config.h +3 -0
  415. data/third_party/cares/config_linux/ares_config.h +3 -0
  416. data/third_party/cares/config_openbsd/ares_config.h +3 -0
  417. metadata +83 -48
  418. data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
  419. data/src/core/ext/filters/client_channel/request_routing.h +0 -177
  420. data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
  421. data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
  422. data/src/core/lib/channel/handshaker_factory.cc +0 -42
  423. data/src/core/lib/gpr/arena.cc +0 -192
  424. data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
  425. data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
  426. data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
  427. data/src/core/lib/transport/service_config.cc +0 -106
  428. data/src/core/lib/transport/service_config.h +0 -249
@@ -225,27 +225,27 @@ class Chttp2IncomingByteStream : public ByteStream {
225
225
  // TODO(roth): When I converted this class to C++, I wanted to make it
226
226
  // inherit from RefCounted or InternallyRefCounted instead of continuing
227
227
  // to use its own custom ref-counting code. However, that would require
228
- // using multiple inheritence, which sucks in general. And to make matters
228
+ // using multiple inheritance, which sucks in general. And to make matters
229
229
  // worse, it causes problems with our New<> and Delete<> wrappers.
230
230
  // Specifically, unless RefCounted is first in the list of parent classes,
231
231
  // it will see a different value of the address of the object than the one
232
232
  // we actually allocated, in which case gpr_free() will be called on a
233
233
  // different address than the one we got from gpr_malloc(), thus causing a
234
234
  // crash. Given the fragility of depending on that, as well as a desire to
235
- // avoid multiple inheritence in general, I've decided to leave this
235
+ // avoid multiple inheritance in general, I've decided to leave this
236
236
  // alone for now. We can revisit this once we're able to link against
237
237
  // libc++, at which point we can eliminate New<> and Delete<> and
238
238
  // switch to std::shared_ptr<>.
239
239
  void Ref() { refs_.Ref(); }
240
240
  void Unref() {
241
- if (refs_.Unref()) {
241
+ if (GPR_UNLIKELY(refs_.Unref())) {
242
242
  grpc_core::Delete(this);
243
243
  }
244
244
  }
245
245
 
246
246
  void PublishError(grpc_error* error);
247
247
 
248
- grpc_error* Push(grpc_slice slice, grpc_slice* slice_out);
248
+ grpc_error* Push(const grpc_slice& slice, grpc_slice* slice_out);
249
249
 
250
250
  grpc_error* Finished(grpc_error* error, bool reset_on_error);
251
251
 
@@ -438,7 +438,8 @@ struct grpc_chttp2_transport {
438
438
  void* parser_data = nullptr;
439
439
  grpc_chttp2_stream* incoming_stream = nullptr;
440
440
  grpc_error* (*parser)(void* parser_user_data, grpc_chttp2_transport* t,
441
- grpc_chttp2_stream* s, grpc_slice slice, int is_last);
441
+ grpc_chttp2_stream* s, const grpc_slice& slice,
442
+ int is_last);
442
443
 
443
444
  grpc_chttp2_write_cb* write_cb_pool = nullptr;
444
445
 
@@ -498,17 +499,23 @@ typedef enum {
498
499
  GRPC_METADATA_NOT_PUBLISHED,
499
500
  GRPC_METADATA_SYNTHESIZED_FROM_FAKE,
500
501
  GRPC_METADATA_PUBLISHED_FROM_WIRE,
501
- GPRC_METADATA_PUBLISHED_AT_CLOSE
502
+ GRPC_METADATA_PUBLISHED_AT_CLOSE
502
503
  } grpc_published_metadata_method;
503
504
 
504
505
  struct grpc_chttp2_stream {
505
506
  grpc_chttp2_stream(grpc_chttp2_transport* t, grpc_stream_refcount* refcount,
506
- const void* server_data, gpr_arena* arena);
507
+ const void* server_data, grpc_core::Arena* arena);
507
508
  ~grpc_chttp2_stream();
508
509
 
509
510
  void* context;
510
511
  grpc_chttp2_transport* t;
511
512
  grpc_stream_refcount* refcount;
513
+ // Reffer is a 0-len structure, simply reffing `t` and `refcount` in its ctor
514
+ // before initializing the rest of the stream, to avoid cache misses. This
515
+ // field MUST be right after `t` and `refcount`.
516
+ struct Reffer {
517
+ explicit Reffer(grpc_chttp2_stream* s);
518
+ } reffer;
512
519
 
513
520
  grpc_closure destroy_stream;
514
521
  grpc_closure* destroy_stream_arg;
@@ -576,10 +583,6 @@ struct grpc_chttp2_stream {
576
583
 
577
584
  grpc_slice_buffer frame_storage; /* protected by t combiner */
578
585
 
579
- /* Accessed only by transport thread when stream->pending_byte_stream == false
580
- * Accessed only by application thread when stream->pending_byte_stream ==
581
- * true */
582
- grpc_slice_buffer unprocessed_incoming_frames_buffer;
583
586
  grpc_closure* on_next = nullptr; /* protected by t combiner */
584
587
  bool pending_byte_stream = false; /* protected by t combiner */
585
588
  // cached length of buffer to be used by the transport thread in cases where
@@ -587,6 +590,10 @@ struct grpc_chttp2_stream {
587
590
  // application threads are allowed to modify
588
591
  // unprocessed_incoming_frames_buffer
589
592
  size_t unprocessed_incoming_frames_buffer_cached_length = 0;
593
+ /* Accessed only by transport thread when stream->pending_byte_stream == false
594
+ * Accessed only by application thread when stream->pending_byte_stream ==
595
+ * true */
596
+ grpc_slice_buffer unprocessed_incoming_frames_buffer;
590
597
  grpc_closure reset_byte_stream;
591
598
  grpc_error* byte_stream_error = GRPC_ERROR_NONE; /* protected by t combiner */
592
599
  bool received_last_frame = false; /* protected by t combiner */
@@ -626,19 +633,8 @@ struct grpc_chttp2_stream {
626
633
  GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS;
627
634
  /* Stream decompression method to be used. */
628
635
  grpc_stream_compression_method stream_decompression_method =
629
- GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS;
630
- /** Stream compression decompress context */
631
- grpc_stream_compression_context* stream_decompression_ctx = nullptr;
632
- /** Stream compression compress context */
633
- grpc_stream_compression_context* stream_compression_ctx = nullptr;
636
+ GRPC_STREAM_COMPRESSION_IDENTITY_DECOMPRESS;
634
637
 
635
- /** Buffer storing data that is compressed but not sent */
636
- grpc_slice_buffer compressed_data_buffer;
637
- /** Amount of uncompressed bytes sent out when compressed_data_buffer is
638
- * emptied */
639
- size_t uncompressed_data_size = 0;
640
- /** Temporary buffer storing decompressed data */
641
- grpc_slice_buffer decompressed_data_buffer;
642
638
  /** Whether bytes stored in unprocessed_incoming_byte_stream is decompressed
643
639
  */
644
640
  bool unprocessed_incoming_frames_decompressed = false;
@@ -648,6 +644,22 @@ struct grpc_chttp2_stream {
648
644
  size_t decompressed_header_bytes = 0;
649
645
  /** Byte counter for number of bytes written */
650
646
  size_t byte_counter = 0;
647
+
648
+ /** Amount of uncompressed bytes sent out when compressed_data_buffer is
649
+ * emptied */
650
+ size_t uncompressed_data_size;
651
+ /** Stream compression compress context */
652
+ grpc_stream_compression_context* stream_compression_ctx;
653
+ /** Buffer storing data that is compressed but not sent */
654
+ grpc_slice_buffer compressed_data_buffer;
655
+
656
+ /** Stream compression decompress context */
657
+ grpc_stream_compression_context* stream_decompression_ctx;
658
+ /** Temporary buffer storing decompressed data.
659
+ * Initialized, used, and destroyed only when stream uses (non-identity)
660
+ * compression.
661
+ */
662
+ grpc_slice_buffer decompressed_data_buffer;
651
663
  };
652
664
 
653
665
  /** Transport writing call flow:
@@ -681,7 +693,7 @@ void grpc_chttp2_end_write(grpc_chttp2_transport* t, grpc_error* error);
681
693
  /** Process one slice of incoming data; return 1 if the connection is still
682
694
  viable after reading, or 0 if the connection should be torn down */
683
695
  grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
684
- grpc_slice slice);
696
+ const grpc_slice& slice);
685
697
 
686
698
  bool grpc_chttp2_list_add_writable_stream(grpc_chttp2_transport* t,
687
699
  grpc_chttp2_stream* s);
@@ -740,7 +752,7 @@ grpc_chttp2_stream* grpc_chttp2_parsing_accept_stream(grpc_chttp2_transport* t,
740
752
 
741
753
  void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport* t,
742
754
  uint32_t goaway_error,
743
- grpc_slice goaway_text);
755
+ const grpc_slice& goaway_text);
744
756
 
745
757
  void grpc_chttp2_parsing_become_skip_parser(grpc_chttp2_transport* t);
746
758
 
@@ -759,11 +771,12 @@ void grpc_chttp2_complete_closure_step(grpc_chttp2_transport* t,
759
771
  // extern grpc_core::TraceFlag grpc_http_trace;
760
772
  // extern grpc_core::TraceFlag grpc_flowctl_trace;
761
773
 
762
- #define GRPC_CHTTP2_IF_TRACING(stmt) \
763
- if (!(grpc_http_trace.enabled())) \
764
- ; \
765
- else \
766
- stmt
774
+ #define GRPC_CHTTP2_IF_TRACING(stmt) \
775
+ do { \
776
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) { \
777
+ (stmt); \
778
+ } \
779
+ } while (0)
767
780
 
768
781
  void grpc_chttp2_fake_status(grpc_chttp2_transport* t,
769
782
  grpc_chttp2_stream* stream, grpc_error* error);
@@ -28,6 +28,7 @@
28
28
 
29
29
  #include "src/core/lib/profiling/timers.h"
30
30
  #include "src/core/lib/slice/slice_string_helpers.h"
31
+ #include "src/core/lib/slice/slice_utils.h"
31
32
  #include "src/core/lib/transport/http2_errors.h"
32
33
  #include "src/core/lib/transport/static_metadata.h"
33
34
  #include "src/core/lib/transport/status_conversion.h"
@@ -45,14 +46,14 @@ static grpc_error* init_goaway_parser(grpc_chttp2_transport* t);
45
46
  static grpc_error* init_skip_frame_parser(grpc_chttp2_transport* t,
46
47
  int is_header);
47
48
 
48
- static grpc_error* parse_frame_slice(grpc_chttp2_transport* t, grpc_slice slice,
49
- int is_last);
49
+ static grpc_error* parse_frame_slice(grpc_chttp2_transport* t,
50
+ const grpc_slice& slice, int is_last);
50
51
 
51
52
  grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
52
- grpc_slice slice) {
53
- uint8_t* beg = GRPC_SLICE_START_PTR(slice);
54
- uint8_t* end = GRPC_SLICE_END_PTR(slice);
55
- uint8_t* cur = beg;
53
+ const grpc_slice& slice) {
54
+ const uint8_t* beg = GRPC_SLICE_START_PTR(slice);
55
+ const uint8_t* end = GRPC_SLICE_END_PTR(slice);
56
+ const uint8_t* cur = beg;
56
57
  grpc_error* err;
57
58
 
58
59
  if (cur == end) return GRPC_ERROR_NONE;
@@ -304,7 +305,7 @@ static grpc_error* init_frame_parser(grpc_chttp2_transport* t) {
304
305
  case GRPC_CHTTP2_FRAME_GOAWAY:
305
306
  return init_goaway_parser(t);
306
307
  default:
307
- if (grpc_http_trace.enabled()) {
308
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
308
309
  gpr_log(GPR_ERROR, "Unknown frame type %02x", t->incoming_frame_type);
309
310
  }
310
311
  return init_skip_frame_parser(t, 0);
@@ -312,7 +313,7 @@ static grpc_error* init_frame_parser(grpc_chttp2_transport* t) {
312
313
  }
313
314
 
314
315
  static grpc_error* skip_parser(void* parser, grpc_chttp2_transport* t,
315
- grpc_chttp2_stream* s, grpc_slice slice,
316
+ grpc_chttp2_stream* s, const grpc_slice& slice,
316
317
  int is_last) {
317
318
  return GRPC_ERROR_NONE;
318
319
  }
@@ -400,7 +401,7 @@ static void on_initial_header(void* tp, grpc_mdelem md) {
400
401
  grpc_chttp2_stream* s = t->incoming_stream;
401
402
  GPR_ASSERT(s != nullptr);
402
403
 
403
- if (grpc_http_trace.enabled()) {
404
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
404
405
  char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
405
406
  char* value =
406
407
  grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
@@ -410,53 +411,42 @@ static void on_initial_header(void* tp, grpc_mdelem md) {
410
411
  gpr_free(value);
411
412
  }
412
413
 
413
- if (GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC) {
414
- // We don't use grpc_mdelem_eq here to avoid executing additional
415
- // instructions. The reasoning is if the payload is not equal, we already
416
- // know that the metadata elements are not equal because the md is
417
- // confirmed to be static. If we had used grpc_mdelem_eq here, then if the
418
- // payloads are not equal, grpc_mdelem_eq executes more instructions to
419
- // determine if they're equal or not.
420
- if (md.payload == GRPC_MDELEM_GRPC_STATUS_1.payload ||
421
- md.payload == GRPC_MDELEM_GRPC_STATUS_2.payload) {
422
- s->seen_error = true;
423
- }
424
- } else {
425
- if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) &&
426
- !grpc_mdelem_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) {
427
- /* TODO(ctiller): check for a status like " 0" */
428
- s->seen_error = true;
429
- }
430
-
431
- if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_TIMEOUT)) {
432
- grpc_millis* cached_timeout = static_cast<grpc_millis*>(
433
- grpc_mdelem_get_user_data(md, free_timeout));
434
- grpc_millis timeout;
435
- if (cached_timeout != nullptr) {
436
- timeout = *cached_timeout;
437
- } else {
438
- if (GPR_UNLIKELY(
439
- !grpc_http2_decode_timeout(GRPC_MDVALUE(md), &timeout))) {
440
- char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
441
- gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'", val);
442
- gpr_free(val);
443
- timeout = GRPC_MILLIS_INF_FUTURE;
444
- }
445
- if (GRPC_MDELEM_IS_INTERNED(md)) {
446
- /* store the result */
447
- cached_timeout =
448
- static_cast<grpc_millis*>(gpr_malloc(sizeof(grpc_millis)));
449
- *cached_timeout = timeout;
450
- grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
451
- }
414
+ // If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
415
+ // then we have seen an error. In fact, if it is a GRPC_STATUS and it's
416
+ // not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
417
+ if (grpc_slice_eq_static_interned(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) &&
418
+ !grpc_mdelem_static_value_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) {
419
+ /* TODO(ctiller): check for a status like " 0" */
420
+ s->seen_error = true;
421
+ } else if (grpc_slice_eq_static_interned(GRPC_MDKEY(md),
422
+ GRPC_MDSTR_GRPC_TIMEOUT)) {
423
+ grpc_millis* cached_timeout =
424
+ static_cast<grpc_millis*>(grpc_mdelem_get_user_data(md, free_timeout));
425
+ grpc_millis timeout;
426
+ if (cached_timeout != nullptr) {
427
+ timeout = *cached_timeout;
428
+ } else {
429
+ if (GPR_UNLIKELY(
430
+ !grpc_http2_decode_timeout(GRPC_MDVALUE(md), &timeout))) {
431
+ char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
432
+ gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'", val);
433
+ gpr_free(val);
434
+ timeout = GRPC_MILLIS_INF_FUTURE;
452
435
  }
453
- if (timeout != GRPC_MILLIS_INF_FUTURE) {
454
- grpc_chttp2_incoming_metadata_buffer_set_deadline(
455
- &s->metadata_buffer[0], grpc_core::ExecCtx::Get()->Now() + timeout);
436
+ if (GRPC_MDELEM_IS_INTERNED(md)) {
437
+ /* store the result */
438
+ cached_timeout =
439
+ static_cast<grpc_millis*>(gpr_malloc(sizeof(grpc_millis)));
440
+ *cached_timeout = timeout;
441
+ grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
456
442
  }
457
- GRPC_MDELEM_UNREF(md);
458
- return;
459
443
  }
444
+ if (timeout != GRPC_MILLIS_INF_FUTURE) {
445
+ grpc_chttp2_incoming_metadata_buffer_set_deadline(
446
+ &s->metadata_buffer[0], grpc_core::ExecCtx::Get()->Now() + timeout);
447
+ }
448
+ GRPC_MDELEM_UNREF(md);
449
+ return;
460
450
  }
461
451
 
462
452
  const size_t new_size = s->metadata_buffer[0].size + GRPC_MDELEM_LENGTH(md);
@@ -496,7 +486,7 @@ static void on_trailing_header(void* tp, grpc_mdelem md) {
496
486
  grpc_chttp2_stream* s = t->incoming_stream;
497
487
  GPR_ASSERT(s != nullptr);
498
488
 
499
- if (grpc_http_trace.enabled()) {
489
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
500
490
  char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
501
491
  char* value =
502
492
  grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
@@ -506,19 +496,11 @@ static void on_trailing_header(void* tp, grpc_mdelem md) {
506
496
  gpr_free(value);
507
497
  }
508
498
 
509
- if (GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC) {
510
- // We don't use grpc_mdelem_eq here to avoid executing additional
511
- // instructions. The reasoning is if the payload is not equal, we already
512
- // know that the metadata elements are not equal because the md is
513
- // confirmed to be static. If we had used grpc_mdelem_eq here, then if the
514
- // payloads are not equal, grpc_mdelem_eq executes more instructions to
515
- // determine if they're equal or not.
516
- if (md.payload == GRPC_MDELEM_GRPC_STATUS_1.payload ||
517
- md.payload == GRPC_MDELEM_GRPC_STATUS_2.payload) {
518
- s->seen_error = true;
519
- }
520
- } else if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) &&
521
- !grpc_mdelem_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) {
499
+ // If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
500
+ // then we have seen an error. In fact, if it is a GRPC_STATUS and it's
501
+ // not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
502
+ if (grpc_slice_eq_static_interned(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) &&
503
+ !grpc_mdelem_static_value_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) {
522
504
  /* TODO(ctiller): check for a status like " 0" */
523
505
  s->seen_error = true;
524
506
  }
@@ -753,15 +735,15 @@ static grpc_error* init_settings_frame_parser(grpc_chttp2_transport* t) {
753
735
  return GRPC_ERROR_NONE;
754
736
  }
755
737
 
756
- static grpc_error* parse_frame_slice(grpc_chttp2_transport* t, grpc_slice slice,
757
- int is_last) {
738
+ static grpc_error* parse_frame_slice(grpc_chttp2_transport* t,
739
+ const grpc_slice& slice, int is_last) {
758
740
  grpc_chttp2_stream* s = t->incoming_stream;
759
741
  grpc_error* err = t->parser(t->parser_data, t, s, slice, is_last);
760
742
  intptr_t unused;
761
743
  if (GPR_LIKELY(err == GRPC_ERROR_NONE)) {
762
744
  return err;
763
745
  } else if (grpc_error_get_int(err, GRPC_ERROR_INT_STREAM_ID, &unused)) {
764
- if (grpc_http_trace.enabled()) {
746
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
765
747
  const char* msg = grpc_error_string(err);
766
748
  gpr_log(GPR_ERROR, "%s", msg);
767
749
  }
@@ -67,7 +67,7 @@ static bool stream_list_pop(grpc_chttp2_transport* t,
67
67
  s->included[id] = 0;
68
68
  }
69
69
  *stream = s;
70
- if (s && grpc_trace_http2_stream_state.enabled()) {
70
+ if (s && GRPC_TRACE_FLAG_ENABLED(grpc_trace_http2_stream_state)) {
71
71
  gpr_log(GPR_INFO, "%p[%d][%s]: pop from %s", t, s->id,
72
72
  t->is_client ? "cli" : "svr", stream_list_id_string(id));
73
73
  }
@@ -89,7 +89,7 @@ static void stream_list_remove(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
89
89
  } else {
90
90
  t->lists[id].tail = s->links[id].prev;
91
91
  }
92
- if (grpc_trace_http2_stream_state.enabled()) {
92
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_http2_stream_state)) {
93
93
  gpr_log(GPR_INFO, "%p[%d][%s]: remove from %s", t, s->id,
94
94
  t->is_client ? "cli" : "svr", stream_list_id_string(id));
95
95
  }
@@ -121,7 +121,7 @@ static void stream_list_add_tail(grpc_chttp2_transport* t,
121
121
  }
122
122
  t->lists[id].tail = s;
123
123
  s->included[id] = 1;
124
- if (grpc_trace_http2_stream_state.enabled()) {
124
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_http2_stream_state)) {
125
125
  gpr_log(GPR_INFO, "%p[%d][%s]: add to %s", t, s->id,
126
126
  t->is_client ? "cli" : "svr", stream_list_id_string(id));
127
127
  }
@@ -25,6 +25,7 @@
25
25
 
26
26
  #include <grpc/support/log.h>
27
27
 
28
+ #include "src/core/lib/compression/stream_compression.h"
28
29
  #include "src/core/lib/debug/stats.h"
29
30
  #include "src/core/lib/profiling/timers.h"
30
31
  #include "src/core/lib/slice/slice_internal.h"
@@ -52,7 +53,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
52
53
  }
53
54
  if (!grpc_closure_list_empty(pq->lists[GRPC_CHTTP2_PCL_INFLIGHT])) {
54
55
  /* ping already in-flight: wait */
55
- if (grpc_http_trace.enabled() || grpc_bdp_estimator_trace.enabled()) {
56
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
57
+ GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
56
58
  gpr_log(GPR_INFO, "%s: Ping delayed [%p]: already pinging",
57
59
  t->is_client ? "CLIENT" : "SERVER", t->peer_string);
58
60
  }
@@ -61,7 +63,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
61
63
  if (t->ping_state.pings_before_data_required == 0 &&
62
64
  t->ping_policy.max_pings_without_data != 0) {
63
65
  /* need to receive something of substance before sending a ping again */
64
- if (grpc_http_trace.enabled() || grpc_bdp_estimator_trace.enabled()) {
66
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
67
+ GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
65
68
  gpr_log(GPR_INFO, "%s: Ping delayed [%p]: too many recent pings: %d/%d",
66
69
  t->is_client ? "CLIENT" : "SERVER", t->peer_string,
67
70
  t->ping_state.pings_before_data_required,
@@ -81,7 +84,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
81
84
 
82
85
  if (next_allowed_ping > now) {
83
86
  /* not enough elapsed time between successive pings */
84
- if (grpc_http_trace.enabled() || grpc_bdp_estimator_trace.enabled()) {
87
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
88
+ GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
85
89
  gpr_log(GPR_INFO,
86
90
  "%s: Ping delayed [%p]: not enough time elapsed since last ping. "
87
91
  " Last ping %f: Next ping %f: Now %f",
@@ -107,8 +111,9 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
107
111
  grpc_chttp2_ping_create(false, pq->inflight_id));
108
112
  GRPC_STATS_INC_HTTP2_PINGS_SENT();
109
113
  t->ping_state.last_ping_sent_time = now;
110
- if (grpc_http_trace.enabled() || grpc_bdp_estimator_trace.enabled()) {
111
- gpr_log(GPR_INFO, "%s: Ping sent [%p]: %d/%d",
114
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
115
+ GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
116
+ gpr_log(GPR_INFO, "%s: Ping sent [%s]: %d/%d",
112
117
  t->is_client ? "CLIENT" : "SERVER", t->peer_string,
113
118
  t->ping_state.pings_before_data_required,
114
119
  t->ping_policy.max_pings_without_data);
@@ -140,7 +145,7 @@ static bool update_list(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
140
145
 
141
146
  static void report_stall(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
142
147
  const char* staller) {
143
- if (grpc_flowctl_trace.enabled()) {
148
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_flowctl_trace)) {
144
149
  gpr_log(
145
150
  GPR_DEBUG,
146
151
  "%s:%p stream %d moved to stalled list by %s. This is FULLY expected "
@@ -150,7 +155,11 @@ static void report_stall(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
150
155
  ":flowed=%" PRId64 ":peer_initwin=%d:t_win=%" PRId64
151
156
  ":s_win=%d:s_delta=%" PRId64 "]",
152
157
  t->peer_string, t, s->id, staller, s->flow_controlled_buffer.length,
153
- s->compressed_data_buffer.length, s->flow_controlled_bytes_flowed,
158
+ s->stream_compression_method ==
159
+ GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS
160
+ ? 0
161
+ : s->compressed_data_buffer.length,
162
+ s->flow_controlled_bytes_flowed,
154
163
  t->settings[GRPC_ACKED_SETTINGS]
155
164
  [GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE],
156
165
  t->flow_control->remote_window(),
@@ -163,15 +172,6 @@ static void report_stall(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
163
172
  }
164
173
  }
165
174
 
166
- static bool stream_ref_if_not_destroyed(gpr_refcount* r) {
167
- gpr_atm count;
168
- do {
169
- count = gpr_atm_acq_load(&r->count);
170
- if (count == 0) return false;
171
- } while (!gpr_atm_rel_cas(&r->count, count, count + 1));
172
- return true;
173
- }
174
-
175
175
  /* How many bytes would we like to put on the wire during a single syscall */
176
176
  static uint32_t target_write_size(grpc_chttp2_transport* t) {
177
177
  return 1024 * 1024;
@@ -254,7 +254,7 @@ class WriteContext {
254
254
  while (grpc_chttp2_list_pop_stalled_by_transport(t_, &s)) {
255
255
  if (t_->closed_with_error == GRPC_ERROR_NONE &&
256
256
  grpc_chttp2_list_add_writable_stream(t_, s)) {
257
- if (!stream_ref_if_not_destroyed(&s->refcount->refs)) {
257
+ if (!s->refcount->refs.RefIfNonZero()) {
258
258
  grpc_chttp2_list_remove_writable_stream(t_, s);
259
259
  }
260
260
  }
@@ -334,7 +334,23 @@ class DataSendContext {
334
334
 
335
335
  bool AnyOutgoing() const { return max_outgoing() > 0; }
336
336
 
337
+ void FlushUncompressedBytes() {
338
+ uint32_t send_bytes = static_cast<uint32_t> GPR_MIN(
339
+ max_outgoing(), s_->flow_controlled_buffer.length);
340
+ is_last_frame_ = send_bytes == s_->flow_controlled_buffer.length &&
341
+ s_->fetching_send_message == nullptr &&
342
+ s_->send_trailing_metadata != nullptr &&
343
+ grpc_metadata_batch_is_empty(s_->send_trailing_metadata);
344
+ grpc_chttp2_encode_data(s_->id, &s_->flow_controlled_buffer, send_bytes,
345
+ is_last_frame_, &s_->stats.outgoing, &t_->outbuf);
346
+ s_->flow_control->SentData(send_bytes);
347
+ s_->sending_bytes += send_bytes;
348
+ }
349
+
337
350
  void FlushCompressedBytes() {
351
+ GPR_DEBUG_ASSERT(s_->stream_compression_method !=
352
+ GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS);
353
+
338
354
  uint32_t send_bytes = static_cast<uint32_t> GPR_MIN(
339
355
  max_outgoing(), s_->compressed_data_buffer.length);
340
356
  bool is_last_data_frame =
@@ -363,13 +379,15 @@ class DataSendContext {
363
379
  grpc_chttp2_encode_data(s_->id, &s_->compressed_data_buffer, send_bytes,
364
380
  is_last_frame_, &s_->stats.outgoing, &t_->outbuf);
365
381
  s_->flow_control->SentData(send_bytes);
366
- s_->byte_counter += send_bytes;
367
382
  if (s_->compressed_data_buffer.length == 0) {
368
383
  s_->sending_bytes += s_->uncompressed_data_size;
369
384
  }
370
385
  }
371
386
 
372
387
  void CompressMoreBytes() {
388
+ GPR_DEBUG_ASSERT(s_->stream_compression_method !=
389
+ GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS);
390
+
373
391
  if (s_->stream_compression_ctx == nullptr) {
374
392
  s_->stream_compression_ctx =
375
393
  grpc_stream_compression_context_create(s_->stream_compression_method);
@@ -427,7 +445,7 @@ class StreamWriteContext {
427
445
  // https://github.com/grpc/proposal/blob/master/A6-client-retries.md#when-retries-are-valid
428
446
  if (!t_->is_client && s_->fetching_send_message == nullptr &&
429
447
  s_->flow_controlled_buffer.length == 0 &&
430
- s_->compressed_data_buffer.length == 0 &&
448
+ compressed_data_buffer_len() == 0 &&
431
449
  s_->send_trailing_metadata != nullptr &&
432
450
  is_default_initial_metadata(s_->send_initial_metadata)) {
433
451
  ConvertInitialMetadataToTrailingMetadata();
@@ -456,6 +474,13 @@ class StreamWriteContext {
456
474
  "send_initial_metadata_finished");
457
475
  }
458
476
 
477
+ bool compressed_data_buffer_len() {
478
+ return s_->stream_compression_method ==
479
+ GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS
480
+ ? 0
481
+ : s_->compressed_data_buffer.length;
482
+ }
483
+
459
484
  void FlushWindowUpdates() {
460
485
  /* send any window updates */
461
486
  const uint32_t stream_announce = s_->flow_control->MaybeSendUpdate();
@@ -472,7 +497,7 @@ class StreamWriteContext {
472
497
  if (!s_->sent_initial_metadata) return;
473
498
 
474
499
  if (s_->flow_controlled_buffer.length == 0 &&
475
- s_->compressed_data_buffer.length == 0) {
500
+ compressed_data_buffer_len() == 0) {
476
501
  return; // early out: nothing to do
477
502
  }
478
503
 
@@ -489,17 +514,22 @@ class StreamWriteContext {
489
514
  return; // early out: nothing to do
490
515
  }
491
516
 
492
- while ((s_->flow_controlled_buffer.length > 0 ||
493
- s_->compressed_data_buffer.length > 0) &&
494
- data_send_context.max_outgoing() > 0) {
495
- if (s_->compressed_data_buffer.length > 0) {
496
- data_send_context.FlushCompressedBytes();
497
- } else {
498
- data_send_context.CompressMoreBytes();
517
+ if (s_->stream_compression_method ==
518
+ GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS) {
519
+ while (s_->flow_controlled_buffer.length > 0 &&
520
+ data_send_context.max_outgoing() > 0) {
521
+ data_send_context.FlushUncompressedBytes();
522
+ }
523
+ } else {
524
+ while ((s_->flow_controlled_buffer.length > 0 ||
525
+ s_->compressed_data_buffer.length > 0) &&
526
+ data_send_context.max_outgoing() > 0) {
527
+ if (s_->compressed_data_buffer.length > 0) {
528
+ data_send_context.FlushCompressedBytes();
529
+ } else {
530
+ data_send_context.CompressMoreBytes();
531
+ }
499
532
  }
500
- }
501
- if (s_->traced && grpc_endpoint_can_track_err(t_->ep)) {
502
- grpc_core::ContextList::Append(&t_->cl, s_);
503
533
  }
504
534
  write_context_->ResetPingClock();
505
535
  if (data_send_context.is_last_frame()) {
@@ -508,7 +538,7 @@ class StreamWriteContext {
508
538
  data_send_context.CallCallbacks();
509
539
  stream_became_writable_ = true;
510
540
  if (s_->flow_controlled_buffer.length > 0 ||
511
- s_->compressed_data_buffer.length > 0) {
541
+ compressed_data_buffer_len() > 0) {
512
542
  GRPC_CHTTP2_STREAM_REF(s_, "chttp2_writing:fork");
513
543
  grpc_chttp2_list_add_writable_stream(t_, s_);
514
544
  }
@@ -521,7 +551,7 @@ class StreamWriteContext {
521
551
  if (s_->send_trailing_metadata == nullptr) return;
522
552
  if (s_->fetching_send_message != nullptr) return;
523
553
  if (s_->flow_controlled_buffer.length != 0) return;
524
- if (s_->compressed_data_buffer.length != 0) return;
554
+ if (compressed_data_buffer_len() != 0) return;
525
555
 
526
556
  GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "sending trailing_metadata"));
527
557
  if (grpc_metadata_batch_is_empty(s_->send_trailing_metadata)) {
@@ -610,11 +640,18 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write(
610
640
  (according to available window sizes) and add to the output buffer */
611
641
  while (grpc_chttp2_stream* s = ctx.NextStream()) {
612
642
  StreamWriteContext stream_ctx(&ctx, s);
643
+ size_t orig_len = t->outbuf.length;
613
644
  stream_ctx.FlushInitialMetadata();
614
645
  stream_ctx.FlushWindowUpdates();
615
646
  stream_ctx.FlushData();
616
647
  stream_ctx.FlushTrailingMetadata();
617
-
648
+ if (t->outbuf.length > orig_len) {
649
+ /* Add this stream to the list of the contexts to be traced at TCP */
650
+ s->byte_counter += t->outbuf.length - orig_len;
651
+ if (s->traced && grpc_endpoint_can_track_err(t->ep)) {
652
+ grpc_core::ContextList::Append(&t->cl, s);
653
+ }
654
+ }
618
655
  if (stream_ctx.stream_became_writable()) {
619
656
  if (!grpc_chttp2_list_add_writing_stream(t, s)) {
620
657
  /* already in writing list: drop ref */