grpc 1.36.0 → 1.38.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 (680) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +126 -92
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +15 -1
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +7 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +715 -3166
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +9 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +18 -14
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  24. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  26. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  27. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  28. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  29. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -1
  30. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  36. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  40. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  41. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +29 -44
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +32 -47
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +86 -63
  46. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  48. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  49. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  50. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  51. data/src/core/ext/filters/client_channel/resolver.cc +3 -0
  52. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +17 -15
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +38 -33
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  62. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  63. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  64. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  65. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +31 -14
  66. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  67. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +334 -114
  68. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  69. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  70. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  71. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  72. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  73. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  74. data/src/core/ext/filters/client_channel/server_address.cc +4 -1
  75. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  76. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  77. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  78. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  79. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  80. data/src/core/ext/filters/client_channel/subchannel.cc +86 -162
  81. data/src/core/ext/filters/client_channel/subchannel.h +68 -99
  82. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  83. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  84. data/src/core/ext/filters/client_idle/client_idle_filter.cc +17 -16
  85. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  86. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +501 -0
  87. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  88. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  89. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  90. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  91. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  92. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  93. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  94. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  95. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  96. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  97. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  98. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +5 -4
  99. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -8
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +5 -4
  102. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +2 -2
  103. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -5
  104. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +485 -199
  105. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  106. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  107. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -3
  108. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +167 -122
  110. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  111. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  112. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  113. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  114. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  115. data/src/core/ext/transport/chttp2/transport/frame_data.cc +13 -9
  116. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  118. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  120. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  122. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  124. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  125. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  126. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  128. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  129. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  130. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  131. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  132. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  133. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/internal.h +32 -27
  135. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  138. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  139. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  140. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  141. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  144. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  145. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  146. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  147. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  148. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -0
  149. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +44 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  151. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  154. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  155. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  156. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +6 -5
  157. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +13 -9
  158. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  159. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  160. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  161. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  162. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  163. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  164. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  165. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  166. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  167. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  168. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  169. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  170. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  171. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  172. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  173. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  174. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  175. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  176. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +13 -7
  177. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  178. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  179. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  180. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  181. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  182. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  183. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  184. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +21 -20
  185. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  186. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  187. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  188. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  189. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  190. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  191. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  192. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  193. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  194. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  195. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  196. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  197. data/src/core/ext/xds/xds_api.cc +1649 -329
  198. data/src/core/ext/xds/xds_api.h +284 -44
  199. data/src/core/ext/xds/xds_bootstrap.cc +110 -156
  200. data/src/core/ext/xds/xds_bootstrap.h +24 -25
  201. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  202. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  203. data/src/core/ext/xds/xds_channel_args.h +5 -2
  204. data/src/core/ext/xds/xds_client.cc +454 -177
  205. data/src/core/ext/xds/xds_client.h +62 -22
  206. data/src/core/ext/xds/xds_client_stats.h +5 -4
  207. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  208. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  209. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  210. data/src/core/ext/xds/xds_http_filters.h +130 -0
  211. data/src/core/ext/xds/xds_server_config_fetcher.cc +410 -131
  212. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  213. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  214. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +107 -4
  215. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +26 -6
  216. data/src/core/lib/channel/channel_stack.cc +22 -9
  217. data/src/core/lib/channel/channel_stack.h +17 -9
  218. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  219. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  220. data/src/core/lib/channel/channelz.cc +108 -12
  221. data/src/core/lib/channel/channelz.h +30 -1
  222. data/src/core/lib/channel/channelz_registry.cc +14 -0
  223. data/src/core/lib/channel/connected_channel.cc +4 -4
  224. data/src/core/lib/channel/handshaker.cc +7 -45
  225. data/src/core/lib/channel/handshaker.h +5 -22
  226. data/src/core/lib/channel/status_util.cc +12 -2
  227. data/src/core/lib/channel/status_util.h +5 -0
  228. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  229. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  230. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  231. data/src/core/lib/gpr/sync_windows.cc +2 -2
  232. data/src/core/lib/gprpp/atomic.h +3 -3
  233. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  234. data/src/core/lib/gprpp/ref_counted.h +28 -14
  235. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  236. data/src/core/lib/gprpp/status_helper.cc +407 -0
  237. data/src/core/lib/gprpp/status_helper.h +180 -0
  238. data/src/core/lib/gprpp/thd.h +1 -1
  239. data/src/core/lib/http/httpcli.cc +11 -11
  240. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  241. data/src/core/lib/http/parser.cc +16 -16
  242. data/src/core/lib/http/parser.h +4 -4
  243. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  244. data/src/core/lib/iomgr/buffer_list.h +5 -6
  245. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  246. data/src/core/lib/iomgr/call_combiner.h +12 -14
  247. data/src/core/lib/iomgr/cfstream_handle.cc +5 -5
  248. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  249. data/src/core/lib/iomgr/closure.h +7 -6
  250. data/src/core/lib/iomgr/combiner.cc +14 -12
  251. data/src/core/lib/iomgr/combiner.h +2 -2
  252. data/src/core/lib/iomgr/endpoint.cc +1 -1
  253. data/src/core/lib/iomgr/endpoint.h +2 -2
  254. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  255. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  256. data/src/core/lib/iomgr/error.cc +167 -61
  257. data/src/core/lib/iomgr/error.h +218 -107
  258. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  259. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  260. data/src/core/lib/iomgr/error_internal.h +5 -1
  261. data/src/core/lib/iomgr/ev_apple.cc +6 -6
  262. data/src/core/lib/iomgr/ev_epoll1_linux.cc +22 -22
  263. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  264. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  265. data/src/core/lib/iomgr/ev_posix.cc +12 -11
  266. data/src/core/lib/iomgr/ev_posix.h +9 -9
  267. data/src/core/lib/iomgr/exec_ctx.cc +10 -6
  268. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  269. data/src/core/lib/iomgr/executor.cc +8 -8
  270. data/src/core/lib/iomgr/executor.h +2 -2
  271. data/src/core/lib/iomgr/iomgr.cc +1 -1
  272. data/src/core/lib/iomgr/iomgr.h +1 -1
  273. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  274. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  275. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  276. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  277. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  278. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  279. data/src/core/lib/iomgr/load_file.cc +4 -4
  280. data/src/core/lib/iomgr/load_file.h +2 -2
  281. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  282. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  283. data/src/core/lib/iomgr/pollset.cc +5 -5
  284. data/src/core/lib/iomgr/pollset.h +9 -9
  285. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  286. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  287. data/src/core/lib/iomgr/port.h +1 -1
  288. data/src/core/lib/iomgr/python_util.h +1 -1
  289. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  290. data/src/core/lib/iomgr/resolve_address.h +6 -6
  291. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  292. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  293. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  294. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  295. data/src/core/lib/iomgr/resource_quota.cc +12 -11
  296. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  297. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  298. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  299. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  300. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  301. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  302. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  303. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  304. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  305. data/src/core/lib/iomgr/tcp_posix.cc +37 -38
  306. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  307. data/src/core/lib/iomgr/tcp_server.h +12 -11
  308. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  309. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  310. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  311. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  312. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  313. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  314. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  315. data/src/core/lib/iomgr/tcp_uv.cc +27 -25
  316. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  317. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  318. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  319. data/src/core/lib/iomgr/timer_custom.h +1 -1
  320. data/src/core/lib/iomgr/timer_generic.cc +8 -8
  321. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  322. data/src/core/lib/iomgr/udp_server.cc +21 -20
  323. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  324. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  325. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  326. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  327. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  328. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  329. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  330. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  331. data/src/core/lib/iomgr/work_serializer.h +17 -1
  332. data/src/core/lib/json/json.h +1 -1
  333. data/src/core/lib/json/json_reader.cc +4 -4
  334. data/src/core/lib/{security/authorization → matchers}/matchers.cc +47 -47
  335. data/src/core/lib/{security/authorization → matchers}/matchers.h +42 -40
  336. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  337. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  338. data/src/core/lib/security/credentials/credentials.h +2 -2
  339. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  340. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  341. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  342. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  343. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  344. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  345. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  346. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  347. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  348. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  349. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  350. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  351. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  352. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  353. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  354. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  355. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  356. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  357. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  358. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  359. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  360. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  361. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  362. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  363. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  364. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  365. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  366. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  367. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  368. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  369. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  370. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  371. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  372. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  373. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  374. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  375. data/src/core/lib/security/security_connector/ssl_utils.cc +28 -8
  376. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  377. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +62 -60
  378. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  379. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  380. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  381. data/src/core/lib/security/transport/security_handshaker.cc +65 -34
  382. data/src/core/lib/security/transport/server_auth_filter.cc +24 -11
  383. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  384. data/src/core/lib/security/transport/tsi_error.h +2 -1
  385. data/src/core/lib/security/util/json_util.cc +2 -2
  386. data/src/core/lib/security/util/json_util.h +1 -1
  387. data/src/core/lib/slice/slice_intern.cc +6 -7
  388. data/src/core/lib/surface/call.cc +46 -45
  389. data/src/core/lib/surface/call.h +2 -2
  390. data/src/core/lib/surface/channel.cc +6 -6
  391. data/src/core/lib/surface/channel.h +6 -5
  392. data/src/core/lib/surface/channel_ping.cc +1 -1
  393. data/src/core/lib/surface/completion_queue.cc +46 -47
  394. data/src/core/lib/surface/completion_queue.h +2 -1
  395. data/src/core/lib/surface/lame_client.cc +43 -24
  396. data/src/core/lib/surface/lame_client.h +4 -3
  397. data/src/core/lib/surface/server.cc +68 -55
  398. data/src/core/lib/surface/server.h +89 -29
  399. data/src/core/lib/surface/validate_metadata.cc +7 -7
  400. data/src/core/lib/surface/validate_metadata.h +3 -2
  401. data/src/core/lib/surface/version.cc +4 -2
  402. data/src/core/lib/transport/byte_stream.cc +5 -5
  403. data/src/core/lib/transport/byte_stream.h +8 -8
  404. data/src/core/lib/transport/connectivity_state.cc +1 -1
  405. data/src/core/lib/transport/error_utils.cc +19 -8
  406. data/src/core/lib/transport/error_utils.h +11 -5
  407. data/src/core/lib/transport/metadata_batch.cc +64 -37
  408. data/src/core/lib/transport/metadata_batch.h +33 -18
  409. data/src/core/lib/transport/transport.cc +4 -3
  410. data/src/core/lib/transport/transport.h +4 -4
  411. data/src/core/lib/transport/transport_op_string.cc +5 -5
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  413. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +6 -8
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  416. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  417. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  418. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  419. data/src/core/tsi/fake_transport_security.cc +10 -1
  420. data/src/core/tsi/ssl_transport_security.cc +32 -14
  421. data/src/core/tsi/ssl_transport_security.h +3 -4
  422. data/src/ruby/bin/math_services_pb.rb +1 -1
  423. data/src/ruby/ext/grpc/extconf.rb +9 -1
  424. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  425. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  426. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  427. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  428. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  429. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  430. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  431. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  432. data/src/ruby/ext/grpc/rb_server.c +13 -1
  433. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  434. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  435. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  436. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  437. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  438. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  439. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  440. data/src/ruby/lib/grpc/version.rb +1 -1
  441. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  442. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  443. data/src/ruby/spec/call_spec.rb +1 -1
  444. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  445. data/src/ruby/spec/channel_spec.rb +17 -6
  446. data/src/ruby/spec/client_auth_spec.rb +27 -1
  447. data/src/ruby/spec/errors_spec.rb +1 -1
  448. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  449. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  450. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  451. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  452. data/src/ruby/spec/server_spec.rb +22 -0
  453. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  454. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  455. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  456. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  457. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  458. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  459. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  460. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  461. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  462. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  463. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  464. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  465. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  466. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  467. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  468. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  469. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  470. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  471. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  472. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  473. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  474. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  475. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  476. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  477. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  478. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  479. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  480. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  481. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  482. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  483. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  484. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  485. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  486. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  487. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  488. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  489. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  490. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  491. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  492. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  493. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  494. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  495. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  496. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  497. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  498. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  499. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  500. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  501. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  502. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  503. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  504. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  505. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  506. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  507. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  508. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  509. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  510. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  511. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  512. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  513. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  514. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  515. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  516. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  517. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  518. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  519. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  526. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  527. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  529. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  530. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  535. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  536. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  537. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  538. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  539. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  540. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  541. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  542. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  543. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  544. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  545. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  546. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  547. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  548. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  549. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  550. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  551. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  552. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  553. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  554. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  555. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  556. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  557. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  558. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  559. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  560. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  561. data/third_party/boringssl-with-bazel/err_data.c +478 -462
  562. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  563. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  564. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  565. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  566. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  567. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  568. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  569. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  570. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  571. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  572. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  573. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  574. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  575. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  576. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  577. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +32 -16
  578. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  579. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  580. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  581. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  582. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  583. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  584. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  585. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  586. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  587. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  588. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  589. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  590. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  591. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  592. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  593. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  594. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +7 -5
  595. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  596. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  597. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  598. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  599. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  600. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  601. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  602. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  603. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  604. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  605. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  606. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  607. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  608. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  609. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  610. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  611. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  612. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  613. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -30
  614. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  615. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  616. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  617. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  618. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +21 -34
  619. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  620. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  621. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  622. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
  623. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  624. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  625. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  626. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  627. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  628. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  629. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -4
  630. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  631. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  632. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  633. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  634. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  635. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  636. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  637. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  638. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  639. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  640. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  641. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +210 -26
  642. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  643. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -122
  644. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  645. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  646. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  647. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  648. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  649. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  650. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  651. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  652. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  653. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  654. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  655. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +131 -83
  656. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  657. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  658. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  659. data/third_party/xxhash/xxhash.h +5443 -0
  660. metadata +128 -61
  661. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  662. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  663. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  664. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  665. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  666. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  667. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  668. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  669. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  670. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -99
  671. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  672. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  673. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  674. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  675. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  676. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
  677. data/third_party/upb/upb/json_decode.c +0 -1443
  678. data/third_party/upb/upb/json_decode.h +0 -23
  679. data/third_party/upb/upb/json_encode.c +0 -713
  680. data/third_party/upb/upb/json_encode.h +0 -36
