grpc 1.35.0.pre1 → 1.37.1

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 (507) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +121 -89
  3. data/include/grpc/grpc.h +15 -1
  4. data/include/grpc/grpc_security.h +16 -11
  5. data/include/grpc/impl/codegen/port_platform.h +2 -0
  6. data/src/core/ext/filters/client_channel/client_channel.cc +359 -331
  7. data/src/core/ext/filters/client_channel/client_channel.h +0 -2
  8. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  9. data/src/core/ext/filters/client_channel/config_selector.h +9 -1
  10. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -4
  11. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  12. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  13. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -2
  14. data/src/core/ext/filters/client_channel/lb_policy.cc +3 -0
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +3 -5
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +8 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +289 -170
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +5 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +8 -25
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +232 -110
  27. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  28. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  29. data/src/core/ext/filters/client_channel/resolver.cc +5 -5
  30. data/src/core/ext/filters/client_channel/resolver.h +1 -12
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -45
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +34 -50
  35. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +16 -14
  36. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -15
  37. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +377 -0
  38. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  39. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +307 -155
  40. data/src/core/ext/filters/client_channel/server_address.cc +9 -0
  41. data/src/core/ext/filters/client_channel/server_address.h +31 -0
  42. data/src/core/ext/filters/client_channel/subchannel.cc +69 -146
  43. data/src/core/ext/filters/client_channel/subchannel.h +63 -95
  44. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  45. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  46. data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
  47. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +500 -0
  48. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  49. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  50. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  51. data/src/core/ext/filters/max_age/max_age_filter.cc +35 -32
  52. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
  53. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  54. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +3 -2
  55. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  56. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -2
  57. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +490 -178
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  59. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  60. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
  61. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  62. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +39 -7
  63. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  64. data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
  65. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  66. data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
  67. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  68. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  69. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +0 -1
  70. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  71. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  72. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +11 -16
  73. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +42 -59
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +3 -2
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +15 -0
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -1
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +75 -0
  78. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -2
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +9 -9
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +7 -7
  81. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +28 -13
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +0 -1
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +11 -5
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +41 -7
  87. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +0 -1
  88. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -21
  89. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  90. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +13 -9
  91. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +37 -5
  92. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +0 -1
  93. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  94. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  95. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  96. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  97. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +11 -9
  98. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +44 -27
  99. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +57 -16
  100. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +150 -0
  101. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +0 -1
  102. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  103. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  104. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  105. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  106. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  107. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  108. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  109. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  110. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +19 -21
  111. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +64 -51
  112. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +16 -13
  114. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +50 -18
  115. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +4 -7
  116. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +0 -17
  117. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +0 -1
  118. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +30 -23
  119. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +85 -73
  120. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -3
  121. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -3
  122. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +0 -1
  123. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -2
  124. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  125. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  126. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  127. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  128. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +0 -1
  129. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  130. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  131. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +21 -4
  132. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +29 -0
  133. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  134. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  135. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/authority.upb.c +5 -5
  136. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  137. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  138. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  139. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  140. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  141. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/resource.upb.c +9 -9
  142. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  143. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  144. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  145. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  146. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  147. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  148. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  149. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +168 -171
  150. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  151. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  152. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +405 -420
  153. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +2 -2
  154. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +12 -9
  155. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +177 -171
  156. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  157. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +88 -88
  158. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +153 -153
  159. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  160. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  161. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +4 -7
  162. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +33 -20
  163. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +56 -59
  164. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +116 -111
  165. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +129 -121
  166. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +21 -24
  167. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  168. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  169. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  170. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  171. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +17 -13
  172. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +753 -724
  173. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  174. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +22 -25
  175. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  176. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  177. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  178. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  179. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  180. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  181. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  182. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  183. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +371 -377
  184. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +12 -16
  185. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +112 -108
  186. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +45 -53
  187. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +177 -180
  188. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +92 -102
  189. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
  190. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +32 -42
  191. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +30 -40
  192. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +4 -7
  193. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +38 -44
  194. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  195. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  196. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  197. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  198. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +30 -33
  199. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  200. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  201. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +8 -7
  202. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +9 -9
  203. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +9 -8
  204. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +8 -8
  205. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +8 -8
  206. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +9 -8
  207. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +8 -8
  208. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  209. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  210. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +14 -11
  211. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  212. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  213. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  214. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  215. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  216. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  217. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  218. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  219. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  220. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  221. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  222. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  223. data/src/core/ext/xds/xds_api.cc +2149 -666
  224. data/src/core/ext/xds/xds_api.h +321 -119
  225. data/src/core/ext/xds/xds_bootstrap.cc +80 -45
  226. data/src/core/ext/xds/xds_bootstrap.h +17 -5
  227. data/src/core/ext/xds/xds_certificate_provider.cc +180 -74
  228. data/src/core/ext/xds/xds_certificate_provider.h +83 -44
  229. data/src/core/ext/xds/xds_client.cc +181 -34
  230. data/src/core/ext/xds/xds_client.h +29 -0
  231. data/src/core/ext/xds/xds_client_stats.cc +2 -1
  232. data/src/core/ext/xds/xds_client_stats.h +2 -2
  233. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  234. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  235. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  236. data/src/core/ext/xds/xds_http_filters.h +130 -0
  237. data/src/core/ext/xds/xds_server_config_fetcher.cc +425 -24
  238. data/src/core/lib/channel/channel_stack.cc +12 -0
  239. data/src/core/lib/channel/channel_stack.h +7 -0
  240. data/src/core/lib/channel/channelz.cc +92 -4
  241. data/src/core/lib/channel/channelz.h +30 -1
  242. data/src/core/lib/channel/channelz_registry.cc +14 -0
  243. data/src/core/lib/channel/handshaker.cc +2 -44
  244. data/src/core/lib/channel/handshaker.h +1 -18
  245. data/src/core/lib/channel/status_util.cc +12 -2
  246. data/src/core/lib/channel/status_util.h +5 -0
  247. data/src/core/lib/gpr/log.cc +6 -1
  248. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  249. data/src/core/lib/gpr/sync_windows.cc +2 -2
  250. data/src/core/lib/gprpp/atomic.h +3 -3
  251. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  252. data/src/core/lib/gprpp/mpscq.cc +2 -2
  253. data/src/core/lib/gprpp/ref_counted.h +1 -1
  254. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  255. data/src/core/lib/gprpp/sync.h +129 -40
  256. data/src/core/lib/gprpp/thd.h +1 -1
  257. data/src/core/lib/gprpp/time_util.cc +77 -0
  258. data/src/core/lib/gprpp/time_util.h +42 -0
  259. data/src/core/lib/http/httpcli_security_connector.cc +2 -2
  260. data/src/core/lib/iomgr/buffer_list.h +1 -1
  261. data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
  262. data/src/core/lib/iomgr/error.h +1 -1
  263. data/src/core/lib/iomgr/ev_apple.cc +11 -8
  264. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -3
  265. data/src/core/lib/iomgr/ev_epollex_linux.cc +4 -4
  266. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  267. data/src/core/lib/iomgr/exec_ctx.cc +6 -2
  268. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  269. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  270. data/src/core/lib/iomgr/resource_quota.cc +1 -1
  271. data/src/core/lib/iomgr/sockaddr_utils.cc +121 -1
  272. data/src/core/lib/iomgr/sockaddr_utils.h +25 -0
  273. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  274. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  275. data/src/core/lib/iomgr/tcp_posix.cc +5 -8
  276. data/src/core/lib/iomgr/tcp_uv.cc +2 -2
  277. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  278. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  279. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  280. data/src/core/lib/matchers/matchers.cc +339 -0
  281. data/src/core/lib/matchers/matchers.h +160 -0
  282. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  284. data/src/core/lib/security/credentials/credentials.h +2 -1
  285. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +1 -1
  286. data/src/core/lib/security/credentials/external/external_account_credentials.cc +2 -2
  287. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -1
  288. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -1
  289. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -1
  290. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +7 -6
  291. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +2 -2
  292. data/src/core/lib/security/credentials/jwt/json_token.cc +0 -3
  293. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +0 -3
  294. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  295. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  296. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +2 -1
  297. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  298. data/src/core/lib/security/credentials/tls/tls_credentials.cc +2 -1
  299. data/src/core/lib/security/credentials/tls/tls_credentials.h +1 -1
  300. data/src/core/lib/security/credentials/xds/xds_credentials.cc +128 -59
  301. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  302. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
  303. data/src/core/lib/security/security_connector/ssl_utils.cc +9 -4
  304. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +32 -14
  305. data/src/core/lib/security/transport/security_handshaker.cc +33 -5
  306. data/src/core/lib/security/transport/server_auth_filter.cc +7 -0
  307. data/src/core/lib/slice/slice_intern.cc +5 -6
  308. data/src/core/lib/surface/channel.h +3 -3
  309. data/src/core/lib/surface/completion_queue.cc +1 -1
  310. data/src/core/lib/surface/init.cc +13 -15
  311. data/src/core/lib/surface/lame_client.cc +38 -19
  312. data/src/core/lib/surface/lame_client.h +4 -3
  313. data/src/core/lib/surface/server.cc +43 -36
  314. data/src/core/lib/surface/server.h +76 -14
  315. data/src/core/lib/surface/version.cc +2 -2
  316. data/src/core/lib/transport/metadata.cc +6 -2
  317. data/src/core/lib/transport/metadata_batch.cc +27 -0
  318. data/src/core/lib/transport/metadata_batch.h +14 -0
  319. data/src/core/plugin_registry/grpc_plugin_registry.cc +12 -0
  320. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +18 -24
  321. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +16 -21
  322. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  323. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  324. data/src/core/tsi/fake_transport_security.cc +11 -2
  325. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -3
  326. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  327. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +2 -4
  328. data/src/core/tsi/ssl_transport_security.cc +0 -3
  329. data/src/core/tsi/ssl_transport_security.h +0 -3
  330. data/src/ruby/ext/grpc/extconf.rb +9 -1
  331. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  332. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  333. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  334. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  335. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  336. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  337. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  338. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  339. data/src/ruby/ext/grpc/rb_server.c +13 -1
  340. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  341. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  342. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  343. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  344. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  345. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  346. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +7 -0
  349. data/src/ruby/spec/call_spec.rb +1 -1
  350. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  351. data/src/ruby/spec/channel_spec.rb +17 -6
  352. data/src/ruby/spec/client_auth_spec.rb +27 -1
  353. data/src/ruby/spec/errors_spec.rb +1 -1
  354. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  355. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  356. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  357. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  358. data/src/ruby/spec/server_spec.rb +22 -0
  359. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +1 -0
  360. data/third_party/boringssl-with-bazel/err_data.c +715 -713
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  365. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -14
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  372. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  373. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  374. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  375. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  377. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  378. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  379. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  381. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  382. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  383. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  384. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  385. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  386. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  387. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  388. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  389. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
  395. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  396. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +135 -43
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +51 -32
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +147 -0
  404. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +18 -29
  405. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +13 -4
  406. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  407. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  408. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  409. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  410. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  411. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  412. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +1 -29
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +10 -7
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +8 -8
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +1 -1
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +29 -23
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +1 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +39 -4
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  424. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  425. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +11 -10
  426. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  427. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +25 -25
  428. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +40 -20
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +6 -6
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  436. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +3 -3
  437. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -545
  438. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  439. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -5
  440. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  441. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  442. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +19 -0
  443. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  444. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +56 -26
  445. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  446. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  447. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +12 -2
  448. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  449. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +67 -33
  451. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +27 -8
  452. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +287 -99
  453. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +139 -36
  454. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +4 -3
  455. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +11 -20
  456. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +10 -5
  457. data/third_party/boringssl-with-bazel/src/ssl/internal.h +37 -16
  458. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  459. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -8
  460. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +20 -14
  461. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +7 -8
  462. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  463. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  464. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +362 -50
  465. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -2
  466. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  467. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +66 -24
  468. data/third_party/xxhash/xxhash.h +5443 -0
  469. metadata +140 -84
  470. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +0 -60
  471. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +0 -52
  472. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +0 -143
  473. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +0 -42
  474. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +0 -84
  475. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +0 -94
  476. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +0 -54
  477. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +0 -173
  478. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +0 -36
  479. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +0 -92
  480. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +0 -42
  481. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +0 -35
  482. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +0 -62
  483. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +0 -40
  484. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +0 -45
  485. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +0 -40
  486. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +0 -49
  487. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +0 -35
  488. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +0 -68
  489. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +0 -40
  490. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +0 -51
  491. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +0 -35
  492. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  493. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  494. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  495. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  496. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  497. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  498. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  499. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  500. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -97
  501. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  502. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  503. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  504. data/third_party/upb/upb/json_decode.c +0 -1443
  505. data/third_party/upb/upb/json_decode.h +0 -23
  506. data/third_party/upb/upb/json_encode.c +0 -713
  507. data/third_party/upb/upb/json_encode.h +0 -36
