grpc 1.28.0 → 1.31.0.pre2

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 (707) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +8314 -11869
  3. data/include/grpc/grpc.h +2 -2
  4. data/include/grpc/grpc_security.h +30 -9
  5. data/include/grpc/grpc_security_constants.h +4 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +23 -23
  7. data/include/grpc/impl/codegen/port_platform.h +6 -34
  8. data/include/grpc/module.modulemap +24 -39
  9. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -12
  10. data/src/core/ext/filters/client_channel/client_channel.cc +591 -479
  11. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  12. data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
  13. data/src/core/ext/filters/client_channel/config_selector.h +93 -0
  14. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
  15. data/src/core/ext/filters/client_channel/health/health_check_client.cc +9 -22
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
  18. data/src/core/ext/filters/client_channel/http_proxy.cc +23 -14
  19. data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
  20. data/src/core/ext/filters/client_channel/lb_policy.h +44 -33
  21. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -4
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +279 -324
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  29. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +9 -17
  32. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +733 -0
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +84 -37
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +1143 -0
  38. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +10 -7
  39. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  40. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  41. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  42. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +78 -61
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +41 -40
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +22 -24
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +12 -10
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +79 -122
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +199 -163
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  52. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +46 -45
  53. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
  54. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  55. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +38 -8
  57. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  58. data/src/core/ext/filters/client_channel/resolver_registry.cc +19 -17
  59. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  60. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +21 -22
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
  62. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +49 -55
  63. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +43 -23
  64. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  65. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  66. data/src/core/ext/filters/client_channel/service_config.cc +104 -144
  67. data/src/core/ext/filters/client_channel/service_config.h +28 -98
  68. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  69. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  70. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  71. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  72. data/src/core/ext/filters/client_channel/subchannel.cc +55 -25
  73. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  74. data/src/core/ext/filters/client_channel/xds/xds_api.cc +565 -234
  75. data/src/core/ext/filters/client_channel/xds/xds_api.h +102 -37
  76. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +55 -71
  77. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +4 -3
  78. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
  79. data/src/core/ext/filters/client_channel/xds/xds_client.cc +619 -347
  80. data/src/core/ext/filters/client_channel/xds/xds_client.h +57 -22
  81. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
  82. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +40 -28
  83. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -33
  84. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  85. data/src/core/ext/filters/http/http_filters_plugin.cc +28 -12
  86. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  87. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +399 -0
  88. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +31 -0
  89. data/src/core/ext/filters/message_size/message_size_filter.cc +61 -88
  90. data/src/core/ext/filters/message_size/message_size_filter.h +10 -4
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +386 -350
  92. data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
  93. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
  94. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
  95. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
  96. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +42 -26
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  99. data/src/core/ext/transport/chttp2/transport/flow_control.cc +25 -30
  100. data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
  101. data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
  102. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
  103. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  104. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  105. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  106. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
  107. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  108. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
  109. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  110. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
  111. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  112. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  113. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  114. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  116. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  118. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  119. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  120. data/src/core/ext/transport/chttp2/transport/internal.h +27 -21
  121. data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
  122. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  123. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -22
  124. data/src/core/ext/transport/inproc/inproc_transport.cc +54 -15
  125. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
  126. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
  127. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
  128. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -876
  129. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  130. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +429 -0
  131. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +198 -0
  133. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  134. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +388 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
  137. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +23 -10
  138. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +352 -310
  139. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
  140. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +42 -34
  141. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  142. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +7 -7
  143. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  144. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +79 -61
  145. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
  146. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +55 -49
  147. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  148. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +79 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +48 -27
  150. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +258 -214
  151. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
  152. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +51 -45
  153. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  154. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +71 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
  156. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +107 -100
  157. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
  158. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +157 -122
  159. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  160. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +9 -9
  161. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
  162. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +173 -73
  163. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  164. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +88 -0
  165. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +2 -1
  166. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
  167. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
  168. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
  169. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +2 -1
  170. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
  171. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
  172. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -1
  173. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
  174. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +53 -38
  175. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  176. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +70 -62
  177. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
  178. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
  179. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
  180. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +95 -63
  181. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
  182. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -1
  183. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +3 -2
  184. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
  185. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
  186. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +9 -10
  187. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
  188. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
  189. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
  190. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
  191. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
  192. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -1
  193. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +68 -46
  194. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +770 -722
  195. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
  196. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
  197. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
  198. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
  199. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +2 -1
  200. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
  201. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
  202. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +305 -210
  203. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
  204. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
  205. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  206. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  207. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  208. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +1 -2
  209. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  210. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +22 -16
  211. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  212. data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
  213. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
  214. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +48 -11
  215. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
  216. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
  217. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
  218. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
  219. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  220. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
  221. data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
  222. data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
  223. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
  224. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
  225. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
  226. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
  227. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
  228. data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
  229. data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
  230. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
  231. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +12 -11
  232. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +421 -389
  233. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
  234. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
  235. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
  236. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
  237. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
  238. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
  239. data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
  240. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
  244. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
  245. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
  246. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
  247. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
  248. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
  249. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  250. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +64 -0
  251. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
  252. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
  253. data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
  254. data/src/core/ext/upb-generated/validate/validate.upb.h +569 -562
  255. data/src/core/lib/channel/channel_args.cc +15 -14
  256. data/src/core/lib/channel/channel_args.h +3 -1
  257. data/src/core/lib/channel/channel_stack.h +20 -13
  258. data/src/core/lib/channel/channel_trace.cc +2 -6
  259. data/src/core/lib/channel/channelz.cc +10 -21
  260. data/src/core/lib/channel/channelz.h +3 -2
  261. data/src/core/lib/channel/channelz_registry.cc +5 -3
  262. data/src/core/lib/channel/connected_channel.cc +7 -5
  263. data/src/core/lib/channel/context.h +1 -1
  264. data/src/core/lib/channel/handshaker.cc +11 -13
  265. data/src/core/lib/channel/handshaker.h +4 -2
  266. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  267. data/src/core/lib/channel/status_util.cc +2 -3
  268. data/src/core/lib/compression/message_compress.cc +5 -1
  269. data/src/core/lib/debug/stats.cc +21 -27
  270. data/src/core/lib/debug/stats.h +3 -1
  271. data/src/core/lib/gpr/log_linux.cc +6 -8
  272. data/src/core/lib/gpr/log_posix.cc +6 -8
  273. data/src/core/lib/gpr/spinlock.h +2 -3
  274. data/src/core/lib/gpr/string.cc +10 -33
  275. data/src/core/lib/gpr/string.h +4 -18
  276. data/src/core/lib/gpr/sync_abseil.cc +2 -0
  277. data/src/core/lib/gpr/time.cc +4 -0
  278. data/src/core/lib/gpr/time_posix.cc +1 -1
  279. data/src/core/lib/gprpp/atomic.h +6 -6
  280. data/src/core/lib/gprpp/fork.cc +1 -1
  281. data/src/core/lib/gprpp/global_config_env.cc +8 -6
  282. data/src/core/lib/gprpp/host_port.cc +29 -35
  283. data/src/core/lib/gprpp/host_port.h +14 -17
  284. data/src/core/lib/gprpp/map.h +5 -11
  285. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  286. data/src/core/lib/http/format_request.cc +46 -65
  287. data/src/core/lib/http/httpcli.cc +15 -13
  288. data/src/core/lib/http/httpcli.h +2 -3
  289. data/src/core/lib/http/httpcli_security_connector.cc +10 -10
  290. data/src/core/lib/http/parser.h +2 -3
  291. data/src/core/lib/iomgr/buffer_list.h +22 -21
  292. data/src/core/lib/iomgr/call_combiner.h +3 -2
  293. data/src/core/lib/iomgr/cfstream_handle.cc +4 -2
  294. data/src/core/lib/iomgr/closure.h +2 -3
  295. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  296. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  297. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  298. data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
  299. data/src/core/lib/iomgr/error.cc +6 -9
  300. data/src/core/lib/iomgr/error.h +0 -1
  301. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  302. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  303. data/src/core/lib/iomgr/ev_apple.h +43 -0
  304. data/src/core/lib/iomgr/ev_epoll1_linux.cc +25 -29
  305. data/src/core/lib/iomgr/ev_epollex_linux.cc +17 -24
  306. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -8
  307. data/src/core/lib/iomgr/ev_posix.cc +4 -3
  308. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  309. data/src/core/lib/iomgr/iomgr.cc +10 -0
  310. data/src/core/lib/iomgr/iomgr.h +10 -0
  311. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  312. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  313. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  314. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  315. data/src/core/lib/iomgr/port.h +2 -21
  316. data/src/core/lib/iomgr/python_util.h +46 -0
  317. data/src/core/lib/iomgr/resolve_address.h +4 -6
  318. data/src/core/lib/iomgr/resolve_address_custom.cc +42 -57
  319. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  320. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  321. data/src/core/lib/iomgr/resolve_address_windows.cc +16 -25
  322. data/src/core/lib/iomgr/resource_quota.cc +38 -37
  323. data/src/core/lib/iomgr/sockaddr_utils.cc +29 -33
  324. data/src/core/lib/iomgr/sockaddr_utils.h +10 -15
  325. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  326. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  327. data/src/core/lib/iomgr/socket_utils_common_posix.cc +102 -81
  328. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  329. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  330. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -18
  331. data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
  332. data/src/core/lib/iomgr/tcp_client_posix.cc +30 -36
  333. data/src/core/lib/iomgr/tcp_client_windows.cc +10 -11
  334. data/src/core/lib/iomgr/tcp_custom.cc +3 -4
  335. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  336. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  337. data/src/core/lib/iomgr/tcp_server.h +7 -5
  338. data/src/core/lib/iomgr/tcp_server_custom.cc +11 -23
  339. data/src/core/lib/iomgr/tcp_server_posix.cc +38 -44
  340. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
  341. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -8
  342. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +10 -18
  343. data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
  344. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  345. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  346. data/src/core/lib/iomgr/timer_generic.cc +15 -15
  347. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  348. data/src/core/lib/iomgr/timer_heap.h +2 -3
  349. data/src/core/lib/iomgr/udp_server.cc +32 -36
  350. data/src/core/lib/iomgr/udp_server.h +5 -2
  351. data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
  352. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  353. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
  354. data/src/core/lib/json/json.h +3 -2
  355. data/src/core/lib/json/json_reader.cc +25 -26
  356. data/src/core/lib/json/json_writer.cc +13 -12
  357. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  358. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  359. data/src/core/lib/security/credentials/credentials.cc +0 -84
  360. data/src/core/lib/security/credentials/credentials.h +13 -62
  361. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  362. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  363. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -17
  364. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  365. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  366. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  367. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  368. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
  369. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  370. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
  371. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  372. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +73 -54
  373. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
  374. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +19 -6
  375. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  376. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
  377. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
  378. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
  379. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +48 -11
  380. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
  381. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -17
  382. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  383. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  384. data/src/core/lib/security/security_connector/security_connector.cc +2 -0
  385. data/src/core/lib/security/security_connector/security_connector.h +2 -2
  386. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +38 -36
  387. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +8 -5
  388. data/src/core/lib/security/security_connector/ssl_utils.cc +89 -21
  389. data/src/core/lib/security/security_connector/ssl_utils.h +18 -12
  390. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +101 -72
  391. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
  392. data/src/core/lib/security/transport/auth_filters.h +0 -5
  393. data/src/core/lib/security/transport/client_auth_filter.cc +11 -11
  394. data/src/core/lib/security/util/json_util.cc +12 -13
  395. data/src/core/lib/slice/slice.cc +38 -1
  396. data/src/core/lib/slice/slice_intern.cc +2 -3
  397. data/src/core/lib/slice/slice_internal.h +15 -0
  398. data/src/core/lib/slice/slice_utils.h +9 -0
  399. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  400. data/src/core/lib/surface/call.cc +42 -44
  401. data/src/core/lib/surface/call_log_batch.cc +50 -58
  402. data/src/core/lib/surface/channel.cc +53 -31
  403. data/src/core/lib/surface/channel.h +35 -4
  404. data/src/core/lib/surface/channel_ping.cc +2 -3
  405. data/src/core/lib/surface/completion_queue.cc +304 -47
  406. data/src/core/lib/surface/completion_queue.h +8 -0
  407. data/src/core/lib/surface/event_string.cc +18 -25
  408. data/src/core/lib/surface/event_string.h +3 -1
  409. data/src/core/lib/surface/init.cc +2 -0
  410. data/src/core/lib/surface/init_secure.cc +1 -4
  411. data/src/core/lib/surface/server.cc +971 -837
  412. data/src/core/lib/surface/server.h +66 -12
  413. data/src/core/lib/surface/version.cc +2 -2
  414. data/src/core/lib/transport/byte_stream.h +7 -2
  415. data/src/core/lib/transport/connectivity_state.cc +7 -6
  416. data/src/core/lib/transport/connectivity_state.h +5 -3
  417. data/src/core/lib/transport/metadata.cc +3 -3
  418. data/src/core/lib/transport/metadata_batch.h +2 -3
  419. data/src/core/lib/transport/static_metadata.h +1 -1
  420. data/src/core/lib/transport/status_conversion.cc +6 -14
  421. data/src/core/lib/transport/transport.cc +2 -3
  422. data/src/core/lib/transport/transport.h +9 -2
  423. data/src/core/lib/transport/transport_op_string.cc +61 -102
  424. data/src/core/lib/uri/uri_parser.cc +8 -15
  425. data/src/core/lib/uri/uri_parser.h +2 -3
  426. data/src/core/plugin_registry/grpc_plugin_registry.cc +24 -4
  427. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  428. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +31 -14
  429. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  430. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +34 -2
  431. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  432. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
  433. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  434. data/src/core/tsi/fake_transport_security.cc +10 -15
  435. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  436. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  437. data/src/core/tsi/ssl_transport_security.cc +154 -50
  438. data/src/core/tsi/ssl_transport_security.h +22 -10
  439. data/src/core/tsi/ssl_types.h +0 -2
  440. data/src/core/tsi/transport_security.h +6 -9
  441. data/src/core/tsi/transport_security_grpc.h +2 -3
  442. data/src/core/tsi/transport_security_interface.h +8 -3
  443. data/src/ruby/ext/grpc/extconf.rb +5 -2
  444. data/src/ruby/ext/grpc/rb_call.c +12 -3
  445. data/src/ruby/ext/grpc/rb_call.h +4 -0
  446. data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
  447. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  448. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  449. data/src/ruby/lib/grpc/errors.rb +103 -42
  450. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  451. data/src/ruby/lib/grpc/generic/interceptors.rb +5 -5
  452. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  453. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  454. data/src/ruby/lib/grpc/structs.rb +1 -1
  455. data/src/ruby/lib/grpc/version.rb +1 -1
  456. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  457. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
  458. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  459. data/src/ruby/spec/debug_message_spec.rb +134 -0
  460. data/src/ruby/spec/generic/service_spec.rb +2 -0
  461. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  462. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
  463. data/src/ruby/spec/pb/codegen/package_option_spec.rb +7 -1
  464. data/src/ruby/spec/support/services.rb +10 -4
  465. data/src/ruby/spec/testdata/ca.pem +18 -13
  466. data/src/ruby/spec/testdata/client.key +26 -14
  467. data/src/ruby/spec/testdata/client.pem +18 -12
  468. data/src/ruby/spec/testdata/server1.key +26 -14
  469. data/src/ruby/spec/testdata/server1.pem +20 -14
  470. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  471. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  472. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  473. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  474. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  475. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  476. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  477. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  478. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  481. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  482. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  483. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  484. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  485. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  486. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  487. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  488. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  489. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  490. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  491. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  492. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  493. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  494. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  495. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  496. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  497. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  498. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  499. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  500. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  501. data/third_party/boringssl-with-bazel/err_data.c +335 -297
  502. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  503. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
  504. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
  505. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
  506. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  507. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  508. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
  509. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
  510. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
  511. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
  512. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  513. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  514. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
  515. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
  516. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  517. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  518. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  519. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  520. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  521. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  522. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
  523. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
  524. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +385 -0
  525. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +56 -0
  526. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  527. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  528. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +143 -0
  529. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  530. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  531. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
  532. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  533. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +25 -12
  534. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  535. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  536. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  537. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
  538. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
  539. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  540. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  541. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +434 -161
  542. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  543. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +18 -25
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  545. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +104 -122
  546. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +740 -0
  547. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  548. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  549. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  550. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  551. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  552. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  553. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  554. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  555. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  556. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  557. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  558. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
  559. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
  560. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
  561. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  562. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
  563. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
  564. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
  565. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
  566. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  567. data/third_party/boringssl-with-bazel/src/crypto/mem.c +47 -16
  568. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  569. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
  570. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
  571. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  572. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  573. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  574. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +249 -0
  576. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1227 -0
  577. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +682 -0
  578. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
  579. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
  580. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
  581. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  582. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
  583. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
  584. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +57 -0
  585. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
  586. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +33 -9
  587. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
  588. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
  589. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
  590. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
  591. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
  592. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
  593. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
  594. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  595. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
  596. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +6 -2
  597. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
  598. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
  599. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  600. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  601. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  602. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  603. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
  604. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  605. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
  606. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  607. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  608. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +191 -79
  609. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  610. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +282 -0
  611. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +791 -715
  612. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  613. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  614. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  615. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  616. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
  617. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +23 -5
  618. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +30 -22
  619. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +21 -4
  620. data/third_party/boringssl-with-bazel/src/ssl/internal.h +74 -54
  621. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  622. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  623. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  624. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
  625. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
  626. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +34 -1
  627. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  628. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +44 -5
  629. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  630. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
  631. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +51 -26
  632. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
  633. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
  634. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +129 -48
  635. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
  636. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +55 -22
  637. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  638. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  639. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  640. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  641. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  642. data/third_party/re2/re2/bitmap256.h +117 -0
  643. data/third_party/re2/re2/bitstate.cc +385 -0
  644. data/third_party/re2/re2/compile.cc +1279 -0
  645. data/third_party/re2/re2/dfa.cc +2130 -0
  646. data/third_party/re2/re2/filtered_re2.cc +121 -0
  647. data/third_party/re2/re2/filtered_re2.h +109 -0
  648. data/third_party/re2/re2/mimics_pcre.cc +197 -0
  649. data/third_party/re2/re2/nfa.cc +713 -0
  650. data/third_party/re2/re2/onepass.cc +623 -0
  651. data/third_party/re2/re2/parse.cc +2464 -0
  652. data/third_party/re2/re2/perl_groups.cc +119 -0
  653. data/third_party/re2/re2/pod_array.h +55 -0
  654. data/third_party/re2/re2/prefilter.cc +710 -0
  655. data/third_party/re2/re2/prefilter.h +108 -0
  656. data/third_party/re2/re2/prefilter_tree.cc +407 -0
  657. data/third_party/re2/re2/prefilter_tree.h +139 -0
  658. data/third_party/re2/re2/prog.cc +988 -0
  659. data/third_party/re2/re2/prog.h +436 -0
  660. data/third_party/re2/re2/re2.cc +1362 -0
  661. data/third_party/re2/re2/re2.h +1002 -0
  662. data/third_party/re2/re2/regexp.cc +980 -0
  663. data/third_party/re2/re2/regexp.h +659 -0
  664. data/third_party/re2/re2/set.cc +154 -0
  665. data/third_party/re2/re2/set.h +80 -0
  666. data/third_party/re2/re2/simplify.cc +657 -0
  667. data/third_party/re2/re2/sparse_array.h +392 -0
  668. data/third_party/re2/re2/sparse_set.h +264 -0
  669. data/third_party/re2/re2/stringpiece.cc +65 -0
  670. data/third_party/re2/re2/stringpiece.h +210 -0
  671. data/third_party/re2/re2/tostring.cc +351 -0
  672. data/third_party/re2/re2/unicode_casefold.cc +582 -0
  673. data/third_party/re2/re2/unicode_casefold.h +78 -0
  674. data/third_party/re2/re2/unicode_groups.cc +6269 -0
  675. data/third_party/re2/re2/unicode_groups.h +67 -0
  676. data/third_party/re2/re2/walker-inl.h +246 -0
  677. data/third_party/re2/util/benchmark.h +156 -0
  678. data/third_party/re2/util/flags.h +26 -0
  679. data/third_party/re2/util/logging.h +109 -0
  680. data/third_party/re2/util/malloc_counter.h +19 -0
  681. data/third_party/re2/util/mix.h +41 -0
  682. data/third_party/re2/util/mutex.h +148 -0
  683. data/third_party/re2/util/pcre.cc +1025 -0
  684. data/third_party/re2/util/pcre.h +681 -0
  685. data/third_party/re2/util/rune.cc +260 -0
  686. data/third_party/re2/util/strutil.cc +149 -0
  687. data/third_party/re2/util/strutil.h +21 -0
  688. data/third_party/re2/util/test.h +50 -0
  689. data/third_party/re2/util/utf.h +44 -0
  690. data/third_party/re2/util/util.h +42 -0
  691. data/third_party/upb/upb/decode.c +467 -504
  692. data/third_party/upb/upb/encode.c +163 -121
  693. data/third_party/upb/upb/msg.c +130 -64
  694. data/third_party/upb/upb/msg.h +418 -14
  695. data/third_party/upb/upb/port_def.inc +35 -6
  696. data/third_party/upb/upb/port_undef.inc +8 -1
  697. data/third_party/upb/upb/table.c +53 -75
  698. data/third_party/upb/upb/table.int.h +11 -43
  699. data/third_party/upb/upb/upb.c +148 -124
  700. data/third_party/upb/upb/upb.h +65 -147
  701. data/third_party/upb/upb/upb.hpp +86 -0
  702. metadata +175 -47
  703. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
  704. data/src/core/lib/gprpp/string_view.h +0 -60
  705. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  706. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
  707. data/third_party/upb/upb/generated_util.h +0 -105
