grpc 1.28.0 → 1.37.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 (1541) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1734 -22357
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +31 -9
  6. data/include/grpc/grpc_security.h +274 -180
  7. data/include/grpc/grpc_security_constants.h +4 -0
  8. data/include/grpc/impl/codegen/README.md +22 -0
  9. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  10. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  11. data/include/grpc/impl/codegen/grpc_types.h +32 -30
  12. data/include/grpc/impl/codegen/log.h +0 -2
  13. data/include/grpc/impl/codegen/port_platform.h +36 -90
  14. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  15. data/include/grpc/module.modulemap +24 -39
  16. data/include/grpc/slice_buffer.h +3 -3
  17. data/include/grpc/support/sync.h +3 -3
  18. data/include/grpc/support/time.h +7 -7
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +16 -12
  20. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
  21. data/src/core/ext/filters/client_channel/client_channel.cc +3845 -2414
  22. data/src/core/ext/filters/client_channel/client_channel.h +1 -7
  23. data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
  24. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  25. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -3
  26. data/src/core/ext/filters/client_channel/config_selector.cc +58 -0
  27. data/src/core/ext/filters/client_channel/config_selector.h +133 -0
  28. data/src/core/ext/filters/client_channel/dynamic_filters.cc +191 -0
  29. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  30. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +26 -122
  31. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  32. data/src/core/ext/filters/client_channel/health/health_check_client.cc +25 -30
  33. data/src/core/ext/filters/client_channel/health/health_check_client.h +7 -7
  34. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +15 -16
  35. data/src/core/ext/filters/client_channel/http_proxy.cc +44 -34
  36. data/src/core/ext/filters/client_channel/lb_policy.cc +28 -20
  37. data/src/core/ext/filters/client_channel/lb_policy.h +50 -38
  38. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +96 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +101 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +20 -11
  41. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +481 -510
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +76 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +37 -0
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +6 -41
  47. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  48. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  49. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  50. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  51. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +24 -18
  52. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +922 -0
  53. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  54. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  55. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +11 -10
  56. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +18 -46
  57. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +744 -0
  58. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +520 -134
  59. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +53 -26
  60. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +29 -0
  61. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +795 -0
  62. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +722 -0
  63. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1384 -0
  64. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +18 -8
  65. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  66. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +12 -10
  67. data/src/core/ext/filters/client_channel/resolver.cc +9 -10
  68. data/src/core/ext/filters/client_channel/resolver.h +10 -20
  69. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +111 -110
  70. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +4 -34
  71. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +22 -24
  72. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +15 -13
  73. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +82 -123
  74. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +642 -184
  75. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +10 -3
  76. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  77. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  78. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +61 -61
  79. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +102 -108
  80. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -5
  81. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +377 -0
  82. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +38 -31
  83. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +829 -46
  84. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
  85. data/src/core/ext/filters/client_channel/resolver_factory.h +8 -8
  86. data/src/core/ext/filters/client_channel/resolver_registry.cc +55 -52
  87. data/src/core/ext/filters/client_channel/resolver_registry.h +10 -10
  88. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +47 -93
  89. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +30 -26
  90. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  91. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -2
  92. data/src/core/ext/filters/client_channel/server_address.cc +132 -13
  93. data/src/core/ext/filters/client_channel/server_address.h +80 -32
  94. data/src/core/ext/filters/client_channel/service_config.cc +114 -149
  95. data/src/core/ext/filters/client_channel/service_config.h +33 -100
  96. data/src/core/ext/filters/client_channel/service_config_call_data.h +86 -0
  97. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  98. data/src/core/ext/filters/client_channel/service_config_parser.cc +89 -0
  99. data/src/core/ext/filters/client_channel/service_config_parser.h +92 -0
  100. data/src/core/ext/filters/client_channel/subchannel.cc +211 -230
  101. data/src/core/ext/filters/client_channel/subchannel.h +116 -118
  102. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
  103. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  104. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +16 -10
  105. data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
  106. data/src/core/ext/filters/deadline/deadline_filter.cc +87 -79
  107. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  108. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +495 -0
  109. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  110. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  111. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  112. data/src/core/ext/filters/http/client/http_client_filter.cc +29 -34
  113. data/src/core/ext/filters/http/client_authority_filter.cc +10 -10
  114. data/src/core/ext/filters/http/http_filters_plugin.cc +34 -15
  115. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  116. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +399 -0
  117. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +31 -0
  118. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  119. data/src/core/ext/filters/max_age/max_age_filter.cc +38 -34
  120. data/src/core/ext/filters/message_size/message_size_filter.cc +64 -90
  121. data/src/core/ext/filters/message_size/message_size_filter.h +12 -5
  122. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
  123. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  124. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  125. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
  126. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +19 -2
  127. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +23 -10
  128. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  129. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +37 -49
  130. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +803 -355
  131. data/src/core/ext/transport/chttp2/server/chttp2_server.h +16 -2
  132. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +13 -3
  133. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +19 -18
  134. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +65 -21
  135. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  136. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  137. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +343 -347
  138. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +13 -1
  139. data/src/core/ext/transport/chttp2/transport/flow_control.cc +36 -33
  140. data/src/core/ext/transport/chttp2/transport/flow_control.h +27 -19
  141. data/src/core/ext/transport/chttp2/transport/frame_data.cc +14 -13
  142. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -7
  143. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  144. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  145. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  146. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
  147. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  148. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +8 -9
  149. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -4
  150. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +15 -18
  151. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  152. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +30 -17
  153. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  154. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +37 -37
  155. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  156. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
  157. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  158. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  159. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  160. data/src/core/ext/transport/chttp2/transport/internal.h +38 -23
  161. data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -74
  162. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  163. data/src/core/ext/transport/chttp2/transport/writing.cc +30 -28
  164. data/src/core/ext/transport/inproc/inproc_transport.cc +106 -33
  165. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  166. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  167. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -1
  168. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  169. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +10 -4
  170. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +243 -0
  171. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +865 -0
  172. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  173. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  174. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
  175. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +253 -0
  176. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +453 -0
  177. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1801 -0
  178. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +35 -0
  179. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +77 -0
  180. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +56 -0
  181. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +364 -0
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +124 -0
  183. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +428 -0
  184. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +35 -0
  185. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +88 -0
  186. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +334 -0
  187. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +1066 -0
  188. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +103 -0
  189. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +388 -0
  190. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
  191. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +78 -0
  192. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
  193. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +149 -0
  194. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +241 -0
  195. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +839 -0
  196. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
  197. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +767 -0
  198. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +36 -0
  199. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +88 -0
  200. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +182 -0
  201. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +755 -0
  202. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +27 -0
  203. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +65 -0
  204. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +34 -0
  205. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +95 -0
  206. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +42 -0
  207. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +126 -0
  208. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +90 -0
  209. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +243 -0
  210. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
  211. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +305 -0
  212. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
  213. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +367 -0
  214. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +33 -0
  215. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +73 -0
  216. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +130 -0
  217. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +557 -0
  218. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +159 -0
  219. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +623 -0
  220. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +40 -0
  221. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +107 -0
  222. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  223. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  224. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  225. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  226. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +178 -0
  227. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +662 -0
  228. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +65 -0
  229. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +237 -0
  230. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +941 -0
  231. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +3790 -0
  232. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +60 -0
  233. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +159 -0
  234. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +49 -0
  235. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +122 -0
  236. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  237. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  238. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  239. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  240. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  241. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  242. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  243. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  244. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +362 -0
  245. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1488 -0
  246. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +19 -0
  247. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +35 -0
  248. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +113 -0
  249. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +458 -0
  250. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +73 -0
  251. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +219 -0
  252. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +146 -0
  253. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +621 -0
  254. data/src/core/ext/upb-generated/envoy/{api/v2/rds.upb.c → service/cluster/v3/cds.upb.c} +7 -9
  255. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +56 -0
  256. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +25 -0
  257. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +56 -0
  258. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +146 -0
  259. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +499 -0
  260. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +27 -0
  261. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +56 -0
  262. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +27 -0
  263. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +56 -0
  264. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +54 -0
  265. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +151 -0
  266. data/src/core/ext/upb-generated/envoy/{api/v2/srds.upb.c → service/route/v3/rds.upb.c} +7 -7
  267. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +56 -0
  268. data/src/core/ext/upb-generated/envoy/{api/v2/cds.upb.c → service/route/v3/srds.upb.c} +7 -7
  269. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +56 -0
  270. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  271. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  272. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
  273. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +128 -0
  274. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  275. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  276. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
  277. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +84 -0
  278. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
  279. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +78 -0
  280. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
  281. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +166 -0
  282. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +53 -0
  283. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +146 -0
  284. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  285. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  286. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
  287. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +207 -0
  288. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
  289. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +301 -0
  290. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
  291. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +283 -0
  292. data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +3 -2
  293. data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +9 -9
  294. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +40 -0
  295. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +99 -0
  296. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +51 -0
  297. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +130 -0
  298. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +30 -0
  299. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +68 -0
  300. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
  301. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
  302. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +830 -0
  303. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +251 -0
  304. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +871 -0
  305. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  306. data/src/core/ext/upb-generated/google/api/http.upb.h +52 -32
  307. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  308. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +12 -6
  309. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +107 -106
  310. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +691 -496
  311. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  312. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +12 -6
  313. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  314. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +8 -2
  315. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +5 -5
  316. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +55 -57
  317. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  318. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +12 -6
  319. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  320. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +82 -28
  321. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  322. data/src/core/ext/upb-generated/google/rpc/status.upb.h +17 -10
  323. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +5 -5
  324. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +40 -45
  325. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +43 -43
  326. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +236 -184
  327. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  328. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +29 -13
  329. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  330. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +19 -7
  331. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  332. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +122 -62
  333. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  334. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +30 -12
  335. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
  336. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +64 -0
  337. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -1
  338. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  339. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +71 -0
  340. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
  341. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +60 -0
  342. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +9 -9
  343. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +48 -68
  344. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  345. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  346. data/src/core/ext/upb-generated/validate/validate.upb.c +71 -70
  347. data/src/core/ext/upb-generated/validate/validate.upb.h +732 -586
  348. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +28 -0
  349. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  350. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  351. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  352. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  353. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  354. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +36 -0
  355. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  356. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  357. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  358. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  359. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  360. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  361. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  362. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  363. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  364. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  365. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  366. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +251 -0
  367. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  368. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  369. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  370. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  371. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  372. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +543 -0
  373. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  374. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  375. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  376. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +136 -0
  377. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  378. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  379. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  380. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  381. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  382. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +272 -0
  383. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +135 -0
  384. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  385. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  386. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  387. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  388. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  389. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  390. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  391. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  392. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  393. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  394. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  395. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  396. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +231 -0
  397. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +85 -0
  398. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +43 -0
  399. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  400. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  401. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  402. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +68 -0
  403. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  404. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +107 -0
  405. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  406. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  407. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  408. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  409. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  410. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  411. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  412. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +195 -0
  413. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  414. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +193 -0
  415. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  416. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +59 -0
  417. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  418. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  419. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  420. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  421. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  422. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +101 -0
  423. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  424. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +944 -0
  425. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +290 -0
  426. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  427. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  428. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +61 -0
  429. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  430. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  431. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  432. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  433. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  434. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  435. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  436. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  437. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  438. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +505 -0
  439. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  440. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +44 -0
  441. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  442. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +170 -0
  443. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  444. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +97 -0
  445. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  446. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +246 -0
  447. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  448. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  449. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  450. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  451. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  452. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +142 -0
  453. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +65 -0
  454. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +73 -0
  455. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  456. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +72 -0
  457. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  458. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +80 -0
  459. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  460. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +80 -0
  461. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  462. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  463. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  464. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  465. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  466. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  467. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  468. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  469. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  470. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  471. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  472. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  473. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  474. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  475. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  476. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +69 -0
  477. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  478. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  479. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  480. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  481. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  482. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  483. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  484. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  485. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  486. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  487. data/src/core/ext/{upb-generated/gogoproto/gogo.upb.h → upbdefs-generated/envoy/type/v3/http.upbdefs.h} +10 -10
  488. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  489. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  490. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  491. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  492. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  493. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  494. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  495. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  496. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  497. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  498. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +39 -0
  499. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  500. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  501. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  502. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +40 -0
  503. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  504. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  505. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  506. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  507. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  508. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +40 -0
  509. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  510. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  511. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  512. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  513. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  514. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  515. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  516. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  517. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  518. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  519. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  520. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  521. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  522. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  523. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  524. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  525. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  526. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +310 -0
  527. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  528. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  529. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  530. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  531. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  532. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  533. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  534. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  535. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  536. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  537. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  538. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  539. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  540. data/src/core/ext/xds/certificate_provider_factory.h +61 -0
  541. data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
  542. data/src/core/ext/xds/certificate_provider_registry.h +57 -0
  543. data/src/core/ext/xds/certificate_provider_store.cc +87 -0
  544. data/src/core/ext/xds/certificate_provider_store.h +112 -0
  545. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
  546. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
  547. data/src/core/ext/xds/xds_api.cc +3791 -0
  548. data/src/core/ext/xds/xds_api.h +671 -0
  549. data/src/core/ext/xds/xds_bootstrap.cc +555 -0
  550. data/src/core/ext/xds/xds_bootstrap.h +120 -0
  551. data/src/core/ext/xds/xds_certificate_provider.cc +405 -0
  552. data/src/core/ext/xds/xds_certificate_provider.h +151 -0
  553. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +9 -6
  554. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +983 -773
  555. data/src/core/ext/xds/xds_client.h +365 -0
  556. data/src/core/ext/xds/xds_client_stats.cc +159 -0
  557. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +80 -40
  558. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  559. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  560. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  561. data/src/core/ext/xds/xds_http_filters.h +130 -0
  562. data/src/core/ext/xds/xds_server_config_fetcher.cc +532 -0
  563. data/src/core/lib/channel/channel_args.cc +24 -22
  564. data/src/core/lib/channel/channel_args.h +3 -2
  565. data/src/core/lib/channel/channel_stack.cc +12 -0
  566. data/src/core/lib/channel/channel_stack.h +27 -13
  567. data/src/core/lib/channel/channel_trace.cc +6 -8
  568. data/src/core/lib/channel/channel_trace.h +1 -1
  569. data/src/core/lib/channel/channelz.cc +137 -97
  570. data/src/core/lib/channel/channelz.h +47 -26
  571. data/src/core/lib/channel/channelz_registry.cc +34 -15
  572. data/src/core/lib/channel/channelz_registry.h +3 -1
  573. data/src/core/lib/channel/connected_channel.cc +7 -5
  574. data/src/core/lib/channel/context.h +1 -1
  575. data/src/core/lib/channel/handshaker.cc +15 -59
  576. data/src/core/lib/channel/handshaker.h +7 -22
  577. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  578. data/src/core/lib/channel/status_util.cc +14 -5
  579. data/src/core/lib/channel/status_util.h +5 -0
  580. data/src/core/lib/compression/compression.cc +8 -4
  581. data/src/core/lib/compression/compression_args.cc +3 -2
  582. data/src/core/lib/compression/compression_internal.cc +10 -5
  583. data/src/core/lib/compression/compression_internal.h +2 -1
  584. data/src/core/lib/compression/message_compress.cc +5 -1
  585. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  586. data/src/core/lib/debug/stats.cc +21 -27
  587. data/src/core/lib/debug/stats.h +5 -3
  588. data/src/core/lib/debug/stats_data.cc +1 -0
  589. data/src/core/lib/debug/stats_data.h +13 -13
  590. data/src/core/lib/gpr/alloc.cc +3 -2
  591. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  592. data/src/core/lib/gpr/log.cc +59 -17
  593. data/src/core/lib/gpr/log_linux.cc +23 -9
  594. data/src/core/lib/gpr/log_posix.cc +19 -7
  595. data/src/core/lib/gpr/log_windows.cc +18 -4
  596. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  597. data/src/core/lib/gpr/spinlock.h +12 -5
  598. data/src/core/lib/gpr/string.cc +33 -55
  599. data/src/core/lib/gpr/string.h +9 -24
  600. data/src/core/lib/gpr/sync.cc +4 -4
  601. data/src/core/lib/gpr/sync_abseil.cc +5 -6
  602. data/src/core/lib/gpr/sync_posix.cc +2 -8
  603. data/src/core/lib/gpr/sync_windows.cc +2 -2
  604. data/src/core/lib/gpr/time.cc +16 -12
  605. data/src/core/lib/gpr/time_posix.cc +1 -1
  606. data/src/core/lib/gpr/time_precise.cc +5 -2
  607. data/src/core/lib/gpr/time_precise.h +6 -2
  608. data/src/core/lib/gpr/tls.h +4 -0
  609. data/src/core/lib/gpr/tls_msvc.h +2 -0
  610. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  611. data/src/core/lib/gpr/useful.h +5 -4
  612. data/src/core/lib/gprpp/arena.h +3 -2
  613. data/src/core/lib/gprpp/atomic.h +9 -9
  614. data/src/core/lib/gprpp/dual_ref_counted.h +331 -0
  615. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  616. data/src/core/lib/gprpp/examine_stack.h +46 -0
  617. data/src/core/lib/gprpp/fork.cc +3 -3
  618. data/src/core/lib/gprpp/global_config_env.cc +8 -6
  619. data/src/core/lib/gprpp/host_port.cc +29 -35
  620. data/src/core/lib/gprpp/host_port.h +14 -17
  621. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  622. data/src/core/lib/gprpp/mpscq.cc +2 -2
  623. data/src/core/lib/gprpp/orphanable.h +4 -8
  624. data/src/core/lib/gprpp/ref_counted.h +91 -68
  625. data/src/core/lib/gprpp/ref_counted_ptr.h +173 -7
  626. data/src/core/lib/gprpp/stat.h +38 -0
  627. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  628. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  629. data/src/core/lib/gprpp/sync.h +129 -40
  630. data/src/core/lib/gprpp/thd.h +3 -3
  631. data/src/core/lib/gprpp/thd_posix.cc +42 -37
  632. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  633. data/src/core/lib/gprpp/time_util.cc +77 -0
  634. data/src/core/lib/gprpp/time_util.h +42 -0
  635. data/src/core/lib/http/format_request.cc +46 -65
  636. data/src/core/lib/http/httpcli.cc +16 -14
  637. data/src/core/lib/http/httpcli.h +4 -6
  638. data/src/core/lib/http/httpcli_security_connector.cc +13 -13
  639. data/src/core/lib/http/parser.cc +47 -27
  640. data/src/core/lib/http/parser.h +2 -3
  641. data/src/core/lib/iomgr/buffer_list.h +23 -22
  642. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  643. data/src/core/lib/iomgr/call_combiner.h +3 -2
  644. data/src/core/lib/iomgr/cfstream_handle.cc +6 -4
  645. data/src/core/lib/iomgr/closure.h +2 -3
  646. data/src/core/lib/iomgr/combiner.cc +2 -1
  647. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  648. data/src/core/lib/iomgr/endpoint.cc +5 -1
  649. data/src/core/lib/iomgr/endpoint.h +8 -4
  650. data/src/core/lib/iomgr/endpoint_cfstream.cc +38 -14
  651. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  652. data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
  653. data/src/core/lib/iomgr/error.cc +23 -21
  654. data/src/core/lib/iomgr/error.h +1 -2
  655. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  656. data/src/core/lib/iomgr/error_internal.h +1 -1
  657. data/src/core/lib/iomgr/ev_apple.cc +359 -0
  658. data/src/core/lib/iomgr/ev_apple.h +43 -0
  659. data/src/core/lib/iomgr/ev_epoll1_linux.cc +46 -43
  660. data/src/core/lib/iomgr/ev_epollex_linux.cc +46 -45
  661. data/src/core/lib/iomgr/ev_poll_posix.cc +18 -15
  662. data/src/core/lib/iomgr/ev_posix.cc +5 -6
  663. data/src/core/lib/iomgr/exec_ctx.cc +7 -3
  664. data/src/core/lib/iomgr/exec_ctx.h +26 -10
  665. data/src/core/lib/iomgr/executor.cc +2 -1
  666. data/src/core/lib/iomgr/executor.h +1 -1
  667. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  668. data/src/core/lib/iomgr/executor/threadpool.h +4 -4
  669. data/src/core/lib/iomgr/iomgr.cc +1 -1
  670. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  671. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -21
  672. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  673. data/src/core/lib/iomgr/load_file.h +1 -1
  674. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  675. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  676. data/src/core/lib/iomgr/parse_address.cc +322 -0
  677. data/src/core/lib/iomgr/parse_address.h +77 -0
  678. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  679. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  680. data/src/core/lib/iomgr/pollset_set_custom.cc +11 -11
  681. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  682. data/src/core/lib/iomgr/port.h +2 -21
  683. data/src/core/lib/iomgr/python_util.h +46 -0
  684. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  685. data/src/core/lib/iomgr/resolve_address.h +4 -6
  686. data/src/core/lib/iomgr/resolve_address_custom.cc +42 -57
  687. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  688. data/src/core/lib/iomgr/resolve_address_posix.cc +11 -16
  689. data/src/core/lib/iomgr/resolve_address_windows.cc +16 -25
  690. data/src/core/lib/iomgr/resource_quota.cc +39 -38
  691. data/src/core/lib/iomgr/sockaddr_utils.cc +161 -44
  692. data/src/core/lib/iomgr/sockaddr_utils.h +40 -19
  693. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  694. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  695. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  696. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  697. data/src/core/lib/iomgr/socket_utils_common_posix.cc +103 -81
  698. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  699. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  700. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  701. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -18
  702. data/src/core/lib/iomgr/tcp_client_custom.cc +13 -15
  703. data/src/core/lib/iomgr/tcp_client_posix.cc +31 -37
  704. data/src/core/lib/iomgr/tcp_client_windows.cc +10 -11
  705. data/src/core/lib/iomgr/tcp_custom.cc +56 -36
  706. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  707. data/src/core/lib/iomgr/tcp_posix.cc +48 -29
  708. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  709. data/src/core/lib/iomgr/tcp_server.h +7 -5
  710. data/src/core/lib/iomgr/tcp_server_custom.cc +39 -45
  711. data/src/core/lib/iomgr/tcp_server_posix.cc +38 -44
  712. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
  713. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -8
  714. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +10 -18
  715. data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
  716. data/src/core/lib/iomgr/tcp_uv.cc +5 -4
  717. data/src/core/lib/iomgr/tcp_windows.cc +26 -10
  718. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  719. data/src/core/lib/iomgr/timer_custom.cc +5 -5
  720. data/src/core/lib/iomgr/timer_generic.cc +20 -20
  721. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  722. data/src/core/lib/iomgr/timer_heap.h +2 -3
  723. data/src/core/lib/iomgr/timer_manager.cc +3 -3
  724. data/src/core/lib/iomgr/udp_server.cc +33 -38
  725. data/src/core/lib/iomgr/udp_server.h +6 -4
  726. data/src/core/lib/iomgr/unix_sockets_posix.cc +36 -30
  727. data/src/core/lib/iomgr/unix_sockets_posix.h +8 -1
  728. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +12 -2
  729. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  730. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  731. data/src/core/lib/json/json.h +15 -4
  732. data/src/core/lib/json/json_reader.cc +33 -30
  733. data/src/core/lib/json/json_util.cc +58 -0
  734. data/src/core/lib/json/json_util.h +204 -0
  735. data/src/core/lib/json/json_writer.cc +15 -13
  736. data/src/core/lib/matchers/matchers.cc +339 -0
  737. data/src/core/lib/matchers/matchers.h +160 -0
  738. data/src/core/lib/security/context/security_context.cc +4 -3
  739. data/src/core/lib/security/context/security_context.h +3 -1
  740. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  741. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  742. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  743. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  744. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  745. data/src/core/lib/security/credentials/credentials.cc +7 -91
  746. data/src/core/lib/security/credentials/credentials.h +18 -66
  747. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  748. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  749. data/src/core/lib/security/credentials/external/aws_request_signer.cc +213 -0
  750. data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
  751. data/src/core/lib/security/credentials/external/external_account_credentials.cc +497 -0
  752. data/src/core/lib/security/credentials/external/external_account_credentials.h +120 -0
  753. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
  754. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +48 -0
  755. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +213 -0
  756. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +58 -0
  757. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -2
  758. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  759. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  760. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +90 -67
  761. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  762. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  763. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +64 -0
  764. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -4
  765. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  766. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
  767. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +13 -0
  768. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +13 -19
  769. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  770. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  771. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  772. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +109 -97
  773. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +14 -7
  774. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +20 -7
  775. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  776. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +27 -6
  777. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +12 -2
  778. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +346 -0
  779. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +213 -0
  780. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +399 -0
  781. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +138 -0
  782. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +78 -140
  783. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +74 -167
  784. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -13
  785. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -3
  786. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  787. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  788. data/src/core/lib/security/credentials/xds/xds_credentials.cc +244 -0
  789. data/src/core/lib/security/credentials/xds/xds_credentials.h +69 -0
  790. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -7
  791. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +27 -32
  792. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +121 -0
  793. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +87 -0
  794. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  795. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  796. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  797. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -4
  798. data/src/core/lib/security/security_connector/security_connector.cc +6 -3
  799. data/src/core/lib/security/security_connector/security_connector.h +6 -4
  800. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +42 -40
  801. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +8 -5
  802. data/src/core/lib/security/security_connector/ssl_utils.cc +100 -27
  803. data/src/core/lib/security/security_connector/ssl_utils.h +37 -31
  804. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +394 -284
  805. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +108 -42
  806. data/src/core/lib/security/transport/auth_filters.h +0 -5
  807. data/src/core/lib/security/transport/client_auth_filter.cc +11 -11
  808. data/src/core/lib/security/transport/secure_endpoint.cc +9 -3
  809. data/src/core/lib/security/transport/security_handshaker.cc +36 -8
  810. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  811. data/src/core/lib/security/util/json_util.cc +12 -13
  812. data/src/core/lib/security/util/json_util.h +1 -0
  813. data/src/core/lib/slice/slice.cc +45 -5
  814. data/src/core/lib/slice/slice_buffer.cc +2 -1
  815. data/src/core/lib/slice/slice_intern.cc +13 -16
  816. data/src/core/lib/slice/slice_internal.h +17 -2
  817. data/src/core/lib/slice/slice_utils.h +9 -0
  818. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  819. data/src/core/lib/surface/call.cc +95 -88
  820. data/src/core/lib/surface/call.h +2 -1
  821. data/src/core/lib/surface/call_details.cc +8 -8
  822. data/src/core/lib/surface/call_log_batch.cc +50 -58
  823. data/src/core/lib/surface/channel.cc +86 -72
  824. data/src/core/lib/surface/channel.h +54 -7
  825. data/src/core/lib/surface/channel_init.cc +1 -1
  826. data/src/core/lib/surface/channel_ping.cc +2 -3
  827. data/src/core/lib/surface/completion_queue.cc +64 -63
  828. data/src/core/lib/surface/completion_queue.h +16 -16
  829. data/src/core/lib/surface/event_string.cc +18 -25
  830. data/src/core/lib/surface/event_string.h +3 -1
  831. data/src/core/lib/surface/init.cc +45 -29
  832. data/src/core/lib/surface/init_secure.cc +1 -4
  833. data/src/core/lib/surface/lame_client.cc +47 -54
  834. data/src/core/lib/surface/lame_client.h +5 -0
  835. data/src/core/lib/surface/server.cc +1309 -1300
  836. data/src/core/lib/surface/server.h +469 -45
  837. data/src/core/lib/surface/validate_metadata.h +3 -0
  838. data/src/core/lib/surface/version.cc +2 -2
  839. data/src/core/lib/transport/authority_override.cc +40 -0
  840. data/src/core/lib/transport/authority_override.h +37 -0
  841. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  842. data/src/core/lib/transport/bdp_estimator.h +2 -1
  843. data/src/core/lib/transport/byte_stream.h +10 -5
  844. data/src/core/lib/transport/connectivity_state.cc +23 -17
  845. data/src/core/lib/transport/connectivity_state.h +31 -15
  846. data/src/core/lib/transport/error_utils.cc +13 -0
  847. data/src/core/lib/transport/error_utils.h +7 -1
  848. data/src/core/lib/transport/metadata.cc +19 -5
  849. data/src/core/lib/transport/metadata.h +2 -2
  850. data/src/core/lib/transport/metadata_batch.cc +27 -0
  851. data/src/core/lib/transport/metadata_batch.h +20 -7
  852. data/src/core/lib/transport/static_metadata.cc +296 -277
  853. data/src/core/lib/transport/static_metadata.h +81 -74
  854. data/src/core/lib/transport/status_conversion.cc +6 -14
  855. data/src/core/lib/transport/status_metadata.cc +4 -3
  856. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  857. data/src/core/lib/transport/transport.cc +7 -6
  858. data/src/core/lib/transport/transport.h +24 -10
  859. data/src/core/lib/transport/transport_op_string.cc +61 -102
  860. data/src/core/lib/uri/uri_parser.cc +135 -258
  861. data/src/core/lib/uri/uri_parser.h +60 -23
  862. data/src/core/plugin_registry/grpc_plugin_registry.cc +65 -12
  863. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  864. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  865. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  866. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +49 -38
  867. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  868. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +98 -48
  869. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  870. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +3 -3
  871. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  872. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  873. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  874. data/src/core/tsi/fake_transport_security.cc +27 -20
  875. data/src/core/tsi/local_transport_security.cc +5 -1
  876. data/src/core/tsi/local_transport_security.h +6 -7
  877. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  878. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  879. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  880. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -4
  881. data/src/core/tsi/ssl_transport_security.cc +226 -105
  882. data/src/core/tsi/ssl_transport_security.h +28 -16
  883. data/src/core/tsi/ssl_types.h +0 -2
  884. data/src/core/tsi/transport_security.cc +10 -8
  885. data/src/core/tsi/transport_security.h +6 -9
  886. data/src/core/tsi/transport_security_grpc.h +2 -3
  887. data/src/core/tsi/transport_security_interface.h +9 -4
  888. data/src/ruby/bin/math_services_pb.rb +4 -4
  889. data/src/ruby/ext/grpc/extconf.rb +15 -4
  890. data/src/ruby/ext/grpc/rb_call.c +12 -3
  891. data/src/ruby/ext/grpc/rb_call.h +4 -0
  892. data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
  893. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  894. data/src/ruby/ext/grpc/rb_channel_credentials.c +20 -1
  895. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  896. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  897. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  898. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  899. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  900. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +44 -18
  901. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +83 -44
  902. data/src/ruby/ext/grpc/rb_server.c +13 -1
  903. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  904. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  905. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  906. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  907. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  908. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  909. data/src/ruby/lib/grpc/errors.rb +103 -42
  910. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  911. data/src/ruby/lib/grpc/generic/client_stub.rb +5 -3
  912. data/src/ruby/lib/grpc/generic/interceptors.rb +5 -5
  913. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  914. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  915. data/src/ruby/lib/grpc/structs.rb +1 -1
  916. data/src/ruby/lib/grpc/version.rb +1 -1
  917. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  918. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +2 -2
  919. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +51 -0
  920. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +61 -11
  921. data/src/ruby/spec/call_spec.rb +1 -1
  922. data/src/ruby/spec/channel_credentials_spec.rb +42 -0
  923. data/src/ruby/spec/channel_spec.rb +17 -6
  924. data/src/ruby/spec/client_auth_spec.rb +27 -1
  925. data/src/ruby/spec/debug_message_spec.rb +134 -0
  926. data/src/ruby/spec/errors_spec.rb +1 -1
  927. data/src/ruby/spec/generic/active_call_spec.rb +21 -10
  928. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  929. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  930. data/src/ruby/spec/generic/service_spec.rb +2 -0
  931. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  932. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
  933. data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
  934. data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
  935. data/src/ruby/spec/pb/codegen/package_option_spec.rb +29 -7
  936. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  937. data/src/ruby/spec/server_spec.rb +22 -0
  938. data/src/ruby/spec/support/services.rb +10 -4
  939. data/src/ruby/spec/testdata/ca.pem +18 -13
  940. data/src/ruby/spec/testdata/client.key +26 -14
  941. data/src/ruby/spec/testdata/client.pem +18 -12
  942. data/src/ruby/spec/testdata/server1.key +26 -14
  943. data/src/ruby/spec/testdata/server1.pem +20 -14
  944. data/src/ruby/spec/user_agent_spec.rb +74 -0
  945. data/third_party/abseil-cpp/absl/algorithm/container.h +1764 -0
  946. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  947. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  948. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  949. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  950. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  951. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  952. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +166 -0
  953. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  954. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
  955. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
  956. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  957. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
  958. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
  959. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  960. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  961. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  962. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  963. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  964. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  965. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  966. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  967. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  968. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  969. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  970. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  971. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  972. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  973. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  974. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  975. data/third_party/abseil-cpp/absl/container/fixed_array.h +532 -0
  976. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  977. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  978. data/third_party/abseil-cpp/absl/container/internal/common.h +206 -0
  979. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  980. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +460 -0
  981. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +161 -0
  982. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +208 -0
  983. data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  984. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +270 -0
  985. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +321 -0
  986. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
  987. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +50 -0
  988. data/third_party/abseil-cpp/absl/container/internal/layout.h +743 -0
  989. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  990. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
  991. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1903 -0
  992. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +139 -0
  993. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  994. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1945 -0
  995. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
  996. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
  997. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
  998. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +196 -0
  999. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +134 -0
  1000. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +89 -0
  1001. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +108 -0
  1002. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
  1003. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
  1004. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +93 -0
  1005. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
  1006. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +149 -0
  1007. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +173 -0
  1008. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  1009. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
  1010. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
  1011. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +36 -0
  1012. data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
  1013. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  1014. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1560 -0
  1015. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  1016. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
  1017. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  1018. data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
  1019. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  1020. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
  1021. data/third_party/abseil-cpp/absl/hash/hash.h +325 -0
  1022. data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
  1023. data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
  1024. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
  1025. data/third_party/abseil-cpp/absl/hash/internal/hash.h +996 -0
  1026. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  1027. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  1028. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  1029. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  1030. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  1031. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  1032. data/third_party/abseil-cpp/absl/status/status.cc +445 -0
  1033. data/third_party/abseil-cpp/absl/status/status.h +817 -0
  1034. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +38 -0
  1035. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
  1036. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  1037. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  1038. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  1039. data/third_party/abseil-cpp/absl/strings/cord.cc +1998 -0
  1040. data/third_party/abseil-cpp/absl/strings/cord.h +1276 -0
  1041. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  1042. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  1043. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  1044. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  1045. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  1046. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +173 -0
  1047. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  1048. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  1049. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  1050. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  1051. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  1052. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  1053. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  1054. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  1055. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  1056. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  1057. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  1058. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  1059. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  1060. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  1061. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  1062. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  1063. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  1064. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  1065. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  1066. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  1067. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  1068. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  1069. data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
  1070. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
  1071. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
  1072. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
  1073. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
  1074. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +698 -0
  1075. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
  1076. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
  1077. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +249 -0
  1078. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  1079. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
  1080. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +492 -0
  1081. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
  1082. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2739 -0
  1083. data/third_party/abseil-cpp/absl/synchronization/mutex.h +1065 -0
  1084. data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
  1085. data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
  1086. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  1087. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  1088. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  1089. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  1090. data/third_party/abseil-cpp/absl/time/duration.cc +953 -0
  1091. data/third_party/abseil-cpp/absl/time/format.cc +160 -0
  1092. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  1093. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +632 -0
  1094. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +386 -0
  1095. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  1096. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  1097. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  1098. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  1099. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1029 -0
  1100. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  1101. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  1102. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +113 -0
  1103. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  1104. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +965 -0
  1105. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +137 -0
  1106. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +309 -0
  1107. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  1108. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  1109. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  1110. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  1111. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  1112. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +116 -0
  1113. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  1114. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  1115. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  1116. data/third_party/abseil-cpp/absl/time/time.h +1583 -0
  1117. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
  1118. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
  1119. data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
  1120. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  1121. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  1122. data/third_party/abseil-cpp/absl/types/variant.h +861 -0
  1123. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  1124. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  1125. data/third_party/boringssl-with-bazel/err_data.c +759 -707
  1126. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +6 -6
  1127. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +5 -5
  1128. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +6 -6
  1129. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +6 -13
  1130. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  1131. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  1132. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +5 -3
  1133. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  1134. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -20
  1135. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  1136. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
  1137. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
  1138. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
  1139. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  1140. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  1141. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  1142. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  1143. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  1144. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  1145. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  1146. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  1147. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  1148. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  1149. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  1150. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  1151. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  1152. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  1153. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  1154. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  1155. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
  1156. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  1157. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +18 -7
  1158. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  1159. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  1160. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  1161. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  1162. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  1163. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  1164. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  1165. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  1166. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  1167. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  1168. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +19 -43
  1169. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
  1170. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
  1171. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  1172. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +385 -0
  1173. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +56 -0
  1174. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  1175. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  1176. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
  1177. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +159 -0
  1178. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
  1179. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  1180. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  1181. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +5 -2
  1182. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  1183. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  1184. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  1185. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +34 -13
  1186. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  1187. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  1188. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
  1189. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  1190. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  1191. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +149 -211
  1192. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  1193. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  1194. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +301 -117
  1195. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +22 -28
  1196. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  1197. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  1198. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +434 -161
  1199. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  1200. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +18 -25
  1201. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  1202. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +104 -122
  1203. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +740 -0
  1204. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  1205. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  1206. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  1207. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  1208. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  1209. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  1210. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  1211. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  1212. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  1213. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  1214. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  1215. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +69 -5
  1216. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +162 -55
  1217. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -121
  1218. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  1219. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +5 -0
  1220. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +73 -40
  1221. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +122 -55
  1222. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +217 -2
  1223. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  1224. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +532 -0
  1225. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +246 -0
  1226. data/third_party/boringssl-with-bazel/src/crypto/mem.c +47 -16
  1227. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  1228. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
  1229. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
  1230. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  1231. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  1232. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  1233. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  1234. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  1235. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  1236. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  1237. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  1238. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  1239. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  1240. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +318 -0
  1241. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1399 -0
  1242. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +858 -0
  1243. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  1244. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +7 -7
  1245. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +10 -0
  1246. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
  1247. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  1248. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
  1249. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
  1250. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  1251. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +21 -37
  1252. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +27 -21
  1253. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
  1254. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  1255. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
  1256. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +89 -11
  1257. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +7 -4
  1258. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
  1259. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +4 -4
  1260. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +62 -44
  1261. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +67 -25
  1262. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +13 -11
  1263. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
  1264. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
  1265. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +38 -17
  1266. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
  1267. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  1268. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
  1269. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
  1270. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +68 -9
  1271. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  1272. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
  1273. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
  1274. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  1275. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  1276. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +25 -24
  1277. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  1278. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +32 -28
  1279. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  1280. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  1281. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +42 -22
  1282. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  1283. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
  1284. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  1285. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +2 -2
  1286. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +126 -40
  1287. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +7 -7
  1288. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  1289. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  1290. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  1291. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +54 -0
  1292. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +662 -556
  1293. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  1294. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +19 -7
  1295. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  1296. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  1297. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  1298. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +25 -0
  1299. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  1300. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +10 -5
  1301. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  1302. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +82 -20
  1303. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +11 -0
  1304. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  1305. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  1306. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  1307. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  1308. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +85 -3
  1309. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  1310. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  1311. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  1312. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +6 -17
  1313. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  1314. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  1315. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  1316. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +359 -120
  1317. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +33 -10
  1318. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +310 -0
  1319. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +1140 -755
  1320. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  1321. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +593 -440
  1322. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  1323. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  1324. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  1325. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  1326. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +181 -57
  1327. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +45 -26
  1328. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +43 -45
  1329. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +32 -10
  1330. data/third_party/boringssl-with-bazel/src/ssl/internal.h +160 -80
  1331. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  1332. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -3
  1333. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  1334. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +77 -8
  1335. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +7 -6
  1336. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
  1337. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +131 -15
  1338. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  1339. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +50 -15
  1340. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  1341. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  1342. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
  1343. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +53 -30
  1344. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +636 -100
  1345. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +2 -3
  1346. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +187 -68
  1347. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +71 -90
  1348. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +247 -73
  1349. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  1350. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
  1351. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  1352. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  1353. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  1354. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  1355. data/third_party/re2/re2/bitmap256.h +117 -0
  1356. data/third_party/re2/re2/bitstate.cc +385 -0
  1357. data/third_party/re2/re2/compile.cc +1279 -0
  1358. data/third_party/re2/re2/dfa.cc +2130 -0
  1359. data/third_party/re2/re2/filtered_re2.cc +121 -0
  1360. data/third_party/re2/re2/filtered_re2.h +109 -0
  1361. data/third_party/re2/re2/mimics_pcre.cc +197 -0
  1362. data/third_party/re2/re2/nfa.cc +713 -0
  1363. data/third_party/re2/re2/onepass.cc +623 -0
  1364. data/third_party/re2/re2/parse.cc +2464 -0
  1365. data/third_party/re2/re2/perl_groups.cc +119 -0
  1366. data/third_party/re2/re2/pod_array.h +55 -0
  1367. data/third_party/re2/re2/prefilter.cc +710 -0
  1368. data/third_party/re2/re2/prefilter.h +108 -0
  1369. data/third_party/re2/re2/prefilter_tree.cc +407 -0
  1370. data/third_party/re2/re2/prefilter_tree.h +139 -0
  1371. data/third_party/re2/re2/prog.cc +988 -0
  1372. data/third_party/re2/re2/prog.h +436 -0
  1373. data/third_party/re2/re2/re2.cc +1362 -0
  1374. data/third_party/re2/re2/re2.h +1002 -0
  1375. data/third_party/re2/re2/regexp.cc +980 -0
  1376. data/third_party/re2/re2/regexp.h +659 -0
  1377. data/third_party/re2/re2/set.cc +154 -0
  1378. data/third_party/re2/re2/set.h +80 -0
  1379. data/third_party/re2/re2/simplify.cc +657 -0
  1380. data/third_party/re2/re2/sparse_array.h +392 -0
  1381. data/third_party/re2/re2/sparse_set.h +264 -0
  1382. data/third_party/re2/re2/stringpiece.cc +65 -0
  1383. data/third_party/re2/re2/stringpiece.h +210 -0
  1384. data/third_party/re2/re2/tostring.cc +351 -0
  1385. data/third_party/re2/re2/unicode_casefold.cc +582 -0
  1386. data/third_party/re2/re2/unicode_casefold.h +78 -0
  1387. data/third_party/re2/re2/unicode_groups.cc +6269 -0
  1388. data/third_party/re2/re2/unicode_groups.h +67 -0
  1389. data/third_party/re2/re2/walker-inl.h +246 -0
  1390. data/third_party/re2/util/benchmark.h +156 -0
  1391. data/third_party/re2/util/flags.h +26 -0
  1392. data/third_party/re2/util/logging.h +109 -0
  1393. data/third_party/re2/util/malloc_counter.h +19 -0
  1394. data/third_party/re2/util/mix.h +41 -0
  1395. data/third_party/re2/util/mutex.h +148 -0
  1396. data/third_party/re2/util/pcre.cc +1025 -0
  1397. data/third_party/re2/util/pcre.h +681 -0
  1398. data/third_party/re2/util/rune.cc +260 -0
  1399. data/third_party/re2/util/strutil.cc +149 -0
  1400. data/third_party/re2/util/strutil.h +21 -0
  1401. data/third_party/re2/util/test.h +50 -0
  1402. data/third_party/re2/util/utf.h +44 -0
  1403. data/third_party/re2/util/util.h +42 -0
  1404. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  1405. data/third_party/upb/upb/decode.c +604 -511
  1406. data/third_party/upb/upb/decode.h +20 -1
  1407. data/third_party/upb/upb/decode.int.h +163 -0
  1408. data/third_party/upb/upb/decode_fast.c +1040 -0
  1409. data/third_party/upb/upb/decode_fast.h +126 -0
  1410. data/third_party/upb/upb/def.c +2178 -0
  1411. data/third_party/upb/upb/def.h +315 -0
  1412. data/third_party/upb/upb/def.hpp +439 -0
  1413. data/third_party/upb/upb/encode.c +311 -211
  1414. data/third_party/upb/upb/encode.h +27 -2
  1415. data/third_party/upb/upb/msg.c +215 -70
  1416. data/third_party/upb/upb/msg.h +558 -14
  1417. data/third_party/upb/upb/port_def.inc +105 -63
  1418. data/third_party/upb/upb/port_undef.inc +10 -7
  1419. data/third_party/upb/upb/reflection.c +408 -0
  1420. data/third_party/upb/upb/reflection.h +168 -0
  1421. data/third_party/upb/upb/table.c +73 -269
  1422. data/third_party/upb/upb/table.int.h +25 -57
  1423. data/third_party/upb/upb/text_encode.c +421 -0
  1424. data/third_party/upb/upb/text_encode.h +38 -0
  1425. data/third_party/upb/upb/upb.c +138 -135
  1426. data/third_party/upb/upb/upb.h +119 -146
  1427. data/third_party/upb/upb/upb.hpp +88 -0
  1428. data/third_party/upb/upb/upb.int.h +29 -0
  1429. data/third_party/xxhash/xxhash.h +5443 -0
  1430. metadata +686 -160
  1431. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
  1432. data/src/core/ext/filters/client_channel/parse_address.cc +0 -237
  1433. data/src/core/ext/filters/client_channel/parse_address.h +0 -53
  1434. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -484
  1435. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -65
  1436. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -359
  1437. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -122
  1438. data/src/core/ext/filters/client_channel/xds/xds_api.cc +0 -1779
  1439. data/src/core/ext/filters/client_channel/xds/xds_api.h +0 -280
  1440. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +0 -347
  1441. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +0 -87
  1442. data/src/core/ext/filters/client_channel/xds/xds_channel.h +0 -46
  1443. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +0 -104
  1444. data/src/core/ext/filters/client_channel/xds/xds_client.h +0 -274
  1445. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +0 -116
  1446. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -246
  1447. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -905
  1448. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -53
  1449. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -390
  1450. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1411
  1451. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -73
  1452. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -218
  1453. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +0 -34
  1454. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
  1455. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +0 -54
  1456. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -305
  1457. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -111
  1458. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -328
  1459. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -292
  1460. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -847
  1461. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -95
  1462. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -322
  1463. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -196
  1464. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -642
  1465. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -168
  1466. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -658
  1467. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +0 -35
  1468. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
  1469. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -132
  1470. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -436
  1471. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -128
  1472. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -392
  1473. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +0 -30
  1474. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -53
  1475. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -91
  1476. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -240
  1477. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -17
  1478. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -33
  1479. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -88
  1480. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -258
  1481. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -111
  1482. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -324
  1483. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +0 -30
  1484. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -53
  1485. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -104
  1486. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -383
  1487. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -17
  1488. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -33
  1489. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -144
  1490. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -527
  1491. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -42
  1492. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -112
  1493. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -53
  1494. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -62
  1495. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -199
  1496. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -17
  1497. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -33
  1498. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -793
  1499. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -2936
  1500. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -58
  1501. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -134
  1502. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -53
  1503. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -227
  1504. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -725
  1505. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -296
  1506. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1072
  1507. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +0 -32
  1508. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
  1509. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +0 -23
  1510. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -50
  1511. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -52
  1512. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -130
  1513. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -47
  1514. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -108
  1515. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -52
  1516. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
  1517. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -87
  1518. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
  1519. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +0 -38
  1520. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -87
  1521. data/src/core/ext/upb-generated/envoy/type/range.upb.c +0 -49
  1522. data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -112
  1523. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +0 -28
  1524. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -62
  1525. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -88
  1526. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -249
  1527. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
  1528. data/src/core/lib/gprpp/map.h +0 -59
  1529. data/src/core/lib/gprpp/string_view.h +0 -60
  1530. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  1531. data/src/core/lib/security/transport/target_authority_table.cc +0 -75
  1532. data/src/core/lib/security/transport/target_authority_table.h +0 -40
  1533. data/src/core/lib/slice/slice_hash_table.h +0 -199
  1534. data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
  1535. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  1536. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
  1537. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
  1538. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
  1539. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
  1540. data/third_party/upb/upb/generated_util.h +0 -105
  1541. data/third_party/upb/upb/port.c +0 -26