@@ -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;
@@ -62,7 +62,7 @@ grpc_channel* grpc_insecure_channel_create_from_fd(
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;
@@ -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;
@@ -62,13 +62,17 @@ const char kUnixAbstractUriPrefix[] = "unix-abstract:";
62
62
  class Chttp2ServerListener : public Server::ListenerInterface {
63
63
  public:
64
64
  static grpc_error* Create(Server* server, grpc_resolved_address* addr,
65
- grpc_channel_args* args, int* port_num);
65
+ grpc_channel_args* args,
66
+ Chttp2ServerArgsModifier args_modifier,
67
+ int* port_num);
66
68
 
67
69
  static grpc_error* CreateWithAcceptor(Server* server, const char* name,
68
- grpc_channel_args* args);
70
+ grpc_channel_args* args,
71
+ Chttp2ServerArgsModifier args_modifier);
69
72
 
70
73
  // Do not instantiate directly. Use one of the factory methods above.
71
- Chttp2ServerListener(Server* server, grpc_channel_args* args);
74
+ Chttp2ServerListener(Server* server, grpc_channel_args* args,
75
+ Chttp2ServerArgsModifier args_modifier);
72
76
  ~Chttp2ServerListener() override;
73
77
 
74
78
  void Start(Server* server,
@@ -86,91 +90,209 @@ class Chttp2ServerListener : public Server::ListenerInterface {
86
90
  class ConfigFetcherWatcher
87
91
  : public grpc_server_config_fetcher::WatcherInterface {
88
92
  public:
89
- explicit ConfigFetcherWatcher(Chttp2ServerListener* listener)
90
- : listener_(listener) {}
91
-
92
- void UpdateConfig(grpc_channel_args* args) override {
93
- {
94
- MutexLock lock(&listener_->mu_);
95
- // TODO(yashykt): Fix this
96
- // grpc_channel_args_destroy(listener_->args_);
97
- // listener_->args_ = args;
98
- if (!listener_->shutdown_) return; // Already started listening.
99
- }
100
- int port_temp;
101
- grpc_error* error = grpc_tcp_server_add_port(
102
- listener_->tcp_server_, &listener_->resolved_address_, &port_temp);
103
- if (error != GRPC_ERROR_NONE) {
104
- GRPC_ERROR_UNREF(error);
105
- gpr_log(GPR_ERROR, "Error adding port to server: %s",
106
- grpc_error_string(error));
107
- // TODO(yashykt): We wouldn't need to assert here if we bound to the
108
- // port earlier during AddPort.
109
- GPR_ASSERT(0);
110
- }
111
- listener_->StartListening();
112
- }
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;
113
101
 
114
102
  private:
115
- Chttp2ServerListener* listener_;
103
+ RefCountedPtr<Chttp2ServerListener> listener_;
116
104
  };
117
105
 
118
- class ConnectionState : public RefCounted<ConnectionState> {
106
+ class ActiveConnection : public InternallyRefCounted<ActiveConnection> {
119
107
  public:
120
- ConnectionState(Chttp2ServerListener* listener,
121
- grpc_pollset* accepting_pollset,
122
- grpc_tcp_server_acceptor* acceptor,
123
- RefCountedPtr<HandshakeManager> handshake_mgr,
124
- 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;
118
+
119
+ void Start(grpc_endpoint* endpoint, grpc_channel_args* args);
125
120
 
126
- ~ConnectionState() override;
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* error);
126
+ static void OnReceiveSettings(void* arg, grpc_error* /* error */);
127
+ static void OnHandshakeDone(void* arg, grpc_error* 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;
127
156
 
128
157
  private:
129
- static void OnTimeout(void* arg, grpc_error* error);
130
- static void OnReceiveSettings(void* arg, grpc_error* error);
131
- static void OnHandshakeDone(void* arg, grpc_error* error);
132
-
133
- Chttp2ServerListener* const listener_;
134
- grpc_pollset* const accepting_pollset_;
135
- grpc_tcp_server_acceptor* const acceptor_;
136
- RefCountedPtr<HandshakeManager> handshake_mgr_;
137
- // State for enforcing handshake timeout on receiving HTTP/2 settings.
138
- grpc_chttp2_transport* transport_ = nullptr;
139
- grpc_millis deadline_;
140
- grpc_timer timer_;
141
- grpc_closure on_timeout_;
142
- grpc_closure on_receive_settings_;
143
- grpc_pollset_set* const interested_parties_;
158
+ static void OnClose(void* arg, grpc_error* 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;
144
170
  };
145
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.
146
176
  void StartListening();
147
177
 
148
178
  static void OnAccept(void* arg, grpc_endpoint* tcp,
149
179
  grpc_pollset* accepting_pollset,
150
180
  grpc_tcp_server_acceptor* acceptor);
151
181
 
152
- RefCountedPtr<HandshakeManager> CreateHandshakeManager();
153
-
154
182
  static void TcpServerShutdownComplete(void* arg, grpc_error* error);
155
183
 
156
184
  static void DestroyListener(Server* /*server*/, void* arg,
157
185
  grpc_closure* destroy_done);
158
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
+
159
214
  Server* const server_;
160
- grpc_channel_args* const args_;
161
215
  grpc_tcp_server* tcp_server_;
162
216
  grpc_resolved_address resolved_address_;
163
- Mutex mu_;
217
+ Chttp2ServerArgsModifier const args_modifier_;
164
218
  ConfigFetcherWatcher* config_fetcher_watcher_ = nullptr;
165
- bool shutdown_ = true;
166
- grpc_closure tcp_server_shutdown_complete_;
167
- grpc_closure* on_destroy_done_ = nullptr;
168
- 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;
169
236
  RefCountedPtr<channelz::ListenSocketNode> channelz_listen_socket_;
170
237
  };
171
238
 
172
239
  //
173
- // 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* 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_string(error));
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
174
296
  //
175
297
 
176
298
  grpc_millis GetConnectionDeadline(const grpc_channel_args* args) {
@@ -180,73 +302,96 @@ grpc_millis GetConnectionDeadline(const grpc_channel_args* args) {
180
302
  return ExecCtx::Get()->Now() + timeout_ms;
181
303
  }
182
304
 
183
- Chttp2ServerListener::ConnectionState::ConnectionState(
184
- Chttp2ServerListener* listener, grpc_pollset* accepting_pollset,
185
- grpc_tcp_server_acceptor* acceptor,
186
- RefCountedPtr<HandshakeManager> handshake_mgr, grpc_channel_args* args,
187
- grpc_endpoint* endpoint)
188
- : 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)),
189
310
  accepting_pollset_(accepting_pollset),
190
311
  acceptor_(acceptor),
191
- handshake_mgr_(std::move(handshake_mgr)),
312
+ handshake_mgr_(MakeRefCounted<HandshakeManager>()),
192
313
  deadline_(GetConnectionDeadline(args)),
193
314
  interested_parties_(grpc_pollset_set_create()) {
194
315
  grpc_pollset_set_add_pollset(interested_parties_, accepting_pollset_);
195
316
  HandshakerRegistry::AddHandshakers(HANDSHAKER_SERVER, args,
196
317
  interested_parties_, handshake_mgr_.get());
197
- handshake_mgr_->DoHandshake(endpoint, args, deadline_, acceptor_,
198
- OnHandshakeDone, this);
199
318
  }
200
319
 
201
- Chttp2ServerListener::ConnectionState::~ConnectionState() {
202
- if (transport_ != nullptr) {
203
- GRPC_CHTTP2_UNREF_TRANSPORT(transport_, "receive settings timeout");
204
- }
320
+ Chttp2ServerListener::ActiveConnection::HandshakingState::~HandshakingState() {
205
321
  grpc_pollset_set_del_pollset(interested_parties_, accepting_pollset_);
206
322
  grpc_pollset_set_destroy(interested_parties_);
207
323
  }
208
324
 
209
- void Chttp2ServerListener::ConnectionState::OnTimeout(void* arg,
210
- grpc_error* error) {
211
- 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* error) {
351
+ HandshakingState* self = static_cast<HandshakingState*>(arg);
212
352
  // Note that we may be called with GRPC_ERROR_NONE when the timer fires
213
353
  // or with an error indicating that the timer system is being shut down.
214
354
  if (error != GRPC_ERROR_CANCELLED) {
215
355
  grpc_transport_op* op = grpc_make_transport_op(nullptr);
216
356
  op->disconnect_with_error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
217
357
  "Did not receive HTTP/2 settings before handshake timeout");
218
- 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);
219
364
  }
220
365
  self->Unref();
221
366
  }
222
367
 
223
- void Chttp2ServerListener::ConnectionState::OnReceiveSettings(
224
- void* arg, grpc_error* error) {
225
- ConnectionState* self = static_cast<ConnectionState*>(arg);
226
- if (error == GRPC_ERROR_NONE) {
227
- grpc_timer_cancel(&self->timer_);
228
- }
368
+ void Chttp2ServerListener::ActiveConnection::HandshakingState::
369
+ OnReceiveSettings(void* arg, grpc_error* /* error */) {
370
+ HandshakingState* self = static_cast<HandshakingState*>(arg);
371
+ grpc_timer_cancel(&self->timer_);
229
372
  self->Unref();
230
373
  }
231
374
 
232
- void Chttp2ServerListener::ConnectionState::OnHandshakeDone(void* arg,
233
- grpc_error* error) {
375
+ void Chttp2ServerListener::ActiveConnection::HandshakingState::OnHandshakeDone(
376
+ void* arg, grpc_error* error) {
234
377
  auto* args = static_cast<HandshakerArgs*>(arg);
235
- 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();
236
385
  {
237
- MutexLock lock(&self->listener_->mu_);
238
- grpc_resource_user* resource_user =
239
- self->listener_->server_->default_resource_user();
240
- if (error != GRPC_ERROR_NONE || self->listener_->shutdown_) {
386
+ MutexLock connection_lock(&self->connection_->mu_);
387
+ if (error != GRPC_ERROR_NONE || self->connection_->shutdown_) {
241
388
  const char* error_str = grpc_error_string(error);
242
389
  gpr_log(GPR_DEBUG, "Handshaking failed: %s", error_str);
243
- if (resource_user != nullptr) {
244
- grpc_resource_user_free(resource_user,
245
- GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
246
- }
390
+ cleanup_connection = true;
391
+ free_resource_quota = true;
247
392
  if (error == GRPC_ERROR_NONE && args->endpoint != nullptr) {
248
- // We were shut down after handshaking completed successfully, so
249
- // destroy the endpoint here.
393
+ // We were shut down or stopped serving after handshaking completed
394
+ // successfully, so destroy the endpoint here.
250
395
  // TODO(ctiller): It is currently necessary to shutdown endpoints
251
396
  // before destroying them, even if we know that there are no
252
397
  // pending read/write callbacks. This should be fixed, at which
@@ -264,9 +409,11 @@ void Chttp2ServerListener::ConnectionState::OnHandshakeDone(void* arg,
264
409
  if (args->endpoint != nullptr) {
265
410
  grpc_transport* transport = grpc_create_chttp2_transport(
266
411
  args->args, args->endpoint, false, resource_user);
267
- grpc_error* channel_init_err = self->listener_->server_->SetupTransport(
268
- transport, self->accepting_pollset_, args->args,
269
- grpc_chttp2_transport_get_socket_node(transport), resource_user);
412
+ grpc_error* 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);
270
417
  if (channel_init_err == GRPC_ERROR_NONE) {
271
418
  // Use notify_on_receive_settings callback to enforce the
272
419
  // handshake deadline.
@@ -276,18 +423,32 @@ void Chttp2ServerListener::ConnectionState::OnHandshakeDone(void* arg,
276
423
  // static_cast<> to a derived class.
277
424
  // TODO(roth): Change to static_cast<> when we C++-ify the
278
425
  // transport API.
279
- self->transport_ =
426
+ self->connection_->transport_ =
280
427
  reinterpret_cast<grpc_chttp2_transport*>(transport);
428
+ GRPC_CHTTP2_REF_TRANSPORT(self->connection_->transport_,
429
+ "ActiveConnection"); // Held by connection_
281
430
  self->Ref().release(); // Held by OnReceiveSettings().
282
431
  GRPC_CLOSURE_INIT(&self->on_receive_settings_, OnReceiveSettings,
283
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
+ }
284
447
  grpc_chttp2_transport_start_reading(transport, args->read_buffer,
285
- &self->on_receive_settings_);
448
+ &self->on_receive_settings_,
449
+ on_close);
286
450
  grpc_channel_args_destroy(args->args);
287
451
  self->Ref().release(); // Held by OnTimeout().
288
- GRPC_CHTTP2_REF_TRANSPORT(
289
- reinterpret_cast<grpc_chttp2_transport*>(transport),
290
- "receive settings timeout");
291
452
  GRPC_CLOSURE_INIT(&self->on_timeout_, OnTimeout, self,
292
453
  grpc_schedule_on_exec_ctx);
293
454
  grpc_timer_init(&self->timer_, self->deadline_, &self->on_timeout_);
@@ -299,25 +460,116 @@ void Chttp2ServerListener::ConnectionState::OnHandshakeDone(void* arg,
299
460
  grpc_transport_destroy(transport);
300
461
  grpc_slice_buffer_destroy_internal(args->read_buffer);
301
462
  gpr_free(args->read_buffer);
302
- if (resource_user != nullptr) {
303
- grpc_resource_user_free(resource_user,
304
- GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
305
- }
463
+ cleanup_connection = true;
464
+ free_resource_quota = true;
306
465
  grpc_channel_args_destroy(args->args);
307
466
  }
308
467
  } else {
309
- if (resource_user != nullptr) {
310
- grpc_resource_user_free(resource_user,
311
- GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
312
- }
468
+ cleanup_connection = true;
469
+ free_resource_quota = true;
313
470
  }
314
471
  }
315
- self->handshake_mgr_->RemoveFromPendingMgrList(
316
- &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_);
317
478
  }
318
- self->handshake_mgr_.reset();
319
479
  gpr_free(self->acceptor_);
320
- 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(void* arg,
557
+ grpc_error* /* 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
+ }
321
573
  self->Unref();
322
574
  }
323
575
 
@@ -328,13 +580,14 @@ void Chttp2ServerListener::ConnectionState::OnHandshakeDone(void* arg,
328
580
  grpc_error* Chttp2ServerListener::Create(Server* server,
329
581
  grpc_resolved_address* addr,
330
582
  grpc_channel_args* args,
583
+ Chttp2ServerArgsModifier args_modifier,
331
584
  int* port_num) {
332
585
  Chttp2ServerListener* listener = nullptr;
333
586
  // The bulk of this method is inside of a lambda to make cleanup
334
587
  // easier without using goto.
335
588
  grpc_error* error = [&]() {
336
589
  // Create Chttp2ServerListener.
337
- listener = new Chttp2ServerListener(server, args);
590
+ listener = new Chttp2ServerListener(server, args, args_modifier);
338
591
  error = grpc_tcp_server_create(&listener->tcp_server_shutdown_complete_,
339
592
  args, &listener->tcp_server_);
340
593
  if (error != GRPC_ERROR_NONE) return error;
@@ -349,7 +602,7 @@ grpc_error* Chttp2ServerListener::Create(Server* server,
349
602
  // Create channelz node.
350
603
  if (grpc_channel_args_find_bool(args, GRPC_ARG_ENABLE_CHANNELZ,
351
604
  GRPC_ENABLE_CHANNELZ_DEFAULT)) {
352
- std::string string_address = grpc_sockaddr_to_string(addr, false);
605
+ std::string string_address = grpc_sockaddr_to_uri(addr);
353
606
  listener->channelz_listen_socket_ =
354
607
  MakeRefCounted<channelz::ListenSocketNode>(
355
608
  string_address.c_str(),
@@ -374,10 +627,11 @@ grpc_error* Chttp2ServerListener::Create(Server* server,
374
627
  return error;
375
628
  }
376
629
 
377
- grpc_error* Chttp2ServerListener::CreateWithAcceptor(Server* server,
378
- const char* name,
379
- grpc_channel_args* args) {
380
- Chttp2ServerListener* listener = new Chttp2ServerListener(server, args);
630
+ grpc_error* Chttp2ServerListener::CreateWithAcceptor(
631
+ Server* server, const char* name, grpc_channel_args* args,
632
+ Chttp2ServerArgsModifier args_modifier) {
633
+ Chttp2ServerListener* listener =
634
+ new Chttp2ServerListener(server, args, args_modifier);
381
635
  grpc_error* error = grpc_tcp_server_create(
382
636
  &listener->tcp_server_shutdown_complete_, args, &listener->tcp_server_);
383
637
  if (error != GRPC_ERROR_NONE) {
@@ -392,14 +646,22 @@ grpc_error* Chttp2ServerListener::CreateWithAcceptor(Server* server,
392
646
  return GRPC_ERROR_NONE;
393
647
  }
394
648
 
395
- Chttp2ServerListener::Chttp2ServerListener(Server* server,
396
- grpc_channel_args* args)
397
- : server_(server), args_(args) {
649
+ Chttp2ServerListener::Chttp2ServerListener(
650
+ Server* server, grpc_channel_args* args,
651
+ Chttp2ServerArgsModifier args_modifier)
652
+ : server_(server), args_modifier_(args_modifier), args_(args) {
398
653
  GRPC_CLOSURE_INIT(&tcp_server_shutdown_complete_, TcpServerShutdownComplete,
399
654
  this, grpc_schedule_on_exec_ctx);
400
655
  }
401
656
 
402
657
  Chttp2ServerListener::~Chttp2ServerListener() {
658
+ // Flush queued work before destroying handshaker factory, since that
659
+ // may do a synchronous unref.
660
+ ExecCtx::Get()->Flush();
661
+ if (on_destroy_done_ != nullptr) {
662
+ ExecCtx::Run(DEBUG_LOCATION, on_destroy_done_, GRPC_ERROR_NONE);
663
+ ExecCtx::Get()->Flush();
664
+ }
403
665
  grpc_channel_args_destroy(args_);
404
666
  }
405
667
 
@@ -407,22 +669,28 @@ Chttp2ServerListener::~Chttp2ServerListener() {
407
669
  void Chttp2ServerListener::Start(
408
670
  Server* /*server*/, const std::vector<grpc_pollset*>* /* pollsets */) {
409
671
  if (server_->config_fetcher() != nullptr) {
410
- auto watcher = absl::make_unique<ConfigFetcherWatcher>(this);
672
+ grpc_channel_args* args = nullptr;
673
+ auto watcher = absl::make_unique<ConfigFetcherWatcher>(Ref());
674
+ config_fetcher_watcher_ = watcher.get();
411
675
  {
412
- MutexLock lock(&mu_);
413
- config_fetcher_watcher_ = watcher.get();
676
+ MutexLock lock(&channel_args_mu_);
677
+ args = grpc_channel_args_copy(args_);
414
678
  }
415
679
  server_->config_fetcher()->StartWatch(
416
- grpc_sockaddr_to_string(&resolved_address_, false), std::move(watcher));
680
+ grpc_sockaddr_to_string(&resolved_address_, false), args,
681
+ std::move(watcher));
417
682
  } else {
683
+ {
684
+ MutexLock lock(&mu_);
685
+ started_ = true;
686
+ is_serving_ = true;
687
+ }
418
688
  StartListening();
419
689
  }
420
690
  }
421
691
 
422
692
  void Chttp2ServerListener::StartListening() {
423
693
  grpc_tcp_server_start(tcp_server_, &server_->pollsets(), OnAccept, this);
424
- MutexLock lock(&mu_);
425
- shutdown_ = false;
426
694
  }
427
695
 
428
696
  void Chttp2ServerListener::SetOnDestroyDone(grpc_closure* on_destroy_done) {
@@ -430,61 +698,93 @@ void Chttp2ServerListener::SetOnDestroyDone(grpc_closure* on_destroy_done) {
430
698
  on_destroy_done_ = on_destroy_done;
431
699
  }
432
700
 
433
- RefCountedPtr<HandshakeManager> Chttp2ServerListener::CreateHandshakeManager() {
434
- MutexLock lock(&mu_);
435
- if (shutdown_) return nullptr;
436
- grpc_resource_user* resource_user = server_->default_resource_user();
437
- if (resource_user != nullptr &&
438
- !grpc_resource_user_safe_alloc(resource_user,
439
- GRPC_RESOURCE_QUOTA_CHANNEL_SIZE)) {
440
- gpr_log(GPR_ERROR,
441
- "Memory quota exhausted, rejecting connection, no handshaking.");
442
- return nullptr;
443
- }
444
- auto handshake_mgr = MakeRefCounted<HandshakeManager>();
445
- handshake_mgr->AddToPendingMgrList(&pending_handshake_mgrs_);
446
- grpc_tcp_server_ref(tcp_server_); // Ref held by ConnectionState.
447
- return handshake_mgr;
448
- }
449
-
450
701
  void Chttp2ServerListener::OnAccept(void* arg, grpc_endpoint* tcp,
451
702
  grpc_pollset* accepting_pollset,
452
703
  grpc_tcp_server_acceptor* acceptor) {
453
704
  Chttp2ServerListener* self = static_cast<Chttp2ServerListener*>(arg);
454
- RefCountedPtr<HandshakeManager> handshake_mgr =
455
- self->CreateHandshakeManager();
456
- if (handshake_mgr == nullptr) {
457
- grpc_endpoint_shutdown(tcp, GRPC_ERROR_NONE);
705
+ grpc_channel_args* args = nullptr;
706
+ RefCountedPtr<grpc_server_config_fetcher::ConnectionManager>
707
+ connection_manager;
708
+ {
709
+ MutexLock lock(&self->channel_args_mu_);
710
+ args = grpc_channel_args_copy(self->args_);
711
+ connection_manager = self->connection_manager_;
712
+ }
713
+ auto endpoint_cleanup = [&](grpc_error* error) {
714
+ grpc_endpoint_shutdown(tcp, error);
458
715
  grpc_endpoint_destroy(tcp);
459
716
  gpr_free(acceptor);
460
- return;
717
+ };
718
+ if (self->server_->config_fetcher() != nullptr) {
719
+ if (connection_manager == nullptr) {
720
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
721
+ "No ConnectionManager configured. Closing connection.");
722
+ endpoint_cleanup(error);
723
+ grpc_channel_args_destroy(args);
724
+ return;
725
+ }
726
+ // TODO(yashykt): Maybe combine the following two arg modifiers into a
727
+ // single one.
728
+ absl::StatusOr<grpc_channel_args*> args_result =
729
+ connection_manager->UpdateChannelArgsForConnection(args, tcp);
730
+ if (!args_result.ok()) {
731
+ gpr_log(GPR_DEBUG, "Closing connection: %s",
732
+ args_result.status().ToString().c_str());
733
+ endpoint_cleanup(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
734
+ args_result.status().ToString().c_str()));
735
+ return;
736
+ }
737
+ grpc_error* error = GRPC_ERROR_NONE;
738
+ args = self->args_modifier_(*args_result, &error);
739
+ if (error != GRPC_ERROR_NONE) {
740
+ gpr_log(GPR_DEBUG, "Closing connection: %s", grpc_error_string(error));
741
+ endpoint_cleanup(error);
742
+ grpc_channel_args_destroy(args);
743
+ return;
744
+ }
461
745
  }
462
- // Deletes itself when done.
463
- new ConnectionState(self, accepting_pollset, acceptor,
464
- std::move(handshake_mgr), self->args_, tcp);
465
- }
466
-
467
- void Chttp2ServerListener::TcpServerShutdownComplete(void* arg,
468
- grpc_error* error) {
469
- Chttp2ServerListener* self = static_cast<Chttp2ServerListener*>(arg);
470
- /* ensure all threads have unlocked */
471
- grpc_closure* destroy_done = nullptr;
746
+ auto connection =
747
+ MakeOrphanable<ActiveConnection>(accepting_pollset, acceptor, args);
748
+ // Hold a ref to connection to allow starting handshake outside the
749
+ // critical region
750
+ RefCountedPtr<ActiveConnection> connection_ref = connection->Ref();
751
+ RefCountedPtr<Chttp2ServerListener> listener_ref;
472
752
  {
473
753
  MutexLock lock(&self->mu_);
474
- destroy_done = self->on_destroy_done_;
475
- GPR_ASSERT(self->shutdown_);
476
- if (self->pending_handshake_mgrs_ != nullptr) {
477
- self->pending_handshake_mgrs_->ShutdownAllPending(GRPC_ERROR_REF(error));
754
+ // Shutdown the the connection if listener's stopped serving.
755
+ if (!self->shutdown_ && self->is_serving_) {
756
+ grpc_resource_user* resource_user =
757
+ self->server_->default_resource_user();
758
+ if (resource_user != nullptr &&
759
+ !grpc_resource_user_safe_alloc(resource_user,
760
+ GRPC_RESOURCE_QUOTA_CHANNEL_SIZE)) {
761
+ gpr_log(
762
+ GPR_ERROR,
763
+ "Memory quota exhausted, rejecting connection, no handshaking.");
764
+ } else {
765
+ // This ref needs to be taken in the critical region after having made
766
+ // sure that the listener has not been Orphaned, so as to avoid
767
+ // heap-use-after-free issues where `Ref()` is invoked when the ref of
768
+ // tcp_server_ has already reached 0. (Ref() implementation of
769
+ // Chttp2ServerListener is grpc_tcp_server_ref().)
770
+ listener_ref = self->Ref();
771
+ self->connections_.emplace(connection.get(), std::move(connection));
772
+ }
478
773
  }
479
- self->channelz_listen_socket_.reset();
480
774
  }
481
- // Flush queued work before destroying handshaker factory, since that
482
- // may do a synchronous unref.
483
- ExecCtx::Get()->Flush();
484
- if (destroy_done != nullptr) {
485
- ExecCtx::Run(DEBUG_LOCATION, destroy_done, GRPC_ERROR_REF(error));
486
- ExecCtx::Get()->Flush();
775
+ if (connection != nullptr) {
776
+ endpoint_cleanup(GRPC_ERROR_NONE);
777
+ } else {
778
+ connection_ref->Start(std::move(listener_ref), tcp, args);
487
779
  }
780
+ grpc_channel_args_destroy(args);
781
+ }
782
+
783
+ void Chttp2ServerListener::TcpServerShutdownComplete(void* arg,
784
+ grpc_error* error) {
785
+ Chttp2ServerListener* self = static_cast<Chttp2ServerListener*>(arg);
786
+ self->channelz_listen_socket_.reset();
787
+ GRPC_ERROR_UNREF(error);
488
788
  delete self;
489
789
  }
490
790
 
@@ -496,10 +796,20 @@ void Chttp2ServerListener::Orphan() {
496
796
  if (config_fetcher_watcher_ != nullptr) {
497
797
  server_->config_fetcher()->CancelWatch(config_fetcher_watcher_);
498
798
  }
799
+ std::map<ActiveConnection*, OrphanablePtr<ActiveConnection>> connections;
499
800
  grpc_tcp_server* tcp_server;
500
801
  {
501
802
  MutexLock lock(&mu_);
502
803
  shutdown_ = true;
804
+ is_serving_ = false;
805
+ // Orphan the connections so that they can start cleaning up.
806
+ connections = std::move(connections_);
807
+ // If the listener is currently set to be serving but has not been started
808
+ // yet, it means that `grpc_tcp_server_start` is in progress. Wait for the
809
+ // operation to finish to avoid causing races.
810
+ while (is_serving_ && !started_) {
811
+ started_cv_.Wait(&mu_);
812
+ }
503
813
  tcp_server = tcp_server_;
504
814
  }
505
815
  grpc_tcp_server_shutdown_listeners(tcp_server);
@@ -513,10 +823,12 @@ void Chttp2ServerListener::Orphan() {
513
823
  //
514
824
 
515
825
  grpc_error* Chttp2ServerAddPort(Server* server, const char* addr,
516
- grpc_channel_args* args, int* port_num) {
826
+ grpc_channel_args* args,
827
+ Chttp2ServerArgsModifier args_modifier,
828
+ int* port_num) {
517
829
  if (strncmp(addr, "external:", 9) == 0) {
518
- return grpc_core::Chttp2ServerListener::CreateWithAcceptor(server, addr,
519
- args);
830
+ return grpc_core::Chttp2ServerListener::CreateWithAcceptor(
831
+ server, addr, args, args_modifier);
520
832
  }
521
833
  *port_num = -1;
522
834
  grpc_resolved_addresses* resolved = nullptr;
@@ -540,10 +852,10 @@ grpc_error* Chttp2ServerAddPort(Server* server, const char* addr,
540
852
  if (*port_num != -1 && grpc_sockaddr_get_port(&resolved->addrs[i]) == 0) {
541
853
  grpc_sockaddr_set_port(&resolved->addrs[i], *port_num);
542
854
  }
543
- int port_temp;
855
+ int port_temp = -1;
544
856
  error = grpc_core::Chttp2ServerListener::Create(
545
857
  server, &resolved->addrs[i], grpc_channel_args_copy(args),
546
- &port_temp);
858
+ args_modifier, &port_temp);
547
859
  if (error != GRPC_ERROR_NONE) {
548
860
  error_list.push_back(error);
549
861
  } else {