@@ -37,8 +37,9 @@
37
37
  #include "src/core/lib/surface/call.h"
38
38
  #include "src/core/lib/surface/channel_init.h"
39
39
 
40
- static void recv_message_ready(void* user_data, grpc_error* error);
41
- static void recv_trailing_metadata_ready(void* user_data, grpc_error* error);
40
+ static void recv_message_ready(void* user_data, grpc_error_handle error);
41
+ static void recv_trailing_metadata_ready(void* user_data,
42
+ grpc_error_handle error);
42
43
 
43
44
  namespace grpc_core {
44
45
 
@@ -67,9 +68,10 @@ const MessageSizeParsedConfig* MessageSizeParsedConfig::GetFromCallContext(
67
68
 
68
69
  std::unique_ptr<ServiceConfigParser::ParsedConfig>
69
70
  MessageSizeParser::ParsePerMethodParams(const grpc_channel_args* /*args*/,
70
- const Json& json, grpc_error** error) {
71
+ const Json& json,
72
+ grpc_error_handle* error) {
71
73
  GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
72
- std::vector<grpc_error*> error_list;
74
+ std::vector<grpc_error_handle> error_list;
73
75
  // Max request size.
74
76
  int max_request_message_bytes = -1;
75
77
  auto it = json.object_value().find("maxRequestMessageBytes");
@@ -179,7 +181,7 @@ struct call_data {
179
181
  grpc_closure recv_message_ready;
180
182
  grpc_closure recv_trailing_metadata_ready;
181
183
  // The error caused by a message that is too large, or GRPC_ERROR_NONE
182
- grpc_error* error = GRPC_ERROR_NONE;
184
+ grpc_error_handle error = GRPC_ERROR_NONE;
183
185
  // Used by recv_message_ready.
184
186
  grpc_core::OrphanablePtr<grpc_core::ByteStream>* recv_message = nullptr;
185
187
  // Original recv_message_ready callback, invoked after our own.
@@ -187,20 +189,20 @@ struct call_data {
187
189
  // Original recv_trailing_metadata callback, invoked after our own.
188
190
  grpc_closure* original_recv_trailing_metadata_ready;
189
191
  bool seen_recv_trailing_metadata = false;
190
- grpc_error* recv_trailing_metadata_error;
192
+ grpc_error_handle recv_trailing_metadata_error;
191
193
  };
192
194
 
193
195
  } // namespace
194
196
 
195
197
  // Callback invoked when we receive a message. Here we check the max
196
198
  // receive message size.
197
- static void recv_message_ready(void* user_data, grpc_error* error) {
199
+ static void recv_message_ready(void* user_data, grpc_error_handle error) {
198
200
  grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
199
201
  call_data* calld = static_cast<call_data*>(elem->call_data);
200
202
  if (*calld->recv_message != nullptr && calld->limits.max_recv_size >= 0 &&
201
203
  (*calld->recv_message)->length() >
202
204
  static_cast<size_t>(calld->limits.max_recv_size)) {
203
- grpc_error* new_error = grpc_error_set_int(
205
+ grpc_error_handle new_error = grpc_error_set_int(
204
206
  GRPC_ERROR_CREATE_FROM_COPIED_STRING(
205
207
  absl::StrFormat("Received message larger than max (%u vs. %d)",
206
208
  (*calld->recv_message)->length(),
@@ -233,7 +235,8 @@ static void recv_message_ready(void* user_data, grpc_error* error) {
233
235
 
234
236
  // Callback invoked on completion of recv_trailing_metadata
235
237
  // Notifies the recv_trailing_metadata batch of any message size failures
236
- static void recv_trailing_metadata_ready(void* user_data, grpc_error* error) {
238
+ static void recv_trailing_metadata_ready(void* user_data,
239
+ grpc_error_handle error) {
237
240
  grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
238
241
  call_data* calld = static_cast<call_data*>(elem->call_data);
239
242
  if (calld->next_recv_message_ready != nullptr) {
@@ -291,7 +294,7 @@ static void message_size_start_transport_stream_op_batch(
291
294
  }
292
295
 
293
296
  // Constructor for call_data.
294
- static grpc_error* message_size_init_call_elem(
297
+ static grpc_error_handle message_size_init_call_elem(
295
298
  grpc_call_element* elem, const grpc_call_element_args* args) {
296
299
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
297
300
  new (elem->call_data) call_data(elem, *chand, *args);
@@ -315,7 +318,7 @@ grpc_core::MessageSizeParsedConfig::message_size_limits get_message_size_limits(
315
318
  }
316
319
 
317
320
  // Constructor for channel_data.
318
- static grpc_error* message_size_init_channel_elem(
321
+ static grpc_error_handle message_size_init_channel_elem(
319
322
  grpc_channel_element* elem, grpc_channel_element_args* args) {
320
323
  GPR_ASSERT(!args->is_last);
321
324
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
@@ -51,7 +51,7 @@ class MessageSizeParser : public ServiceConfigParser::Parser {
51
51
  public:
52
52
  std::unique_ptr<ServiceConfigParser::ParsedConfig> ParsePerMethodParams(
53
53
  const grpc_channel_args* /*args*/, const Json& json,
54
- grpc_error** error) override;
54
+ grpc_error_handle* error) override;
55
55
 
56
56
  static void Register();
57
57
 
@@ -54,7 +54,8 @@ static bool get_user_agent_mdelem(const grpc_metadata_batch* batch,
54
54
  }
55
55
 
56
56
  // Callback invoked when we receive an initial metadata.
57
- static void recv_initial_metadata_ready(void* user_data, grpc_error* error) {
57
+ static void recv_initial_metadata_ready(void* user_data,
58
+ grpc_error_handle error) {
58
59
  grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
59
60
  call_data* calld = static_cast<call_data*>(elem->call_data);
60
61
 
@@ -105,7 +106,7 @@ static void cronet_compression_start_transport_stream_op_batch(
105
106
  }
106
107
 
107
108
  // Constructor for call_data.
108
- static grpc_error* cronet_compression_init_call_elem(
109
+ static grpc_error_handle cronet_compression_init_call_elem(
109
110
  grpc_call_element* elem, const grpc_call_element_args* /*args*/) {
110
111
  call_data* calld = static_cast<call_data*>(elem->call_data);
111
112
  calld->next_recv_initial_metadata_ready = nullptr;
@@ -122,7 +123,7 @@ static void cronet_compression_destroy_call_elem(
122
123
  grpc_closure* /*ignored*/) {}
123
124
 
124
125
  // Constructor for channel_data.
125
- static grpc_error* cronet_compression_init_channel_elem(
126
+ static grpc_error_handle cronet_compression_init_channel_elem(
126
127
  grpc_channel_element* /*elem*/, grpc_channel_element_args* /*args*/) {
127
128
  return GRPC_ERROR_NONE;
128
129
  }
@@ -192,7 +193,7 @@ static bool register_workaround_cronet_compression(
192
193
  if (a == nullptr) {
193
194
  return true;
194
195
  }
195
- if (grpc_channel_arg_get_bool(a, false) == false) {
196
+ if (!grpc_channel_arg_get_bool(a, false)) {
196
197
  return true;
197
198
  }
198
199
  return grpc_channel_stack_builder_prepend_filter(
@@ -75,7 +75,7 @@ void Chttp2Connector::Connect(const Args& args, Result* result,
75
75
  args.channel_args, &addr, args.deadline);
76
76
  }
77
77
 
78
- void Chttp2Connector::Shutdown(grpc_error* error) {
78
+ void Chttp2Connector::Shutdown(grpc_error_handle error) {
79
79
  MutexLock lock(&mu_);
80
80
  shutdown_ = true;
81
81
  if (handshake_mgr_ != nullptr) {
@@ -89,7 +89,7 @@ void Chttp2Connector::Shutdown(grpc_error* error) {
89
89
  GRPC_ERROR_UNREF(error);
90
90
  }
91
91
 
92
- void Chttp2Connector::Connected(void* arg, grpc_error* error) {
92
+ void Chttp2Connector::Connected(void* arg, grpc_error_handle error) {
93
93
  Chttp2Connector* self = static_cast<Chttp2Connector*>(arg);
94
94
  bool unref = false;
95
95
  {
@@ -131,14 +131,14 @@ void Chttp2Connector::StartHandshakeLocked() {
131
131
 
132
132
  namespace {
133
133
  void NullThenSchedClosure(const DebugLocation& location, grpc_closure** closure,
134
- grpc_error* error) {
134
+ grpc_error_handle error) {
135
135
  grpc_closure* c = *closure;
136
136
  *closure = nullptr;
137
137
  ExecCtx::Run(location, c, error);
138
138
  }
139
139
  } // namespace
140
140
 
141
- void Chttp2Connector::OnHandshakeDone(void* arg, grpc_error* error) {
141
+ void Chttp2Connector::OnHandshakeDone(void* arg, grpc_error_handle error) {
142
142
  auto* args = static_cast<HandshakerArgs*>(arg);
143
143
  Chttp2Connector* self = static_cast<Chttp2Connector*>(args->user_data);
144
144
  {
@@ -178,7 +178,7 @@ void Chttp2Connector::OnHandshakeDone(void* arg, grpc_error* error) {
178
178
  self->Ref().release(); // Ref held by OnTimeout()
179
179
  grpc_chttp2_transport_start_reading(self->result_->transport,
180
180
  args->read_buffer,
181
- &self->on_receive_settings_);
181
+ &self->on_receive_settings_, nullptr);
182
182
  GRPC_CLOSURE_INIT(&self->on_timeout_, OnTimeout, self,
183
183
  grpc_schedule_on_exec_ctx);
184
184
  grpc_timer_init(&self->timer_, self->args_.deadline, &self->on_timeout_);
@@ -194,7 +194,7 @@ void Chttp2Connector::OnHandshakeDone(void* arg, grpc_error* error) {
194
194
  self->Unref();
195
195
  }
196
196
 
197
- void Chttp2Connector::OnReceiveSettings(void* arg, grpc_error* error) {
197
+ void Chttp2Connector::OnReceiveSettings(void* arg, grpc_error_handle error) {
198
198
  Chttp2Connector* self = static_cast<Chttp2Connector*>(arg);
199
199
  {
200
200
  MutexLock lock(&self->mu_);
@@ -220,7 +220,7 @@ void Chttp2Connector::OnReceiveSettings(void* arg, grpc_error* error) {
220
220
  self->Unref();
221
221
  }
222
222
 
223
- void Chttp2Connector::OnTimeout(void* arg, grpc_error* /*error*/) {
223
+ void Chttp2Connector::OnTimeout(void* arg, grpc_error_handle /*error*/) {
224
224
  Chttp2Connector* self = static_cast<Chttp2Connector*>(arg);
225
225
  {
226
226
  MutexLock lock(&self->mu_);
@@ -245,7 +245,7 @@ void Chttp2Connector::OnTimeout(void* arg, grpc_error* /*error*/) {
245
245
  self->Unref();
246
246
  }
247
247
 
248
- void Chttp2Connector::MaybeNotify(grpc_error* error) {
248
+ void Chttp2Connector::MaybeNotify(grpc_error_handle error) {
249
249
  if (notify_error_.has_value()) {
250
250
  GRPC_ERROR_UNREF(error);
251
251
  NullThenSchedClosure(DEBUG_LOCATION, &notify_, notify_error_.value());
@@ -33,14 +33,14 @@ class Chttp2Connector : public SubchannelConnector {
33
33
  ~Chttp2Connector() override;
34
34
 
35
35
  void Connect(const Args& args, Result* result, grpc_closure* notify) override;
36
- void Shutdown(grpc_error* error) override;
36
+ void Shutdown(grpc_error_handle error) override;
37
37
 
38
38
  private:
39
- static void Connected(void* arg, grpc_error* error);
39
+ static void Connected(void* arg, grpc_error_handle error);
40
40
  void StartHandshakeLocked();
41
- static void OnHandshakeDone(void* arg, grpc_error* error);
42
- static void OnReceiveSettings(void* arg, grpc_error* error);
43
- static void OnTimeout(void* arg, grpc_error* error);
41
+ static void OnHandshakeDone(void* arg, grpc_error_handle error);
42
+ static void OnReceiveSettings(void* arg, grpc_error_handle error);
43
+ static void OnTimeout(void* arg, grpc_error_handle error);
44
44
 
45
45
  // We cannot invoke notify_ until both OnTimeout() and OnReceiveSettings()
46
46
  // have been called since that is an indicator to the upper layer that we are
@@ -51,7 +51,7 @@ class Chttp2Connector : public SubchannelConnector {
51
51
  // invoked, we call MaybeNotify() again to actually invoke the notify_
52
52
  // callback. Note that this only happens if the handshake is done and the
53
53
  // connector is waiting on the SETTINGS frame.
54
- void MaybeNotify(grpc_error* error);
54
+ void MaybeNotify(grpc_error_handle error);
55
55
 
56
56
  Mutex mu_;
57
57
  Args args_;
@@ -66,7 +66,7 @@ class Chttp2Connector : public SubchannelConnector {
66
66
  grpc_closure on_receive_settings_;
67
67
  grpc_timer timer_;
68
68
  grpc_closure on_timeout_;
69
- absl::optional<grpc_error*> notify_error_;
69
+ absl::optional<grpc_error_handle> notify_error_;
70
70
  RefCountedPtr<HandshakeManager> handshake_mgr_;
71
71
  };
72
72
 
@@ -37,10 +37,11 @@ namespace grpc_core {
37
37
 
38
38
  class Chttp2InsecureClientChannelFactory : public ClientChannelFactory {
39
39
  public:
40
- Subchannel* CreateSubchannel(const grpc_channel_args* args) override {
40
+ RefCountedPtr<Subchannel> CreateSubchannel(
41
+ const grpc_channel_args* args) override {
41
42
  grpc_channel_args* new_args =
42
43
  grpc_default_authority_add_if_not_present(args);
43
- Subchannel* s =
44
+ RefCountedPtr<Subchannel> s =
44
45
  Subchannel::Create(MakeOrphanable<Chttp2Connector>(), new_args);
45
46
  grpc_channel_args_destroy(new_args);
46
47
  return s;
@@ -50,7 +51,7 @@ class Chttp2InsecureClientChannelFactory : public ClientChannelFactory {
50
51
  namespace {
51
52
 
52
53
  grpc_channel* CreateChannel(const char* target, const grpc_channel_args* args,
53
- grpc_error** error) {
54
+ grpc_error_handle* error) {
54
55
  if (target == nullptr) {
55
56
  gpr_log(GPR_ERROR, "cannot create channel with NULL target name");
56
57
  if (error != nullptr) {
@@ -105,7 +106,7 @@ grpc_channel* grpc_insecure_channel_create(const char* target,
105
106
  const char* arg_to_remove = arg.key;
106
107
  grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
107
108
  args, &arg_to_remove, 1, &arg, 1);
108
- grpc_error* error = GRPC_ERROR_NONE;
109
+ grpc_error_handle error = GRPC_ERROR_NONE;
109
110
  // Create channel.
110
111
  grpc_channel* channel = grpc_core::CreateChannel(target, new_args, &error);
111
112
  // Clean up.
@@ -56,13 +56,13 @@ grpc_channel* grpc_insecure_channel_create_from_fd(
56
56
  grpc_transport* transport =
57
57
  grpc_create_chttp2_transport(final_args, client, true);
58
58
  GPR_ASSERT(transport);
59
- grpc_error* error = nullptr;
59
+ grpc_error_handle error = GRPC_ERROR_NONE;
60
60
  grpc_channel* channel =
61
61
  grpc_channel_create(target, final_args, GRPC_CLIENT_DIRECT_CHANNEL,
62
62
  transport, nullptr, &error);
63
63
  grpc_channel_args_destroy(final_args);
64
64
  if (channel != nullptr) {
65
- grpc_chttp2_transport_start_reading(transport, nullptr, nullptr);
65
+ grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr);
66
66
  grpc_core::ExecCtx::Get()->Flush();
67
67
  } else {
68
68
  intptr_t integer;
@@ -28,9 +28,9 @@
28
28
  #include "src/core/ext/filters/client_channel/client_channel.h"
29
29
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
30
30
  #include "src/core/ext/transport/chttp2/client/chttp2_connector.h"
31
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
31
32
  #include "src/core/lib/channel/channel_args.h"
32
33
  #include "src/core/lib/gprpp/memory.h"
33
- #include "src/core/lib/iomgr/sockaddr_utils.h"
34
34
  #include "src/core/lib/security/credentials/credentials.h"
35
35
  #include "src/core/lib/security/security_connector/security_connector.h"
36
36
  #include "src/core/lib/slice/slice_internal.h"
@@ -43,14 +43,15 @@ namespace grpc_core {
43
43
 
44
44
  class Chttp2SecureClientChannelFactory : public ClientChannelFactory {
45
45
  public:
46
- Subchannel* CreateSubchannel(const grpc_channel_args* args) override {
46
+ RefCountedPtr<Subchannel> CreateSubchannel(
47
+ const grpc_channel_args* args) override {
47
48
  grpc_channel_args* new_args = GetSecureNamingChannelArgs(args);
48
49
  if (new_args == nullptr) {
49
50
  gpr_log(GPR_ERROR,
50
51
  "Failed to create channel args during subchannel creation.");
51
52
  return nullptr;
52
53
  }
53
- Subchannel* s =
54
+ RefCountedPtr<Subchannel> s =
54
55
  Subchannel::Create(MakeOrphanable<Chttp2Connector>(), new_args);
55
56
  grpc_channel_args_destroy(new_args);
56
57
  return s;
@@ -128,7 +129,7 @@ class Chttp2SecureClientChannelFactory : public ClientChannelFactory {
128
129
  namespace {
129
130
 
130
131
  grpc_channel* CreateChannel(const char* target, const grpc_channel_args* args,
131
- grpc_error** error) {
132
+ grpc_error_handle* error) {
132
133
  if (target == nullptr) {
133
134
  gpr_log(GPR_ERROR, "cannot create channel with NULL target name");
134
135
  if (error != nullptr) {
@@ -180,7 +181,7 @@ grpc_channel* grpc_secure_channel_create(grpc_channel_credentials* creds,
180
181
  4, ((void*)creds, target, (void*)args, (void*)reserved));
181
182
  GPR_ASSERT(reserved == nullptr);
182
183
  grpc_channel* channel = nullptr;
183
- grpc_error* error = GRPC_ERROR_NONE;
184
+ grpc_error_handle error = GRPC_ERROR_NONE;
184
185
  if (creds != nullptr) {
185
186
  // Add channel args containing the client channel factory and channel
186
187
  // credentials.
@@ -38,6 +38,7 @@
38
38
  #include "src/core/ext/filters/http/server/http_server_filter.h"
39
39
  #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
40
40
  #include "src/core/ext/transport/chttp2/transport/internal.h"
41
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
41
42
  #include "src/core/lib/channel/channel_args.h"
42
43
  #include "src/core/lib/channel/handshaker.h"
43
44
  #include "src/core/lib/channel/handshaker_registry.h"
@@ -46,7 +47,6 @@
46
47
  #include "src/core/lib/iomgr/endpoint.h"
47
48
  #include "src/core/lib/iomgr/resolve_address.h"
48
49
  #include "src/core/lib/iomgr/resource_quota.h"
49
- #include "src/core/lib/iomgr/sockaddr_utils.h"
50
50
  #include "src/core/lib/iomgr/tcp_server.h"
51
51
  #include "src/core/lib/iomgr/unix_sockets_posix.h"
52
52
  #include "src/core/lib/slice/slice_internal.h"
@@ -61,14 +61,14 @@ const char kUnixAbstractUriPrefix[] = "unix-abstract:";
61
61
 
62
62
  class Chttp2ServerListener : public Server::ListenerInterface {
63
63
  public:
64
- static grpc_error* Create(Server* server, grpc_resolved_address* addr,
65
- grpc_channel_args* args,
66
- Chttp2ServerArgsModifier args_modifier,
67
- int* port_num);
64
+ static grpc_error_handle Create(Server* server, grpc_resolved_address* addr,
65
+ grpc_channel_args* args,
66
+ Chttp2ServerArgsModifier args_modifier,
67
+ int* port_num);
68
68
 
69
- static grpc_error* CreateWithAcceptor(Server* server, const char* name,
70
- grpc_channel_args* args,
71
- Chttp2ServerArgsModifier args_modifier);
69
+ static grpc_error_handle CreateWithAcceptor(
70
+ Server* server, const char* name, grpc_channel_args* args,
71
+ Chttp2ServerArgsModifier args_modifier);
72
72
 
73
73
  // Do not instantiate directly. Use one of the factory methods above.
74
74
  Chttp2ServerListener(Server* server, grpc_channel_args* args,
@@ -90,98 +90,209 @@ class Chttp2ServerListener : public Server::ListenerInterface {
90
90
  class ConfigFetcherWatcher
91
91
  : public grpc_server_config_fetcher::WatcherInterface {
92
92
  public:
93
- explicit ConfigFetcherWatcher(Chttp2ServerListener* listener)
94
- : listener_(listener) {}
95
-
96
- void UpdateConfig(grpc_channel_args* args) override {
97
- {
98
- MutexLock lock(&listener_->mu_);
99
- grpc_channel_args_destroy(listener_->args_);
100
- grpc_error* error = GRPC_ERROR_NONE;
101
- args = listener_->args_modifier_(args, &error);
102
- if (error != GRPC_ERROR_NONE) {
103
- // TODO(yashykt): Set state to close down connections immediately
104
- // after accepting.
105
- GPR_ASSERT(0);
106
- }
107
- listener_->args_ = args;
108
- if (!listener_->shutdown_) return; // Already started listening.
109
- }
110
- int port_temp;
111
- grpc_error* error = grpc_tcp_server_add_port(
112
- listener_->tcp_server_, &listener_->resolved_address_, &port_temp);
113
- if (error != GRPC_ERROR_NONE) {
114
- GRPC_ERROR_UNREF(error);
115
- gpr_log(GPR_ERROR, "Error adding port to server: %s",
116
- grpc_error_string(error));
117
- // TODO(yashykt): We wouldn't need to assert here if we bound to the
118
- // port earlier during AddPort.
119
- GPR_ASSERT(0);
120
- }
121
- listener_->StartListening();
122
- }
93
+ explicit ConfigFetcherWatcher(RefCountedPtr<Chttp2ServerListener> listener)
94
+ : listener_(std::move(listener)) {}
95
+
96
+ void UpdateConnectionManager(
97
+ RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
98
+ connection_manager) override;
99
+
100
+ void StopServing() override;
123
101
 
124
102
  private:
125
- Chttp2ServerListener* listener_;
103
+ RefCountedPtr<Chttp2ServerListener> listener_;
126
104
  };
127
105
 
128
- class ConnectionState : public RefCounted<ConnectionState> {
106
+ class ActiveConnection : public InternallyRefCounted<ActiveConnection> {
129
107
  public:
130
- ConnectionState(Chttp2ServerListener* listener,
131
- grpc_pollset* accepting_pollset,
132
- grpc_tcp_server_acceptor* acceptor,
133
- RefCountedPtr<HandshakeManager> handshake_mgr,
134
- grpc_channel_args* args, grpc_endpoint* endpoint);
108
+ class HandshakingState : public InternallyRefCounted<HandshakingState> {
109
+ public:
110
+ HandshakingState(RefCountedPtr<ActiveConnection> connection_ref,
111
+ grpc_pollset* accepting_pollset,
112
+ grpc_tcp_server_acceptor* acceptor,
113
+ grpc_channel_args* args);
114
+
115
+ ~HandshakingState() override;
116
+
117
+ void Orphan() override;
135
118
 
136
- ~ConnectionState() override;
119
+ void Start(grpc_endpoint* endpoint, grpc_channel_args* args);
120
+
121
+ // Needed to be able to grab an external ref in ActiveConnection::Start()
122
+ using InternallyRefCounted<HandshakingState>::Ref;
123
+
124
+ private:
125
+ static void OnTimeout(void* arg, grpc_error_handle error);
126
+ static void OnReceiveSettings(void* arg, grpc_error_handle /* error */);
127
+ static void OnHandshakeDone(void* arg, grpc_error_handle error);
128
+ RefCountedPtr<ActiveConnection> const connection_;
129
+ grpc_pollset* const accepting_pollset_;
130
+ grpc_tcp_server_acceptor* const acceptor_;
131
+ RefCountedPtr<HandshakeManager> handshake_mgr_
132
+ ABSL_GUARDED_BY(&connection_->mu_);
133
+ // State for enforcing handshake timeout on receiving HTTP/2 settings.
134
+ grpc_millis const deadline_;
135
+ grpc_timer timer_ ABSL_GUARDED_BY(&connection_->mu_);
136
+ grpc_closure on_timeout_ ABSL_GUARDED_BY(&connection_->mu_);
137
+ grpc_closure on_receive_settings_ ABSL_GUARDED_BY(&connection_->mu_);
138
+ grpc_pollset_set* const interested_parties_;
139
+ };
140
+
141
+ ActiveConnection(grpc_pollset* accepting_pollset,
142
+ grpc_tcp_server_acceptor* acceptor,
143
+ grpc_channel_args* args);
144
+ ~ActiveConnection() override;
145
+
146
+ void Orphan() override;
147
+
148
+ void SendGoAway();
149
+
150
+ void Start(RefCountedPtr<Chttp2ServerListener> listener,
151
+ grpc_endpoint* endpoint, grpc_channel_args* args);
152
+
153
+ // Needed to be able to grab an external ref in
154
+ // Chttp2ServerListener::OnAccept()
155
+ using InternallyRefCounted<ActiveConnection>::Ref;
137
156
 
138
157
  private:
139
- static void OnTimeout(void* arg, grpc_error* error);
140
- static void OnReceiveSettings(void* arg, grpc_error* error);
141
- static void OnHandshakeDone(void* arg, grpc_error* error);
142
-
143
- Chttp2ServerListener* const listener_;
144
- grpc_pollset* const accepting_pollset_;
145
- grpc_tcp_server_acceptor* const acceptor_;
146
- RefCountedPtr<HandshakeManager> handshake_mgr_;
147
- // State for enforcing handshake timeout on receiving HTTP/2 settings.
148
- grpc_chttp2_transport* transport_ = nullptr;
149
- grpc_millis deadline_;
150
- grpc_timer timer_;
151
- grpc_closure on_timeout_;
152
- grpc_closure on_receive_settings_;
153
- grpc_pollset_set* const interested_parties_;
158
+ static void OnClose(void* arg, grpc_error_handle error);
159
+
160
+ RefCountedPtr<Chttp2ServerListener> listener_;
161
+ Mutex mu_ ABSL_ACQUIRED_AFTER(&listener_->mu_);
162
+ // Set by HandshakingState before the handshaking begins and reset when
163
+ // handshaking is done.
164
+ OrphanablePtr<HandshakingState> handshaking_state_ ABSL_GUARDED_BY(&mu_);
165
+ // Set by HandshakingState when handshaking is done and a valid transport is
166
+ // created.
167
+ grpc_chttp2_transport* transport_ ABSL_GUARDED_BY(&mu_) = nullptr;
168
+ grpc_closure on_close_;
169
+ bool shutdown_ ABSL_GUARDED_BY(&mu_) = false;
154
170
  };
155
171
 
172
+ // To allow access to RefCounted<> like interface.
173
+ friend class RefCountedPtr<Chttp2ServerListener>;
174
+
175
+ // Should only be called once so as to start the TCP server.
156
176
  void StartListening();
157
177
 
158
178
  static void OnAccept(void* arg, grpc_endpoint* tcp,
159
179
  grpc_pollset* accepting_pollset,
160
180
  grpc_tcp_server_acceptor* acceptor);
161
181
 
162
- RefCountedPtr<HandshakeManager> CreateHandshakeManager();
163
-
164
- static void TcpServerShutdownComplete(void* arg, grpc_error* error);
182
+ static void TcpServerShutdownComplete(void* arg, grpc_error_handle error);
165
183
 
166
184
  static void DestroyListener(Server* /*server*/, void* arg,
167
185
  grpc_closure* destroy_done);
168
186
 
187
+ // The interface required by RefCountedPtr<> has been manually implemented
188
+ // here to take a ref on tcp_server_ instead. Note that, the handshaker needs
189
+ // tcp_server_ to exist for the lifetime of the handshake since it's needed by
190
+ // acceptor. Sharing refs between the listener and tcp_server_ is just an
191
+ // optimization to avoid taking additional refs on the listener, since
192
+ // TcpServerShutdownComplete already holds a ref to the listener.
193
+ void IncrementRefCount() { grpc_tcp_server_ref(tcp_server_); }
194
+ void IncrementRefCount(const DebugLocation& /* location */,
195
+ const char* /* reason */) {
196
+ IncrementRefCount();
197
+ }
198
+
199
+ RefCountedPtr<Chttp2ServerListener> Ref() GRPC_MUST_USE_RESULT {
200
+ IncrementRefCount();
201
+ return RefCountedPtr<Chttp2ServerListener>(this);
202
+ }
203
+ RefCountedPtr<Chttp2ServerListener> Ref(const DebugLocation& /* location */,
204
+ const char* /* reason */)
205
+ GRPC_MUST_USE_RESULT {
206
+ return Ref();
207
+ }
208
+
209
+ void Unref() { grpc_tcp_server_unref(tcp_server_); }
210
+ void Unref(const DebugLocation& /* location */, const char* /* reason */) {
211
+ Unref();
212
+ }
213
+
169
214
  Server* const server_;
170
215
  grpc_tcp_server* tcp_server_;
171
216
  grpc_resolved_address resolved_address_;
172
- Chttp2ServerArgsModifier args_modifier_;
173
- Mutex mu_;
174
- grpc_channel_args* args_; // guarded by mu_
217
+ Chttp2ServerArgsModifier const args_modifier_;
175
218
  ConfigFetcherWatcher* config_fetcher_watcher_ = nullptr;
176
- bool shutdown_ = true;
177
- grpc_closure tcp_server_shutdown_complete_;
178
- grpc_closure* on_destroy_done_ = nullptr;
179
- HandshakeManager* pending_handshake_mgrs_ = nullptr;
219
+ Mutex channel_args_mu_;
220
+ grpc_channel_args* args_ ABSL_GUARDED_BY(channel_args_mu_);
221
+ RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
222
+ connection_manager_ ABSL_GUARDED_BY(channel_args_mu_);
223
+ Mutex mu_;
224
+ // Signals whether grpc_tcp_server_start() has been called.
225
+ bool started_ ABSL_GUARDED_BY(mu_) = false;
226
+ // Signals whether grpc_tcp_server_start() has completed.
227
+ CondVar started_cv_ ABSL_GUARDED_BY(mu_);
228
+ // Signals whether new requests/connections are to be accepted.
229
+ bool is_serving_ ABSL_GUARDED_BY(mu_) = false;
230
+ // Signals whether the application has triggered shutdown.
231
+ bool shutdown_ ABSL_GUARDED_BY(mu_) = false;
232
+ std::map<ActiveConnection*, OrphanablePtr<ActiveConnection>> connections_
233
+ ABSL_GUARDED_BY(mu_);
234
+ grpc_closure tcp_server_shutdown_complete_ ABSL_GUARDED_BY(mu_);
235
+ grpc_closure* on_destroy_done_ ABSL_GUARDED_BY(mu_) = nullptr;
180
236
  RefCountedPtr<channelz::ListenSocketNode> channelz_listen_socket_;
181
237
  };
182
238
 
183
239
  //
184
- // Chttp2ServerListener::ConnectionState
240
+ // Chttp2ServerListener::ConfigFetcherWatcher
241
+ //
242
+
243
+ void Chttp2ServerListener::ConfigFetcherWatcher::UpdateConnectionManager(
244
+ RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
245
+ connection_manager) {
246
+ RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
247
+ connection_manager_to_destroy;
248
+ {
249
+ MutexLock lock(&listener_->channel_args_mu_);
250
+ connection_manager_to_destroy = listener_->connection_manager_;
251
+ listener_->connection_manager_ = std::move(connection_manager);
252
+ }
253
+ {
254
+ MutexLock lock(&listener_->mu_);
255
+ if (listener_->shutdown_) {
256
+ return;
257
+ }
258
+ listener_->is_serving_ = true;
259
+ if (listener_->started_) return;
260
+ }
261
+ int port_temp;
262
+ grpc_error_handle error = grpc_tcp_server_add_port(
263
+ listener_->tcp_server_, &listener_->resolved_address_, &port_temp);
264
+ if (error != GRPC_ERROR_NONE) {
265
+ GRPC_ERROR_UNREF(error);
266
+ gpr_log(GPR_ERROR, "Error adding port to server: %s",
267
+ grpc_error_std_string(error).c_str());
268
+ // TODO(yashykt): We wouldn't need to assert here if we bound to the
269
+ // port earlier during AddPort.
270
+ GPR_ASSERT(0);
271
+ }
272
+ listener_->StartListening();
273
+ {
274
+ MutexLock lock(&listener_->mu_);
275
+ listener_->started_ = true;
276
+ listener_->started_cv_.SignalAll();
277
+ }
278
+ }
279
+
280
+ void Chttp2ServerListener::ConfigFetcherWatcher::StopServing() {
281
+ std::map<ActiveConnection*, OrphanablePtr<ActiveConnection>> connections;
282
+ {
283
+ MutexLock lock(&listener_->mu_);
284
+ listener_->is_serving_ = false;
285
+ connections = std::move(listener_->connections_);
286
+ }
287
+ // Send GOAWAYs on the transports so that they disconnected when existing RPCs
288
+ // finish.
289
+ for (auto& connection : connections) {
290
+ connection.first->SendGoAway();
291
+ }
292
+ }
293
+
294
+ //
295
+ // Chttp2ServerListener::ActiveConnection::HandshakingState
185
296
  //
186
297
 
187
298
  grpc_millis GetConnectionDeadline(const grpc_channel_args* args) {
@@ -191,73 +302,96 @@ grpc_millis GetConnectionDeadline(const grpc_channel_args* args) {
191
302
  return ExecCtx::Get()->Now() + timeout_ms;
192
303
  }
193
304
 
194
- Chttp2ServerListener::ConnectionState::ConnectionState(
195
- Chttp2ServerListener* listener, grpc_pollset* accepting_pollset,
196
- grpc_tcp_server_acceptor* acceptor,
197
- RefCountedPtr<HandshakeManager> handshake_mgr, grpc_channel_args* args,
198
- grpc_endpoint* endpoint)
199
- : listener_(listener),
305
+ Chttp2ServerListener::ActiveConnection::HandshakingState::HandshakingState(
306
+ RefCountedPtr<ActiveConnection> connection_ref,
307
+ grpc_pollset* accepting_pollset, grpc_tcp_server_acceptor* acceptor,
308
+ grpc_channel_args* args)
309
+ : connection_(std::move(connection_ref)),
200
310
  accepting_pollset_(accepting_pollset),
201
311
  acceptor_(acceptor),
202
- handshake_mgr_(std::move(handshake_mgr)),
312
+ handshake_mgr_(MakeRefCounted<HandshakeManager>()),
203
313
  deadline_(GetConnectionDeadline(args)),
204
314
  interested_parties_(grpc_pollset_set_create()) {
205
315
  grpc_pollset_set_add_pollset(interested_parties_, accepting_pollset_);
206
316
  HandshakerRegistry::AddHandshakers(HANDSHAKER_SERVER, args,
207
317
  interested_parties_, handshake_mgr_.get());
208
- handshake_mgr_->DoHandshake(endpoint, args, deadline_, acceptor_,
209
- OnHandshakeDone, this);
210
318
  }
211
319
 
212
- Chttp2ServerListener::ConnectionState::~ConnectionState() {
213
- if (transport_ != nullptr) {
214
- GRPC_CHTTP2_UNREF_TRANSPORT(transport_, "receive settings timeout");
215
- }
320
+ Chttp2ServerListener::ActiveConnection::HandshakingState::~HandshakingState() {
216
321
  grpc_pollset_set_del_pollset(interested_parties_, accepting_pollset_);
217
322
  grpc_pollset_set_destroy(interested_parties_);
218
323
  }
219
324
 
220
- void Chttp2ServerListener::ConnectionState::OnTimeout(void* arg,
221
- grpc_error* error) {
222
- ConnectionState* self = static_cast<ConnectionState*>(arg);
325
+ void Chttp2ServerListener::ActiveConnection::HandshakingState::Orphan() {
326
+ {
327
+ MutexLock lock(&connection_->mu_);
328
+ if (handshake_mgr_ != nullptr) {
329
+ handshake_mgr_->Shutdown(
330
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Listener stopped serving."));
331
+ }
332
+ }
333
+ Unref();
334
+ }
335
+
336
+ void Chttp2ServerListener::ActiveConnection::HandshakingState::Start(
337
+ grpc_endpoint* endpoint, grpc_channel_args* args) {
338
+ Ref().release(); // Held by OnHandshakeDone
339
+ RefCountedPtr<HandshakeManager> handshake_mgr;
340
+ {
341
+ MutexLock lock(&connection_->mu_);
342
+ if (handshake_mgr_ == nullptr) return;
343
+ handshake_mgr = handshake_mgr_;
344
+ }
345
+ handshake_mgr->DoHandshake(endpoint, args, deadline_, acceptor_,
346
+ OnHandshakeDone, this);
347
+ }
348
+
349
+ void Chttp2ServerListener::ActiveConnection::HandshakingState::OnTimeout(
350
+ void* arg, grpc_error_handle error) {
351
+ HandshakingState* self = static_cast<HandshakingState*>(arg);
223
352
  // Note that we may be called with GRPC_ERROR_NONE when the timer fires
224
353
  // or with an error indicating that the timer system is being shut down.
225
354
  if (error != GRPC_ERROR_CANCELLED) {
226
355
  grpc_transport_op* op = grpc_make_transport_op(nullptr);
227
356
  op->disconnect_with_error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
228
357
  "Did not receive HTTP/2 settings before handshake timeout");
229
- grpc_transport_perform_op(&self->transport_->base, op);
358
+ grpc_chttp2_transport* transport = nullptr;
359
+ {
360
+ MutexLock lock(&self->connection_->mu_);
361
+ transport = self->connection_->transport_;
362
+ }
363
+ grpc_transport_perform_op(&transport->base, op);
230
364
  }
231
365
  self->Unref();
232
366
  }
233
367
 
234
- void Chttp2ServerListener::ConnectionState::OnReceiveSettings(
235
- void* arg, grpc_error* error) {
236
- ConnectionState* self = static_cast<ConnectionState*>(arg);
237
- if (error == GRPC_ERROR_NONE) {
238
- grpc_timer_cancel(&self->timer_);
239
- }
368
+ void Chttp2ServerListener::ActiveConnection::HandshakingState::
369
+ OnReceiveSettings(void* arg, grpc_error_handle /* error */) {
370
+ HandshakingState* self = static_cast<HandshakingState*>(arg);
371
+ grpc_timer_cancel(&self->timer_);
240
372
  self->Unref();
241
373
  }
242
374
 
243
- void Chttp2ServerListener::ConnectionState::OnHandshakeDone(void* arg,
244
- grpc_error* error) {
375
+ void Chttp2ServerListener::ActiveConnection::HandshakingState::OnHandshakeDone(
376
+ void* arg, grpc_error_handle error) {
245
377
  auto* args = static_cast<HandshakerArgs*>(arg);
246
- ConnectionState* self = static_cast<ConnectionState*>(args->user_data);
378
+ HandshakingState* self = static_cast<HandshakingState*>(args->user_data);
379
+ OrphanablePtr<HandshakingState> handshaking_state_ref;
380
+ RefCountedPtr<HandshakeManager> handshake_mgr;
381
+ bool cleanup_connection = false;
382
+ bool free_resource_quota = false;
383
+ grpc_resource_user* resource_user =
384
+ self->connection_->listener_->server_->default_resource_user();
247
385
  {
248
- MutexLock lock(&self->listener_->mu_);
249
- grpc_resource_user* resource_user =
250
- self->listener_->server_->default_resource_user();
251
- if (error != GRPC_ERROR_NONE || self->listener_->shutdown_) {
252
- const char* error_str = grpc_error_string(error);
253
- gpr_log(GPR_DEBUG, "Handshaking failed: %s", error_str);
254
- if (resource_user != nullptr) {
255
- grpc_resource_user_free(resource_user,
256
- GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
257
- }
386
+ MutexLock connection_lock(&self->connection_->mu_);
387
+ if (error != GRPC_ERROR_NONE || self->connection_->shutdown_) {
388
+ std::string error_str = grpc_error_std_string(error);
389
+ gpr_log(GPR_DEBUG, "Handshaking failed: %s", error_str.c_str());
390
+ cleanup_connection = true;
391
+ free_resource_quota = true;
258
392
  if (error == GRPC_ERROR_NONE && args->endpoint != nullptr) {
259
- // We were shut down after handshaking completed successfully, so
260
- // destroy the endpoint here.
393
+ // We were shut down or stopped serving after handshaking completed
394
+ // successfully, so destroy the endpoint here.
261
395
  // TODO(ctiller): It is currently necessary to shutdown endpoints
262
396
  // before destroying them, even if we know that there are no
263
397
  // pending read/write callbacks. This should be fixed, at which
@@ -275,9 +409,11 @@ void Chttp2ServerListener::ConnectionState::OnHandshakeDone(void* arg,
275
409
  if (args->endpoint != nullptr) {
276
410
  grpc_transport* transport = grpc_create_chttp2_transport(
277
411
  args->args, args->endpoint, false, resource_user);
278
- grpc_error* channel_init_err = self->listener_->server_->SetupTransport(
279
- transport, self->accepting_pollset_, args->args,
280
- grpc_chttp2_transport_get_socket_node(transport), resource_user);
412
+ grpc_error_handle channel_init_err =
413
+ self->connection_->listener_->server_->SetupTransport(
414
+ transport, self->accepting_pollset_, args->args,
415
+ grpc_chttp2_transport_get_socket_node(transport),
416
+ resource_user);
281
417
  if (channel_init_err == GRPC_ERROR_NONE) {
282
418
  // Use notify_on_receive_settings callback to enforce the
283
419
  // handshake deadline.
@@ -287,48 +423,153 @@ void Chttp2ServerListener::ConnectionState::OnHandshakeDone(void* arg,
287
423
  // static_cast<> to a derived class.
288
424
  // TODO(roth): Change to static_cast<> when we C++-ify the
289
425
  // transport API.
290
- self->transport_ =
426
+ self->connection_->transport_ =
291
427
  reinterpret_cast<grpc_chttp2_transport*>(transport);
428
+ GRPC_CHTTP2_REF_TRANSPORT(self->connection_->transport_,
429
+ "ActiveConnection"); // Held by connection_
292
430
  self->Ref().release(); // Held by OnReceiveSettings().
293
431
  GRPC_CLOSURE_INIT(&self->on_receive_settings_, OnReceiveSettings,
294
432
  self, grpc_schedule_on_exec_ctx);
433
+ // If the listener has been configured with a config fetcher, we need
434
+ // to watch on the transport being closed so that we can an updated
435
+ // list of active connections.
436
+ grpc_closure* on_close = nullptr;
437
+ if (self->connection_->listener_->config_fetcher_watcher_ !=
438
+ nullptr) {
439
+ // Refs helds by OnClose()
440
+ self->connection_->Ref().release();
441
+ on_close = &self->connection_->on_close_;
442
+ } else {
443
+ // Remove the connection from the connections_ map since OnClose()
444
+ // will not be invoked when a config fetcher is set.
445
+ cleanup_connection = true;
446
+ }
295
447
  grpc_chttp2_transport_start_reading(transport, args->read_buffer,
296
- &self->on_receive_settings_);
448
+ &self->on_receive_settings_,
449
+ on_close);
297
450
  grpc_channel_args_destroy(args->args);
298
451
  self->Ref().release(); // Held by OnTimeout().
299
- GRPC_CHTTP2_REF_TRANSPORT(
300
- reinterpret_cast<grpc_chttp2_transport*>(transport),
301
- "receive settings timeout");
302
452
  GRPC_CLOSURE_INIT(&self->on_timeout_, OnTimeout, self,
303
453
  grpc_schedule_on_exec_ctx);
304
454
  grpc_timer_init(&self->timer_, self->deadline_, &self->on_timeout_);
305
455
  } else {
306
456
  // Failed to create channel from transport. Clean up.
307
457
  gpr_log(GPR_ERROR, "Failed to create channel: %s",
308
- grpc_error_string(channel_init_err));
458
+ grpc_error_std_string(channel_init_err).c_str());
309
459
  GRPC_ERROR_UNREF(channel_init_err);
310
460
  grpc_transport_destroy(transport);
311
461
  grpc_slice_buffer_destroy_internal(args->read_buffer);
312
462
  gpr_free(args->read_buffer);
313
- if (resource_user != nullptr) {
314
- grpc_resource_user_free(resource_user,
315
- GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
316
- }
463
+ cleanup_connection = true;
464
+ free_resource_quota = true;
317
465
  grpc_channel_args_destroy(args->args);
318
466
  }
319
467
  } else {
320
- if (resource_user != nullptr) {
321
- grpc_resource_user_free(resource_user,
322
- GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
323
- }
468
+ cleanup_connection = true;
469
+ free_resource_quota = true;
324
470
  }
325
471
  }
326
- self->handshake_mgr_->RemoveFromPendingMgrList(
327
- &self->listener_->pending_handshake_mgrs_);
472
+ // Since the handshake manager is done, the connection no longer needs to
473
+ // shutdown the handshake when the listener needs to stop serving.
474
+ // Avoid calling the destructor of HandshakeManager and HandshakingState
475
+ // from within the critical region.
476
+ handshake_mgr = std::move(self->handshake_mgr_);
477
+ handshaking_state_ref = std::move(self->connection_->handshaking_state_);
328
478
  }
329
- self->handshake_mgr_.reset();
330
479
  gpr_free(self->acceptor_);
331
- grpc_tcp_server_unref(self->listener_->tcp_server_);
480
+ OrphanablePtr<ActiveConnection> connection;
481
+ if (free_resource_quota && resource_user != nullptr) {
482
+ grpc_resource_user_free(resource_user, GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
483
+ }
484
+ if (cleanup_connection) {
485
+ MutexLock listener_lock(&self->connection_->listener_->mu_);
486
+ auto it = self->connection_->listener_->connections_.find(
487
+ self->connection_.get());
488
+ if (it != self->connection_->listener_->connections_.end()) {
489
+ connection = std::move(it->second);
490
+ self->connection_->listener_->connections_.erase(it);
491
+ }
492
+ }
493
+ self->Unref();
494
+ }
495
+
496
+ //
497
+ // Chttp2ServerListener::ActiveConnection
498
+ //
499
+
500
+ Chttp2ServerListener::ActiveConnection::ActiveConnection(
501
+ grpc_pollset* accepting_pollset, grpc_tcp_server_acceptor* acceptor,
502
+ grpc_channel_args* args)
503
+ : handshaking_state_(MakeOrphanable<HandshakingState>(
504
+ Ref(), accepting_pollset, acceptor, args)) {
505
+ GRPC_CLOSURE_INIT(&on_close_, ActiveConnection::OnClose, this,
506
+ grpc_schedule_on_exec_ctx);
507
+ }
508
+
509
+ Chttp2ServerListener::ActiveConnection::~ActiveConnection() {
510
+ if (transport_ != nullptr) {
511
+ GRPC_CHTTP2_UNREF_TRANSPORT(transport_, "ActiveConnection");
512
+ }
513
+ }
514
+
515
+ void Chttp2ServerListener::ActiveConnection::Orphan() {
516
+ OrphanablePtr<HandshakingState> handshaking_state;
517
+ {
518
+ MutexLock lock(&mu_);
519
+ shutdown_ = true;
520
+ // Reset handshaking_state_ since we have been orphaned by the listener
521
+ // signaling that the listener has stopped serving.
522
+ handshaking_state = std::move(handshaking_state_);
523
+ }
524
+ Unref();
525
+ }
526
+
527
+ void Chttp2ServerListener::ActiveConnection::SendGoAway() {
528
+ grpc_chttp2_transport* transport = nullptr;
529
+ {
530
+ MutexLock lock(&mu_);
531
+ transport = transport_;
532
+ }
533
+ if (transport != nullptr) {
534
+ grpc_transport_op* op = grpc_make_transport_op(nullptr);
535
+ op->goaway_error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
536
+ "Server is stopping to serve requests.");
537
+ grpc_transport_perform_op(&transport->base, op);
538
+ }
539
+ }
540
+
541
+ void Chttp2ServerListener::ActiveConnection::Start(
542
+ RefCountedPtr<Chttp2ServerListener> listener, grpc_endpoint* endpoint,
543
+ grpc_channel_args* args) {
544
+ RefCountedPtr<HandshakingState> handshaking_state_ref;
545
+ listener_ = std::move(listener);
546
+ {
547
+ MutexLock lock(&mu_);
548
+ if (shutdown_) return;
549
+ // Hold a ref to HandshakingState to allow starting the handshake outside
550
+ // the critical region.
551
+ handshaking_state_ref = handshaking_state_->Ref();
552
+ }
553
+ handshaking_state_ref->Start(endpoint, args);
554
+ }
555
+
556
+ void Chttp2ServerListener::ActiveConnection::OnClose(
557
+ void* arg, grpc_error_handle /* error */) {
558
+ ActiveConnection* self = static_cast<ActiveConnection*>(arg);
559
+ OrphanablePtr<ActiveConnection> connection;
560
+ {
561
+ MutexLock listener_lock(&self->listener_->mu_);
562
+ MutexLock connection_lock(&self->mu_);
563
+ // The node was already deleted from the connections_ list if the connection
564
+ // is shutdown.
565
+ if (!self->shutdown_) {
566
+ auto it = self->listener_->connections_.find(self);
567
+ if (it != self->listener_->connections_.end()) {
568
+ connection = std::move(it->second);
569
+ self->listener_->connections_.erase(it);
570
+ }
571
+ }
572
+ }
332
573
  self->Unref();
333
574
  }
334
575
 
@@ -336,15 +577,13 @@ void Chttp2ServerListener::ConnectionState::OnHandshakeDone(void* arg,
336
577
  // Chttp2ServerListener
337
578
  //
338
579
 
339
- grpc_error* Chttp2ServerListener::Create(Server* server,
340
- grpc_resolved_address* addr,
341
- grpc_channel_args* args,
342
- Chttp2ServerArgsModifier args_modifier,
343
- int* port_num) {
580
+ grpc_error_handle Chttp2ServerListener::Create(
581
+ Server* server, grpc_resolved_address* addr, grpc_channel_args* args,
582
+ Chttp2ServerArgsModifier args_modifier, int* port_num) {
344
583
  Chttp2ServerListener* listener = nullptr;
345
584
  // The bulk of this method is inside of a lambda to make cleanup
346
585
  // easier without using goto.
347
- grpc_error* error = [&]() {
586
+ grpc_error_handle error = [&]() {
348
587
  // Create Chttp2ServerListener.
349
588
  listener = new Chttp2ServerListener(server, args, args_modifier);
350
589
  error = grpc_tcp_server_create(&listener->tcp_server_shutdown_complete_,
@@ -361,7 +600,7 @@ grpc_error* Chttp2ServerListener::Create(Server* server,
361
600
  // Create channelz node.
362
601
  if (grpc_channel_args_find_bool(args, GRPC_ARG_ENABLE_CHANNELZ,
363
602
  GRPC_ENABLE_CHANNELZ_DEFAULT)) {
364
- std::string string_address = grpc_sockaddr_to_string(addr, false);
603
+ std::string string_address = grpc_sockaddr_to_uri(addr);
365
604
  listener->channelz_listen_socket_ =
366
605
  MakeRefCounted<channelz::ListenSocketNode>(
367
606
  string_address.c_str(),
@@ -386,12 +625,12 @@ grpc_error* Chttp2ServerListener::Create(Server* server,
386
625
  return error;
387
626
  }
388
627
 
389
- grpc_error* Chttp2ServerListener::CreateWithAcceptor(
628
+ grpc_error_handle Chttp2ServerListener::CreateWithAcceptor(
390
629
  Server* server, const char* name, grpc_channel_args* args,
391
630
  Chttp2ServerArgsModifier args_modifier) {
392
631
  Chttp2ServerListener* listener =
393
632
  new Chttp2ServerListener(server, args, args_modifier);
394
- grpc_error* error = grpc_tcp_server_create(
633
+ grpc_error_handle error = grpc_tcp_server_create(
395
634
  &listener->tcp_server_shutdown_complete_, args, &listener->tcp_server_);
396
635
  if (error != GRPC_ERROR_NONE) {
397
636
  delete listener;
@@ -414,6 +653,13 @@ Chttp2ServerListener::Chttp2ServerListener(
414
653
  }
415
654
 
416
655
  Chttp2ServerListener::~Chttp2ServerListener() {
656
+ // Flush queued work before destroying handshaker factory, since that
657
+ // may do a synchronous unref.
658
+ ExecCtx::Get()->Flush();
659
+ if (on_destroy_done_ != nullptr) {
660
+ ExecCtx::Run(DEBUG_LOCATION, on_destroy_done_, GRPC_ERROR_NONE);
661
+ ExecCtx::Get()->Flush();
662
+ }
417
663
  grpc_channel_args_destroy(args_);
418
664
  }
419
665
 
@@ -422,24 +668,27 @@ void Chttp2ServerListener::Start(
422
668
  Server* /*server*/, const std::vector<grpc_pollset*>* /* pollsets */) {
423
669
  if (server_->config_fetcher() != nullptr) {
424
670
  grpc_channel_args* args = nullptr;
425
- auto watcher = absl::make_unique<ConfigFetcherWatcher>(this);
671
+ auto watcher = absl::make_unique<ConfigFetcherWatcher>(Ref());
672
+ config_fetcher_watcher_ = watcher.get();
426
673
  {
427
- MutexLock lock(&mu_);
428
- config_fetcher_watcher_ = watcher.get();
674
+ MutexLock lock(&channel_args_mu_);
429
675
  args = grpc_channel_args_copy(args_);
430
676
  }
431
677
  server_->config_fetcher()->StartWatch(
432
678
  grpc_sockaddr_to_string(&resolved_address_, false), args,
433
679
  std::move(watcher));
434
680
  } else {
681
+ {
682
+ MutexLock lock(&mu_);
683
+ started_ = true;
684
+ is_serving_ = true;
685
+ }
435
686
  StartListening();
436
687
  }
437
688
  }
438
689
 
439
690
  void Chttp2ServerListener::StartListening() {
440
691
  grpc_tcp_server_start(tcp_server_, &server_->pollsets(), OnAccept, this);
441
- MutexLock lock(&mu_);
442
- shutdown_ = false;
443
692
  }
444
693
 
445
694
  void Chttp2ServerListener::SetOnDestroyDone(grpc_closure* on_destroy_done) {
@@ -447,67 +696,94 @@ void Chttp2ServerListener::SetOnDestroyDone(grpc_closure* on_destroy_done) {
447
696
  on_destroy_done_ = on_destroy_done;
448
697
  }
449
698
 
450
- RefCountedPtr<HandshakeManager> Chttp2ServerListener::CreateHandshakeManager() {
451
- MutexLock lock(&mu_);
452
- if (shutdown_) return nullptr;
453
- grpc_resource_user* resource_user = server_->default_resource_user();
454
- if (resource_user != nullptr &&
455
- !grpc_resource_user_safe_alloc(resource_user,
456
- GRPC_RESOURCE_QUOTA_CHANNEL_SIZE)) {
457
- gpr_log(GPR_ERROR,
458
- "Memory quota exhausted, rejecting connection, no handshaking.");
459
- return nullptr;
460
- }
461
- auto handshake_mgr = MakeRefCounted<HandshakeManager>();
462
- handshake_mgr->AddToPendingMgrList(&pending_handshake_mgrs_);
463
- grpc_tcp_server_ref(tcp_server_); // Ref held by ConnectionState.
464
- return handshake_mgr;
465
- }
466
-
467
699
  void Chttp2ServerListener::OnAccept(void* arg, grpc_endpoint* tcp,
468
700
  grpc_pollset* accepting_pollset,
469
701
  grpc_tcp_server_acceptor* acceptor) {
470
702
  Chttp2ServerListener* self = static_cast<Chttp2ServerListener*>(arg);
471
- RefCountedPtr<HandshakeManager> handshake_mgr =
472
- self->CreateHandshakeManager();
473
- if (handshake_mgr == nullptr) {
474
- grpc_endpoint_shutdown(tcp, GRPC_ERROR_NONE);
703
+ grpc_channel_args* args = nullptr;
704
+ RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
705
+ connection_manager;
706
+ {
707
+ MutexLock lock(&self->channel_args_mu_);
708
+ args = grpc_channel_args_copy(self->args_);
709
+ connection_manager = self->connection_manager_;
710
+ }
711
+ auto endpoint_cleanup = [&](grpc_error_handle error) {
712
+ grpc_endpoint_shutdown(tcp, error);
475
713
  grpc_endpoint_destroy(tcp);
476
714
  gpr_free(acceptor);
477
- return;
715
+ };
716
+ if (self->server_->config_fetcher() != nullptr) {
717
+ if (connection_manager == nullptr) {
718
+ grpc_error_handle error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
719
+ "No ConnectionManager configured. Closing connection.");
720
+ endpoint_cleanup(error);
721
+ grpc_channel_args_destroy(args);
722
+ return;
723
+ }
724
+ // TODO(yashykt): Maybe combine the following two arg modifiers into a
725
+ // single one.
726
+ absl::StatusOr<grpc_channel_args*> args_result =
727
+ connection_manager->UpdateChannelArgsForConnection(args, tcp);
728
+ if (!args_result.ok()) {
729
+ gpr_log(GPR_DEBUG, "Closing connection: %s",
730
+ args_result.status().ToString().c_str());
731
+ endpoint_cleanup(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
732
+ args_result.status().ToString().c_str()));
733
+ return;
734
+ }
735
+ grpc_error_handle error = GRPC_ERROR_NONE;
736
+ args = self->args_modifier_(*args_result, &error);
737
+ if (error != GRPC_ERROR_NONE) {
738
+ gpr_log(GPR_DEBUG, "Closing connection: %s",
739
+ grpc_error_std_string(error).c_str());
740
+ endpoint_cleanup(error);
741
+ grpc_channel_args_destroy(args);
742
+ return;
743
+ }
478
744
  }
479
- grpc_channel_args* args = nullptr;
745
+ auto connection =
746
+ MakeOrphanable<ActiveConnection>(accepting_pollset, acceptor, args);
747
+ // Hold a ref to connection to allow starting handshake outside the
748
+ // critical region
749
+ RefCountedPtr<ActiveConnection> connection_ref = connection->Ref();
750
+ RefCountedPtr<Chttp2ServerListener> listener_ref;
480
751
  {
481
752
  MutexLock lock(&self->mu_);
482
- args = grpc_channel_args_copy(self->args_);
753
+ // Shutdown the the connection if listener's stopped serving.
754
+ if (!self->shutdown_ && self->is_serving_) {
755
+ grpc_resource_user* resource_user =
756
+ self->server_->default_resource_user();
757
+ if (resource_user != nullptr &&
758
+ !grpc_resource_user_safe_alloc(resource_user,
759
+ GRPC_RESOURCE_QUOTA_CHANNEL_SIZE)) {
760
+ gpr_log(
761
+ GPR_ERROR,
762
+ "Memory quota exhausted, rejecting connection, no handshaking.");
763
+ } else {
764
+ // This ref needs to be taken in the critical region after having made
765
+ // sure that the listener has not been Orphaned, so as to avoid
766
+ // heap-use-after-free issues where `Ref()` is invoked when the ref of
767
+ // tcp_server_ has already reached 0. (Ref() implementation of
768
+ // Chttp2ServerListener is grpc_tcp_server_ref().)
769
+ listener_ref = self->Ref();
770
+ self->connections_.emplace(connection.get(), std::move(connection));
771
+ }
772
+ }
773
+ }
774
+ if (connection != nullptr) {
775
+ endpoint_cleanup(GRPC_ERROR_NONE);
776
+ } else {
777
+ connection_ref->Start(std::move(listener_ref), tcp, args);
483
778
  }
484
- // Deletes itself when done.
485
- new ConnectionState(self, accepting_pollset, acceptor,
486
- std::move(handshake_mgr), args, tcp);
487
779
  grpc_channel_args_destroy(args);
488
780
  }
489
781
 
490
782
  void Chttp2ServerListener::TcpServerShutdownComplete(void* arg,
491
- grpc_error* error) {
783
+ grpc_error_handle error) {
492
784
  Chttp2ServerListener* self = static_cast<Chttp2ServerListener*>(arg);
493
- /* ensure all threads have unlocked */
494
- grpc_closure* destroy_done = nullptr;
495
- {
496
- MutexLock lock(&self->mu_);
497
- destroy_done = self->on_destroy_done_;
498
- GPR_ASSERT(self->shutdown_);
499
- if (self->pending_handshake_mgrs_ != nullptr) {
500
- self->pending_handshake_mgrs_->ShutdownAllPending(GRPC_ERROR_REF(error));
501
- }
502
- self->channelz_listen_socket_.reset();
503
- }
504
- // Flush queued work before destroying handshaker factory, since that
505
- // may do a synchronous unref.
506
- ExecCtx::Get()->Flush();
507
- if (destroy_done != nullptr) {
508
- ExecCtx::Run(DEBUG_LOCATION, destroy_done, GRPC_ERROR_REF(error));
509
- ExecCtx::Get()->Flush();
510
- }
785
+ self->channelz_listen_socket_.reset();
786
+ GRPC_ERROR_UNREF(error);
511
787
  delete self;
512
788
  }
513
789
 
@@ -519,10 +795,20 @@ void Chttp2ServerListener::Orphan() {
519
795
  if (config_fetcher_watcher_ != nullptr) {
520
796
  server_->config_fetcher()->CancelWatch(config_fetcher_watcher_);
521
797
  }
798
+ std::map<ActiveConnection*, OrphanablePtr<ActiveConnection>> connections;
522
799
  grpc_tcp_server* tcp_server;
523
800
  {
524
801
  MutexLock lock(&mu_);
525
802
  shutdown_ = true;
803
+ is_serving_ = false;
804
+ // Orphan the connections so that they can start cleaning up.
805
+ connections = std::move(connections_);
806
+ // If the listener is currently set to be serving but has not been started
807
+ // yet, it means that `grpc_tcp_server_start` is in progress. Wait for the
808
+ // operation to finish to avoid causing races.
809
+ while (is_serving_ && !started_) {
810
+ started_cv_.Wait(&mu_);
811
+ }
526
812
  tcp_server = tcp_server_;
527
813
  }
528
814
  grpc_tcp_server_shutdown_listeners(tcp_server);
@@ -535,19 +821,19 @@ void Chttp2ServerListener::Orphan() {
535
821
  // Chttp2ServerAddPort()
536
822
  //
537
823
 
538
- grpc_error* Chttp2ServerAddPort(Server* server, const char* addr,
539
- grpc_channel_args* args,
540
- Chttp2ServerArgsModifier args_modifier,
541
- int* port_num) {
824
+ grpc_error_handle Chttp2ServerAddPort(Server* server, const char* addr,
825
+ grpc_channel_args* args,
826
+ Chttp2ServerArgsModifier args_modifier,
827
+ int* port_num) {
542
828
  if (strncmp(addr, "external:", 9) == 0) {
543
829
  return grpc_core::Chttp2ServerListener::CreateWithAcceptor(
544
830
  server, addr, args, args_modifier);
545
831
  }
546
832
  *port_num = -1;
547
833
  grpc_resolved_addresses* resolved = nullptr;
548
- std::vector<grpc_error*> error_list;
834
+ std::vector<grpc_error_handle> error_list;
549
835
  // Using lambda to avoid use of goto.
550
- grpc_error* error = [&]() {
836
+ grpc_error_handle error = [&]() {
551
837
  if (absl::StartsWith(addr, kUnixUriPrefix)) {
552
838
  error = grpc_resolve_unix_domain_address(
553
839
  addr + sizeof(kUnixUriPrefix) - 1, &resolved);
@@ -592,13 +878,13 @@ grpc_error* Chttp2ServerAddPort(Server* server, const char* addr,
592
878
  resolved->naddrs - error_list.size(), resolved->naddrs);
593
879
  error = GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(
594
880
  msg.c_str(), error_list.data(), error_list.size());
595
- gpr_log(GPR_INFO, "WARNING: %s", grpc_error_string(error));
881
+ gpr_log(GPR_INFO, "WARNING: %s", grpc_error_std_string(error).c_str());
596
882
  GRPC_ERROR_UNREF(error);
597
883
  // we managed to bind some addresses: continue without error
598
884
  }
599
885
  return GRPC_ERROR_NONE;
600
886
  }(); // lambda end
601
- for (grpc_error* error : error_list) {
887
+ for (grpc_error_handle error : error_list) {
602
888
  GRPC_ERROR_UNREF(error);
603
889
  }
604
890
  grpc_channel_args_destroy(args);