@@ -29,5 +29,4 @@
29
29
  #define GRPC_ARG_ADDRESS_IS_BACKEND_FROM_XDS_LOAD_BALANCER \
30
30
  "grpc.address_is_backend_from_xds_load_balancer"
31
31
 
32
- #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_H \
33
- */
32
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_H */
@@ -0,0 +1,1143 @@
1
+ //
2
+ // Copyright 2018 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include <inttypes.h>
20
+ #include <limits.h>
21
+ #include <string.h>
22
+
23
+ #include "absl/container/inlined_vector.h"
24
+ #include "absl/strings/match.h"
25
+ #include "absl/strings/numbers.h"
26
+ #include "absl/strings/str_cat.h"
27
+ #include "absl/strings/str_join.h"
28
+ #include "absl/strings/str_split.h"
29
+ #include "absl/strings/string_view.h"
30
+ #include "re2/re2.h"
31
+
32
+ #include <grpc/grpc.h>
33
+
34
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
35
+ #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
36
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
37
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
38
+ #include "src/core/ext/filters/client_channel/xds/xds_api.h"
39
+ #include "src/core/lib/channel/channel_args.h"
40
+ #include "src/core/lib/gpr/string.h"
41
+ #include "src/core/lib/gprpp/orphanable.h"
42
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
43
+ #include "src/core/lib/iomgr/timer.h"
44
+ #include "src/core/lib/iomgr/work_serializer.h"
45
+
46
+ #define GRPC_XDS_ROUTING_CHILD_RETENTION_INTERVAL_MS (15 * 60 * 1000)
47
+
48
+ namespace grpc_core {
49
+
50
+ TraceFlag grpc_xds_routing_lb_trace(false, "xds_routing_lb");
51
+
52
+ namespace {
53
+
54
+ constexpr char kXdsRouting[] = "xds_routing_experimental";
55
+
56
+ // Config for xds_routing LB policy.
57
+ class XdsRoutingLbConfig : public LoadBalancingPolicy::Config {
58
+ public:
59
+ struct Route {
60
+ XdsApi::RdsUpdate::RdsRoute::Matchers matchers;
61
+ std::string action;
62
+ };
63
+ using RouteTable = std::vector<Route>;
64
+ using ActionMap =
65
+ std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>>;
66
+
67
+ XdsRoutingLbConfig(ActionMap action_map, RouteTable route_table)
68
+ : action_map_(std::move(action_map)),
69
+ route_table_(std::move(route_table)) {}
70
+
71
+ const char* name() const override { return kXdsRouting; }
72
+
73
+ const ActionMap& action_map() const { return action_map_; }
74
+
75
+ const RouteTable& route_table() const { return route_table_; }
76
+
77
+ private:
78
+ ActionMap action_map_;
79
+ RouteTable route_table_;
80
+ };
81
+
82
+ // xds_routing LB policy.
83
+ class XdsRoutingLb : public LoadBalancingPolicy {
84
+ public:
85
+ explicit XdsRoutingLb(Args args);
86
+
87
+ const char* name() const override { return kXdsRouting; }
88
+
89
+ void UpdateLocked(UpdateArgs args) override;
90
+ void ExitIdleLocked() override;
91
+ void ResetBackoffLocked() override;
92
+
93
+ private:
94
+ // A simple wrapper for ref-counting a picker from the child policy.
95
+ class ChildPickerWrapper : public RefCounted<ChildPickerWrapper> {
96
+ public:
97
+ ChildPickerWrapper(std::string name,
98
+ std::unique_ptr<SubchannelPicker> picker)
99
+ : name_(std::move(name)), picker_(std::move(picker)) {}
100
+ PickResult Pick(PickArgs args) { return picker_->Pick(args); }
101
+
102
+ const std::string& name() const { return name_; }
103
+
104
+ private:
105
+ std::string name_;
106
+ std::unique_ptr<SubchannelPicker> picker_;
107
+ };
108
+
109
+ // Picks a child using prefix or path matching and then delegates to that
110
+ // child's picker.
111
+ class RoutePicker : public SubchannelPicker {
112
+ public:
113
+ struct Route {
114
+ const XdsApi::RdsUpdate::RdsRoute::Matchers* matchers;
115
+ RefCountedPtr<ChildPickerWrapper> picker;
116
+ };
117
+
118
+ // Maintains an ordered xds route table as provided by RDS response.
119
+ using RouteTable = std::vector<Route>;
120
+
121
+ RoutePicker(RouteTable route_table,
122
+ RefCountedPtr<XdsRoutingLbConfig> config)
123
+ : route_table_(std::move(route_table)), config_(std::move(config)) {}
124
+
125
+ PickResult Pick(PickArgs args) override;
126
+
127
+ private:
128
+ RouteTable route_table_;
129
+ // Take a reference to config so that we can use
130
+ // XdsApi::RdsUpdate::RdsRoute::Matchers from it.
131
+ RefCountedPtr<XdsRoutingLbConfig> config_;
132
+ };
133
+
134
+ // Each XdsRoutingChild holds a ref to its parent XdsRoutingLb.
135
+ class XdsRoutingChild : public InternallyRefCounted<XdsRoutingChild> {
136
+ public:
137
+ XdsRoutingChild(RefCountedPtr<XdsRoutingLb> xds_routing_policy,
138
+ const std::string& name);
139
+ ~XdsRoutingChild();
140
+
141
+ void Orphan() override;
142
+
143
+ void UpdateLocked(RefCountedPtr<LoadBalancingPolicy::Config> config,
144
+ const ServerAddressList& addresses,
145
+ const grpc_channel_args* args);
146
+ void ExitIdleLocked();
147
+ void ResetBackoffLocked();
148
+ void DeactivateLocked();
149
+
150
+ grpc_connectivity_state connectivity_state() const {
151
+ return connectivity_state_;
152
+ }
153
+ RefCountedPtr<ChildPickerWrapper> picker_wrapper() const {
154
+ return picker_wrapper_;
155
+ }
156
+
157
+ private:
158
+ class Helper : public ChannelControlHelper {
159
+ public:
160
+ explicit Helper(RefCountedPtr<XdsRoutingChild> xds_routing_child)
161
+ : xds_routing_child_(std::move(xds_routing_child)) {}
162
+
163
+ ~Helper() { xds_routing_child_.reset(DEBUG_LOCATION, "Helper"); }
164
+
165
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
166
+ const grpc_channel_args& args) override;
167
+ void UpdateState(grpc_connectivity_state state,
168
+ std::unique_ptr<SubchannelPicker> picker) override;
169
+ void RequestReresolution() override;
170
+ void AddTraceEvent(TraceSeverity severity,
171
+ absl::string_view message) override;
172
+
173
+ private:
174
+ RefCountedPtr<XdsRoutingChild> xds_routing_child_;
175
+ };
176
+
177
+ // Methods for dealing with the child policy.
178
+ OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
179
+ const grpc_channel_args* args);
180
+
181
+ static void OnDelayedRemovalTimer(void* arg, grpc_error* error);
182
+ void OnDelayedRemovalTimerLocked(grpc_error* error);
183
+
184
+ // The owning LB policy.
185
+ RefCountedPtr<XdsRoutingLb> xds_routing_policy_;
186
+
187
+ // Points to the corresponding key in XdsRoutingLb::actions_.
188
+ const std::string name_;
189
+
190
+ OrphanablePtr<LoadBalancingPolicy> child_policy_;
191
+
192
+ RefCountedPtr<ChildPickerWrapper> picker_wrapper_;
193
+ grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE;
194
+ bool seen_failure_since_ready_ = false;
195
+
196
+ // States for delayed removal.
197
+ grpc_timer delayed_removal_timer_;
198
+ grpc_closure on_delayed_removal_timer_;
199
+ bool delayed_removal_timer_callback_pending_ = false;
200
+ bool shutdown_ = false;
201
+ };
202
+
203
+ ~XdsRoutingLb();
204
+
205
+ void ShutdownLocked() override;
206
+
207
+ void UpdateStateLocked();
208
+
209
+ // Current config from the resolver.
210
+ RefCountedPtr<XdsRoutingLbConfig> config_;
211
+
212
+ // Internal state.
213
+ bool shutting_down_ = false;
214
+
215
+ // Children.
216
+ std::map<std::string, OrphanablePtr<XdsRoutingChild>> actions_;
217
+ };
218
+
219
+ //
220
+ // XdsRoutingLb::RoutePicker
221
+ //
222
+
223
+ bool PathMatch(
224
+ const absl::string_view& path,
225
+ const XdsApi::RdsUpdate::RdsRoute::Matchers::PathMatcher& path_matcher) {
226
+ switch (path_matcher.type) {
227
+ case XdsApi::RdsUpdate::RdsRoute::Matchers::PathMatcher::PathMatcherType::
228
+ PREFIX:
229
+ return absl::StartsWith(path, path_matcher.string_matcher);
230
+ case XdsApi::RdsUpdate::RdsRoute::Matchers::PathMatcher::PathMatcherType::
231
+ PATH:
232
+ return path == path_matcher.string_matcher;
233
+ case XdsApi::RdsUpdate::RdsRoute::Matchers::PathMatcher::PathMatcherType::
234
+ REGEX:
235
+ return RE2::FullMatch(path.data(), *path_matcher.regex_matcher);
236
+ default:
237
+ return false;
238
+ }
239
+ }
240
+
241
+ absl::optional<absl::string_view> GetMetadataValue(
242
+ const std::string& key,
243
+ LoadBalancingPolicy::MetadataInterface* initial_metadata,
244
+ std::string* concatenated_value) {
245
+ // Find all values for the specified key.
246
+ GPR_DEBUG_ASSERT(initial_metadata != nullptr);
247
+ absl::InlinedVector<absl::string_view, 1> values;
248
+ for (const auto p : *initial_metadata) {
249
+ if (p.first == key) values.push_back(p.second);
250
+ }
251
+ // If none found, no match.
252
+ if (values.empty()) return absl::nullopt;
253
+ // If exactly one found, return it as-is.
254
+ if (values.size() == 1) return values.front();
255
+ // If more than one found, concatenate the values, using
256
+ // *concatenated_values as a temporary holding place for the
257
+ // concatenated string.
258
+ *concatenated_value = absl::StrJoin(values, ",");
259
+ return *concatenated_value;
260
+ }
261
+
262
+ bool HeaderMatchHelper(
263
+ const XdsApi::RdsUpdate::RdsRoute::Matchers::HeaderMatcher& header_matcher,
264
+ LoadBalancingPolicy::MetadataInterface* initial_metadata) {
265
+ std::string concatenated_value;
266
+ absl::optional<absl::string_view> value;
267
+ // Note: If we ever allow binary headers here, we still need to
268
+ // special-case ignore "grpc-tags-bin" and "grpc-trace-bin", since
269
+ // they are not visible to the LB policy in grpc-go.
270
+ if (absl::EndsWith(header_matcher.name, "-bin") ||
271
+ header_matcher.name == "grpc-previous-rpc-attempts") {
272
+ value = absl::nullopt;
273
+ } else if (header_matcher.name == "content-type") {
274
+ value = "application/grpc";
275
+ } else {
276
+ value = GetMetadataValue(header_matcher.name, initial_metadata,
277
+ &concatenated_value);
278
+ }
279
+ if (!value.has_value()) {
280
+ if (header_matcher.type == XdsApi::RdsUpdate::RdsRoute::Matchers::
281
+ HeaderMatcher::HeaderMatcherType::PRESENT) {
282
+ return !header_matcher.present_match;
283
+ } else {
284
+ // For all other header matcher types, we need the header value to
285
+ // exist to consider matches.
286
+ return false;
287
+ }
288
+ }
289
+ switch (header_matcher.type) {
290
+ case XdsApi::RdsUpdate::RdsRoute::Matchers::HeaderMatcher::
291
+ HeaderMatcherType::EXACT:
292
+ return value.value() == header_matcher.string_matcher;
293
+ case XdsApi::RdsUpdate::RdsRoute::Matchers::HeaderMatcher::
294
+ HeaderMatcherType::REGEX:
295
+ return RE2::FullMatch(value.value().data(), *header_matcher.regex_match);
296
+ case XdsApi::RdsUpdate::RdsRoute::Matchers::HeaderMatcher::
297
+ HeaderMatcherType::RANGE:
298
+ int64_t int_value;
299
+ if (!absl::SimpleAtoi(value.value(), &int_value)) {
300
+ return false;
301
+ }
302
+ return int_value >= header_matcher.range_start &&
303
+ int_value < header_matcher.range_end;
304
+ case XdsApi::RdsUpdate::RdsRoute::Matchers::HeaderMatcher::
305
+ HeaderMatcherType::PREFIX:
306
+ return absl::StartsWith(value.value(), header_matcher.string_matcher);
307
+ case XdsApi::RdsUpdate::RdsRoute::Matchers::HeaderMatcher::
308
+ HeaderMatcherType::SUFFIX:
309
+ return absl::EndsWith(value.value(), header_matcher.string_matcher);
310
+ default:
311
+ return false;
312
+ }
313
+ }
314
+
315
+ bool HeadersMatch(
316
+ const std::vector<XdsApi::RdsUpdate::RdsRoute::Matchers::HeaderMatcher>&
317
+ header_matchers,
318
+ LoadBalancingPolicy::MetadataInterface* initial_metadata) {
319
+ for (const auto& header_matcher : header_matchers) {
320
+ bool match = HeaderMatchHelper(header_matcher, initial_metadata);
321
+ if (header_matcher.invert_match) match = !match;
322
+ if (!match) return false;
323
+ }
324
+ return true;
325
+ }
326
+
327
+ bool UnderFraction(const uint32_t fraction_per_million) {
328
+ // Generate a random number in [0, 1000000).
329
+ const uint32_t random_number = rand() % 1000000;
330
+ return random_number < fraction_per_million;
331
+ }
332
+
333
+ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) {
334
+ for (const Route& route : route_table_) {
335
+ // Path matching.
336
+ if (!PathMatch(args.path, route.matchers->path_matcher)) continue;
337
+ // Header Matching.
338
+ if (!HeadersMatch(route.matchers->header_matchers, args.initial_metadata)) {
339
+ continue;
340
+ }
341
+ // Match fraction check
342
+ if (route.matchers->fraction_per_million.has_value() &&
343
+ !UnderFraction(route.matchers->fraction_per_million.value())) {
344
+ continue;
345
+ }
346
+ // Found a match
347
+ return route.picker->Pick(args);
348
+ }
349
+ PickResult result;
350
+ result.type = PickResult::PICK_FAILED;
351
+ result.error =
352
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
353
+ "xds routing picker: no matching route"),
354
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
355
+ return result;
356
+ }
357
+
358
+ //
359
+ // XdsRoutingLb
360
+ //
361
+
362
+ XdsRoutingLb::XdsRoutingLb(Args args) : LoadBalancingPolicy(std::move(args)) {}
363
+
364
+ XdsRoutingLb::~XdsRoutingLb() {
365
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
366
+ gpr_log(GPR_INFO, "[xds_routing_lb %p] destroying xds_routing LB policy",
367
+ this);
368
+ }
369
+ }
370
+
371
+ void XdsRoutingLb::ShutdownLocked() {
372
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
373
+ gpr_log(GPR_INFO, "[xds_routing_lb %p] shutting down", this);
374
+ }
375
+ shutting_down_ = true;
376
+ actions_.clear();
377
+ }
378
+
379
+ void XdsRoutingLb::ExitIdleLocked() {
380
+ for (auto& p : actions_) p.second->ExitIdleLocked();
381
+ }
382
+
383
+ void XdsRoutingLb::ResetBackoffLocked() {
384
+ for (auto& p : actions_) p.second->ResetBackoffLocked();
385
+ }
386
+
387
+ void XdsRoutingLb::UpdateLocked(UpdateArgs args) {
388
+ if (shutting_down_) return;
389
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
390
+ gpr_log(GPR_INFO, "[xds_routing_lb %p] Received update", this);
391
+ }
392
+ // Update config.
393
+ config_ = std::move(args.config);
394
+ // Deactivate the actions not in the new config.
395
+ for (const auto& p : actions_) {
396
+ const std::string& name = p.first;
397
+ XdsRoutingChild* child = p.second.get();
398
+ if (config_->action_map().find(name) == config_->action_map().end()) {
399
+ child->DeactivateLocked();
400
+ }
401
+ }
402
+ // Add or update the actions in the new config.
403
+ for (const auto& p : config_->action_map()) {
404
+ const std::string& name = p.first;
405
+ const RefCountedPtr<LoadBalancingPolicy::Config>& config = p.second;
406
+ auto it = actions_.find(name);
407
+ if (it == actions_.end()) {
408
+ it = actions_
409
+ .emplace(name, MakeOrphanable<XdsRoutingChild>(
410
+ Ref(DEBUG_LOCATION, "XdsRoutingChild"), name))
411
+ .first;
412
+ }
413
+ it->second->UpdateLocked(config, args.addresses, args.args);
414
+ }
415
+ }
416
+
417
+ void XdsRoutingLb::UpdateStateLocked() {
418
+ // Also count the number of children in each state, to determine the
419
+ // overall state.
420
+ size_t num_ready = 0;
421
+ size_t num_connecting = 0;
422
+ size_t num_idle = 0;
423
+ size_t num_transient_failures = 0;
424
+ for (const auto& p : actions_) {
425
+ const auto& child_name = p.first;
426
+ const XdsRoutingChild* child = p.second.get();
427
+ // Skip the actions that are not in the latest update.
428
+ if (config_->action_map().find(child_name) == config_->action_map().end()) {
429
+ continue;
430
+ }
431
+ switch (child->connectivity_state()) {
432
+ case GRPC_CHANNEL_READY: {
433
+ ++num_ready;
434
+ break;
435
+ }
436
+ case GRPC_CHANNEL_CONNECTING: {
437
+ ++num_connecting;
438
+ break;
439
+ }
440
+ case GRPC_CHANNEL_IDLE: {
441
+ ++num_idle;
442
+ break;
443
+ }
444
+ case GRPC_CHANNEL_TRANSIENT_FAILURE: {
445
+ ++num_transient_failures;
446
+ break;
447
+ }
448
+ default:
449
+ GPR_UNREACHABLE_CODE(return );
450
+ }
451
+ }
452
+ // Determine aggregated connectivity state.
453
+ grpc_connectivity_state connectivity_state;
454
+ if (num_ready > 0) {
455
+ connectivity_state = GRPC_CHANNEL_READY;
456
+ } else if (num_connecting > 0) {
457
+ connectivity_state = GRPC_CHANNEL_CONNECTING;
458
+ } else if (num_idle > 0) {
459
+ connectivity_state = GRPC_CHANNEL_IDLE;
460
+ } else {
461
+ connectivity_state = GRPC_CHANNEL_TRANSIENT_FAILURE;
462
+ }
463
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
464
+ gpr_log(GPR_INFO, "[xds_routing_lb %p] connectivity changed to %s", this,
465
+ ConnectivityStateName(connectivity_state));
466
+ }
467
+ std::unique_ptr<SubchannelPicker> picker;
468
+ switch (connectivity_state) {
469
+ case GRPC_CHANNEL_READY: {
470
+ RoutePicker::RouteTable route_table;
471
+ for (const auto& config_route : config_->route_table()) {
472
+ RoutePicker::Route route;
473
+ route.matchers = &config_route.matchers;
474
+ route.picker = actions_[config_route.action]->picker_wrapper();
475
+ if (route.picker == nullptr) {
476
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
477
+ gpr_log(GPR_INFO,
478
+ "[xds_routing_lb %p] child %s has not yet returned a "
479
+ "picker; creating a QueuePicker.",
480
+ this, config_route.action.c_str());
481
+ }
482
+ route.picker = MakeRefCounted<ChildPickerWrapper>(
483
+ config_route.action, absl::make_unique<QueuePicker>(
484
+ Ref(DEBUG_LOCATION, "QueuePicker")));
485
+ }
486
+ route_table.push_back(std::move(route));
487
+ }
488
+ picker = absl::make_unique<RoutePicker>(std::move(route_table), config_);
489
+ break;
490
+ }
491
+ case GRPC_CHANNEL_CONNECTING:
492
+ case GRPC_CHANNEL_IDLE:
493
+ picker =
494
+ absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker"));
495
+ break;
496
+ default:
497
+ picker = absl::make_unique<TransientFailurePicker>(grpc_error_set_int(
498
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
499
+ "TRANSIENT_FAILURE from XdsRoutingLb"),
500
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
501
+ }
502
+ channel_control_helper()->UpdateState(connectivity_state, std::move(picker));
503
+ }
504
+
505
+ //
506
+ // XdsRoutingLb::XdsRoutingChild
507
+ //
508
+
509
+ XdsRoutingLb::XdsRoutingChild::XdsRoutingChild(
510
+ RefCountedPtr<XdsRoutingLb> xds_routing_policy, const std::string& name)
511
+ : xds_routing_policy_(std::move(xds_routing_policy)), name_(name) {
512
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
513
+ gpr_log(GPR_INFO, "[xds_routing_lb %p] created XdsRoutingChild %p for %s",
514
+ xds_routing_policy_.get(), this, name_.c_str());
515
+ }
516
+ GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this,
517
+ grpc_schedule_on_exec_ctx);
518
+ }
519
+
520
+ XdsRoutingLb::XdsRoutingChild::~XdsRoutingChild() {
521
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
522
+ gpr_log(GPR_INFO,
523
+ "[xds_routing_lb %p] XdsRoutingChild %p: destroying child",
524
+ xds_routing_policy_.get(), this);
525
+ }
526
+ xds_routing_policy_.reset(DEBUG_LOCATION, "XdsRoutingChild");
527
+ }
528
+
529
+ void XdsRoutingLb::XdsRoutingChild::Orphan() {
530
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
531
+ gpr_log(GPR_INFO,
532
+ "[xds_routing_lb %p] XdsRoutingChild %p %s: shutting down child",
533
+ xds_routing_policy_.get(), this, name_.c_str());
534
+ }
535
+ // Remove the child policy's interested_parties pollset_set from the
536
+ // xDS policy.
537
+ grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
538
+ xds_routing_policy_->interested_parties());
539
+ child_policy_.reset();
540
+ // Drop our ref to the child's picker, in case it's holding a ref to
541
+ // the child.
542
+ picker_wrapper_.reset();
543
+ if (delayed_removal_timer_callback_pending_) {
544
+ grpc_timer_cancel(&delayed_removal_timer_);
545
+ }
546
+ shutdown_ = true;
547
+ Unref();
548
+ }
549
+
550
+ OrphanablePtr<LoadBalancingPolicy>
551
+ XdsRoutingLb::XdsRoutingChild::CreateChildPolicyLocked(
552
+ const grpc_channel_args* args) {
553
+ LoadBalancingPolicy::Args lb_policy_args;
554
+ lb_policy_args.work_serializer = xds_routing_policy_->work_serializer();
555
+ lb_policy_args.args = args;
556
+ lb_policy_args.channel_control_helper =
557
+ absl::make_unique<Helper>(this->Ref(DEBUG_LOCATION, "Helper"));
558
+ OrphanablePtr<LoadBalancingPolicy> lb_policy =
559
+ MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
560
+ &grpc_xds_routing_lb_trace);
561
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
562
+ gpr_log(GPR_INFO,
563
+ "[xds_routing_lb %p] XdsRoutingChild %p %s: Created new child "
564
+ "policy handler %p",
565
+ xds_routing_policy_.get(), this, name_.c_str(), lb_policy.get());
566
+ }
567
+ // Add the xDS's interested_parties pollset_set to that of the newly created
568
+ // child policy. This will make the child policy progress upon activity on
569
+ // xDS LB, which in turn is tied to the application's call.
570
+ grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
571
+ xds_routing_policy_->interested_parties());
572
+ return lb_policy;
573
+ }
574
+
575
+ void XdsRoutingLb::XdsRoutingChild::UpdateLocked(
576
+ RefCountedPtr<LoadBalancingPolicy::Config> config,
577
+ const ServerAddressList& addresses, const grpc_channel_args* args) {
578
+ if (xds_routing_policy_->shutting_down_) return;
579
+ // Update child weight.
580
+ // Reactivate if needed.
581
+ if (delayed_removal_timer_callback_pending_) {
582
+ delayed_removal_timer_callback_pending_ = false;
583
+ grpc_timer_cancel(&delayed_removal_timer_);
584
+ }
585
+ // Create child policy if needed.
586
+ if (child_policy_ == nullptr) {
587
+ child_policy_ = CreateChildPolicyLocked(args);
588
+ }
589
+ // Construct update args.
590
+ UpdateArgs update_args;
591
+ update_args.config = std::move(config);
592
+ update_args.addresses = addresses;
593
+ update_args.args = grpc_channel_args_copy(args);
594
+ // Update the policy.
595
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
596
+ gpr_log(GPR_INFO,
597
+ "[xds_routing_lb %p] XdsRoutingChild %p %s: Updating child "
598
+ "policy handler %p",
599
+ xds_routing_policy_.get(), this, name_.c_str(),
600
+ child_policy_.get());
601
+ }
602
+ child_policy_->UpdateLocked(std::move(update_args));
603
+ }
604
+
605
+ void XdsRoutingLb::XdsRoutingChild::ExitIdleLocked() {
606
+ child_policy_->ExitIdleLocked();
607
+ }
608
+
609
+ void XdsRoutingLb::XdsRoutingChild::ResetBackoffLocked() {
610
+ child_policy_->ResetBackoffLocked();
611
+ }
612
+
613
+ void XdsRoutingLb::XdsRoutingChild::DeactivateLocked() {
614
+ // If already deactivated, don't do that again.
615
+ if (delayed_removal_timer_callback_pending_ == true) return;
616
+ // Set the child weight to 0 so that future picker won't contain this child.
617
+ // Start a timer to delete the child.
618
+ Ref(DEBUG_LOCATION, "XdsRoutingChild+timer").release();
619
+ grpc_timer_init(
620
+ &delayed_removal_timer_,
621
+ ExecCtx::Get()->Now() + GRPC_XDS_ROUTING_CHILD_RETENTION_INTERVAL_MS,
622
+ &on_delayed_removal_timer_);
623
+ delayed_removal_timer_callback_pending_ = true;
624
+ }
625
+
626
+ void XdsRoutingLb::XdsRoutingChild::OnDelayedRemovalTimer(void* arg,
627
+ grpc_error* error) {
628
+ XdsRoutingChild* self = static_cast<XdsRoutingChild*>(arg);
629
+ GRPC_ERROR_REF(error); // Ref owned by the lambda
630
+ self->xds_routing_policy_->work_serializer()->Run(
631
+ [self, error]() { self->OnDelayedRemovalTimerLocked(error); },
632
+ DEBUG_LOCATION);
633
+ }
634
+
635
+ void XdsRoutingLb::XdsRoutingChild::OnDelayedRemovalTimerLocked(
636
+ grpc_error* error) {
637
+ delayed_removal_timer_callback_pending_ = false;
638
+ if (error == GRPC_ERROR_NONE && !shutdown_) {
639
+ xds_routing_policy_->actions_.erase(name_);
640
+ }
641
+ Unref(DEBUG_LOCATION, "XdsRoutingChild+timer");
642
+ GRPC_ERROR_UNREF(error);
643
+ }
644
+
645
+ //
646
+ // XdsRoutingLb::XdsRoutingChild::Helper
647
+ //
648
+
649
+ RefCountedPtr<SubchannelInterface>
650
+ XdsRoutingLb::XdsRoutingChild::Helper::CreateSubchannel(
651
+ const grpc_channel_args& args) {
652
+ if (xds_routing_child_->xds_routing_policy_->shutting_down_) return nullptr;
653
+ return xds_routing_child_->xds_routing_policy_->channel_control_helper()
654
+ ->CreateSubchannel(args);
655
+ }
656
+
657
+ void XdsRoutingLb::XdsRoutingChild::Helper::UpdateState(
658
+ grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
659
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
660
+ gpr_log(GPR_INFO,
661
+ "[xds_routing_lb %p] child %s: received update: state=%s picker=%p",
662
+ xds_routing_child_->xds_routing_policy_.get(),
663
+ xds_routing_child_->name_.c_str(), ConnectivityStateName(state),
664
+ picker.get());
665
+ }
666
+ if (xds_routing_child_->xds_routing_policy_->shutting_down_) return;
667
+ // Cache the picker in the XdsRoutingChild.
668
+ xds_routing_child_->picker_wrapper_ = MakeRefCounted<ChildPickerWrapper>(
669
+ xds_routing_child_->name_, std::move(picker));
670
+ // Decide what state to report for aggregation purposes.
671
+ // If we haven't seen a failure since the last time we were in state
672
+ // READY, then we report the state change as-is. However, once we do see
673
+ // a failure, we report TRANSIENT_FAILURE and ignore any subsequent state
674
+ // changes until we go back into state READY.
675
+ if (!xds_routing_child_->seen_failure_since_ready_) {
676
+ if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
677
+ xds_routing_child_->seen_failure_since_ready_ = true;
678
+ }
679
+ } else {
680
+ if (state != GRPC_CHANNEL_READY) return;
681
+ xds_routing_child_->seen_failure_since_ready_ = false;
682
+ }
683
+ xds_routing_child_->connectivity_state_ = state;
684
+ // Notify the LB policy.
685
+ xds_routing_child_->xds_routing_policy_->UpdateStateLocked();
686
+ }
687
+
688
+ void XdsRoutingLb::XdsRoutingChild::Helper::RequestReresolution() {
689
+ if (xds_routing_child_->xds_routing_policy_->shutting_down_) return;
690
+ xds_routing_child_->xds_routing_policy_->channel_control_helper()
691
+ ->RequestReresolution();
692
+ }
693
+
694
+ void XdsRoutingLb::XdsRoutingChild::Helper::AddTraceEvent(
695
+ TraceSeverity severity, absl::string_view message) {
696
+ if (xds_routing_child_->xds_routing_policy_->shutting_down_) return;
697
+ xds_routing_child_->xds_routing_policy_->channel_control_helper()
698
+ ->AddTraceEvent(severity, message);
699
+ }
700
+
701
+ //
702
+ // factory
703
+ //
704
+
705
+ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory {
706
+ public:
707
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
708
+ LoadBalancingPolicy::Args args) const override {
709
+ return MakeOrphanable<XdsRoutingLb>(std::move(args));
710
+ }
711
+
712
+ const char* name() const override { return kXdsRouting; }
713
+
714
+ RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
715
+ const Json& json, grpc_error** error) const override {
716
+ GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
717
+ if (json.type() == Json::Type::JSON_NULL) {
718
+ // xds_routing was mentioned as a policy in the deprecated
719
+ // loadBalancingPolicy field or in the client API.
720
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
721
+ "field:loadBalancingPolicy error:xds_routing policy requires "
722
+ "configuration. Please use loadBalancingConfig field of service "
723
+ "config instead.");
724
+ return nullptr;
725
+ }
726
+ std::vector<grpc_error*> error_list;
727
+ // action map.
728
+ XdsRoutingLbConfig::ActionMap action_map;
729
+ std::set<std::string /*action_name*/> actions_to_be_used;
730
+ auto it = json.object_value().find("actions");
731
+ if (it == json.object_value().end()) {
732
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
733
+ "field:actions error:required field not present"));
734
+ } else if (it->second.type() != Json::Type::OBJECT) {
735
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
736
+ "field:actions error:type should be object"));
737
+ } else {
738
+ for (const auto& p : it->second.object_value()) {
739
+ if (p.first.empty()) {
740
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
741
+ "field:actions element error: name cannot be empty"));
742
+ continue;
743
+ }
744
+ RefCountedPtr<LoadBalancingPolicy::Config> child_config;
745
+ std::vector<grpc_error*> child_errors =
746
+ ParseChildConfig(p.second, &child_config);
747
+ if (!child_errors.empty()) {
748
+ // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
749
+ // string is not static in this case.
750
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
751
+ absl::StrCat("field:actions name:", p.first).c_str());
752
+ for (grpc_error* child_error : child_errors) {
753
+ error = grpc_error_add_child(error, child_error);
754
+ }
755
+ error_list.push_back(error);
756
+ } else {
757
+ action_map[p.first] = std::move(child_config);
758
+ actions_to_be_used.insert(p.first);
759
+ }
760
+ }
761
+ }
762
+ if (action_map.empty()) {
763
+ error_list.push_back(
764
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("no valid actions configured"));
765
+ }
766
+ XdsRoutingLbConfig::RouteTable route_table;
767
+ it = json.object_value().find("routes");
768
+ if (it == json.object_value().end()) {
769
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
770
+ "field:routes error:required field not present"));
771
+ } else if (it->second.type() != Json::Type::ARRAY) {
772
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
773
+ "field:routes error:type should be array"));
774
+ } else {
775
+ const Json::Array& array = it->second.array_value();
776
+ for (size_t i = 0; i < array.size(); ++i) {
777
+ XdsRoutingLbConfig::Route route;
778
+ std::vector<grpc_error*> route_errors =
779
+ ParseRoute(array[i], action_map, &route, &actions_to_be_used);
780
+ if (!route_errors.empty()) {
781
+ // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
782
+ // string is not static in this case.
783
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
784
+ absl::StrCat("field:routes element: ", i, " error").c_str());
785
+ for (grpc_error* route_error : route_errors) {
786
+ error = grpc_error_add_child(error, route_error);
787
+ }
788
+ error_list.push_back(error);
789
+ }
790
+ route_table.emplace_back(std::move(route));
791
+ }
792
+ }
793
+ if (route_table.empty()) {
794
+ grpc_error* error =
795
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("no valid routes configured");
796
+ error_list.push_back(error);
797
+ }
798
+ if (!actions_to_be_used.empty()) {
799
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
800
+ "some actions were not referenced by any route"));
801
+ }
802
+ if (!error_list.empty()) {
803
+ *error = GRPC_ERROR_CREATE_FROM_VECTOR(
804
+ "xds_routing_experimental LB policy config", &error_list);
805
+ return nullptr;
806
+ }
807
+ return MakeRefCounted<XdsRoutingLbConfig>(std::move(action_map),
808
+ std::move(route_table));
809
+ }
810
+
811
+ private:
812
+ static std::vector<grpc_error*> ParseChildConfig(
813
+ const Json& json,
814
+ RefCountedPtr<LoadBalancingPolicy::Config>* child_config) {
815
+ std::vector<grpc_error*> error_list;
816
+ if (json.type() != Json::Type::OBJECT) {
817
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
818
+ "value should be of type object"));
819
+ return error_list;
820
+ }
821
+ auto it = json.object_value().find("childPolicy");
822
+ if (it == json.object_value().end()) {
823
+ error_list.push_back(
824
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("did not find childPolicy"));
825
+ } else {
826
+ grpc_error* parse_error = GRPC_ERROR_NONE;
827
+ *child_config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
828
+ it->second, &parse_error);
829
+ if (*child_config == nullptr) {
830
+ GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
831
+ std::vector<grpc_error*> child_errors;
832
+ child_errors.push_back(parse_error);
833
+ error_list.push_back(
834
+ GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors));
835
+ }
836
+ }
837
+ return error_list;
838
+ }
839
+
840
+ static std::vector<grpc_error*> ParseRoute(
841
+ const Json& json, const XdsRoutingLbConfig::ActionMap& action_map,
842
+ XdsRoutingLbConfig::Route* route,
843
+ std::set<std::string /*action_name*/>* actions_to_be_used) {
844
+ std::vector<grpc_error*> error_list;
845
+ if (json.type() != Json::Type::OBJECT) {
846
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
847
+ "value should be of type object"));
848
+ return error_list;
849
+ }
850
+ // Parse and ensure one and only one path matcher is set: prefix, path, or
851
+ // regex.
852
+ bool path_matcher_seen = false;
853
+ auto it = json.object_value().find("prefix");
854
+ if (it != json.object_value().end()) {
855
+ if (it->second.type() != Json::Type::STRING) {
856
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
857
+ "field:prefix error: should be string"));
858
+ } else {
859
+ path_matcher_seen = true;
860
+ route->matchers.path_matcher.type = XdsApi::RdsUpdate::RdsRoute::
861
+ Matchers::PathMatcher::PathMatcherType::PREFIX;
862
+ route->matchers.path_matcher.string_matcher = it->second.string_value();
863
+ }
864
+ }
865
+ it = json.object_value().find("path");
866
+ if (it != json.object_value().end()) {
867
+ if (path_matcher_seen) {
868
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
869
+ "field:path error: other path matcher already specified"));
870
+ } else {
871
+ path_matcher_seen = true;
872
+ if (it->second.type() != Json::Type::STRING) {
873
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
874
+ "field:path error: should be string"));
875
+ } else {
876
+ route->matchers.path_matcher.type = XdsApi::RdsUpdate::RdsRoute::
877
+ Matchers::PathMatcher::PathMatcherType::PATH;
878
+ route->matchers.path_matcher.string_matcher =
879
+ it->second.string_value();
880
+ }
881
+ }
882
+ }
883
+ it = json.object_value().find("regex");
884
+ if (it != json.object_value().end()) {
885
+ if (path_matcher_seen) {
886
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
887
+ "field:regex error: other path matcher already specified"));
888
+ } else {
889
+ path_matcher_seen = true;
890
+ if (it->second.type() != Json::Type::STRING) {
891
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
892
+ "field:regex error: should be string"));
893
+ } else {
894
+ route->matchers.path_matcher.type = XdsApi::RdsUpdate::RdsRoute::
895
+ Matchers::PathMatcher::PathMatcherType::REGEX;
896
+ route->matchers.path_matcher.regex_matcher =
897
+ absl::make_unique<RE2>(it->second.string_value());
898
+ }
899
+ }
900
+ }
901
+ if (!path_matcher_seen) {
902
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
903
+ "one path matcher: prefix, path, or regex is required"));
904
+ }
905
+ // Parse Header Matcher: headers.
906
+ it = json.object_value().find("headers");
907
+ if (it != json.object_value().end()) {
908
+ if (it->second.type() != Json::Type::ARRAY) {
909
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
910
+ "field:headers error: should be array"));
911
+ } else {
912
+ const Json::Array& array = it->second.array_value();
913
+ for (size_t i = 0; i < array.size(); ++i) {
914
+ const Json& header_json = array[i];
915
+ if (header_json.type() != Json::Type::OBJECT) {
916
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
917
+ "value should be of type object"));
918
+ } else {
919
+ route->matchers.header_matchers.emplace_back();
920
+ XdsApi::RdsUpdate::RdsRoute::Matchers::HeaderMatcher&
921
+ header_matcher = route->matchers.header_matchers.back();
922
+ auto header_it = header_json.object_value().find("name");
923
+ if (header_it == header_json.object_value().end()) {
924
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
925
+ "field:name error:required field missing"));
926
+ } else {
927
+ if (header_it->second.type() != Json::Type::STRING) {
928
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
929
+ "field:name error: should be string"));
930
+ } else {
931
+ header_matcher.name = header_it->second.string_value();
932
+ }
933
+ }
934
+ header_it = header_json.object_value().find("invert_match");
935
+ if (header_it != header_json.object_value().end()) {
936
+ if (header_it->second.type() == Json::Type::JSON_TRUE) {
937
+ header_matcher.invert_match = true;
938
+ } else if (header_it->second.type() == Json::Type::JSON_FALSE) {
939
+ header_matcher.invert_match = false;
940
+ } else {
941
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
942
+ "field:present_match error: should be boolean"));
943
+ }
944
+ }
945
+ // Parse and ensure one and only one header matcher is set per
946
+ // header matcher.
947
+ bool header_matcher_seen = false;
948
+ header_it = header_json.object_value().find("exact_match");
949
+ if (header_it != header_json.object_value().end()) {
950
+ header_matcher_seen = true;
951
+ if (header_it->second.type() != Json::Type::STRING) {
952
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
953
+ "field:exact_match error: should be string"));
954
+ } else {
955
+ header_matcher.type = XdsApi::RdsUpdate::RdsRoute::Matchers::
956
+ HeaderMatcher::HeaderMatcherType::EXACT;
957
+ header_matcher.string_matcher =
958
+ header_it->second.string_value();
959
+ }
960
+ }
961
+ header_it = header_json.object_value().find("regex_match");
962
+ if (header_it != header_json.object_value().end()) {
963
+ if (header_matcher_seen) {
964
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
965
+ "field:regex_match error: other header matcher already "
966
+ "specified"));
967
+ } else {
968
+ header_matcher_seen = true;
969
+ if (header_it->second.type() != Json::Type::STRING) {
970
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
971
+ "field:regex_match error: should be string"));
972
+ } else {
973
+ header_matcher.type = XdsApi::RdsUpdate::RdsRoute::Matchers::
974
+ HeaderMatcher::HeaderMatcherType::REGEX;
975
+ header_matcher.regex_match =
976
+ absl::make_unique<RE2>(header_it->second.string_value());
977
+ }
978
+ }
979
+ }
980
+ header_it = header_json.object_value().find("range_match");
981
+ if (header_it != header_json.object_value().end()) {
982
+ if (header_matcher_seen) {
983
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
984
+ "field:range_match error: other header matcher already "
985
+ "specified"));
986
+ } else {
987
+ header_matcher_seen = true;
988
+ if (header_it->second.type() != Json::Type::OBJECT) {
989
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
990
+ "field:range_match error: should be object"));
991
+ } else {
992
+ auto range_it =
993
+ header_it->second.object_value().find("start");
994
+ if (range_it != header_it->second.object_value().end()) {
995
+ if (range_it->second.type() != Json::Type::NUMBER) {
996
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
997
+ "field:start error: should be of number"));
998
+ } else {
999
+ header_matcher.range_start = gpr_parse_nonnegative_int(
1000
+ range_it->second.string_value().c_str());
1001
+ }
1002
+ } else {
1003
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1004
+ "field:start missing"));
1005
+ }
1006
+ range_it = header_it->second.object_value().find("end");
1007
+ if (range_it != header_it->second.object_value().end()) {
1008
+ if (range_it->second.type() != Json::Type::NUMBER) {
1009
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1010
+ "field:end error: should be of number"));
1011
+ } else {
1012
+ header_matcher.range_end = gpr_parse_nonnegative_int(
1013
+ range_it->second.string_value().c_str());
1014
+ }
1015
+ } else {
1016
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1017
+ "field:end missing"));
1018
+ }
1019
+ if (header_matcher.range_end > header_matcher.range_start) {
1020
+ header_matcher.type = XdsApi::RdsUpdate::RdsRoute::
1021
+ Matchers::HeaderMatcher::HeaderMatcherType::RANGE;
1022
+ }
1023
+ }
1024
+ }
1025
+ }
1026
+ header_it = header_json.object_value().find("present_match");
1027
+ if (header_it != header_json.object_value().end()) {
1028
+ if (header_matcher_seen) {
1029
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1030
+ "field:present_match error: other header matcher already "
1031
+ "specified"));
1032
+ } else {
1033
+ header_matcher_seen = true;
1034
+ if (header_it->second.type() == Json::Type::JSON_TRUE) {
1035
+ header_matcher.type = XdsApi::RdsUpdate::RdsRoute::Matchers::
1036
+ HeaderMatcher::HeaderMatcherType::PRESENT;
1037
+ header_matcher.present_match = true;
1038
+ } else if (header_it->second.type() == Json::Type::JSON_FALSE) {
1039
+ header_matcher.type = XdsApi::RdsUpdate::RdsRoute::Matchers::
1040
+ HeaderMatcher::HeaderMatcherType::PRESENT;
1041
+ header_matcher.present_match = false;
1042
+ } else {
1043
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1044
+ "field:present_match error: should be boolean"));
1045
+ }
1046
+ }
1047
+ }
1048
+ header_it = header_json.object_value().find("prefix_match");
1049
+ if (header_it != header_json.object_value().end()) {
1050
+ if (header_matcher_seen) {
1051
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1052
+ "field:prefix_match error: other header matcher already "
1053
+ "specified"));
1054
+ } else {
1055
+ header_matcher_seen = true;
1056
+ if (header_it->second.type() != Json::Type::STRING) {
1057
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1058
+ "field:prefix_match error: should be string"));
1059
+ } else {
1060
+ header_matcher.type = XdsApi::RdsUpdate::RdsRoute::Matchers::
1061
+ HeaderMatcher::HeaderMatcherType::PREFIX;
1062
+ header_matcher.string_matcher =
1063
+ header_it->second.string_value();
1064
+ }
1065
+ }
1066
+ }
1067
+ header_it = header_json.object_value().find("suffix_match");
1068
+ if (header_it != header_json.object_value().end()) {
1069
+ if (header_matcher_seen) {
1070
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1071
+ "field:suffix_match error: other header matcher already "
1072
+ "specified"));
1073
+ } else {
1074
+ header_matcher_seen = true;
1075
+ if (header_it->second.type() != Json::Type::STRING) {
1076
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1077
+ "field:suffix_match error: should be string"));
1078
+ } else {
1079
+ header_matcher.type = XdsApi::RdsUpdate::RdsRoute::Matchers::
1080
+ HeaderMatcher::HeaderMatcherType::SUFFIX;
1081
+ header_matcher.string_matcher =
1082
+ header_it->second.string_value();
1083
+ }
1084
+ }
1085
+ }
1086
+ }
1087
+ }
1088
+ }
1089
+ }
1090
+ // Parse Fraction numerator.
1091
+ it = json.object_value().find("match_fraction");
1092
+ if (it != json.object_value().end()) {
1093
+ if (it->second.type() != Json::Type::NUMBER) {
1094
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1095
+ "field:match_fraction error:must be of type number"));
1096
+ } else {
1097
+ route->matchers.fraction_per_million =
1098
+ gpr_parse_nonnegative_int(it->second.string_value().c_str());
1099
+ }
1100
+ }
1101
+ // Parse action.
1102
+ it = json.object_value().find("action");
1103
+ if (it == json.object_value().end()) {
1104
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1105
+ "field:action error:required field missing"));
1106
+ } else if (it->second.type() != Json::Type::STRING) {
1107
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1108
+ "field:action error:should be of type string"));
1109
+ } else {
1110
+ route->action = it->second.string_value();
1111
+ if (route->action.empty()) {
1112
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1113
+ "field:action error:cannot be empty"));
1114
+ } else {
1115
+ // Validate action exists and mark it as used.
1116
+ if (action_map.find(route->action) == action_map.end()) {
1117
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1118
+ absl::StrCat("field:action error:", route->action,
1119
+ " does not exist")
1120
+ .c_str()));
1121
+ }
1122
+ actions_to_be_used->erase(route->action);
1123
+ }
1124
+ }
1125
+ return error_list;
1126
+ }
1127
+ };
1128
+
1129
+ } // namespace
1130
+
1131
+ } // namespace grpc_core
1132
+
1133
+ //
1134
+ // Plugin registration
1135
+ //
1136
+
1137
+ void grpc_lb_policy_xds_routing_init() {
1138
+ grpc_core::LoadBalancingPolicyRegistry::Builder::
1139
+ RegisterLoadBalancingPolicyFactory(
1140
+ absl::make_unique<grpc_core::XdsRoutingLbFactory>());
1141
+ }
1142
+
1143
+ void grpc_lb_policy_xds_routing_shutdown() {}