@@ -22,47 +22,40 @@
22
22
 
23
23
  #include <stdio.h>
24
24
 
25
+ #include <vector>
26
+
27
+ #include "absl/strings/str_format.h"
28
+ #include "absl/strings/str_join.h"
29
+
25
30
  #include <grpc/byte_buffer.h>
26
31
  #include <grpc/support/string_util.h>
27
32
  #include "src/core/lib/gpr/string.h"
28
33
 
29
- static void addhdr(gpr_strvec* buf, grpc_event* ev) {
30
- char* tmp;
31
- gpr_asprintf(&tmp, "tag:%p", ev->tag);
32
- gpr_strvec_add(buf, tmp);
34
+ static void addhdr(grpc_event* ev, std::vector<std::string>* buf) {
35
+ buf->push_back(absl::StrFormat("tag:%p", ev->tag));
33
36
  }
34
37
 
35
38
  static const char* errstr(int success) { return success ? "OK" : "ERROR"; }
36
39
 
37
- static void adderr(gpr_strvec* buf, int success) {
38
- char* tmp;
39
- gpr_asprintf(&tmp, " %s", errstr(success));
40
- gpr_strvec_add(buf, tmp);
40
+ static void adderr(int success, std::vector<std::string>* buf) {
41
+ buf->push_back(absl::StrFormat(" %s", errstr(success)));
41
42
  }
42
43
 
43
- char* grpc_event_string(grpc_event* ev) {
44
- char* out;
45
- gpr_strvec buf;
46
-
47
- if (ev == nullptr) return gpr_strdup("null");
48
-
49
- gpr_strvec_init(&buf);
50
-
44
+ std::string grpc_event_string(grpc_event* ev) {
45
+ if (ev == nullptr) return "null";
46
+ std::vector<std::string> out;
51
47
  switch (ev->type) {
52
48
  case GRPC_QUEUE_TIMEOUT:
53
- gpr_strvec_add(&buf, gpr_strdup("QUEUE_TIMEOUT"));
49
+ out.push_back("QUEUE_TIMEOUT");
54
50
  break;
55
51
  case GRPC_QUEUE_SHUTDOWN:
56
- gpr_strvec_add(&buf, gpr_strdup("QUEUE_SHUTDOWN"));
52
+ out.push_back("QUEUE_SHUTDOWN");
57
53
  break;
58
54
  case GRPC_OP_COMPLETE:
59
- gpr_strvec_add(&buf, gpr_strdup("OP_COMPLETE: "));
60
- addhdr(&buf, ev);
61
- adderr(&buf, ev->success);
55
+ out.push_back("OP_COMPLETE: ");
56
+ addhdr(ev, &out);
57
+ adderr(ev->success, &out);
62
58
  break;
63
59
  }
64
-
65
- out = gpr_strvec_flatten(&buf, nullptr);
66
- gpr_strvec_destroy(&buf);
67
- return out;
60
+ return absl::StrJoin(out, "");
68
61
  }
@@ -21,9 +21,11 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <string>
25
+
24
26
  #include <grpc/grpc.h>
25
27
 
26
28
  /* Returns a string describing an event. Must be later freed with gpr_free() */
27
- char* grpc_event_string(grpc_event* ev);
29
+ std::string grpc_event_string(grpc_event* ev);
28
30
 
29
31
  #endif /* GRPC_CORE_LIB_SURFACE_EVENT_STRING_H */
@@ -18,6 +18,8 @@
18
18
 
19
19
  #include <grpc/support/port_platform.h>
20
20
 
21
+ #include "src/core/lib/surface/init.h"
22
+
21
23
  #include <limits.h>
22
24
  #include <memory.h>
23
25
 
@@ -26,6 +28,7 @@
26
28
  #include <grpc/support/alloc.h>
27
29
  #include <grpc/support/log.h>
28
30
  #include <grpc/support/time.h>
31
+
29
32
  #include "src/core/lib/channel/channel_stack.h"
30
33
  #include "src/core/lib/channel/channelz_registry.h"
31
34
  #include "src/core/lib/channel/connected_channel.h"
@@ -37,6 +40,7 @@
37
40
  #include "src/core/lib/http/parser.h"
38
41
  #include "src/core/lib/iomgr/call_combiner.h"
39
42
  #include "src/core/lib/iomgr/combiner.h"
43
+ #include "src/core/lib/iomgr/exec_ctx.h"
40
44
  #include "src/core/lib/iomgr/executor.h"
41
45
  #include "src/core/lib/iomgr/iomgr.h"
42
46
  #include "src/core/lib/iomgr/resource_quota.h"
@@ -47,7 +51,6 @@
47
51
  #include "src/core/lib/surface/call.h"
48
52
  #include "src/core/lib/surface/channel_init.h"
49
53
  #include "src/core/lib/surface/completion_queue.h"
50
- #include "src/core/lib/surface/init.h"
51
54
  #include "src/core/lib/surface/lame_client.h"
52
55
  #include "src/core/lib/surface/server.h"
53
56
  #include "src/core/lib/transport/bdp_estimator.h"
@@ -60,16 +63,15 @@ extern void grpc_register_built_in_plugins(void);
60
63
  #define MAX_PLUGINS 128
61
64
 
62
65
  static gpr_once g_basic_init = GPR_ONCE_INIT;
63
- static gpr_mu g_init_mu;
66
+ static grpc_core::Mutex* g_init_mu;
64
67
  static int g_initializations;
65
- static gpr_cv* g_shutting_down_cv;
68
+ static grpc_core::CondVar* g_shutting_down_cv;
66
69
  static bool g_shutting_down;
67
70
 
68
71
  static void do_basic_init(void) {
69
72
  gpr_log_verbosity_init();
70
- gpr_mu_init(&g_init_mu);
71
- g_shutting_down_cv = static_cast<gpr_cv*>(malloc(sizeof(gpr_cv)));
72
- gpr_cv_init(g_shutting_down_cv);
73
+ g_init_mu = new grpc_core::Mutex();
74
+ g_shutting_down_cv = new grpc_core::CondVar();
73
75
  g_shutting_down = false;
74
76
  grpc_register_built_in_plugins();
75
77
  grpc_cq_global_init();
@@ -98,11 +100,12 @@ static void register_builtin_channel_init() {
98
100
  grpc_channel_init_register_stage(GRPC_SERVER_CHANNEL,
99
101
  GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
100
102
  grpc_add_connected_filter, nullptr);
101
- grpc_channel_init_register_stage(GRPC_CLIENT_LAME_CHANNEL,
102
- GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
103
- append_filter, (void*)&grpc_lame_filter);
104
- grpc_channel_init_register_stage(GRPC_SERVER_CHANNEL, INT_MAX, prepend_filter,
105
- (void*)&grpc_server_top_filter);
103
+ grpc_channel_init_register_stage(
104
+ GRPC_CLIENT_LAME_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
105
+ append_filter, const_cast<grpc_channel_filter*>(&grpc_lame_filter));
106
+ grpc_channel_init_register_stage(
107
+ GRPC_SERVER_CHANNEL, INT_MAX, prepend_filter,
108
+ const_cast<grpc_channel_filter*>(&grpc_core::Server::kServerTopFilter));
106
109
  }
107
110
 
108
111
  typedef struct grpc_plugin {
@@ -126,11 +129,11 @@ void grpc_init(void) {
126
129
  int i;
127
130
  gpr_once_init(&g_basic_init, do_basic_init);
128
131
 
129
- grpc_core::MutexLock lock(&g_init_mu);
132
+ grpc_core::MutexLock lock(g_init_mu);
130
133
  if (++g_initializations == 1) {
131
134
  if (g_shutting_down) {
132
135
  g_shutting_down = false;
133
- gpr_cv_broadcast(g_shutting_down_cv);
136
+ g_shutting_down_cv->SignalAll();
134
137
  }
135
138
  grpc_core::Fork::GlobalInit();
136
139
  grpc_fork_handlers_auto_register();
@@ -192,14 +195,14 @@ void grpc_shutdown_internal_locked(void) {
192
195
  grpc_core::ExecCtx::GlobalShutdown();
193
196
  grpc_core::ApplicationCallbackExecCtx::GlobalShutdown();
194
197
  g_shutting_down = false;
195
- gpr_cv_broadcast(g_shutting_down_cv);
198
+ g_shutting_down_cv->SignalAll();
196
199
  // Absolute last action will be to delete static metadata context.
197
200
  grpc_destroy_static_metadata_ctx();
198
201
  }
199
202
 
200
203
  void grpc_shutdown_internal(void* /*ignored*/) {
201
204
  GRPC_API_TRACE("grpc_shutdown_internal", 0, ());
202
- grpc_core::MutexLock lock(&g_init_mu);
205
+ grpc_core::MutexLock lock(g_init_mu);
203
206
  // We have released lock from the shutdown thread and it is possible that
204
207
  // another grpc_init has been called, and do nothing if that is the case.
205
208
  if (--g_initializations != 0) {
@@ -210,22 +213,36 @@ void grpc_shutdown_internal(void* /*ignored*/) {
210
213
 
211
214
  void grpc_shutdown(void) {
212
215
  GRPC_API_TRACE("grpc_shutdown(void)", 0, ());
213
- grpc_core::MutexLock lock(&g_init_mu);
216
+ grpc_core::MutexLock lock(g_init_mu);
217
+
214
218
  if (--g_initializations == 0) {
215
- g_initializations++;
216
- g_shutting_down = true;
217
- // spawn a detached thread to do the actual clean up in case we are
218
- // currently in an executor thread.
219
- grpc_core::Thread cleanup_thread(
220
- "grpc_shutdown", grpc_shutdown_internal, nullptr, nullptr,
221
- grpc_core::Thread::Options().set_joinable(false).set_tracked(false));
222
- cleanup_thread.Start();
219
+ grpc_core::ApplicationCallbackExecCtx* acec =
220
+ grpc_core::ApplicationCallbackExecCtx::Get();
221
+ if (!grpc_iomgr_is_any_background_poller_thread() &&
222
+ (acec == nullptr ||
223
+ (acec->Flags() & GRPC_APP_CALLBACK_EXEC_CTX_FLAG_IS_INTERNAL_THREAD) ==
224
+ 0)) {
225
+ // just run clean-up when this is called on non-executor thread.
226
+ gpr_log(GPR_DEBUG, "grpc_shutdown starts clean-up now");
227
+ g_shutting_down = true;
228
+ grpc_shutdown_internal_locked();
229
+ } else {
230
+ // spawn a detached thread to do the actual clean up in case we are
231
+ // currently in an executor thread.
232
+ gpr_log(GPR_DEBUG, "grpc_shutdown spawns clean-up thread");
233
+ g_initializations++;
234
+ g_shutting_down = true;
235
+ grpc_core::Thread cleanup_thread(
236
+ "grpc_shutdown", grpc_shutdown_internal, nullptr, nullptr,
237
+ grpc_core::Thread::Options().set_joinable(false).set_tracked(false));
238
+ cleanup_thread.Start();
239
+ }
223
240
  }
224
241
  }
225
242
 
226
243
  void grpc_shutdown_blocking(void) {
227
244
  GRPC_API_TRACE("grpc_shutdown_blocking(void)", 0, ());
228
- grpc_core::MutexLock lock(&g_init_mu);
245
+ grpc_core::MutexLock lock(g_init_mu);
229
246
  if (--g_initializations == 0) {
230
247
  g_shutting_down = true;
231
248
  grpc_shutdown_internal_locked();
@@ -235,16 +252,15 @@ void grpc_shutdown_blocking(void) {
235
252
  int grpc_is_initialized(void) {
236
253
  int r;
237
254
  gpr_once_init(&g_basic_init, do_basic_init);
238
- grpc_core::MutexLock lock(&g_init_mu);
255
+ grpc_core::MutexLock lock(g_init_mu);
239
256
  r = g_initializations > 0;
240
257
  return r;
241
258
  }
242
259
 
243
260
  void grpc_maybe_wait_for_async_shutdown(void) {
244
261
  gpr_once_init(&g_basic_init, do_basic_init);
245
- grpc_core::MutexLock lock(&g_init_mu);
262
+ grpc_core::MutexLock lock(g_init_mu);
246
263
  while (g_shutting_down) {
247
- gpr_cv_wait(g_shutting_down_cv, &g_init_mu,
248
- gpr_inf_future(GPR_CLOCK_REALTIME));
264
+ g_shutting_down_cv->Wait(g_init_mu);
249
265
  }
250
266
  }
@@ -78,7 +78,4 @@ void grpc_register_security_filters(void) {
78
78
  maybe_prepend_server_auth_filter, nullptr);
79
79
  }
80
80
 
81
- void grpc_security_init() {
82
- grpc_core::SecurityRegisterHandshakerFactories();
83
- grpc_control_plane_credentials_init();
84
- }
81
+ void grpc_security_init() { grpc_core::SecurityRegisterHandshakerFactories(); }
@@ -35,63 +35,37 @@
35
35
  #include "src/core/lib/transport/connectivity_state.h"
36
36
  #include "src/core/lib/transport/static_metadata.h"
37
37
 
38
+ #define GRPC_ARG_LAME_FILTER_ERROR "grpc.lame_filter_error"
39
+
38
40
  namespace grpc_core {
39
41
 
40
42
  namespace {
41
43
 
42
- struct CallData {
43
- CallCombiner* call_combiner;
44
- grpc_linked_mdelem status;
45
- grpc_linked_mdelem details;
46
- Atomic<bool> filled_metadata;
47
- };
48
-
49
44
  struct ChannelData {
50
- ChannelData() : state_tracker("lame_channel", GRPC_CHANNEL_SHUTDOWN) {}
45
+ explicit ChannelData(grpc_channel_element_args* args)
46
+ : state_tracker("lame_channel", GRPC_CHANNEL_SHUTDOWN) {
47
+ grpc_error* err = grpc_channel_args_find_pointer<grpc_error>(
48
+ args->channel_args, GRPC_ARG_LAME_FILTER_ERROR);
49
+ if (err != nullptr) error = GRPC_ERROR_REF(err);
50
+ }
51
51
 
52
- grpc_status_code error_code;
53
- const char* error_message;
52
+ ~ChannelData() { GRPC_ERROR_UNREF(error); }
53
+
54
+ grpc_error* error = GRPC_ERROR_NONE;
54
55
  Mutex mu;
55
56
  ConnectivityStateTracker state_tracker;
56
57
  };
57
58
 
58
- static void fill_metadata(grpc_call_element* elem, grpc_metadata_batch* mdb) {
59
- CallData* calld = static_cast<CallData*>(elem->call_data);
60
- bool expected = false;
61
- if (!calld->filled_metadata.CompareExchangeStrong(
62
- &expected, true, MemoryOrder::RELAXED, MemoryOrder::RELAXED)) {
63
- return;
64
- }
65
- ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
66
- char tmp[GPR_LTOA_MIN_BUFSIZE];
67
- gpr_ltoa(chand->error_code, tmp);
68
- calld->status.md = grpc_mdelem_from_slices(
69
- GRPC_MDSTR_GRPC_STATUS, grpc_core::UnmanagedMemorySlice(tmp));
70
- calld->details.md = grpc_mdelem_from_slices(
71
- GRPC_MDSTR_GRPC_MESSAGE,
72
- grpc_core::UnmanagedMemorySlice(chand->error_message));
73
- calld->status.prev = calld->details.next = nullptr;
74
- calld->status.next = &calld->details;
75
- calld->details.prev = &calld->status;
76
- mdb->list.head = &calld->status;
77
- mdb->list.tail = &calld->details;
78
- mdb->list.count = 2;
79
- mdb->deadline = GRPC_MILLIS_INF_FUTURE;
80
- }
59
+ struct CallData {
60
+ CallCombiner* call_combiner;
61
+ };
81
62
 
82
63
  static void lame_start_transport_stream_op_batch(
83
64
  grpc_call_element* elem, grpc_transport_stream_op_batch* op) {
84
65
  CallData* calld = static_cast<CallData*>(elem->call_data);
85
- if (op->recv_initial_metadata) {
86
- fill_metadata(elem,
87
- op->payload->recv_initial_metadata.recv_initial_metadata);
88
- } else if (op->recv_trailing_metadata) {
89
- fill_metadata(elem,
90
- op->payload->recv_trailing_metadata.recv_trailing_metadata);
91
- }
66
+ ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
92
67
  grpc_transport_stream_op_batch_finish_with_failure(
93
- op, GRPC_ERROR_CREATE_FROM_STATIC_STRING("lame client channel"),
94
- calld->call_combiner);
68
+ op, GRPC_ERROR_REF(chand->error), calld->call_combiner);
95
69
  }
96
70
 
97
71
  static void lame_get_channel_info(grpc_channel_element* /*elem*/,
@@ -139,9 +113,7 @@ static void lame_destroy_call_elem(grpc_call_element* /*elem*/,
139
113
 
140
114
  static grpc_error* lame_init_channel_elem(grpc_channel_element* elem,
141
115
  grpc_channel_element_args* args) {
142
- GPR_ASSERT(args->is_first);
143
- GPR_ASSERT(args->is_last);
144
- new (elem->channel_data) ChannelData;
116
+ new (elem->channel_data) ChannelData(args);
145
117
  return GRPC_ERROR_NONE;
146
118
  }
147
119
 
@@ -150,8 +122,27 @@ static void lame_destroy_channel_elem(grpc_channel_element* elem) {
150
122
  chand->~ChannelData();
151
123
  }
152
124
 
125
+ // Channel arg vtable for a grpc_error*.
126
+ void* ErrorCopy(void* p) {
127
+ grpc_error* error = static_cast<grpc_error*>(p);
128
+ return GRPC_ERROR_REF(error);
129
+ }
130
+ void ErrorDestroy(void* p) {
131
+ grpc_error* error = static_cast<grpc_error*>(p);
132
+ GRPC_ERROR_UNREF(error);
133
+ }
134
+ int ErrorCompare(void* p, void* q) { return GPR_ICMP(p, q); }
135
+ const grpc_arg_pointer_vtable kLameFilterErrorArgVtable = {
136
+ ErrorCopy, ErrorDestroy, ErrorCompare};
137
+
153
138
  } // namespace
154
139
 
140
+ grpc_arg MakeLameClientErrorArg(grpc_error* error) {
141
+ return grpc_channel_arg_pointer_create(
142
+ const_cast<char*>(GRPC_ARG_LAME_FILTER_ERROR), error,
143
+ &kLameFilterErrorArgVtable);
144
+ }
145
+
155
146
  } // namespace grpc_core
156
147
 
157
148
  const grpc_channel_filter grpc_lame_filter = {
@@ -174,18 +165,20 @@ grpc_channel* grpc_lame_client_channel_create(const char* target,
174
165
  grpc_status_code error_code,
175
166
  const char* error_message) {
176
167
  grpc_core::ExecCtx exec_ctx;
177
- grpc_channel_element* elem;
178
- grpc_channel* channel =
179
- grpc_channel_create(target, nullptr, GRPC_CLIENT_LAME_CHANNEL, nullptr);
180
- elem = grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
181
168
  GRPC_API_TRACE(
182
169
  "grpc_lame_client_channel_create(target=%s, error_code=%d, "
183
170
  "error_message=%s)",
184
171
  3, (target, (int)error_code, error_message));
185
- GPR_ASSERT(elem->filter == &grpc_lame_filter);
186
- auto chand = static_cast<grpc_core::ChannelData*>(elem->channel_data);
187
- chand->error_code = error_code;
188
- chand->error_message = error_message;
189
-
172
+ grpc_error* error = grpc_error_set_str(
173
+ grpc_error_set_int(
174
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("lame client channel"),
175
+ GRPC_ERROR_INT_GRPC_STATUS, error_code),
176
+ GRPC_ERROR_STR_GRPC_MESSAGE,
177
+ grpc_slice_from_static_string(error_message));
178
+ grpc_arg error_arg = grpc_core::MakeLameClientErrorArg(error);
179
+ grpc_channel_args args = {1, &error_arg};
180
+ grpc_channel* channel =
181
+ grpc_channel_create(target, &args, GRPC_CLIENT_LAME_CHANNEL, nullptr);
182
+ GRPC_ERROR_UNREF(error);
190
183
  return channel;
191
184
  }
@@ -23,6 +23,11 @@
23
23
 
24
24
  #include "src/core/lib/channel/channel_stack.h"
25
25
 
26
+ namespace grpc_core {
27
+ // Does NOT take ownership of error.
28
+ grpc_arg MakeLameClientErrorArg(grpc_error* error);
29
+ } // namespace grpc_core
30
+
26
31
  extern const grpc_channel_filter grpc_lame_filter;
27
32
 
28
33
  #endif /* GRPC_CORE_LIB_SURFACE_LAME_CLIENT_H */
@@ -1,20 +1,18 @@
1
- /*
2
- *
3
- * Copyright 2015-2016 gRPC authors.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
17
- */
1
+ //
2
+ // Copyright 2015-2016 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
18
16
 
19
17
  #include <grpc/support/port_platform.h>
20
18
 
@@ -24,12 +22,21 @@
24
22
  #include <stdlib.h>
25
23
  #include <string.h>
26
24
 
25
+ #include <algorithm>
26
+ #include <atomic>
27
+ #include <iterator>
28
+ #include <list>
29
+ #include <queue>
30
+ #include <utility>
31
+ #include <vector>
32
+
33
+ #include "absl/memory/memory.h"
34
+ #include "absl/types/optional.h"
35
+
27
36
  #include <grpc/support/alloc.h>
28
37
  #include <grpc/support/log.h>
29
38
  #include <grpc/support/string_util.h>
30
39
 
31
- #include <utility>
32
-
33
40
  #include "src/core/lib/channel/channel_args.h"
34
41
  #include "src/core/lib/channel/channelz.h"
35
42
  #include "src/core/lib/channel/connected_channel.h"
@@ -48,821 +55,1076 @@
48
55
  #include "src/core/lib/transport/metadata.h"
49
56
  #include "src/core/lib/transport/static_metadata.h"
50
57
 
51
- grpc_core::TraceFlag grpc_server_channel_trace(false, "server_channel");
52
-
53
- using grpc_core::LockedMultiProducerSingleConsumerQueue;
54
-
55
- static void server_on_recv_initial_metadata(void* ptr, grpc_error* error);
56
- static void server_recv_trailing_metadata_ready(void* user_data,
57
- grpc_error* error);
58
-
59
- namespace {
60
- struct listener {
61
- void* arg;
62
- void (*start)(grpc_server* server, void* arg, grpc_pollset** pollsets,
63
- size_t pollset_count);
64
- void (*destroy)(grpc_server* server, void* arg, grpc_closure* closure);
65
- struct listener* next;
66
- intptr_t socket_uuid;
67
- grpc_closure destroy_done;
68
- };
69
-
70
- enum requested_call_type { BATCH_CALL, REGISTERED_CALL };
71
-
72
- struct registered_method;
73
-
74
- struct requested_call {
75
- grpc_core::ManualConstructor<
76
- grpc_core::MultiProducerSingleConsumerQueue::Node>
77
- mpscq_node;
78
- requested_call_type type;
79
- size_t cq_idx;
80
- void* tag;
81
- grpc_server* server;
82
- grpc_completion_queue* cq_bound_to_call;
83
- grpc_call** call;
58
+ namespace grpc_core {
59
+
60
+ TraceFlag grpc_server_channel_trace(false, "server_channel");
61
+
62
+ //
63
+ // Server::RequestedCall
64
+ //
65
+
66
+ struct Server::RequestedCall {
67
+ enum class Type { BATCH_CALL, REGISTERED_CALL };
68
+
69
+ RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
70
+ grpc_call** call_arg, grpc_metadata_array* initial_md,
71
+ grpc_call_details* details)
72
+ : type(Type::BATCH_CALL),
73
+ tag(tag_arg),
74
+ cq_bound_to_call(call_cq),
75
+ call(call_arg),
76
+ initial_metadata(initial_md) {
77
+ details->reserved = nullptr;
78
+ data.batch.details = details;
79
+ }
80
+
81
+ RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
82
+ grpc_call** call_arg, grpc_metadata_array* initial_md,
83
+ RegisteredMethod* rm, gpr_timespec* deadline,
84
+ grpc_byte_buffer** optional_payload)
85
+ : type(Type::REGISTERED_CALL),
86
+ tag(tag_arg),
87
+ cq_bound_to_call(call_cq),
88
+ call(call_arg),
89
+ initial_metadata(initial_md) {
90
+ data.registered.method = rm;
91
+ data.registered.deadline = deadline;
92
+ data.registered.optional_payload = optional_payload;
93
+ }
94
+
95
+ MultiProducerSingleConsumerQueue::Node mpscq_node;
96
+ const Type type;
97
+ void* const tag;
98
+ grpc_completion_queue* const cq_bound_to_call;
99
+ grpc_call** const call;
84
100
  grpc_cq_completion completion;
85
- grpc_metadata_array* initial_metadata;
101
+ grpc_metadata_array* const initial_metadata;
86
102
  union {
87
103
  struct {
88
104
  grpc_call_details* details;
89
105
  } batch;
90
106
  struct {
91
- registered_method* method;
107
+ RegisteredMethod* method;
92
108
  gpr_timespec* deadline;
93
109
  grpc_byte_buffer** optional_payload;
94
110
  } registered;
95
111
  } data;
96
112
  };
97
113
 
98
- struct channel_registered_method {
99
- registered_method* server_registered_method;
100
- uint32_t flags;
101
- bool has_host;
102
- grpc_core::ExternallyManagedSlice method;
103
- grpc_core::ExternallyManagedSlice host;
114
+ //
115
+ // Server::RegisteredMethod
116
+ //
117
+
118
+ struct Server::RegisteredMethod {
119
+ RegisteredMethod(
120
+ const char* method_arg, const char* host_arg,
121
+ grpc_server_register_method_payload_handling payload_handling_arg,
122
+ uint32_t flags_arg)
123
+ : method(method_arg == nullptr ? "" : method_arg),
124
+ host(host_arg == nullptr ? "" : host_arg),
125
+ payload_handling(payload_handling_arg),
126
+ flags(flags_arg) {}
127
+
128
+ ~RegisteredMethod() = default;
129
+
130
+ const std::string method;
131
+ const std::string host;
132
+ const grpc_server_register_method_payload_handling payload_handling;
133
+ const uint32_t flags;
134
+ // One request matcher per method.
135
+ std::unique_ptr<RequestMatcherInterface> matcher;
104
136
  };
105
137
 
106
- struct channel_data {
107
- grpc_server* server;
108
- grpc_channel* channel;
109
- size_t cq_idx;
110
- /* linked list of all channels on a server */
111
- channel_data* next;
112
- channel_data* prev;
113
- channel_registered_method* registered_methods;
114
- uint32_t registered_method_slots;
115
- uint32_t registered_method_max_probes;
116
- grpc_closure finish_destroy_channel_closure;
117
- intptr_t channelz_socket_uuid;
138
+ //
139
+ // Server::RequestMatcherInterface
140
+ //
141
+
142
+ // RPCs that come in from the transport must be matched against RPC requests
143
+ // from the application. An incoming request from the application can be matched
144
+ // to an RPC that has already arrived or can be queued up for later use.
145
+ // Likewise, an RPC coming in from the transport can either be matched to a
146
+ // request that already arrived from the application or can be queued up for
147
+ // later use (marked pending). If there is a match, the request's tag is posted
148
+ // on the request's notification CQ.
149
+ //
150
+ // RequestMatcherInterface is the base class to provide this functionality.
151
+ class Server::RequestMatcherInterface {
152
+ public:
153
+ virtual ~RequestMatcherInterface() {}
154
+
155
+ // Unref the calls associated with any incoming RPCs in the pending queue (not
156
+ // yet matched to an application-requested RPC).
157
+ virtual void ZombifyPending() = 0;
158
+
159
+ // Mark all application-requested RPCs failed if they have not been matched to
160
+ // an incoming RPC. The error parameter indicates why the RPCs are being
161
+ // failed (always server shutdown in all current implementations).
162
+ virtual void KillRequests(grpc_error* error) = 0;
163
+
164
+ // How many request queues are supported by this matcher. This is an abstract
165
+ // concept that essentially maps to gRPC completion queues.
166
+ virtual size_t request_queue_count() const = 0;
167
+
168
+ // This function is invoked when the application requests a new RPC whose
169
+ // information is in the call parameter. The request_queue_index marks the
170
+ // queue onto which to place this RPC, and is typically associated with a gRPC
171
+ // CQ. If there are pending RPCs waiting to be matched, publish one (match it
172
+ // and notify the CQ).
173
+ virtual void RequestCallWithPossiblePublish(size_t request_queue_index,
174
+ RequestedCall* call) = 0;
175
+
176
+ // This function is invoked on an incoming RPC, represented by the calld
177
+ // object. The RequestMatcher will try to match it against an
178
+ // application-requested RPC if possible or will place it in the pending queue
179
+ // otherwise. To enable some measure of fairness between server CQs, the match
180
+ // is done starting at the start_request_queue_index parameter in a cyclic
181
+ // order rather than always starting at 0.
182
+ virtual void MatchOrQueue(size_t start_request_queue_index,
183
+ CallData* calld) = 0;
184
+
185
+ // Returns the server associated with this request matcher
186
+ virtual Server* server() const = 0;
118
187
  };
119
188
 
120
- typedef struct shutdown_tag {
121
- void* tag;
122
- grpc_completion_queue* cq;
123
- grpc_cq_completion completion;
124
- } shutdown_tag;
125
-
126
- typedef enum {
127
- /* waiting for metadata */
128
- NOT_STARTED,
129
- /* initial metadata read, not flow controlled in yet */
130
- PENDING,
131
- /* flow controlled in, on completion queue */
132
- ACTIVATED,
133
- /* cancelled before being queued */
134
- ZOMBIED
135
- } call_state;
136
-
137
- typedef struct request_matcher request_matcher;
138
-
139
- struct call_data {
140
- call_data(grpc_call_element* elem, const grpc_call_element_args& args)
141
- : call(grpc_call_from_top_element(elem)),
142
- call_combiner(args.call_combiner) {
143
- GRPC_CLOSURE_INIT(&server_on_recv_initial_metadata,
144
- ::server_on_recv_initial_metadata, elem,
145
- grpc_schedule_on_exec_ctx);
146
- GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready,
147
- server_recv_trailing_metadata_ready, elem,
148
- grpc_schedule_on_exec_ctx);
149
- }
150
- ~call_data() {
151
- GPR_ASSERT(state != PENDING);
152
- GRPC_ERROR_UNREF(recv_initial_metadata_error);
153
- if (host_set) {
154
- grpc_slice_unref_internal(host);
155
- }
156
- if (path_set) {
157
- grpc_slice_unref_internal(path);
189
+ // The RealRequestMatcher is an implementation of RequestMatcherInterface that
190
+ // actually uses all the features of RequestMatcherInterface: expecting the
191
+ // application to explicitly request RPCs and then matching those to incoming
192
+ // RPCs, along with a slow path by which incoming RPCs are put on a locked
193
+ // pending list if they aren't able to be matched to an application request.
194
+ class Server::RealRequestMatcher : public RequestMatcherInterface {
195
+ public:
196
+ explicit RealRequestMatcher(Server* server)
197
+ : server_(server), requests_per_cq_(server->cqs_.size()) {}
198
+
199
+ ~RealRequestMatcher() override {
200
+ for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) {
201
+ GPR_ASSERT(queue.Pop() == nullptr);
158
202
  }
159
- grpc_metadata_array_destroy(&initial_metadata);
160
- grpc_byte_buffer_destroy(payload);
161
203
  }
162
204
 
163
- grpc_call* call;
164
-
165
- gpr_atm state = NOT_STARTED;
166
-
167
- bool path_set = false;
168
- bool host_set = false;
169
- grpc_slice path;
170
- grpc_slice host;
171
- grpc_millis deadline = GRPC_MILLIS_INF_FUTURE;
172
-
173
- grpc_completion_queue* cq_new = nullptr;
174
-
175
- grpc_metadata_batch* recv_initial_metadata = nullptr;
176
- uint32_t recv_initial_metadata_flags = 0;
177
- grpc_metadata_array initial_metadata =
178
- grpc_metadata_array(); // Zero-initialize the C struct.
179
-
180
- request_matcher* matcher = nullptr;
181
- grpc_byte_buffer* payload = nullptr;
205
+ void ZombifyPending() override {
206
+ while (!pending_.empty()) {
207
+ CallData* calld = pending_.front();
208
+ calld->SetState(CallData::CallState::ZOMBIED);
209
+ calld->KillZombie();
210
+ pending_.pop();
211
+ }
212
+ }
182
213
 
183
- grpc_closure got_initial_metadata;
184
- grpc_closure server_on_recv_initial_metadata;
185
- grpc_closure kill_zombie_closure;
186
- grpc_closure* on_done_recv_initial_metadata;
187
- grpc_closure recv_trailing_metadata_ready;
188
- grpc_error* recv_initial_metadata_error = GRPC_ERROR_NONE;
189
- grpc_closure* original_recv_trailing_metadata_ready;
190
- grpc_error* recv_trailing_metadata_error = GRPC_ERROR_NONE;
191
- bool seen_recv_trailing_metadata_ready = false;
214
+ void KillRequests(grpc_error* error) override {
215
+ for (size_t i = 0; i < requests_per_cq_.size(); i++) {
216
+ RequestedCall* rc;
217
+ while ((rc = reinterpret_cast<RequestedCall*>(
218
+ requests_per_cq_[i].Pop())) != nullptr) {
219
+ server_->FailCall(i, rc, GRPC_ERROR_REF(error));
220
+ }
221
+ }
222
+ GRPC_ERROR_UNREF(error);
223
+ }
192
224
 
193
- grpc_closure publish;
225
+ size_t request_queue_count() const override {
226
+ return requests_per_cq_.size();
227
+ }
228
+
229
+ void RequestCallWithPossiblePublish(size_t request_queue_index,
230
+ RequestedCall* call) override {
231
+ if (requests_per_cq_[request_queue_index].Push(&call->mpscq_node)) {
232
+ /* this was the first queued request: we need to lock and start
233
+ matching calls */
234
+ struct PendingCall {
235
+ RequestedCall* rc = nullptr;
236
+ CallData* calld;
237
+ };
238
+ auto pop_next_pending = [this, request_queue_index] {
239
+ PendingCall pending_call;
240
+ {
241
+ MutexLock lock(&server_->mu_call_);
242
+ if (!pending_.empty()) {
243
+ pending_call.rc = reinterpret_cast<RequestedCall*>(
244
+ requests_per_cq_[request_queue_index].Pop());
245
+ if (pending_call.rc != nullptr) {
246
+ pending_call.calld = pending_.front();
247
+ pending_.pop();
248
+ }
249
+ }
250
+ }
251
+ return pending_call;
252
+ };
253
+ while (true) {
254
+ PendingCall next_pending = pop_next_pending();
255
+ if (next_pending.rc == nullptr) break;
256
+ if (!next_pending.calld->MaybeActivate()) {
257
+ // Zombied Call
258
+ next_pending.calld->KillZombie();
259
+ } else {
260
+ next_pending.calld->Publish(request_queue_index, next_pending.rc);
261
+ }
262
+ }
263
+ }
264
+ }
194
265
 
195
- call_data* pending_next = nullptr;
196
- grpc_core::CallCombiner* call_combiner;
197
- };
266
+ void MatchOrQueue(size_t start_request_queue_index,
267
+ CallData* calld) override {
268
+ for (size_t i = 0; i < requests_per_cq_.size(); i++) {
269
+ size_t cq_idx = (start_request_queue_index + i) % requests_per_cq_.size();
270
+ RequestedCall* rc =
271
+ reinterpret_cast<RequestedCall*>(requests_per_cq_[cq_idx].TryPop());
272
+ if (rc != nullptr) {
273
+ GRPC_STATS_INC_SERVER_CQS_CHECKED(i);
274
+ calld->SetState(CallData::CallState::ACTIVATED);
275
+ calld->Publish(cq_idx, rc);
276
+ return;
277
+ }
278
+ }
279
+ // No cq to take the request found; queue it on the slow list.
280
+ GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED();
281
+ // We need to ensure that all the queues are empty. We do this under
282
+ // the server mu_call_ lock to ensure that if something is added to
283
+ // an empty request queue, it will block until the call is actually
284
+ // added to the pending list.
285
+ RequestedCall* rc = nullptr;
286
+ size_t cq_idx = 0;
287
+ size_t loop_count;
288
+ {
289
+ MutexLock lock(&server_->mu_call_);
290
+ for (loop_count = 0; loop_count < requests_per_cq_.size(); loop_count++) {
291
+ cq_idx =
292
+ (start_request_queue_index + loop_count) % requests_per_cq_.size();
293
+ rc = reinterpret_cast<RequestedCall*>(requests_per_cq_[cq_idx].Pop());
294
+ if (rc != nullptr) {
295
+ break;
296
+ }
297
+ }
298
+ if (rc == nullptr) {
299
+ calld->SetState(CallData::CallState::PENDING);
300
+ pending_.push(calld);
301
+ return;
302
+ }
303
+ }
304
+ GRPC_STATS_INC_SERVER_CQS_CHECKED(loop_count + requests_per_cq_.size());
305
+ calld->SetState(CallData::CallState::ACTIVATED);
306
+ calld->Publish(cq_idx, rc);
307
+ }
198
308
 
199
- struct request_matcher {
200
- grpc_server* server;
201
- call_data* pending_head;
202
- call_data* pending_tail;
203
- LockedMultiProducerSingleConsumerQueue* requests_per_cq;
204
- };
309
+ Server* server() const override { return server_; }
205
310
 
206
- struct registered_method {
207
- char* method;
208
- char* host;
209
- grpc_server_register_method_payload_handling payload_handling;
210
- uint32_t flags;
211
- /* one request matcher per method */
212
- request_matcher matcher;
213
- registered_method* next;
311
+ private:
312
+ Server* const server_;
313
+ std::queue<CallData*> pending_;
314
+ std::vector<LockedMultiProducerSingleConsumerQueue> requests_per_cq_;
214
315
  };
215
316
 
216
- typedef struct {
217
- grpc_channel** channels;
218
- size_t num_channels;
219
- } channel_broadcaster;
220
- } // namespace
317
+ // AllocatingRequestMatchers don't allow the application to request an RPC in
318
+ // advance or queue up any incoming RPC for later match. Instead, MatchOrQueue
319
+ // will call out to an allocation function passed in at the construction of the
320
+ // object. These request matchers are designed for the C++ callback API, so they
321
+ // only support 1 completion queue (passed in at the constructor). They are also
322
+ // used for the sync API.
323
+ class Server::AllocatingRequestMatcherBase : public RequestMatcherInterface {
324
+ public:
325
+ AllocatingRequestMatcherBase(Server* server, grpc_completion_queue* cq)
326
+ : server_(server), cq_(cq) {
327
+ size_t idx;
328
+ for (idx = 0; idx < server->cqs_.size(); idx++) {
329
+ if (server->cqs_[idx] == cq) {
330
+ break;
331
+ }
332
+ }
333
+ GPR_ASSERT(idx < server->cqs_.size());
334
+ cq_idx_ = idx;
335
+ }
221
336
 
222
- struct grpc_server {
223
- grpc_channel_args* channel_args;
337
+ void ZombifyPending() override {}
224
338
 
225
- grpc_resource_user* default_resource_user;
339
+ void KillRequests(grpc_error* error) override { GRPC_ERROR_UNREF(error); }
226
340
 
227
- grpc_completion_queue** cqs;
228
- grpc_pollset** pollsets;
229
- size_t cq_count;
230
- size_t pollset_count;
231
- bool started;
341
+ size_t request_queue_count() const override { return 0; }
232
342
 
233
- /* The two following mutexes control access to server-state
234
- mu_global controls access to non-call-related state (e.g., channel state)
235
- mu_call controls access to call-related state (e.g., the call lists)
343
+ void RequestCallWithPossiblePublish(size_t /*request_queue_index*/,
344
+ RequestedCall* /*call*/) final {
345
+ GPR_ASSERT(false);
346
+ }
236
347
 
237
- If they are ever required to be nested, you must lock mu_global
238
- before mu_call. This is currently used in shutdown processing
239
- (grpc_server_shutdown_and_notify and maybe_finish_shutdown) */
240
- gpr_mu mu_global; /* mutex for server and channel state */
241
- gpr_mu mu_call; /* mutex for call-specific state */
348
+ Server* server() const override { return server_; }
242
349
 
243
- /* startup synchronization: flag is protected by mu_global, signals whether
244
- we are doing the listener start routine or not */
245
- bool starting;
246
- gpr_cv starting_cv;
350
+ // Supply the completion queue related to this request matcher
351
+ grpc_completion_queue* cq() const { return cq_; }
247
352
 
248
- registered_method* registered_methods;
249
- /** one request matcher for unregistered methods */
250
- request_matcher unregistered_request_matcher;
353
+ // Supply the completion queue's index relative to the server.
354
+ size_t cq_idx() const { return cq_idx_; }
251
355
 
252
- gpr_atm shutdown_flag;
253
- uint8_t shutdown_published;
254
- size_t num_shutdown_tags;
255
- shutdown_tag* shutdown_tags;
356
+ private:
357
+ Server* const server_;
358
+ grpc_completion_queue* const cq_;
359
+ size_t cq_idx_;
360
+ };
256
361
 
257
- channel_data root_channel_data;
362
+ // An allocating request matcher for non-registered methods (used for generic
363
+ // API and unimplemented RPCs).
364
+ class Server::AllocatingRequestMatcherBatch
365
+ : public AllocatingRequestMatcherBase {
366
+ public:
367
+ AllocatingRequestMatcherBatch(Server* server, grpc_completion_queue* cq,
368
+ std::function<BatchCallAllocation()> allocator)
369
+ : AllocatingRequestMatcherBase(server, cq),
370
+ allocator_(std::move(allocator)) {}
371
+
372
+ void MatchOrQueue(size_t /*start_request_queue_index*/,
373
+ CallData* calld) override {
374
+ if (server()->ShutdownRefOnRequest()) {
375
+ BatchCallAllocation call_info = allocator_();
376
+ GPR_ASSERT(server()->ValidateServerRequest(
377
+ cq(), static_cast<void*>(call_info.tag), nullptr,
378
+ nullptr) == GRPC_CALL_OK);
379
+ RequestedCall* rc = new RequestedCall(
380
+ static_cast<void*>(call_info.tag), call_info.cq, call_info.call,
381
+ call_info.initial_metadata, call_info.details);
382
+ calld->SetState(CallData::CallState::ACTIVATED);
383
+ calld->Publish(cq_idx(), rc);
384
+ } else {
385
+ calld->FailCallCreation();
386
+ }
387
+ server()->ShutdownUnrefOnRequest();
388
+ }
258
389
 
259
- listener* listeners;
260
- int listeners_destroyed;
261
- grpc_core::RefCount internal_refcount;
390
+ private:
391
+ std::function<BatchCallAllocation()> allocator_;
392
+ };
262
393
 
263
- /** when did we print the last shutdown progress message */
264
- gpr_timespec last_shutdown_message_time;
394
+ // An allocating request matcher for registered methods.
395
+ class Server::AllocatingRequestMatcherRegistered
396
+ : public AllocatingRequestMatcherBase {
397
+ public:
398
+ AllocatingRequestMatcherRegistered(
399
+ Server* server, grpc_completion_queue* cq, RegisteredMethod* rm,
400
+ std::function<RegisteredCallAllocation()> allocator)
401
+ : AllocatingRequestMatcherBase(server, cq),
402
+ registered_method_(rm),
403
+ allocator_(std::move(allocator)) {}
404
+
405
+ void MatchOrQueue(size_t /*start_request_queue_index*/,
406
+ CallData* calld) override {
407
+ if (server()->ShutdownRefOnRequest()) {
408
+ RegisteredCallAllocation call_info = allocator_();
409
+ GPR_ASSERT(server()->ValidateServerRequest(
410
+ cq(), call_info.tag, call_info.optional_payload,
411
+ registered_method_) == GRPC_CALL_OK);
412
+ RequestedCall* rc =
413
+ new RequestedCall(call_info.tag, call_info.cq, call_info.call,
414
+ call_info.initial_metadata, registered_method_,
415
+ call_info.deadline, call_info.optional_payload);
416
+ calld->SetState(CallData::CallState::ACTIVATED);
417
+ calld->Publish(cq_idx(), rc);
418
+ } else {
419
+ calld->FailCallCreation();
420
+ }
421
+ server()->ShutdownUnrefOnRequest();
422
+ }
265
423
 
266
- grpc_core::RefCountedPtr<grpc_core::channelz::ServerNode> channelz_server;
424
+ private:
425
+ RegisteredMethod* const registered_method_;
426
+ std::function<RegisteredCallAllocation()> allocator_;
267
427
  };
268
428
 
269
- #define SERVER_FROM_CALL_ELEM(elem) \
270
- (((channel_data*)(elem)->channel_data)->server)
429
+ //
430
+ // ChannelBroadcaster
431
+ //
271
432
 
272
- static void publish_new_rpc(void* calld, grpc_error* error);
273
- static void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
274
- grpc_error* error);
275
- /* Before calling maybe_finish_shutdown, we must hold mu_global and not
276
- hold mu_call */
277
- static void maybe_finish_shutdown(grpc_server* server);
433
+ namespace {
278
434
 
279
- /*
280
- * channel broadcaster
281
- */
435
+ class ChannelBroadcaster {
436
+ public:
437
+ // This can have an empty constructor and destructor since we want to control
438
+ // when the actual setup and shutdown broadcast take place.
282
439
 
283
- /* assumes server locked */
284
- static void channel_broadcaster_init(grpc_server* s, channel_broadcaster* cb) {
285
- channel_data* c;
286
- size_t count = 0;
287
- for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
288
- count++;
440
+ // Copies over the channels from the locked server.
441
+ void FillChannelsLocked(std::vector<grpc_channel*> channels) {
442
+ GPR_DEBUG_ASSERT(channels_.empty());
443
+ channels_ = std::move(channels);
289
444
  }
290
- cb->num_channels = count;
291
- cb->channels = static_cast<grpc_channel**>(
292
- gpr_malloc(sizeof(*cb->channels) * cb->num_channels));
293
- count = 0;
294
- for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
295
- cb->channels[count++] = c->channel;
296
- GRPC_CHANNEL_INTERNAL_REF(c->channel, "broadcast");
445
+
446
+ // Broadcasts a shutdown on each channel.
447
+ void BroadcastShutdown(bool send_goaway, grpc_error* force_disconnect) {
448
+ for (grpc_channel* channel : channels_) {
449
+ SendShutdown(channel, send_goaway, GRPC_ERROR_REF(force_disconnect));
450
+ GRPC_CHANNEL_INTERNAL_UNREF(channel, "broadcast");
451
+ }
452
+ channels_.clear(); // just for safety against double broadcast
453
+ GRPC_ERROR_UNREF(force_disconnect);
297
454
  }
298
- }
299
455
 
300
- struct shutdown_cleanup_args {
301
- grpc_closure closure;
302
- grpc_slice slice;
303
- };
456
+ private:
457
+ struct ShutdownCleanupArgs {
458
+ grpc_closure closure;
459
+ grpc_slice slice;
460
+ };
304
461
 
305
- static void shutdown_cleanup(void* arg, grpc_error* /*error*/) {
306
- struct shutdown_cleanup_args* a =
307
- static_cast<struct shutdown_cleanup_args*>(arg);
308
- grpc_slice_unref_internal(a->slice);
309
- gpr_free(a);
310
- }
462
+ static void ShutdownCleanup(void* arg, grpc_error* /*error*/) {
463
+ ShutdownCleanupArgs* a = static_cast<ShutdownCleanupArgs*>(arg);
464
+ grpc_slice_unref_internal(a->slice);
465
+ delete a;
466
+ }
311
467
 
312
- static void send_shutdown(grpc_channel* channel, bool send_goaway,
313
- grpc_error* send_disconnect) {
314
- struct shutdown_cleanup_args* sc =
315
- static_cast<struct shutdown_cleanup_args*>(gpr_malloc(sizeof(*sc)));
316
- GRPC_CLOSURE_INIT(&sc->closure, shutdown_cleanup, sc,
317
- grpc_schedule_on_exec_ctx);
318
- grpc_transport_op* op = grpc_make_transport_op(&sc->closure);
319
- grpc_channel_element* elem;
320
-
321
- op->goaway_error =
322
- send_goaway ? grpc_error_set_int(
323
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"),
324
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK)
325
- : GRPC_ERROR_NONE;
326
- op->set_accept_stream = true;
327
- sc->slice = grpc_slice_from_copied_string("Server shutdown");
328
- op->disconnect_with_error = send_disconnect;
468
+ static void SendShutdown(grpc_channel* channel, bool send_goaway,
469
+ grpc_error* send_disconnect) {
470
+ ShutdownCleanupArgs* sc = new ShutdownCleanupArgs;
471
+ GRPC_CLOSURE_INIT(&sc->closure, ShutdownCleanup, sc,
472
+ grpc_schedule_on_exec_ctx);
473
+ grpc_transport_op* op = grpc_make_transport_op(&sc->closure);
474
+ grpc_channel_element* elem;
475
+ op->goaway_error =
476
+ send_goaway
477
+ ? grpc_error_set_int(
478
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"),
479
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK)
480
+ : GRPC_ERROR_NONE;
481
+ op->set_accept_stream = true;
482
+ sc->slice = grpc_slice_from_copied_string("Server shutdown");
483
+ op->disconnect_with_error = send_disconnect;
484
+ elem =
485
+ grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
486
+ elem->filter->start_transport_op(elem, op);
487
+ }
488
+
489
+ std::vector<grpc_channel*> channels_;
490
+ };
329
491
 
330
- elem = grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
331
- elem->filter->start_transport_op(elem, op);
332
- }
492
+ } // namespace
333
493
 
334
- static void channel_broadcaster_shutdown(channel_broadcaster* cb,
335
- bool send_goaway,
336
- grpc_error* force_disconnect) {
337
- size_t i;
494
+ //
495
+ // Server
496
+ //
338
497
 
339
- for (i = 0; i < cb->num_channels; i++) {
340
- send_shutdown(cb->channels[i], send_goaway,
341
- GRPC_ERROR_REF(force_disconnect));
342
- GRPC_CHANNEL_INTERNAL_UNREF(cb->channels[i], "broadcast");
343
- }
344
- gpr_free(cb->channels);
345
- GRPC_ERROR_UNREF(force_disconnect);
346
- }
498
+ const grpc_channel_filter Server::kServerTopFilter = {
499
+ Server::CallData::StartTransportStreamOpBatch,
500
+ grpc_channel_next_op,
501
+ sizeof(Server::CallData),
502
+ Server::CallData::InitCallElement,
503
+ grpc_call_stack_ignore_set_pollset_or_pollset_set,
504
+ Server::CallData::DestroyCallElement,
505
+ sizeof(Server::ChannelData),
506
+ Server::ChannelData::InitChannelElement,
507
+ Server::ChannelData::DestroyChannelElement,
508
+ grpc_channel_next_get_info,
509
+ "server",
510
+ };
347
511
 
348
- /*
349
- * request_matcher
350
- */
512
+ namespace {
351
513
 
352
- static void request_matcher_init(request_matcher* rm, grpc_server* server) {
353
- rm->server = server;
354
- rm->pending_head = rm->pending_tail = nullptr;
355
- rm->requests_per_cq = static_cast<LockedMultiProducerSingleConsumerQueue*>(
356
- gpr_malloc(sizeof(*rm->requests_per_cq) * server->cq_count));
357
- for (size_t i = 0; i < server->cq_count; i++) {
358
- new (&rm->requests_per_cq[i]) LockedMultiProducerSingleConsumerQueue();
514
+ grpc_resource_user* CreateDefaultResourceUser(const grpc_channel_args* args) {
515
+ if (args != nullptr) {
516
+ grpc_resource_quota* resource_quota =
517
+ grpc_resource_quota_from_channel_args(args, false /* create */);
518
+ if (resource_quota != nullptr) {
519
+ return grpc_resource_user_create(resource_quota, "default");
520
+ }
359
521
  }
522
+ return nullptr;
360
523
  }
361
524
 
362
- static void request_matcher_destroy(request_matcher* rm) {
363
- for (size_t i = 0; i < rm->server->cq_count; i++) {
364
- GPR_ASSERT(rm->requests_per_cq[i].Pop() == nullptr);
365
- rm->requests_per_cq[i].~LockedMultiProducerSingleConsumerQueue();
525
+ RefCountedPtr<channelz::ServerNode> CreateChannelzNode(
526
+ const grpc_channel_args* args) {
527
+ RefCountedPtr<channelz::ServerNode> channelz_node;
528
+ if (grpc_channel_args_find_bool(args, GRPC_ARG_ENABLE_CHANNELZ,
529
+ GRPC_ENABLE_CHANNELZ_DEFAULT)) {
530
+ size_t channel_tracer_max_memory = grpc_channel_args_find_integer(
531
+ args, GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE,
532
+ {GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX});
533
+ channelz_node =
534
+ MakeRefCounted<channelz::ServerNode>(channel_tracer_max_memory);
535
+ channelz_node->AddTraceEvent(
536
+ channelz::ChannelTrace::Severity::Info,
537
+ grpc_slice_from_static_string("Server created"));
366
538
  }
367
- gpr_free(rm->requests_per_cq);
539
+ return channelz_node;
368
540
  }
369
541
 
370
- static void kill_zombie(void* elem, grpc_error* /*error*/) {
371
- grpc_call_unref(
372
- grpc_call_from_top_element(static_cast<grpc_call_element*>(elem)));
373
- }
542
+ } // namespace
374
543
 
375
- static void request_matcher_zombify_all_pending_calls(request_matcher* rm) {
376
- while (rm->pending_head) {
377
- call_data* calld = rm->pending_head;
378
- rm->pending_head = calld->pending_next;
379
- gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
380
- GRPC_CLOSURE_INIT(
381
- &calld->kill_zombie_closure, kill_zombie,
382
- grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
383
- grpc_schedule_on_exec_ctx);
384
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
385
- GRPC_ERROR_NONE);
544
+ Server::Server(const grpc_channel_args* args)
545
+ : channel_args_(grpc_channel_args_copy(args)),
546
+ default_resource_user_(CreateDefaultResourceUser(args)),
547
+ channelz_node_(CreateChannelzNode(args)) {}
548
+
549
+ Server::~Server() {
550
+ grpc_channel_args_destroy(channel_args_);
551
+ // Remove the cq pollsets from the config_fetcher.
552
+ if (started_ && config_fetcher_ != nullptr &&
553
+ config_fetcher_->interested_parties() != nullptr) {
554
+ for (grpc_pollset* pollset : pollsets_) {
555
+ grpc_pollset_set_del_pollset(config_fetcher_->interested_parties(),
556
+ pollset);
557
+ }
558
+ }
559
+ for (size_t i = 0; i < cqs_.size(); i++) {
560
+ GRPC_CQ_INTERNAL_UNREF(cqs_[i], "server");
386
561
  }
387
562
  }
388
563
 
389
- static void request_matcher_kill_requests(grpc_server* server,
390
- request_matcher* rm,
391
- grpc_error* error) {
392
- requested_call* rc;
393
- for (size_t i = 0; i < server->cq_count; i++) {
394
- while ((rc = reinterpret_cast<requested_call*>(
395
- rm->requests_per_cq[i].Pop())) != nullptr) {
396
- fail_call(server, i, rc, GRPC_ERROR_REF(error));
397
- }
564
+ void Server::AddListener(OrphanablePtr<ListenerInterface> listener) {
565
+ channelz::ListenSocketNode* listen_socket_node =
566
+ listener->channelz_listen_socket_node();
567
+ if (listen_socket_node != nullptr && channelz_node_ != nullptr) {
568
+ channelz_node_->AddChildListenSocket(listen_socket_node->Ref());
398
569
  }
399
- GRPC_ERROR_UNREF(error);
570
+ listeners_.emplace_back(std::move(listener));
400
571
  }
401
572
 
402
- /*
403
- * server proper
404
- */
405
-
406
- static void server_ref(grpc_server* server) { server->internal_refcount.Ref(); }
407
-
408
- static void server_delete(grpc_server* server) {
409
- registered_method* rm;
410
- size_t i;
411
- server->channelz_server.reset();
412
- grpc_channel_args_destroy(server->channel_args);
413
- gpr_mu_destroy(&server->mu_global);
414
- gpr_mu_destroy(&server->mu_call);
415
- gpr_cv_destroy(&server->starting_cv);
416
- while ((rm = server->registered_methods) != nullptr) {
417
- server->registered_methods = rm->next;
418
- if (server->started) {
419
- request_matcher_destroy(&rm->matcher);
573
+ void Server::Start() {
574
+ started_ = true;
575
+ for (grpc_completion_queue* cq : cqs_) {
576
+ if (grpc_cq_can_listen(cq)) {
577
+ pollsets_.push_back(grpc_cq_pollset(cq));
578
+ }
579
+ }
580
+ if (unregistered_request_matcher_ == nullptr) {
581
+ unregistered_request_matcher_ = absl::make_unique<RealRequestMatcher>(this);
582
+ }
583
+ for (std::unique_ptr<RegisteredMethod>& rm : registered_methods_) {
584
+ if (rm->matcher == nullptr) {
585
+ rm->matcher = absl::make_unique<RealRequestMatcher>(this);
420
586
  }
421
- gpr_free(rm->method);
422
- gpr_free(rm->host);
423
- gpr_free(rm);
424
587
  }
425
- if (server->started) {
426
- request_matcher_destroy(&server->unregistered_request_matcher);
588
+ {
589
+ MutexLock lock(&mu_global_);
590
+ starting_ = true;
591
+ }
592
+ // Register the interested parties from the config fetcher to the cq pollsets
593
+ // before starting listeners so that config fetcher is being polled when the
594
+ // listeners start watch the fetcher.
595
+ if (config_fetcher_ != nullptr &&
596
+ config_fetcher_->interested_parties() != nullptr) {
597
+ for (grpc_pollset* pollset : pollsets_) {
598
+ grpc_pollset_set_add_pollset(config_fetcher_->interested_parties(),
599
+ pollset);
600
+ }
427
601
  }
428
- for (i = 0; i < server->cq_count; i++) {
429
- GRPC_CQ_INTERNAL_UNREF(server->cqs[i], "server");
602
+ for (auto& listener : listeners_) {
603
+ listener.listener->Start(this, &pollsets_);
430
604
  }
431
- gpr_free(server->cqs);
432
- gpr_free(server->pollsets);
433
- gpr_free(server->shutdown_tags);
434
- gpr_free(server);
605
+ MutexLock lock(&mu_global_);
606
+ starting_ = false;
607
+ starting_cv_.Signal();
435
608
  }
436
609
 
437
- static void server_unref(grpc_server* server) {
438
- if (GPR_UNLIKELY(server->internal_refcount.Unref())) {
439
- server_delete(server);
610
+ grpc_error* Server::SetupTransport(
611
+ grpc_transport* transport, grpc_pollset* accepting_pollset,
612
+ const grpc_channel_args* args,
613
+ const RefCountedPtr<grpc_core::channelz::SocketNode>& socket_node,
614
+ grpc_resource_user* resource_user) {
615
+ // Create channel.
616
+ grpc_error* error = GRPC_ERROR_NONE;
617
+ grpc_channel* channel = grpc_channel_create(
618
+ nullptr, args, GRPC_SERVER_CHANNEL, transport, resource_user, &error);
619
+ if (channel == nullptr) {
620
+ return error;
621
+ }
622
+ ChannelData* chand = static_cast<ChannelData*>(
623
+ grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0)
624
+ ->channel_data);
625
+ // Set up CQs.
626
+ size_t cq_idx;
627
+ for (cq_idx = 0; cq_idx < cqs_.size(); cq_idx++) {
628
+ if (grpc_cq_pollset(cqs_[cq_idx]) == accepting_pollset) break;
629
+ }
630
+ if (cq_idx == cqs_.size()) {
631
+ // Completion queue not found. Pick a random one to publish new calls to.
632
+ cq_idx = static_cast<size_t>(rand()) % cqs_.size();
440
633
  }
634
+ // Set up channelz node.
635
+ intptr_t channelz_socket_uuid = 0;
636
+ if (socket_node != nullptr) {
637
+ channelz_socket_uuid = socket_node->uuid();
638
+ channelz_node_->AddChildSocket(socket_node);
639
+ }
640
+ // Initialize chand.
641
+ chand->InitTransport(Ref(), channel, cq_idx, transport, channelz_socket_uuid);
642
+ return GRPC_ERROR_NONE;
441
643
  }
442
644
 
443
- static int is_channel_orphaned(channel_data* chand) {
444
- return chand->next == chand;
645
+ bool Server::HasOpenConnections() {
646
+ MutexLock lock(&mu_global_);
647
+ return !channels_.empty();
445
648
  }
446
649
 
447
- static void orphan_channel(channel_data* chand) {
448
- chand->next->prev = chand->prev;
449
- chand->prev->next = chand->next;
450
- chand->next = chand->prev = chand;
650
+ void Server::SetRegisteredMethodAllocator(
651
+ grpc_completion_queue* cq, void* method_tag,
652
+ std::function<RegisteredCallAllocation()> allocator) {
653
+ RegisteredMethod* rm = static_cast<RegisteredMethod*>(method_tag);
654
+ rm->matcher = absl::make_unique<AllocatingRequestMatcherRegistered>(
655
+ this, cq, rm, std::move(allocator));
451
656
  }
452
657
 
453
- static void finish_destroy_channel(void* cd, grpc_error* /*error*/) {
454
- channel_data* chand = static_cast<channel_data*>(cd);
455
- grpc_server* server = chand->server;
456
- GRPC_CHANNEL_INTERNAL_UNREF(chand->channel, "server");
457
- server_unref(server);
658
+ void Server::SetBatchMethodAllocator(
659
+ grpc_completion_queue* cq, std::function<BatchCallAllocation()> allocator) {
660
+ GPR_DEBUG_ASSERT(unregistered_request_matcher_ == nullptr);
661
+ unregistered_request_matcher_ =
662
+ absl::make_unique<AllocatingRequestMatcherBatch>(this, cq,
663
+ std::move(allocator));
458
664
  }
459
665
 
460
- static void destroy_channel(channel_data* chand) {
461
- if (is_channel_orphaned(chand)) return;
462
- GPR_ASSERT(chand->server != nullptr);
463
- orphan_channel(chand);
464
- server_ref(chand->server);
465
- maybe_finish_shutdown(chand->server);
466
- GRPC_CLOSURE_INIT(&chand->finish_destroy_channel_closure,
467
- finish_destroy_channel, chand, grpc_schedule_on_exec_ctx);
468
-
469
- if (GRPC_TRACE_FLAG_ENABLED(grpc_server_channel_trace)) {
470
- gpr_log(GPR_INFO, "Disconnected client");
666
+ void Server::RegisterCompletionQueue(grpc_completion_queue* cq) {
667
+ for (grpc_completion_queue* queue : cqs_) {
668
+ if (queue == cq) return;
471
669
  }
472
-
473
- grpc_transport_op* op =
474
- grpc_make_transport_op(&chand->finish_destroy_channel_closure);
475
- op->set_accept_stream = true;
476
- grpc_channel_next_op(grpc_channel_stack_element(
477
- grpc_channel_get_channel_stack(chand->channel), 0),
478
- op);
670
+ GRPC_CQ_INTERNAL_REF(cq, "server");
671
+ cqs_.push_back(cq);
479
672
  }
480
673
 
481
- static void done_request_event(void* req, grpc_cq_completion* /*c*/) {
482
- gpr_free(req);
674
+ namespace {
675
+
676
+ bool streq(const std::string& a, const char* b) {
677
+ return (a.empty() && b == nullptr) ||
678
+ ((b != nullptr) && !strcmp(a.c_str(), b));
483
679
  }
484
680
 
485
- static void publish_call(grpc_server* server, call_data* calld, size_t cq_idx,
486
- requested_call* rc) {
487
- grpc_call_set_completion_queue(calld->call, rc->cq_bound_to_call);
488
- grpc_call* call = calld->call;
489
- *rc->call = call;
490
- calld->cq_new = server->cqs[cq_idx];
491
- GPR_SWAP(grpc_metadata_array, *rc->initial_metadata, calld->initial_metadata);
492
- switch (rc->type) {
493
- case BATCH_CALL:
494
- GPR_ASSERT(calld->host_set);
495
- GPR_ASSERT(calld->path_set);
496
- rc->data.batch.details->host = grpc_slice_ref_internal(calld->host);
497
- rc->data.batch.details->method = grpc_slice_ref_internal(calld->path);
498
- rc->data.batch.details->deadline =
499
- grpc_millis_to_timespec(calld->deadline, GPR_CLOCK_MONOTONIC);
500
- rc->data.batch.details->flags = calld->recv_initial_metadata_flags;
501
- break;
502
- case REGISTERED_CALL:
503
- *rc->data.registered.deadline =
504
- grpc_millis_to_timespec(calld->deadline, GPR_CLOCK_MONOTONIC);
505
- if (rc->data.registered.optional_payload) {
506
- *rc->data.registered.optional_payload = calld->payload;
507
- calld->payload = nullptr;
508
- }
509
- break;
510
- default:
511
- GPR_UNREACHABLE_CODE(return );
681
+ } // namespace
682
+
683
+ Server::RegisteredMethod* Server::RegisterMethod(
684
+ const char* method, const char* host,
685
+ grpc_server_register_method_payload_handling payload_handling,
686
+ uint32_t flags) {
687
+ if (!method) {
688
+ gpr_log(GPR_ERROR,
689
+ "grpc_server_register_method method string cannot be NULL");
690
+ return nullptr;
691
+ }
692
+ for (std::unique_ptr<RegisteredMethod>& m : registered_methods_) {
693
+ if (streq(m->method, method) && streq(m->host, host)) {
694
+ gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
695
+ host ? host : "*");
696
+ return nullptr;
697
+ }
698
+ }
699
+ if ((flags & ~GRPC_INITIAL_METADATA_USED_MASK) != 0) {
700
+ gpr_log(GPR_ERROR, "grpc_server_register_method invalid flags 0x%08x",
701
+ flags);
702
+ return nullptr;
512
703
  }
704
+ registered_methods_.emplace_back(absl::make_unique<RegisteredMethod>(
705
+ method, host, payload_handling, flags));
706
+ return registered_methods_.back().get();
707
+ }
513
708
 
514
- grpc_cq_end_op(calld->cq_new, rc->tag, GRPC_ERROR_NONE, done_request_event,
515
- rc, &rc->completion, true);
709
+ void Server::DoneRequestEvent(void* req, grpc_cq_completion* /*c*/) {
710
+ delete static_cast<RequestedCall*>(req);
516
711
  }
517
712
 
518
- static void publish_new_rpc(void* arg, grpc_error* error) {
519
- grpc_call_element* call_elem = static_cast<grpc_call_element*>(arg);
520
- call_data* calld = static_cast<call_data*>(call_elem->call_data);
521
- channel_data* chand = static_cast<channel_data*>(call_elem->channel_data);
522
- request_matcher* rm = calld->matcher;
523
- grpc_server* server = rm->server;
524
-
525
- if (error != GRPC_ERROR_NONE || gpr_atm_acq_load(&server->shutdown_flag)) {
526
- gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
527
- GRPC_CLOSURE_INIT(
528
- &calld->kill_zombie_closure, kill_zombie,
529
- grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
530
- grpc_schedule_on_exec_ctx);
531
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
532
- GRPC_ERROR_REF(error));
713
+ void Server::FailCall(size_t cq_idx, RequestedCall* rc, grpc_error* error) {
714
+ *rc->call = nullptr;
715
+ rc->initial_metadata->count = 0;
716
+ GPR_ASSERT(error != GRPC_ERROR_NONE);
717
+ grpc_cq_end_op(cqs_[cq_idx], rc->tag, error, DoneRequestEvent, rc,
718
+ &rc->completion);
719
+ }
720
+
721
+ // Before calling MaybeFinishShutdown(), we must hold mu_global_ and not
722
+ // hold mu_call_.
723
+ void Server::MaybeFinishShutdown() {
724
+ if (!ShutdownReady() || shutdown_published_) {
533
725
  return;
534
726
  }
535
-
536
- for (size_t i = 0; i < server->cq_count; i++) {
537
- size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
538
- requested_call* rc =
539
- reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].TryPop());
540
- if (rc == nullptr) {
541
- continue;
542
- } else {
543
- GRPC_STATS_INC_SERVER_CQS_CHECKED(i);
544
- gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
545
- publish_call(server, calld, cq_idx, rc);
546
- return; /* early out */
727
+ {
728
+ MutexLock lock(&mu_call_);
729
+ KillPendingWorkLocked(
730
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
731
+ }
732
+ if (!channels_.empty() || listeners_destroyed_ < listeners_.size()) {
733
+ if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME),
734
+ last_shutdown_message_time_),
735
+ gpr_time_from_seconds(1, GPR_TIMESPAN)) >= 0) {
736
+ last_shutdown_message_time_ = gpr_now(GPR_CLOCK_REALTIME);
737
+ gpr_log(GPR_DEBUG,
738
+ "Waiting for %" PRIuPTR " channels and %" PRIuPTR "/%" PRIuPTR
739
+ " listeners to be destroyed before shutting down server",
740
+ channels_.size(), listeners_.size() - listeners_destroyed_,
741
+ listeners_.size());
547
742
  }
743
+ return;
548
744
  }
745
+ shutdown_published_ = true;
746
+ for (auto& shutdown_tag : shutdown_tags_) {
747
+ Ref().release();
748
+ grpc_cq_end_op(shutdown_tag.cq, shutdown_tag.tag, GRPC_ERROR_NONE,
749
+ DoneShutdownEvent, this, &shutdown_tag.completion);
750
+ }
751
+ }
549
752
 
550
- /* no cq to take the request found: queue it on the slow list */
551
- GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED();
552
- gpr_mu_lock(&server->mu_call);
553
-
554
- // We need to ensure that all the queues are empty. We do this under
555
- // the server mu_call lock to ensure that if something is added to
556
- // an empty request queue, it will block until the call is actually
557
- // added to the pending list.
558
- for (size_t i = 0; i < server->cq_count; i++) {
559
- size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
560
- requested_call* rc =
561
- reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].Pop());
562
- if (rc == nullptr) {
563
- continue;
564
- } else {
565
- gpr_mu_unlock(&server->mu_call);
566
- GRPC_STATS_INC_SERVER_CQS_CHECKED(i + server->cq_count);
567
- gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
568
- publish_call(server, calld, cq_idx, rc);
569
- return; /* early out */
753
+ void Server::KillPendingWorkLocked(grpc_error* error) {
754
+ if (started_) {
755
+ unregistered_request_matcher_->KillRequests(GRPC_ERROR_REF(error));
756
+ unregistered_request_matcher_->ZombifyPending();
757
+ for (std::unique_ptr<RegisteredMethod>& rm : registered_methods_) {
758
+ rm->matcher->KillRequests(GRPC_ERROR_REF(error));
759
+ rm->matcher->ZombifyPending();
570
760
  }
571
761
  }
762
+ GRPC_ERROR_UNREF(error);
763
+ }
572
764
 
573
- gpr_atm_no_barrier_store(&calld->state, PENDING);
574
- if (rm->pending_head == nullptr) {
575
- rm->pending_tail = rm->pending_head = calld;
576
- } else {
577
- rm->pending_tail->pending_next = calld;
578
- rm->pending_tail = calld;
765
+ std::vector<grpc_channel*> Server::GetChannelsLocked() const {
766
+ std::vector<grpc_channel*> channels;
767
+ channels.reserve(channels_.size());
768
+ for (const ChannelData* chand : channels_) {
769
+ channels.push_back(chand->channel());
770
+ GRPC_CHANNEL_INTERNAL_REF(chand->channel(), "broadcast");
579
771
  }
580
- calld->pending_next = nullptr;
581
- gpr_mu_unlock(&server->mu_call);
772
+ return channels;
582
773
  }
583
774
 
584
- static void finish_start_new_rpc(
585
- grpc_server* server, grpc_call_element* elem, request_matcher* rm,
586
- grpc_server_register_method_payload_handling payload_handling) {
587
- call_data* calld = static_cast<call_data*>(elem->call_data);
588
-
589
- if (gpr_atm_acq_load(&server->shutdown_flag)) {
590
- gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
591
- GRPC_CLOSURE_INIT(&calld->kill_zombie_closure, kill_zombie, elem,
592
- grpc_schedule_on_exec_ctx);
593
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
594
- GRPC_ERROR_NONE);
595
- return;
596
- }
775
+ void Server::ListenerDestroyDone(void* arg, grpc_error* /*error*/) {
776
+ Server* server = static_cast<Server*>(arg);
777
+ MutexLock lock(&server->mu_global_);
778
+ server->listeners_destroyed_++;
779
+ server->MaybeFinishShutdown();
780
+ }
597
781
 
598
- calld->matcher = rm;
782
+ namespace {
599
783
 
600
- switch (payload_handling) {
601
- case GRPC_SRM_PAYLOAD_NONE:
602
- publish_new_rpc(elem, GRPC_ERROR_NONE);
603
- break;
604
- case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER: {
605
- grpc_op op;
606
- op.op = GRPC_OP_RECV_MESSAGE;
607
- op.flags = 0;
608
- op.reserved = nullptr;
609
- op.data.recv_message.recv_message = &calld->payload;
610
- GRPC_CLOSURE_INIT(&calld->publish, publish_new_rpc, elem,
611
- grpc_schedule_on_exec_ctx);
612
- grpc_call_start_batch_and_execute(calld->call, &op, 1, &calld->publish);
613
- break;
614
- }
615
- }
784
+ void DonePublishedShutdown(void* /*done_arg*/, grpc_cq_completion* storage) {
785
+ delete storage;
616
786
  }
617
787
 
618
- static void start_new_rpc(grpc_call_element* elem) {
619
- channel_data* chand = static_cast<channel_data*>(elem->channel_data);
620
- call_data* calld = static_cast<call_data*>(elem->call_data);
621
- grpc_server* server = chand->server;
622
- uint32_t i;
623
- uint32_t hash;
624
- channel_registered_method* rm;
625
-
626
- if (chand->registered_methods && calld->path_set && calld->host_set) {
627
- /* TODO(ctiller): unify these two searches */
628
- /* check for an exact match with host */
629
- hash = GRPC_MDSTR_KV_HASH(grpc_slice_hash_internal(calld->host),
630
- grpc_slice_hash_internal(calld->path));
631
- for (i = 0; i <= chand->registered_method_max_probes; i++) {
632
- rm = &chand->registered_methods[(hash + i) %
633
- chand->registered_method_slots];
634
- if (rm->server_registered_method == nullptr) break;
635
- if (!rm->has_host) continue;
636
- if (rm->host != calld->host) continue;
637
- if (rm->method != calld->path) continue;
638
- if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
639
- 0 == (calld->recv_initial_metadata_flags &
640
- GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
641
- continue;
642
- }
643
- finish_start_new_rpc(server, elem, &rm->server_registered_method->matcher,
644
- rm->server_registered_method->payload_handling);
788
+ } // namespace
789
+
790
+ // - Kills all pending requests-for-incoming-RPC-calls (i.e., the requests made
791
+ // via grpc_server_request_call() and grpc_server_request_registered_call()
792
+ // will now be cancelled). See KillPendingWorkLocked().
793
+ //
794
+ // - Shuts down the listeners (i.e., the server will no longer listen on the
795
+ // port for new incoming channels).
796
+ //
797
+ // - Iterates through all channels on the server and sends shutdown msg (see
798
+ // ChannelBroadcaster::BroadcastShutdown() for details) to the clients via
799
+ // the transport layer. The transport layer then guarantees the following:
800
+ // -- Sends shutdown to the client (e.g., HTTP2 transport sends GOAWAY).
801
+ // -- If the server has outstanding calls that are in the process, the
802
+ // connection is NOT closed until the server is done with all those calls.
803
+ // -- Once there are no more calls in progress, the channel is closed.
804
+ void Server::ShutdownAndNotify(grpc_completion_queue* cq, void* tag) {
805
+ ChannelBroadcaster broadcaster;
806
+ {
807
+ // Wait for startup to be finished. Locks mu_global.
808
+ MutexLock lock(&mu_global_);
809
+ WaitUntil(&starting_cv_, &mu_global_, [this] { return !starting_; });
810
+ // Stay locked, and gather up some stuff to do.
811
+ GPR_ASSERT(grpc_cq_begin_op(cq, tag));
812
+ if (shutdown_published_) {
813
+ grpc_cq_end_op(cq, tag, GRPC_ERROR_NONE, DonePublishedShutdown, nullptr,
814
+ new grpc_cq_completion);
645
815
  return;
646
816
  }
647
- /* check for a wildcard method definition (no host set) */
648
- hash = GRPC_MDSTR_KV_HASH(0, grpc_slice_hash_internal(calld->path));
649
- for (i = 0; i <= chand->registered_method_max_probes; i++) {
650
- rm = &chand->registered_methods[(hash + i) %
651
- chand->registered_method_slots];
652
- if (rm->server_registered_method == nullptr) break;
653
- if (rm->has_host) continue;
654
- if (rm->method != calld->path) continue;
655
- if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
656
- 0 == (calld->recv_initial_metadata_flags &
657
- GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
658
- continue;
659
- }
660
- finish_start_new_rpc(server, elem, &rm->server_registered_method->matcher,
661
- rm->server_registered_method->payload_handling);
817
+ shutdown_tags_.emplace_back(tag, cq);
818
+ if (ShutdownCalled()) {
662
819
  return;
663
820
  }
821
+ last_shutdown_message_time_ = gpr_now(GPR_CLOCK_REALTIME);
822
+ broadcaster.FillChannelsLocked(GetChannelsLocked());
823
+ // Collect all unregistered then registered calls.
824
+ {
825
+ MutexLock lock(&mu_call_);
826
+ KillPendingWorkLocked(
827
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
828
+ }
829
+ ShutdownUnrefOnShutdownCall();
830
+ }
831
+ // Shutdown listeners.
832
+ for (auto& listener : listeners_) {
833
+ channelz::ListenSocketNode* channelz_listen_socket_node =
834
+ listener.listener->channelz_listen_socket_node();
835
+ if (channelz_node_ != nullptr && channelz_listen_socket_node != nullptr) {
836
+ channelz_node_->RemoveChildListenSocket(
837
+ channelz_listen_socket_node->uuid());
838
+ }
839
+ GRPC_CLOSURE_INIT(&listener.destroy_done, ListenerDestroyDone, this,
840
+ grpc_schedule_on_exec_ctx);
841
+ listener.listener->SetOnDestroyDone(&listener.destroy_done);
842
+ listener.listener.reset();
664
843
  }
665
- finish_start_new_rpc(server, elem, &server->unregistered_request_matcher,
666
- GRPC_SRM_PAYLOAD_NONE);
844
+ broadcaster.BroadcastShutdown(/*send_goaway=*/true, GRPC_ERROR_NONE);
667
845
  }
668
846
 
669
- static int num_listeners(grpc_server* server) {
670
- listener* l;
671
- int n = 0;
672
- for (l = server->listeners; l; l = l->next) {
673
- n++;
847
+ void Server::CancelAllCalls() {
848
+ ChannelBroadcaster broadcaster;
849
+ {
850
+ MutexLock lock(&mu_global_);
851
+ broadcaster.FillChannelsLocked(GetChannelsLocked());
674
852
  }
675
- return n;
853
+ broadcaster.BroadcastShutdown(
854
+ /*send_goaway=*/false,
855
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Cancelling all calls"));
676
856
  }
677
857
 
678
- static void done_shutdown_event(void* server,
679
- grpc_cq_completion* /*completion*/) {
680
- server_unref(static_cast<grpc_server*>(server));
858
+ void Server::Orphan() {
859
+ {
860
+ MutexLock lock(&mu_global_);
861
+ GPR_ASSERT(ShutdownCalled() || listeners_.empty());
862
+ GPR_ASSERT(listeners_destroyed_ == listeners_.size());
863
+ }
864
+ if (default_resource_user_ != nullptr) {
865
+ grpc_resource_quota_unref(grpc_resource_user_quota(default_resource_user_));
866
+ grpc_resource_user_shutdown(default_resource_user_);
867
+ grpc_resource_user_unref(default_resource_user_);
868
+ }
869
+ Unref();
681
870
  }
682
871
 
683
- static int num_channels(grpc_server* server) {
684
- channel_data* chand;
685
- int n = 0;
686
- for (chand = server->root_channel_data.next;
687
- chand != &server->root_channel_data; chand = chand->next) {
688
- n++;
872
+ grpc_call_error Server::ValidateServerRequest(
873
+ grpc_completion_queue* cq_for_notification, void* tag,
874
+ grpc_byte_buffer** optional_payload, RegisteredMethod* rm) {
875
+ if ((rm == nullptr && optional_payload != nullptr) ||
876
+ ((rm != nullptr) && ((optional_payload == nullptr) !=
877
+ (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)))) {
878
+ return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
879
+ }
880
+ if (!grpc_cq_begin_op(cq_for_notification, tag)) {
881
+ return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
689
882
  }
690
- return n;
883
+ return GRPC_CALL_OK;
691
884
  }
692
885
 
693
- static void kill_pending_work_locked(grpc_server* server, grpc_error* error) {
694
- if (server->started) {
695
- request_matcher_kill_requests(server, &server->unregistered_request_matcher,
696
- GRPC_ERROR_REF(error));
697
- request_matcher_zombify_all_pending_calls(
698
- &server->unregistered_request_matcher);
699
- for (registered_method* rm = server->registered_methods; rm;
700
- rm = rm->next) {
701
- request_matcher_kill_requests(server, &rm->matcher,
702
- GRPC_ERROR_REF(error));
703
- request_matcher_zombify_all_pending_calls(&rm->matcher);
886
+ grpc_call_error Server::ValidateServerRequestAndCq(
887
+ size_t* cq_idx, grpc_completion_queue* cq_for_notification, void* tag,
888
+ grpc_byte_buffer** optional_payload, RegisteredMethod* rm) {
889
+ size_t idx;
890
+ for (idx = 0; idx < cqs_.size(); idx++) {
891
+ if (cqs_[idx] == cq_for_notification) {
892
+ break;
704
893
  }
705
894
  }
706
- GRPC_ERROR_UNREF(error);
707
- }
708
-
709
- static void maybe_finish_shutdown(grpc_server* server) {
710
- size_t i;
711
- if (!gpr_atm_acq_load(&server->shutdown_flag) || server->shutdown_published) {
712
- return;
895
+ if (idx == cqs_.size()) {
896
+ return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
713
897
  }
898
+ grpc_call_error error =
899
+ ValidateServerRequest(cq_for_notification, tag, optional_payload, rm);
900
+ if (error != GRPC_CALL_OK) {
901
+ return error;
902
+ }
903
+ *cq_idx = idx;
904
+ return GRPC_CALL_OK;
905
+ }
714
906
 
715
- gpr_mu_lock(&server->mu_call);
716
- kill_pending_work_locked(
717
- server, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
718
- gpr_mu_unlock(&server->mu_call);
719
-
720
- if (server->root_channel_data.next != &server->root_channel_data ||
721
- server->listeners_destroyed < num_listeners(server)) {
722
- if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME),
723
- server->last_shutdown_message_time),
724
- gpr_time_from_seconds(1, GPR_TIMESPAN)) >= 0) {
725
- server->last_shutdown_message_time = gpr_now(GPR_CLOCK_REALTIME);
726
- gpr_log(GPR_DEBUG,
727
- "Waiting for %d channels and %d/%d listeners to be destroyed"
728
- " before shutting down server",
729
- num_channels(server),
730
- num_listeners(server) - server->listeners_destroyed,
731
- num_listeners(server));
732
- }
733
- return;
907
+ grpc_call_error Server::QueueRequestedCall(size_t cq_idx, RequestedCall* rc) {
908
+ if (ShutdownCalled()) {
909
+ FailCall(cq_idx, rc,
910
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
911
+ return GRPC_CALL_OK;
734
912
  }
735
- server->shutdown_published = 1;
736
- for (i = 0; i < server->num_shutdown_tags; i++) {
737
- server_ref(server);
738
- grpc_cq_end_op(server->shutdown_tags[i].cq, server->shutdown_tags[i].tag,
739
- GRPC_ERROR_NONE, done_shutdown_event, server,
740
- &server->shutdown_tags[i].completion);
913
+ RequestMatcherInterface* rm;
914
+ switch (rc->type) {
915
+ case RequestedCall::Type::BATCH_CALL:
916
+ rm = unregistered_request_matcher_.get();
917
+ break;
918
+ case RequestedCall::Type::REGISTERED_CALL:
919
+ rm = rc->data.registered.method->matcher.get();
920
+ break;
741
921
  }
922
+ rm->RequestCallWithPossiblePublish(cq_idx, rc);
923
+ return GRPC_CALL_OK;
742
924
  }
743
925
 
744
- static void server_on_recv_initial_metadata(void* ptr, grpc_error* error) {
745
- grpc_call_element* elem = static_cast<grpc_call_element*>(ptr);
746
- call_data* calld = static_cast<call_data*>(elem->call_data);
747
- grpc_millis op_deadline;
926
+ grpc_call_error Server::RequestCall(grpc_call** call,
927
+ grpc_call_details* details,
928
+ grpc_metadata_array* request_metadata,
929
+ grpc_completion_queue* cq_bound_to_call,
930
+ grpc_completion_queue* cq_for_notification,
931
+ void* tag) {
932
+ size_t cq_idx;
933
+ grpc_call_error error = ValidateServerRequestAndCq(
934
+ &cq_idx, cq_for_notification, tag, nullptr, nullptr);
935
+ if (error != GRPC_CALL_OK) {
936
+ return error;
937
+ }
938
+ RequestedCall* rc =
939
+ new RequestedCall(tag, cq_bound_to_call, call, request_metadata, details);
940
+ return QueueRequestedCall(cq_idx, rc);
941
+ }
748
942
 
749
- if (error == GRPC_ERROR_NONE) {
750
- GPR_DEBUG_ASSERT(calld->recv_initial_metadata->idx.named.path != nullptr);
751
- GPR_DEBUG_ASSERT(calld->recv_initial_metadata->idx.named.authority !=
752
- nullptr);
753
- calld->path = grpc_slice_ref_internal(
754
- GRPC_MDVALUE(calld->recv_initial_metadata->idx.named.path->md));
755
- calld->host = grpc_slice_ref_internal(
756
- GRPC_MDVALUE(calld->recv_initial_metadata->idx.named.authority->md));
757
- calld->path_set = true;
758
- calld->host_set = true;
759
- grpc_metadata_batch_remove(calld->recv_initial_metadata, GRPC_BATCH_PATH);
760
- grpc_metadata_batch_remove(calld->recv_initial_metadata,
761
- GRPC_BATCH_AUTHORITY);
762
- } else {
763
- GRPC_ERROR_REF(error);
764
- }
765
- op_deadline = calld->recv_initial_metadata->deadline;
766
- if (op_deadline != GRPC_MILLIS_INF_FUTURE) {
767
- calld->deadline = op_deadline;
768
- }
769
- if (calld->host_set && calld->path_set) {
770
- /* do nothing */
771
- } else {
772
- /* Pass the error reference to calld->recv_initial_metadata_error */
773
- grpc_error* src_error = error;
774
- error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
775
- "Missing :authority or :path", &src_error, 1);
776
- GRPC_ERROR_UNREF(src_error);
777
- calld->recv_initial_metadata_error = GRPC_ERROR_REF(error);
778
- }
779
- grpc_closure* closure = calld->on_done_recv_initial_metadata;
780
- calld->on_done_recv_initial_metadata = nullptr;
781
- if (calld->seen_recv_trailing_metadata_ready) {
782
- GRPC_CALL_COMBINER_START(calld->call_combiner,
783
- &calld->recv_trailing_metadata_ready,
784
- calld->recv_trailing_metadata_error,
785
- "continue server_recv_trailing_metadata_ready");
786
- }
787
- grpc_core::Closure::Run(DEBUG_LOCATION, closure, error);
788
- }
789
-
790
- static void server_recv_trailing_metadata_ready(void* user_data,
791
- grpc_error* error) {
792
- grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
793
- call_data* calld = static_cast<call_data*>(elem->call_data);
794
- if (calld->on_done_recv_initial_metadata != nullptr) {
795
- calld->recv_trailing_metadata_error = GRPC_ERROR_REF(error);
796
- calld->seen_recv_trailing_metadata_ready = true;
797
- GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_ready,
798
- server_recv_trailing_metadata_ready, elem,
799
- grpc_schedule_on_exec_ctx);
800
- GRPC_CALL_COMBINER_STOP(calld->call_combiner,
801
- "deferring server_recv_trailing_metadata_ready "
802
- "until after server_on_recv_initial_metadata");
803
- return;
804
- }
805
- error =
806
- grpc_error_add_child(GRPC_ERROR_REF(error),
807
- GRPC_ERROR_REF(calld->recv_initial_metadata_error));
808
- grpc_core::Closure::Run(DEBUG_LOCATION,
809
- calld->original_recv_trailing_metadata_ready, error);
943
+ grpc_call_error Server::RequestRegisteredCall(
944
+ RegisteredMethod* rm, grpc_call** call, gpr_timespec* deadline,
945
+ grpc_metadata_array* request_metadata, grpc_byte_buffer** optional_payload,
946
+ grpc_completion_queue* cq_bound_to_call,
947
+ grpc_completion_queue* cq_for_notification, void* tag_new) {
948
+ size_t cq_idx;
949
+ grpc_call_error error = ValidateServerRequestAndCq(
950
+ &cq_idx, cq_for_notification, tag_new, optional_payload, rm);
951
+ if (error != GRPC_CALL_OK) {
952
+ return error;
953
+ }
954
+ RequestedCall* rc =
955
+ new RequestedCall(tag_new, cq_bound_to_call, call, request_metadata, rm,
956
+ deadline, optional_payload);
957
+ return QueueRequestedCall(cq_idx, rc);
810
958
  }
811
959
 
812
- static void server_mutate_op(grpc_call_element* elem,
813
- grpc_transport_stream_op_batch* op) {
814
- call_data* calld = static_cast<call_data*>(elem->call_data);
960
+ //
961
+ // Server::ChannelData::ConnectivityWatcher
962
+ //
815
963
 
816
- if (op->recv_initial_metadata) {
817
- GPR_ASSERT(op->payload->recv_initial_metadata.recv_flags == nullptr);
818
- calld->recv_initial_metadata =
819
- op->payload->recv_initial_metadata.recv_initial_metadata;
820
- calld->on_done_recv_initial_metadata =
821
- op->payload->recv_initial_metadata.recv_initial_metadata_ready;
822
- op->payload->recv_initial_metadata.recv_initial_metadata_ready =
823
- &calld->server_on_recv_initial_metadata;
824
- op->payload->recv_initial_metadata.recv_flags =
825
- &calld->recv_initial_metadata_flags;
964
+ class Server::ChannelData::ConnectivityWatcher
965
+ : public AsyncConnectivityStateWatcherInterface {
966
+ public:
967
+ explicit ConnectivityWatcher(ChannelData* chand) : chand_(chand) {
968
+ GRPC_CHANNEL_INTERNAL_REF(chand_->channel_, "connectivity");
826
969
  }
827
- if (op->recv_trailing_metadata) {
828
- calld->original_recv_trailing_metadata_ready =
829
- op->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
830
- op->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
831
- &calld->recv_trailing_metadata_ready;
970
+
971
+ ~ConnectivityWatcher() override {
972
+ GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel_, "connectivity");
832
973
  }
833
- }
834
974
 
835
- static void server_start_transport_stream_op_batch(
836
- grpc_call_element* elem, grpc_transport_stream_op_batch* op) {
837
- server_mutate_op(elem, op);
838
- grpc_call_next_op(elem, op);
975
+ private:
976
+ void OnConnectivityStateChange(grpc_connectivity_state new_state,
977
+ const absl::Status& /*status*/) override {
978
+ // Don't do anything until we are being shut down.
979
+ if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
980
+ // Shut down channel.
981
+ MutexLock lock(&chand_->server_->mu_global_);
982
+ chand_->Destroy();
983
+ }
984
+
985
+ ChannelData* chand_;
986
+ };
987
+
988
+ //
989
+ // Server::ChannelData
990
+ //
991
+
992
+ Server::ChannelData::~ChannelData() {
993
+ if (registered_methods_ != nullptr) {
994
+ for (const ChannelRegisteredMethod& crm : *registered_methods_) {
995
+ grpc_slice_unref_internal(crm.method);
996
+ GPR_DEBUG_ASSERT(crm.method.refcount == &kNoopRefcount ||
997
+ crm.method.refcount == nullptr);
998
+ if (crm.has_host) {
999
+ grpc_slice_unref_internal(crm.host);
1000
+ GPR_DEBUG_ASSERT(crm.host.refcount == &kNoopRefcount ||
1001
+ crm.host.refcount == nullptr);
1002
+ }
1003
+ }
1004
+ registered_methods_.reset();
1005
+ }
1006
+ if (server_ != nullptr) {
1007
+ if (server_->channelz_node_ != nullptr && channelz_socket_uuid_ != 0) {
1008
+ server_->channelz_node_->RemoveChildSocket(channelz_socket_uuid_);
1009
+ }
1010
+ {
1011
+ MutexLock lock(&server_->mu_global_);
1012
+ if (list_position_.has_value()) {
1013
+ server_->channels_.erase(*list_position_);
1014
+ list_position_.reset();
1015
+ }
1016
+ server_->MaybeFinishShutdown();
1017
+ }
1018
+ }
839
1019
  }
840
1020
 
841
- static void got_initial_metadata(void* ptr, grpc_error* error) {
842
- grpc_call_element* elem = static_cast<grpc_call_element*>(ptr);
843
- call_data* calld = static_cast<call_data*>(elem->call_data);
844
- if (error == GRPC_ERROR_NONE) {
845
- start_new_rpc(elem);
846
- } else {
847
- if (gpr_atm_full_cas(&calld->state, NOT_STARTED, ZOMBIED)) {
848
- GRPC_CLOSURE_INIT(&calld->kill_zombie_closure, kill_zombie, elem,
849
- grpc_schedule_on_exec_ctx);
850
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
851
- GRPC_ERROR_NONE);
852
- } else if (gpr_atm_full_cas(&calld->state, PENDING, ZOMBIED)) {
853
- /* zombied call will be destroyed when it's removed from the pending
854
- queue... later */
1021
+ void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
1022
+ grpc_channel* channel, size_t cq_idx,
1023
+ grpc_transport* transport,
1024
+ intptr_t channelz_socket_uuid) {
1025
+ server_ = std::move(server);
1026
+ channel_ = channel;
1027
+ cq_idx_ = cq_idx;
1028
+ channelz_socket_uuid_ = channelz_socket_uuid;
1029
+ // Build a lookup table phrased in terms of mdstr's in this channels context
1030
+ // to quickly find registered methods.
1031
+ size_t num_registered_methods = server_->registered_methods_.size();
1032
+ if (num_registered_methods > 0) {
1033
+ uint32_t max_probes = 0;
1034
+ size_t slots = 2 * num_registered_methods;
1035
+ registered_methods_ =
1036
+ absl::make_unique<std::vector<ChannelRegisteredMethod>>(slots);
1037
+ for (std::unique_ptr<RegisteredMethod>& rm : server_->registered_methods_) {
1038
+ ExternallyManagedSlice host;
1039
+ ExternallyManagedSlice method(rm->method.c_str());
1040
+ const bool has_host = !rm->host.empty();
1041
+ if (has_host) {
1042
+ host = ExternallyManagedSlice(rm->host.c_str());
1043
+ }
1044
+ uint32_t hash =
1045
+ GRPC_MDSTR_KV_HASH(has_host ? host.Hash() : 0, method.Hash());
1046
+ uint32_t probes = 0;
1047
+ for (probes = 0; (*registered_methods_)[(hash + probes) % slots]
1048
+ .server_registered_method != nullptr;
1049
+ probes++) {
1050
+ }
1051
+ if (probes > max_probes) max_probes = probes;
1052
+ ChannelRegisteredMethod* crm =
1053
+ &(*registered_methods_)[(hash + probes) % slots];
1054
+ crm->server_registered_method = rm.get();
1055
+ crm->flags = rm->flags;
1056
+ crm->has_host = has_host;
1057
+ if (has_host) {
1058
+ crm->host = host;
1059
+ }
1060
+ crm->method = method;
1061
+ }
1062
+ GPR_ASSERT(slots <= UINT32_MAX);
1063
+ registered_method_max_probes_ = max_probes;
1064
+ }
1065
+ // Publish channel.
1066
+ {
1067
+ MutexLock lock(&server_->mu_global_);
1068
+ server_->channels_.push_front(this);
1069
+ list_position_ = server_->channels_.begin();
1070
+ }
1071
+ // Start accept_stream transport op.
1072
+ grpc_transport_op* op = grpc_make_transport_op(nullptr);
1073
+ op->set_accept_stream = true;
1074
+ op->set_accept_stream_fn = AcceptStream;
1075
+ op->set_accept_stream_user_data = this;
1076
+ op->start_connectivity_watch = MakeOrphanable<ConnectivityWatcher>(this);
1077
+ if (server_->ShutdownCalled()) {
1078
+ op->disconnect_with_error =
1079
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown");
1080
+ }
1081
+ grpc_transport_perform_op(transport, op);
1082
+ }
1083
+
1084
+ Server::ChannelRegisteredMethod* Server::ChannelData::GetRegisteredMethod(
1085
+ const grpc_slice& host, const grpc_slice& path, bool is_idempotent) {
1086
+ if (registered_methods_ == nullptr) return nullptr;
1087
+ /* TODO(ctiller): unify these two searches */
1088
+ /* check for an exact match with host */
1089
+ uint32_t hash = GRPC_MDSTR_KV_HASH(grpc_slice_hash_internal(host),
1090
+ grpc_slice_hash_internal(path));
1091
+ for (size_t i = 0; i <= registered_method_max_probes_; i++) {
1092
+ ChannelRegisteredMethod* rm =
1093
+ &(*registered_methods_)[(hash + i) % registered_methods_->size()];
1094
+ if (rm->server_registered_method == nullptr) break;
1095
+ if (!rm->has_host) continue;
1096
+ if (rm->host != host) continue;
1097
+ if (rm->method != path) continue;
1098
+ if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
1099
+ !is_idempotent) {
1100
+ continue;
1101
+ }
1102
+ return rm;
1103
+ }
1104
+ /* check for a wildcard method definition (no host set) */
1105
+ hash = GRPC_MDSTR_KV_HASH(0, grpc_slice_hash_internal(path));
1106
+ for (size_t i = 0; i <= registered_method_max_probes_; i++) {
1107
+ ChannelRegisteredMethod* rm =
1108
+ &(*registered_methods_)[(hash + i) % registered_methods_->size()];
1109
+ if (rm->server_registered_method == nullptr) break;
1110
+ if (rm->has_host) continue;
1111
+ if (rm->method != path) continue;
1112
+ if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
1113
+ !is_idempotent) {
1114
+ continue;
855
1115
  }
1116
+ return rm;
856
1117
  }
1118
+ return nullptr;
857
1119
  }
858
1120
 
859
- static void accept_stream(void* cd, grpc_transport* /*transport*/,
860
- const void* transport_server_data) {
861
- channel_data* chand = static_cast<channel_data*>(cd);
1121
+ void Server::ChannelData::AcceptStream(void* arg, grpc_transport* /*transport*/,
1122
+ const void* transport_server_data) {
1123
+ auto* chand = static_cast<Server::ChannelData*>(arg);
862
1124
  /* create a call */
863
1125
  grpc_call_create_args args;
864
- args.channel = chand->channel;
865
- args.server = chand->server;
1126
+ args.channel = chand->channel_;
1127
+ args.server = chand->server_.get();
866
1128
  args.parent = nullptr;
867
1129
  args.propagation_mask = 0;
868
1130
  args.cq = nullptr;
@@ -875,725 +1137,472 @@ static void accept_stream(void* cd, grpc_transport* /*transport*/,
875
1137
  grpc_error* error = grpc_call_create(&args, &call);
876
1138
  grpc_call_element* elem =
877
1139
  grpc_call_stack_element(grpc_call_get_call_stack(call), 0);
1140
+ auto* calld = static_cast<Server::CallData*>(elem->call_data);
878
1141
  if (error != GRPC_ERROR_NONE) {
879
- got_initial_metadata(elem, error);
880
1142
  GRPC_ERROR_UNREF(error);
1143
+ calld->FailCallCreation();
881
1144
  return;
882
1145
  }
883
- call_data* calld = static_cast<call_data*>(elem->call_data);
884
- grpc_op op;
885
- op.op = GRPC_OP_RECV_INITIAL_METADATA;
886
- op.flags = 0;
887
- op.reserved = nullptr;
888
- op.data.recv_initial_metadata.recv_initial_metadata =
889
- &calld->initial_metadata;
890
- GRPC_CLOSURE_INIT(&calld->got_initial_metadata, got_initial_metadata, elem,
891
- grpc_schedule_on_exec_ctx);
892
- grpc_call_start_batch_and_execute(call, &op, 1, &calld->got_initial_metadata);
1146
+ calld->Start(elem);
893
1147
  }
894
1148
 
895
- static grpc_error* server_init_call_elem(grpc_call_element* elem,
896
- const grpc_call_element_args* args) {
897
- channel_data* chand = static_cast<channel_data*>(elem->channel_data);
898
- server_ref(chand->server);
899
- new (elem->call_data) call_data(elem, *args);
900
- return GRPC_ERROR_NONE;
1149
+ void Server::ChannelData::FinishDestroy(void* arg, grpc_error* /*error*/) {
1150
+ auto* chand = static_cast<Server::ChannelData*>(arg);
1151
+ Server* server = chand->server_.get();
1152
+ GRPC_CHANNEL_INTERNAL_UNREF(chand->channel_, "server");
1153
+ server->Unref();
901
1154
  }
902
1155
 
903
- static void server_destroy_call_elem(grpc_call_element* elem,
904
- const grpc_call_final_info* /*final_info*/,
905
- grpc_closure* /*ignored*/) {
906
- call_data* calld = static_cast<call_data*>(elem->call_data);
907
- calld->~call_data();
908
- channel_data* chand = static_cast<channel_data*>(elem->channel_data);
909
- server_unref(chand->server);
1156
+ void Server::ChannelData::Destroy() {
1157
+ if (!list_position_.has_value()) return;
1158
+ GPR_ASSERT(server_ != nullptr);
1159
+ server_->channels_.erase(*list_position_);
1160
+ list_position_.reset();
1161
+ server_->Ref().release();
1162
+ server_->MaybeFinishShutdown();
1163
+ GRPC_CLOSURE_INIT(&finish_destroy_channel_closure_, FinishDestroy, this,
1164
+ grpc_schedule_on_exec_ctx);
1165
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_server_channel_trace)) {
1166
+ gpr_log(GPR_INFO, "Disconnected client");
1167
+ }
1168
+ grpc_transport_op* op =
1169
+ grpc_make_transport_op(&finish_destroy_channel_closure_);
1170
+ op->set_accept_stream = true;
1171
+ grpc_channel_next_op(
1172
+ grpc_channel_stack_element(grpc_channel_get_channel_stack(channel_), 0),
1173
+ op);
910
1174
  }
911
1175
 
912
- static grpc_error* server_init_channel_elem(grpc_channel_element* elem,
913
- grpc_channel_element_args* args) {
914
- channel_data* chand = static_cast<channel_data*>(elem->channel_data);
1176
+ grpc_error* Server::ChannelData::InitChannelElement(
1177
+ grpc_channel_element* elem, grpc_channel_element_args* args) {
915
1178
  GPR_ASSERT(args->is_first);
916
1179
  GPR_ASSERT(!args->is_last);
917
- chand->server = nullptr;
918
- chand->channel = nullptr;
919
- chand->next = chand->prev = chand;
920
- chand->registered_methods = nullptr;
1180
+ new (elem->channel_data) ChannelData();
921
1181
  return GRPC_ERROR_NONE;
922
1182
  }
923
1183
 
924
- static void server_destroy_channel_elem(grpc_channel_element* elem) {
925
- size_t i;
926
- channel_data* chand = static_cast<channel_data*>(elem->channel_data);
927
- if (chand->registered_methods) {
928
- for (i = 0; i < chand->registered_method_slots; i++) {
929
- grpc_slice_unref_internal(chand->registered_methods[i].method);
930
- GPR_DEBUG_ASSERT(chand->registered_methods[i].method.refcount ==
931
- &grpc_core::kNoopRefcount ||
932
- chand->registered_methods[i].method.refcount == nullptr);
933
- if (chand->registered_methods[i].has_host) {
934
- grpc_slice_unref_internal(chand->registered_methods[i].host);
935
- GPR_DEBUG_ASSERT(chand->registered_methods[i].host.refcount ==
936
- &grpc_core::kNoopRefcount ||
937
- chand->registered_methods[i].host.refcount == nullptr);
938
- }
939
- }
940
- gpr_free(chand->registered_methods);
941
- }
942
- if (chand->server) {
943
- if (chand->server->channelz_server != nullptr &&
944
- chand->channelz_socket_uuid != 0) {
945
- chand->server->channelz_server->RemoveChildSocket(
946
- chand->channelz_socket_uuid);
947
- }
948
- gpr_mu_lock(&chand->server->mu_global);
949
- chand->next->prev = chand->prev;
950
- chand->prev->next = chand->next;
951
- chand->next = chand->prev = chand;
952
- maybe_finish_shutdown(chand->server);
953
- gpr_mu_unlock(&chand->server->mu_global);
954
- server_unref(chand->server);
955
- }
1184
+ void Server::ChannelData::DestroyChannelElement(grpc_channel_element* elem) {
1185
+ auto* chand = static_cast<ChannelData*>(elem->channel_data);
1186
+ chand->~ChannelData();
956
1187
  }
957
1188
 
958
- const grpc_channel_filter grpc_server_top_filter = {
959
- server_start_transport_stream_op_batch,
960
- grpc_channel_next_op,
961
- sizeof(call_data),
962
- server_init_call_elem,
963
- grpc_call_stack_ignore_set_pollset_or_pollset_set,
964
- server_destroy_call_elem,
965
- sizeof(channel_data),
966
- server_init_channel_elem,
967
- server_destroy_channel_elem,
968
- grpc_channel_next_get_info,
969
- "server",
970
- };
1189
+ //
1190
+ // Server::CallData
1191
+ //
1192
+
1193
+ Server::CallData::CallData(grpc_call_element* elem,
1194
+ const grpc_call_element_args& args,
1195
+ RefCountedPtr<Server> server)
1196
+ : server_(std::move(server)),
1197
+ call_(grpc_call_from_top_element(elem)),
1198
+ call_combiner_(args.call_combiner) {
1199
+ GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_, RecvInitialMetadataReady,
1200
+ elem, grpc_schedule_on_exec_ctx);
1201
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_, RecvTrailingMetadataReady,
1202
+ elem, grpc_schedule_on_exec_ctx);
1203
+ }
971
1204
 
972
- static void register_completion_queue(grpc_server* server,
973
- grpc_completion_queue* cq,
974
- void* reserved) {
975
- size_t i, n;
976
- GPR_ASSERT(!reserved);
977
- for (i = 0; i < server->cq_count; i++) {
978
- if (server->cqs[i] == cq) return;
1205
+ Server::CallData::~CallData() {
1206
+ GPR_ASSERT(state_.Load(MemoryOrder::RELAXED) != CallState::PENDING);
1207
+ GRPC_ERROR_UNREF(recv_initial_metadata_error_);
1208
+ if (host_.has_value()) {
1209
+ grpc_slice_unref_internal(*host_);
1210
+ }
1211
+ if (path_.has_value()) {
1212
+ grpc_slice_unref_internal(*path_);
979
1213
  }
1214
+ grpc_metadata_array_destroy(&initial_metadata_);
1215
+ grpc_byte_buffer_destroy(payload_);
1216
+ }
980
1217
 
981
- GRPC_CQ_INTERNAL_REF(cq, "server");
982
- n = server->cq_count++;
983
- server->cqs = static_cast<grpc_completion_queue**>(gpr_realloc(
984
- server->cqs, server->cq_count * sizeof(grpc_completion_queue*)));
985
- server->cqs[n] = cq;
1218
+ void Server::CallData::SetState(CallState state) {
1219
+ state_.Store(state, MemoryOrder::RELAXED);
986
1220
  }
987
1221
 
988
- void grpc_server_register_completion_queue(grpc_server* server,
989
- grpc_completion_queue* cq,
990
- void* reserved) {
991
- GRPC_API_TRACE(
992
- "grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3,
993
- (server, cq, reserved));
1222
+ bool Server::CallData::MaybeActivate() {
1223
+ CallState expected = CallState::PENDING;
1224
+ return state_.CompareExchangeStrong(&expected, CallState::ACTIVATED,
1225
+ MemoryOrder::ACQ_REL,
1226
+ MemoryOrder::RELAXED);
1227
+ }
994
1228
 
995
- auto cq_type = grpc_get_cq_completion_type(cq);
996
- if (cq_type != GRPC_CQ_NEXT && cq_type != GRPC_CQ_CALLBACK) {
997
- gpr_log(GPR_INFO,
998
- "Completion queue of type %d is being registered as a "
999
- "server-completion-queue",
1000
- static_cast<int>(cq_type));
1001
- /* Ideally we should log an error and abort but ruby-wrapped-language API
1002
- calls grpc_completion_queue_pluck() on server completion queues */
1229
+ void Server::CallData::FailCallCreation() {
1230
+ CallState expected_not_started = CallState::NOT_STARTED;
1231
+ CallState expected_pending = CallState::PENDING;
1232
+ if (state_.CompareExchangeStrong(&expected_not_started, CallState::ZOMBIED,
1233
+ MemoryOrder::ACQ_REL,
1234
+ MemoryOrder::ACQUIRE)) {
1235
+ KillZombie();
1236
+ } else if (state_.CompareExchangeStrong(&expected_pending, CallState::ZOMBIED,
1237
+ MemoryOrder::ACQ_REL,
1238
+ MemoryOrder::RELAXED)) {
1239
+ // Zombied call will be destroyed when it's removed from the pending
1240
+ // queue... later.
1003
1241
  }
1004
-
1005
- register_completion_queue(server, cq, reserved);
1006
1242
  }
1007
1243
 
1008
- grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) {
1009
- grpc_core::ExecCtx exec_ctx;
1010
- GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved));
1011
-
1012
- grpc_server* server =
1013
- static_cast<grpc_server*>(gpr_zalloc(sizeof(grpc_server)));
1014
-
1015
- gpr_mu_init(&server->mu_global);
1016
- gpr_mu_init(&server->mu_call);
1017
- gpr_cv_init(&server->starting_cv);
1018
-
1019
- /* decremented by grpc_server_destroy */
1020
- new (&server->internal_refcount) grpc_core::RefCount();
1021
- server->root_channel_data.next = server->root_channel_data.prev =
1022
- &server->root_channel_data;
1023
-
1024
- server->channel_args = grpc_channel_args_copy(args);
1244
+ void Server::CallData::Start(grpc_call_element* elem) {
1245
+ grpc_op op;
1246
+ op.op = GRPC_OP_RECV_INITIAL_METADATA;
1247
+ op.flags = 0;
1248
+ op.reserved = nullptr;
1249
+ op.data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_;
1250
+ GRPC_CLOSURE_INIT(&recv_initial_metadata_batch_complete_,
1251
+ RecvInitialMetadataBatchComplete, elem,
1252
+ grpc_schedule_on_exec_ctx);
1253
+ grpc_call_start_batch_and_execute(call_, &op, 1,
1254
+ &recv_initial_metadata_batch_complete_);
1255
+ }
1025
1256
 
1026
- const grpc_arg* arg = grpc_channel_args_find(args, GRPC_ARG_ENABLE_CHANNELZ);
1027
- if (grpc_channel_arg_get_bool(arg, GRPC_ENABLE_CHANNELZ_DEFAULT)) {
1028
- arg = grpc_channel_args_find(
1029
- args, GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE);
1030
- size_t channel_tracer_max_memory = grpc_channel_arg_get_integer(
1031
- arg,
1032
- {GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX});
1033
- server->channelz_server =
1034
- grpc_core::MakeRefCounted<grpc_core::channelz::ServerNode>(
1035
- server, channel_tracer_max_memory);
1036
- server->channelz_server->AddTraceEvent(
1037
- grpc_core::channelz::ChannelTrace::Severity::Info,
1038
- grpc_slice_from_static_string("Server created"));
1257
+ void Server::CallData::Publish(size_t cq_idx, RequestedCall* rc) {
1258
+ grpc_call_set_completion_queue(call_, rc->cq_bound_to_call);
1259
+ *rc->call = call_;
1260
+ cq_new_ = server_->cqs_[cq_idx];
1261
+ GPR_SWAP(grpc_metadata_array, *rc->initial_metadata, initial_metadata_);
1262
+ switch (rc->type) {
1263
+ case RequestedCall::Type::BATCH_CALL:
1264
+ GPR_ASSERT(host_.has_value());
1265
+ GPR_ASSERT(path_.has_value());
1266
+ rc->data.batch.details->host = grpc_slice_ref_internal(*host_);
1267
+ rc->data.batch.details->method = grpc_slice_ref_internal(*path_);
1268
+ rc->data.batch.details->deadline =
1269
+ grpc_millis_to_timespec(deadline_, GPR_CLOCK_MONOTONIC);
1270
+ rc->data.batch.details->flags = recv_initial_metadata_flags_;
1271
+ break;
1272
+ case RequestedCall::Type::REGISTERED_CALL:
1273
+ *rc->data.registered.deadline =
1274
+ grpc_millis_to_timespec(deadline_, GPR_CLOCK_MONOTONIC);
1275
+ if (rc->data.registered.optional_payload != nullptr) {
1276
+ *rc->data.registered.optional_payload = payload_;
1277
+ payload_ = nullptr;
1278
+ }
1279
+ break;
1280
+ default:
1281
+ GPR_UNREACHABLE_CODE(return );
1039
1282
  }
1283
+ grpc_cq_end_op(cq_new_, rc->tag, GRPC_ERROR_NONE, Server::DoneRequestEvent,
1284
+ rc, &rc->completion, true);
1285
+ }
1040
1286
 
1041
- if (args != nullptr) {
1042
- grpc_resource_quota* resource_quota =
1043
- grpc_resource_quota_from_channel_args(args, false /* create */);
1044
- if (resource_quota != nullptr) {
1045
- server->default_resource_user =
1046
- grpc_resource_user_create(resource_quota, "default");
1047
- }
1287
+ void Server::CallData::PublishNewRpc(void* arg, grpc_error* error) {
1288
+ grpc_call_element* call_elem = static_cast<grpc_call_element*>(arg);
1289
+ auto* calld = static_cast<Server::CallData*>(call_elem->call_data);
1290
+ auto* chand = static_cast<Server::ChannelData*>(call_elem->channel_data);
1291
+ RequestMatcherInterface* rm = calld->matcher_;
1292
+ Server* server = rm->server();
1293
+ if (error != GRPC_ERROR_NONE || server->ShutdownCalled()) {
1294
+ calld->state_.Store(CallState::ZOMBIED, MemoryOrder::RELAXED);
1295
+ calld->KillZombie();
1296
+ return;
1048
1297
  }
1049
-
1050
- return server;
1298
+ rm->MatchOrQueue(chand->cq_idx(), calld);
1051
1299
  }
1052
1300
 
1053
- static int streq(const char* a, const char* b) {
1054
- if (a == nullptr && b == nullptr) return 1;
1055
- if (a == nullptr) return 0;
1056
- if (b == nullptr) return 0;
1057
- return 0 == strcmp(a, b);
1058
- }
1301
+ namespace {
1059
1302
 
1060
- void* grpc_server_register_method(
1061
- grpc_server* server, const char* method, const char* host,
1062
- grpc_server_register_method_payload_handling payload_handling,
1063
- uint32_t flags) {
1064
- registered_method* m;
1065
- GRPC_API_TRACE(
1066
- "grpc_server_register_method(server=%p, method=%s, host=%s, "
1067
- "flags=0x%08x)",
1068
- 4, (server, method, host, flags));
1069
- if (!method) {
1070
- gpr_log(GPR_ERROR,
1071
- "grpc_server_register_method method string cannot be NULL");
1072
- return nullptr;
1073
- }
1074
- for (m = server->registered_methods; m; m = m->next) {
1075
- if (streq(m->method, method) && streq(m->host, host)) {
1076
- gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
1077
- host ? host : "*");
1078
- return nullptr;
1079
- }
1080
- }
1081
- if ((flags & ~GRPC_INITIAL_METADATA_USED_MASK) != 0) {
1082
- gpr_log(GPR_ERROR, "grpc_server_register_method invalid flags 0x%08x",
1083
- flags);
1084
- return nullptr;
1085
- }
1086
- m = static_cast<registered_method*>(gpr_zalloc(sizeof(registered_method)));
1087
- m->method = gpr_strdup(method);
1088
- m->host = gpr_strdup(host);
1089
- m->next = server->registered_methods;
1090
- m->payload_handling = payload_handling;
1091
- m->flags = flags;
1092
- server->registered_methods = m;
1093
- return m;
1303
+ void KillZombieClosure(void* call, grpc_error* /*error*/) {
1304
+ grpc_call_unref(static_cast<grpc_call*>(call));
1094
1305
  }
1095
1306
 
1096
- void grpc_server_start(grpc_server* server) {
1097
- size_t i;
1098
- grpc_core::ExecCtx exec_ctx;
1307
+ } // namespace
1099
1308
 
1100
- GRPC_API_TRACE("grpc_server_start(server=%p)", 1, (server));
1309
+ void Server::CallData::KillZombie() {
1310
+ GRPC_CLOSURE_INIT(&kill_zombie_closure_, KillZombieClosure, call_,
1311
+ grpc_schedule_on_exec_ctx);
1312
+ ExecCtx::Run(DEBUG_LOCATION, &kill_zombie_closure_, GRPC_ERROR_NONE);
1313
+ }
1101
1314
 
1102
- server->started = true;
1103
- server->pollset_count = 0;
1104
- server->pollsets = static_cast<grpc_pollset**>(
1105
- gpr_malloc(sizeof(grpc_pollset*) * server->cq_count));
1106
- for (i = 0; i < server->cq_count; i++) {
1107
- if (grpc_cq_can_listen(server->cqs[i])) {
1108
- server->pollsets[server->pollset_count++] =
1109
- grpc_cq_pollset(server->cqs[i]);
1315
+ void Server::CallData::StartNewRpc(grpc_call_element* elem) {
1316
+ auto* chand = static_cast<ChannelData*>(elem->channel_data);
1317
+ if (server_->ShutdownCalled()) {
1318
+ state_.Store(CallState::ZOMBIED, MemoryOrder::RELAXED);
1319
+ KillZombie();
1320
+ return;
1321
+ }
1322
+ // Find request matcher.
1323
+ matcher_ = server_->unregistered_request_matcher_.get();
1324
+ grpc_server_register_method_payload_handling payload_handling =
1325
+ GRPC_SRM_PAYLOAD_NONE;
1326
+ if (path_.has_value() && host_.has_value()) {
1327
+ ChannelRegisteredMethod* rm =
1328
+ chand->GetRegisteredMethod(*host_, *path_,
1329
+ (recv_initial_metadata_flags_ &
1330
+ GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST));
1331
+ if (rm != nullptr) {
1332
+ matcher_ = rm->server_registered_method->matcher.get();
1333
+ payload_handling = rm->server_registered_method->payload_handling;
1110
1334
  }
1111
1335
  }
1112
- request_matcher_init(&server->unregistered_request_matcher, server);
1113
- for (registered_method* rm = server->registered_methods; rm; rm = rm->next) {
1114
- request_matcher_init(&rm->matcher, server);
1336
+ // Start recv_message op if needed.
1337
+ switch (payload_handling) {
1338
+ case GRPC_SRM_PAYLOAD_NONE:
1339
+ PublishNewRpc(elem, GRPC_ERROR_NONE);
1340
+ break;
1341
+ case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER: {
1342
+ grpc_op op;
1343
+ op.op = GRPC_OP_RECV_MESSAGE;
1344
+ op.flags = 0;
1345
+ op.reserved = nullptr;
1346
+ op.data.recv_message.recv_message = &payload_;
1347
+ GRPC_CLOSURE_INIT(&publish_, PublishNewRpc, elem,
1348
+ grpc_schedule_on_exec_ctx);
1349
+ grpc_call_start_batch_and_execute(call_, &op, 1, &publish_);
1350
+ break;
1351
+ }
1115
1352
  }
1353
+ }
1116
1354
 
1117
- gpr_mu_lock(&server->mu_global);
1118
- server->starting = true;
1119
- gpr_mu_unlock(&server->mu_global);
1120
-
1121
- for (listener* l = server->listeners; l; l = l->next) {
1122
- l->start(server, l->arg, server->pollsets, server->pollset_count);
1355
+ void Server::CallData::RecvInitialMetadataBatchComplete(void* arg,
1356
+ grpc_error* error) {
1357
+ grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
1358
+ auto* calld = static_cast<Server::CallData*>(elem->call_data);
1359
+ if (error != GRPC_ERROR_NONE) {
1360
+ calld->FailCallCreation();
1361
+ return;
1123
1362
  }
1124
-
1125
- gpr_mu_lock(&server->mu_global);
1126
- server->starting = false;
1127
- gpr_cv_signal(&server->starting_cv);
1128
- gpr_mu_unlock(&server->mu_global);
1363
+ calld->StartNewRpc(elem);
1129
1364
  }
1130
1365
 
1131
- void grpc_server_get_pollsets(grpc_server* server, grpc_pollset*** pollsets,
1132
- size_t* pollset_count) {
1133
- *pollset_count = server->pollset_count;
1134
- *pollsets = server->pollsets;
1366
+ void Server::CallData::StartTransportStreamOpBatchImpl(
1367
+ grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
1368
+ if (batch->recv_initial_metadata) {
1369
+ GPR_ASSERT(batch->payload->recv_initial_metadata.recv_flags == nullptr);
1370
+ recv_initial_metadata_ =
1371
+ batch->payload->recv_initial_metadata.recv_initial_metadata;
1372
+ original_recv_initial_metadata_ready_ =
1373
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
1374
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
1375
+ &recv_initial_metadata_ready_;
1376
+ batch->payload->recv_initial_metadata.recv_flags =
1377
+ &recv_initial_metadata_flags_;
1378
+ }
1379
+ if (batch->recv_trailing_metadata) {
1380
+ original_recv_trailing_metadata_ready_ =
1381
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
1382
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
1383
+ &recv_trailing_metadata_ready_;
1384
+ }
1385
+ grpc_call_next_op(elem, batch);
1135
1386
  }
1136
1387
 
1137
- class ConnectivityWatcher
1138
- : public grpc_core::AsyncConnectivityStateWatcherInterface {
1139
- public:
1140
- explicit ConnectivityWatcher(channel_data* chand) : chand_(chand) {
1141
- GRPC_CHANNEL_INTERNAL_REF(chand_->channel, "connectivity");
1142
- }
1143
-
1144
- ~ConnectivityWatcher() {
1145
- GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel, "connectivity");
1388
+ void Server::CallData::RecvInitialMetadataReady(void* arg, grpc_error* error) {
1389
+ grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
1390
+ CallData* calld = static_cast<CallData*>(elem->call_data);
1391
+ grpc_millis op_deadline;
1392
+ if (error == GRPC_ERROR_NONE) {
1393
+ GPR_DEBUG_ASSERT(calld->recv_initial_metadata_->idx.named.path != nullptr);
1394
+ GPR_DEBUG_ASSERT(calld->recv_initial_metadata_->idx.named.authority !=
1395
+ nullptr);
1396
+ calld->path_.emplace(grpc_slice_ref_internal(
1397
+ GRPC_MDVALUE(calld->recv_initial_metadata_->idx.named.path->md)));
1398
+ calld->host_.emplace(grpc_slice_ref_internal(
1399
+ GRPC_MDVALUE(calld->recv_initial_metadata_->idx.named.authority->md)));
1400
+ grpc_metadata_batch_remove(calld->recv_initial_metadata_, GRPC_BATCH_PATH);
1401
+ grpc_metadata_batch_remove(calld->recv_initial_metadata_,
1402
+ GRPC_BATCH_AUTHORITY);
1403
+ } else {
1404
+ GRPC_ERROR_REF(error);
1146
1405
  }
1147
-
1148
- private:
1149
- void OnConnectivityStateChange(grpc_connectivity_state new_state) override {
1150
- // Don't do anything until we are being shut down.
1151
- if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
1152
- // Shut down channel.
1153
- grpc_server* server = chand_->server;
1154
- gpr_mu_lock(&server->mu_global);
1155
- destroy_channel(chand_);
1156
- gpr_mu_unlock(&server->mu_global);
1406
+ op_deadline = calld->recv_initial_metadata_->deadline;
1407
+ if (op_deadline != GRPC_MILLIS_INF_FUTURE) {
1408
+ calld->deadline_ = op_deadline;
1157
1409
  }
1158
-
1159
- channel_data* chand_;
1160
- };
1161
-
1162
- void grpc_server_setup_transport(
1163
- grpc_server* s, grpc_transport* transport, grpc_pollset* accepting_pollset,
1164
- const grpc_channel_args* args,
1165
- const grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode>&
1166
- socket_node,
1167
- grpc_resource_user* resource_user) {
1168
- size_t num_registered_methods;
1169
- size_t alloc;
1170
- registered_method* rm;
1171
- channel_registered_method* crm;
1172
- grpc_channel* channel;
1173
- channel_data* chand;
1174
- uint32_t hash;
1175
- size_t slots;
1176
- uint32_t probes;
1177
- uint32_t max_probes = 0;
1178
- grpc_transport_op* op = nullptr;
1179
-
1180
- channel = grpc_channel_create(nullptr, args, GRPC_SERVER_CHANNEL, transport,
1181
- resource_user);
1182
- chand = static_cast<channel_data*>(
1183
- grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0)
1184
- ->channel_data);
1185
- chand->server = s;
1186
- server_ref(s);
1187
- chand->channel = channel;
1188
- if (socket_node != nullptr) {
1189
- chand->channelz_socket_uuid = socket_node->uuid();
1190
- s->channelz_server->AddChildSocket(socket_node);
1410
+ if (calld->host_.has_value() && calld->path_.has_value()) {
1411
+ /* do nothing */
1191
1412
  } else {
1192
- chand->channelz_socket_uuid = 0;
1193
- }
1194
-
1195
- size_t cq_idx;
1196
- for (cq_idx = 0; cq_idx < s->cq_count; cq_idx++) {
1197
- if (grpc_cq_pollset(s->cqs[cq_idx]) == accepting_pollset) break;
1413
+ /* Pass the error reference to calld->recv_initial_metadata_error */
1414
+ grpc_error* src_error = error;
1415
+ error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
1416
+ "Missing :authority or :path", &src_error, 1);
1417
+ GRPC_ERROR_UNREF(src_error);
1418
+ calld->recv_initial_metadata_error_ = GRPC_ERROR_REF(error);
1198
1419
  }
1199
- if (cq_idx == s->cq_count) {
1200
- /* completion queue not found: pick a random one to publish new calls to */
1201
- cq_idx = static_cast<size_t>(rand()) % s->cq_count;
1420
+ grpc_closure* closure = calld->original_recv_initial_metadata_ready_;
1421
+ calld->original_recv_initial_metadata_ready_ = nullptr;
1422
+ if (calld->seen_recv_trailing_metadata_ready_) {
1423
+ GRPC_CALL_COMBINER_START(calld->call_combiner_,
1424
+ &calld->recv_trailing_metadata_ready_,
1425
+ calld->recv_trailing_metadata_error_,
1426
+ "continue server recv_trailing_metadata_ready");
1202
1427
  }
1203
- chand->cq_idx = cq_idx;
1428
+ Closure::Run(DEBUG_LOCATION, closure, error);
1429
+ }
1204
1430
 
1205
- num_registered_methods = 0;
1206
- for (rm = s->registered_methods; rm; rm = rm->next) {
1207
- num_registered_methods++;
1208
- }
1209
- /* build a lookup table phrased in terms of mdstr's in this channels context
1210
- to quickly find registered methods */
1211
- if (num_registered_methods > 0) {
1212
- slots = 2 * num_registered_methods;
1213
- alloc = sizeof(channel_registered_method) * slots;
1214
- chand->registered_methods =
1215
- static_cast<channel_registered_method*>(gpr_zalloc(alloc));
1216
- for (rm = s->registered_methods; rm; rm = rm->next) {
1217
- grpc_core::ExternallyManagedSlice host;
1218
- grpc_core::ExternallyManagedSlice method(rm->method);
1219
- const bool has_host = rm->host != nullptr;
1220
- if (has_host) {
1221
- host = grpc_core::ExternallyManagedSlice(rm->host);
1222
- }
1223
- hash = GRPC_MDSTR_KV_HASH(has_host ? host.Hash() : 0, method.Hash());
1224
- for (probes = 0; chand->registered_methods[(hash + probes) % slots]
1225
- .server_registered_method != nullptr;
1226
- probes++)
1227
- ;
1228
- if (probes > max_probes) max_probes = probes;
1229
- crm = &chand->registered_methods[(hash + probes) % slots];
1230
- crm->server_registered_method = rm;
1231
- crm->flags = rm->flags;
1232
- crm->has_host = has_host;
1233
- if (has_host) {
1234
- crm->host = host;
1235
- }
1236
- crm->method = method;
1237
- }
1238
- GPR_ASSERT(slots <= UINT32_MAX);
1239
- chand->registered_method_slots = static_cast<uint32_t>(slots);
1240
- chand->registered_method_max_probes = max_probes;
1431
+ void Server::CallData::RecvTrailingMetadataReady(void* arg, grpc_error* error) {
1432
+ grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
1433
+ CallData* calld = static_cast<CallData*>(elem->call_data);
1434
+ if (calld->original_recv_initial_metadata_ready_ != nullptr) {
1435
+ calld->recv_trailing_metadata_error_ = GRPC_ERROR_REF(error);
1436
+ calld->seen_recv_trailing_metadata_ready_ = true;
1437
+ GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_ready_,
1438
+ RecvTrailingMetadataReady, elem,
1439
+ grpc_schedule_on_exec_ctx);
1440
+ GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
1441
+ "deferring server recv_trailing_metadata_ready "
1442
+ "until after recv_initial_metadata_ready");
1443
+ return;
1241
1444
  }
1445
+ error =
1446
+ grpc_error_add_child(GRPC_ERROR_REF(error),
1447
+ GRPC_ERROR_REF(calld->recv_initial_metadata_error_));
1448
+ Closure::Run(DEBUG_LOCATION, calld->original_recv_trailing_metadata_ready_,
1449
+ error);
1450
+ }
1242
1451
 
1243
- gpr_mu_lock(&s->mu_global);
1244
- chand->next = &s->root_channel_data;
1245
- chand->prev = chand->next->prev;
1246
- chand->next->prev = chand->prev->next = chand;
1247
- gpr_mu_unlock(&s->mu_global);
1452
+ grpc_error* Server::CallData::InitCallElement(
1453
+ grpc_call_element* elem, const grpc_call_element_args* args) {
1454
+ auto* chand = static_cast<ChannelData*>(elem->channel_data);
1455
+ new (elem->call_data) Server::CallData(elem, *args, chand->server());
1456
+ return GRPC_ERROR_NONE;
1457
+ }
1248
1458
 
1249
- op = grpc_make_transport_op(nullptr);
1250
- op->set_accept_stream = true;
1251
- op->set_accept_stream_fn = accept_stream;
1252
- op->set_accept_stream_user_data = chand;
1253
- op->start_connectivity_watch.reset(new ConnectivityWatcher(chand));
1254
- if (gpr_atm_acq_load(&s->shutdown_flag) != 0) {
1255
- op->disconnect_with_error =
1256
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown");
1257
- }
1258
- grpc_transport_perform_op(transport, op);
1459
+ void Server::CallData::DestroyCallElement(
1460
+ grpc_call_element* elem, const grpc_call_final_info* /*final_info*/,
1461
+ grpc_closure* /*ignored*/) {
1462
+ auto* calld = static_cast<CallData*>(elem->call_data);
1463
+ calld->~CallData();
1259
1464
  }
1260
1465
 
1261
- void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) {
1262
- (void)done_arg;
1263
- gpr_free(storage);
1466
+ void Server::CallData::StartTransportStreamOpBatch(
1467
+ grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
1468
+ auto* calld = static_cast<CallData*>(elem->call_data);
1469
+ calld->StartTransportStreamOpBatchImpl(elem, batch);
1264
1470
  }
1265
1471
 
1266
- static void listener_destroy_done(void* s, grpc_error* /*error*/) {
1267
- grpc_server* server = static_cast<grpc_server*>(s);
1268
- gpr_mu_lock(&server->mu_global);
1269
- server->listeners_destroyed++;
1270
- maybe_finish_shutdown(server);
1271
- gpr_mu_unlock(&server->mu_global);
1472
+ } // namespace grpc_core
1473
+
1474
+ //
1475
+ // C-core API
1476
+ //
1477
+
1478
+ grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) {
1479
+ grpc_core::ExecCtx exec_ctx;
1480
+ GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved));
1481
+ grpc_server* c_server = new grpc_server;
1482
+ c_server->core_server = grpc_core::MakeOrphanable<grpc_core::Server>(args);
1483
+ return c_server;
1272
1484
  }
1273
1485
 
1274
- /*
1275
- - Kills all pending requests-for-incoming-RPC-calls (i.e the requests made via
1276
- grpc_server_request_call and grpc_server_request_registered call will now be
1277
- cancelled). See 'kill_pending_work_locked()'
1486
+ void grpc_server_register_completion_queue(grpc_server* server,
1487
+ grpc_completion_queue* cq,
1488
+ void* reserved) {
1489
+ GRPC_API_TRACE(
1490
+ "grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3,
1491
+ (server, cq, reserved));
1492
+ GPR_ASSERT(!reserved);
1493
+ auto cq_type = grpc_get_cq_completion_type(cq);
1494
+ if (cq_type != GRPC_CQ_NEXT && cq_type != GRPC_CQ_CALLBACK) {
1495
+ gpr_log(GPR_INFO,
1496
+ "Completion queue of type %d is being registered as a "
1497
+ "server-completion-queue",
1498
+ static_cast<int>(cq_type));
1499
+ /* Ideally we should log an error and abort but ruby-wrapped-language API
1500
+ calls grpc_completion_queue_pluck() on server completion queues */
1501
+ }
1502
+ server->core_server->RegisterCompletionQueue(cq);
1503
+ }
1278
1504
 
1279
- - Shuts down the listeners (i.e the server will no longer listen on the port
1280
- for new incoming channels).
1505
+ void* grpc_server_register_method(
1506
+ grpc_server* server, const char* method, const char* host,
1507
+ grpc_server_register_method_payload_handling payload_handling,
1508
+ uint32_t flags) {
1509
+ GRPC_API_TRACE(
1510
+ "grpc_server_register_method(server=%p, method=%s, host=%s, "
1511
+ "flags=0x%08x)",
1512
+ 4, (server, method, host, flags));
1513
+ return server->core_server->RegisterMethod(method, host, payload_handling,
1514
+ flags);
1515
+ }
1516
+
1517
+ void grpc_server_start(grpc_server* server) {
1518
+ grpc_core::ExecCtx exec_ctx;
1519
+ GRPC_API_TRACE("grpc_server_start(server=%p)", 1, (server));
1520
+ server->core_server->Start();
1521
+ }
1281
1522
 
1282
- - Iterates through all channels on the server and sends shutdown msg (see
1283
- 'channel_broadcaster_shutdown()' for details) to the clients via the
1284
- transport layer. The transport layer then guarantees the following:
1285
- -- Sends shutdown to the client (for eg: HTTP2 transport sends GOAWAY)
1286
- -- If the server has outstanding calls that are in the process, the
1287
- connection is NOT closed until the server is done with all those calls
1288
- -- Once, there are no more calls in progress, the channel is closed
1289
- */
1290
1523
  void grpc_server_shutdown_and_notify(grpc_server* server,
1291
1524
  grpc_completion_queue* cq, void* tag) {
1292
- listener* l;
1293
- shutdown_tag* sdt;
1294
- channel_broadcaster broadcaster;
1295
1525
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1296
1526
  grpc_core::ExecCtx exec_ctx;
1297
-
1298
1527
  GRPC_API_TRACE("grpc_server_shutdown_and_notify(server=%p, cq=%p, tag=%p)", 3,
1299
1528
  (server, cq, tag));
1300
-
1301
- /* wait for startup to be finished: locks mu_global */
1302
- gpr_mu_lock(&server->mu_global);
1303
- while (server->starting) {
1304
- gpr_cv_wait(&server->starting_cv, &server->mu_global,
1305
- gpr_inf_future(GPR_CLOCK_MONOTONIC));
1306
- }
1307
-
1308
- /* stay locked, and gather up some stuff to do */
1309
- GPR_ASSERT(grpc_cq_begin_op(cq, tag));
1310
- if (server->shutdown_published) {
1311
- grpc_cq_end_op(cq, tag, GRPC_ERROR_NONE, done_published_shutdown, nullptr,
1312
- static_cast<grpc_cq_completion*>(
1313
- gpr_malloc(sizeof(grpc_cq_completion))));
1314
- gpr_mu_unlock(&server->mu_global);
1315
- return;
1316
- }
1317
- server->shutdown_tags = static_cast<shutdown_tag*>(
1318
- gpr_realloc(server->shutdown_tags,
1319
- sizeof(shutdown_tag) * (server->num_shutdown_tags + 1)));
1320
- sdt = &server->shutdown_tags[server->num_shutdown_tags++];
1321
- sdt->tag = tag;
1322
- sdt->cq = cq;
1323
- if (gpr_atm_acq_load(&server->shutdown_flag)) {
1324
- gpr_mu_unlock(&server->mu_global);
1325
- return;
1326
- }
1327
-
1328
- server->last_shutdown_message_time = gpr_now(GPR_CLOCK_REALTIME);
1329
-
1330
- channel_broadcaster_init(server, &broadcaster);
1331
-
1332
- gpr_atm_rel_store(&server->shutdown_flag, 1);
1333
-
1334
- /* collect all unregistered then registered calls */
1335
- gpr_mu_lock(&server->mu_call);
1336
- kill_pending_work_locked(
1337
- server, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
1338
- gpr_mu_unlock(&server->mu_call);
1339
-
1340
- maybe_finish_shutdown(server);
1341
- gpr_mu_unlock(&server->mu_global);
1342
-
1343
- /* Shutdown listeners */
1344
- for (l = server->listeners; l; l = l->next) {
1345
- GRPC_CLOSURE_INIT(&l->destroy_done, listener_destroy_done, server,
1346
- grpc_schedule_on_exec_ctx);
1347
- l->destroy(server, l->arg, &l->destroy_done);
1348
- if (server->channelz_server != nullptr && l->socket_uuid != 0) {
1349
- server->channelz_server->RemoveChildListenSocket(l->socket_uuid);
1350
- }
1351
- }
1352
-
1353
- channel_broadcaster_shutdown(&broadcaster, true /* send_goaway */,
1354
- GRPC_ERROR_NONE);
1355
-
1356
- if (server->default_resource_user != nullptr) {
1357
- grpc_resource_quota_unref(
1358
- grpc_resource_user_quota(server->default_resource_user));
1359
- grpc_resource_user_shutdown(server->default_resource_user);
1360
- grpc_resource_user_unref(server->default_resource_user);
1361
- }
1529
+ server->core_server->ShutdownAndNotify(cq, tag);
1362
1530
  }
1363
1531
 
1364
1532
  void grpc_server_cancel_all_calls(grpc_server* server) {
1365
- channel_broadcaster broadcaster;
1366
1533
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1367
1534
  grpc_core::ExecCtx exec_ctx;
1368
-
1369
1535
  GRPC_API_TRACE("grpc_server_cancel_all_calls(server=%p)", 1, (server));
1370
-
1371
- gpr_mu_lock(&server->mu_global);
1372
- channel_broadcaster_init(server, &broadcaster);
1373
- gpr_mu_unlock(&server->mu_global);
1374
-
1375
- channel_broadcaster_shutdown(
1376
- &broadcaster, false /* send_goaway */,
1377
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Cancelling all calls"));
1536
+ server->core_server->CancelAllCalls();
1378
1537
  }
1379
1538
 
1380
1539
  void grpc_server_destroy(grpc_server* server) {
1381
- listener* l;
1382
1540
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1383
1541
  grpc_core::ExecCtx exec_ctx;
1384
-
1385
1542
  GRPC_API_TRACE("grpc_server_destroy(server=%p)", 1, (server));
1386
-
1387
- gpr_mu_lock(&server->mu_global);
1388
- GPR_ASSERT(gpr_atm_acq_load(&server->shutdown_flag) || !server->listeners);
1389
- GPR_ASSERT(server->listeners_destroyed == num_listeners(server));
1390
-
1391
- while (server->listeners) {
1392
- l = server->listeners;
1393
- server->listeners = l->next;
1394
- gpr_free(l);
1395
- }
1396
-
1397
- gpr_mu_unlock(&server->mu_global);
1398
-
1399
- server_unref(server);
1400
- }
1401
-
1402
- void grpc_server_add_listener(
1403
- grpc_server* server, void* listener_arg,
1404
- void (*start)(grpc_server* server, void* arg, grpc_pollset** pollsets,
1405
- size_t pollset_count),
1406
- void (*destroy)(grpc_server* server, void* arg, grpc_closure* on_done),
1407
- grpc_core::RefCountedPtr<grpc_core::channelz::ListenSocketNode> node) {
1408
- listener* l = static_cast<listener*>(gpr_malloc(sizeof(listener)));
1409
- l->arg = listener_arg;
1410
- l->start = start;
1411
- l->destroy = destroy;
1412
- l->socket_uuid = 0;
1413
- if (node != nullptr) {
1414
- l->socket_uuid = node->uuid();
1415
- if (server->channelz_server != nullptr) {
1416
- server->channelz_server->AddChildListenSocket(std::move(node));
1417
- }
1418
- }
1419
- l->next = server->listeners;
1420
- server->listeners = l;
1421
- }
1422
-
1423
- static grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx,
1424
- requested_call* rc) {
1425
- call_data* calld = nullptr;
1426
- request_matcher* rm = nullptr;
1427
- if (gpr_atm_acq_load(&server->shutdown_flag)) {
1428
- fail_call(server, cq_idx, rc,
1429
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
1430
- return GRPC_CALL_OK;
1431
- }
1432
- switch (rc->type) {
1433
- case BATCH_CALL:
1434
- rm = &server->unregistered_request_matcher;
1435
- break;
1436
- case REGISTERED_CALL:
1437
- rm = &rc->data.registered.method->matcher;
1438
- break;
1439
- }
1440
- if (rm->requests_per_cq[cq_idx].Push(rc->mpscq_node.get())) {
1441
- /* this was the first queued request: we need to lock and start
1442
- matching calls */
1443
- gpr_mu_lock(&server->mu_call);
1444
- while ((calld = rm->pending_head) != nullptr) {
1445
- rc = reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].Pop());
1446
- if (rc == nullptr) break;
1447
- rm->pending_head = calld->pending_next;
1448
- gpr_mu_unlock(&server->mu_call);
1449
- if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) {
1450
- // Zombied Call
1451
- GRPC_CLOSURE_INIT(
1452
- &calld->kill_zombie_closure, kill_zombie,
1453
- grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
1454
- grpc_schedule_on_exec_ctx);
1455
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
1456
- GRPC_ERROR_NONE);
1457
- } else {
1458
- publish_call(server, calld, cq_idx, rc);
1459
- }
1460
- gpr_mu_lock(&server->mu_call);
1461
- }
1462
- gpr_mu_unlock(&server->mu_call);
1463
- }
1464
- return GRPC_CALL_OK;
1543
+ delete server;
1465
1544
  }
1466
1545
 
1467
1546
  grpc_call_error grpc_server_request_call(
1468
1547
  grpc_server* server, grpc_call** call, grpc_call_details* details,
1469
- grpc_metadata_array* initial_metadata,
1548
+ grpc_metadata_array* request_metadata,
1470
1549
  grpc_completion_queue* cq_bound_to_call,
1471
1550
  grpc_completion_queue* cq_for_notification, void* tag) {
1472
- grpc_call_error error;
1473
1551
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1474
1552
  grpc_core::ExecCtx exec_ctx;
1475
- requested_call* rc = static_cast<requested_call*>(gpr_malloc(sizeof(*rc)));
1476
1553
  GRPC_STATS_INC_SERVER_REQUESTED_CALLS();
1477
1554
  GRPC_API_TRACE(
1478
1555
  "grpc_server_request_call("
1479
1556
  "server=%p, call=%p, details=%p, initial_metadata=%p, "
1480
1557
  "cq_bound_to_call=%p, cq_for_notification=%p, tag=%p)",
1481
1558
  7,
1482
- (server, call, details, initial_metadata, cq_bound_to_call,
1559
+ (server, call, details, request_metadata, cq_bound_to_call,
1483
1560
  cq_for_notification, tag));
1484
- size_t cq_idx;
1485
- for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
1486
- if (server->cqs[cq_idx] == cq_for_notification) {
1487
- break;
1488
- }
1489
- }
1490
- if (cq_idx == server->cq_count) {
1491
- gpr_free(rc);
1492
- error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
1493
- goto done;
1494
- }
1495
- if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
1496
- gpr_free(rc);
1497
- error = GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
1498
- goto done;
1499
- }
1500
- details->reserved = nullptr;
1501
- rc->cq_idx = cq_idx;
1502
- rc->type = BATCH_CALL;
1503
- rc->server = server;
1504
- rc->tag = tag;
1505
- rc->cq_bound_to_call = cq_bound_to_call;
1506
- rc->call = call;
1507
- rc->data.batch.details = details;
1508
- rc->initial_metadata = initial_metadata;
1509
- error = queue_call_request(server, cq_idx, rc);
1510
- done:
1511
-
1512
- return error;
1561
+ return server->core_server->RequestCall(call, details, request_metadata,
1562
+ cq_bound_to_call, cq_for_notification,
1563
+ tag);
1513
1564
  }
1514
1565
 
1515
1566
  grpc_call_error grpc_server_request_registered_call(
1516
- grpc_server* server, void* rmp, grpc_call** call, gpr_timespec* deadline,
1517
- grpc_metadata_array* initial_metadata, grpc_byte_buffer** optional_payload,
1567
+ grpc_server* server, void* registered_method, grpc_call** call,
1568
+ gpr_timespec* deadline, grpc_metadata_array* request_metadata,
1569
+ grpc_byte_buffer** optional_payload,
1518
1570
  grpc_completion_queue* cq_bound_to_call,
1519
- grpc_completion_queue* cq_for_notification, void* tag) {
1571
+ grpc_completion_queue* cq_for_notification, void* tag_new) {
1520
1572
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1521
1573
  grpc_core::ExecCtx exec_ctx;
1522
1574
  GRPC_STATS_INC_SERVER_REQUESTED_CALLS();
1523
- requested_call* rc = static_cast<requested_call*>(gpr_malloc(sizeof(*rc)));
1524
- registered_method* rm = static_cast<registered_method*>(rmp);
1575
+ auto* rm =
1576
+ static_cast<grpc_core::Server::RegisteredMethod*>(registered_method);
1525
1577
  GRPC_API_TRACE(
1526
1578
  "grpc_server_request_registered_call("
1527
- "server=%p, rmp=%p, call=%p, deadline=%p, initial_metadata=%p, "
1579
+ "server=%p, registered_method=%p, call=%p, deadline=%p, "
1580
+ "request_metadata=%p, "
1528
1581
  "optional_payload=%p, cq_bound_to_call=%p, cq_for_notification=%p, "
1529
1582
  "tag=%p)",
1530
1583
  9,
1531
- (server, rmp, call, deadline, initial_metadata, optional_payload,
1532
- cq_bound_to_call, cq_for_notification, tag));
1533
-
1534
- size_t cq_idx;
1535
- for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
1536
- if (server->cqs[cq_idx] == cq_for_notification) {
1537
- break;
1538
- }
1539
- }
1540
- if (cq_idx == server->cq_count) {
1541
- gpr_free(rc);
1542
- return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
1543
- }
1544
- if ((optional_payload == nullptr) !=
1545
- (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)) {
1546
- gpr_free(rc);
1547
- return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
1548
- }
1549
-
1550
- if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
1551
- gpr_free(rc);
1552
- return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
1553
- }
1554
- rc->cq_idx = cq_idx;
1555
- rc->type = REGISTERED_CALL;
1556
- rc->server = server;
1557
- rc->tag = tag;
1558
- rc->cq_bound_to_call = cq_bound_to_call;
1559
- rc->call = call;
1560
- rc->data.registered.method = rm;
1561
- rc->data.registered.deadline = deadline;
1562
- rc->initial_metadata = initial_metadata;
1563
- rc->data.registered.optional_payload = optional_payload;
1564
- return queue_call_request(server, cq_idx, rc);
1565
- }
1566
-
1567
- static void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
1568
- grpc_error* error) {
1569
- *rc->call = nullptr;
1570
- rc->initial_metadata->count = 0;
1571
- GPR_ASSERT(error != GRPC_ERROR_NONE);
1572
-
1573
- grpc_cq_end_op(server->cqs[cq_idx], rc->tag, error, done_request_event, rc,
1574
- &rc->completion);
1584
+ (server, registered_method, call, deadline, request_metadata,
1585
+ optional_payload, cq_bound_to_call, cq_for_notification, tag_new));
1586
+ return server->core_server->RequestRegisteredCall(
1587
+ rm, call, deadline, request_metadata, optional_payload, cq_bound_to_call,
1588
+ cq_for_notification, tag_new);
1575
1589
  }
1576
1590
 
1577
- const grpc_channel_args* grpc_server_get_channel_args(grpc_server* server) {
1578
- return server->channel_args;
1579
- }
1580
-
1581
- grpc_resource_user* grpc_server_get_default_resource_user(grpc_server* server) {
1582
- return server->default_resource_user;
1583
- }
1584
-
1585
- int grpc_server_has_open_connections(grpc_server* server) {
1586
- int r;
1587
- gpr_mu_lock(&server->mu_global);
1588
- r = server->root_channel_data.next != &server->root_channel_data;
1589
- gpr_mu_unlock(&server->mu_global);
1590
- return r;
1591
+ void grpc_server_set_config_fetcher(
1592
+ grpc_server* server, grpc_server_config_fetcher* server_config_fetcher) {
1593
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1594
+ grpc_core::ExecCtx exec_ctx;
1595
+ GRPC_API_TRACE("grpc_server_set_config_fetcher(server=%p, config_fetcher=%p)",
1596
+ 2, (server, server_config_fetcher));
1597
+ server->core_server->set_config_fetcher(
1598
+ std::unique_ptr<grpc_server_config_fetcher>(server_config_fetcher));
1591
1599
  }
1592
1600
 
1593
- grpc_core::channelz::ServerNode* grpc_server_get_channelz_node(
1594
- grpc_server* server) {
1595
- if (server == nullptr) {
1596
- return nullptr;
1597
- }
1598
- return server->channelz_server.get();
1601
+ void grpc_server_config_fetcher_destroy(
1602
+ grpc_server_config_fetcher* server_config_fetcher) {
1603
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1604
+ grpc_core::ExecCtx exec_ctx;
1605
+ GRPC_API_TRACE("grpc_server_config_fetcher_destroy(config_fetcher=%p)", 1,
1606
+ (server_config_fetcher));
1607
+ delete server_config_fetcher;
1599
1608
  }