grpc 1.28.0 → 1.30.2

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 (503) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +7694 -11190
  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 +1 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +19 -21
  7. data/include/grpc/impl/codegen/port_platform.h +6 -2
  8. data/include/grpc/module.modulemap +24 -39
  9. data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +212 -241
  11. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_proxy.cc +17 -10
  15. data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
  16. data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
  17. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -4
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +240 -301
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
  28. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +84 -37
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
  34. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -2
  35. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  36. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  37. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  38. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +73 -59
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +16 -20
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +184 -133
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  48. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +40 -43
  49. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
  50. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  51. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +32 -5
  53. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  54. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
  55. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +16 -16
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
  58. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +20 -31
  59. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -3
  60. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  61. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  62. data/src/core/ext/filters/client_channel/service_config.cc +104 -144
  63. data/src/core/ext/filters/client_channel/service_config.h +28 -98
  64. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  65. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  66. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  67. data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
  68. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  69. data/src/core/ext/filters/client_channel/xds/xds_api.cc +348 -221
  70. data/src/core/ext/filters/client_channel/xds/xds_api.h +37 -37
  71. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +44 -49
  72. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +4 -3
  73. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
  74. data/src/core/ext/filters/client_channel/xds/xds_client.cc +532 -339
  75. data/src/core/ext/filters/client_channel/xds/xds_client.h +57 -22
  76. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
  77. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +31 -19
  78. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
  79. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  80. data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
  83. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +7 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.h +4 -4
  86. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +4 -4
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +23 -22
  89. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  90. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  92. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  93. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  94. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  96. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  97. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  98. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  99. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  100. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  101. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  102. data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
  103. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  104. data/src/core/ext/transport/chttp2/transport/writing.cc +15 -8
  105. data/src/core/ext/transport/inproc/inproc_transport.cc +19 -0
  106. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
  107. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -875
  108. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  109. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
  110. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  111. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
  112. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  113. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
  114. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
  115. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +21 -8
  116. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +43 -7
  117. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
  118. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  119. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  120. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
  121. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  122. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
  123. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +47 -26
  124. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +115 -65
  125. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
  126. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  127. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
  128. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
  129. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
  130. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +28 -13
  131. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
  133. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +88 -6
  134. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
  137. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
  138. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -0
  139. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
  140. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
  141. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +12 -4
  142. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
  144. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
  145. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +16 -0
  146. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
  147. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +2 -1
  148. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
  151. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
  152. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +63 -41
  153. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +173 -77
  154. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
  156. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -0
  157. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
  158. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +90 -30
  159. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
  160. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  161. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  163. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  164. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
  165. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  166. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +36 -0
  168. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
  169. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
  170. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  171. data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
  172. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
  173. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
  174. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
  175. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
  176. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  177. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
  178. data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
  179. data/src/core/ext/upb-generated/validate/validate.upb.h +69 -63
  180. data/src/core/lib/channel/channel_args.cc +15 -14
  181. data/src/core/lib/channel/channel_args.h +3 -1
  182. data/src/core/lib/channel/channel_stack.h +20 -13
  183. data/src/core/lib/channel/channelz.cc +5 -6
  184. data/src/core/lib/channel/channelz.h +3 -2
  185. data/src/core/lib/channel/channelz_registry.cc +5 -3
  186. data/src/core/lib/channel/connected_channel.cc +7 -5
  187. data/src/core/lib/channel/context.h +1 -1
  188. data/src/core/lib/channel/handshaker.cc +11 -13
  189. data/src/core/lib/channel/handshaker.h +4 -2
  190. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  191. data/src/core/lib/channel/status_util.cc +2 -3
  192. data/src/core/lib/compression/message_compress.cc +5 -1
  193. data/src/core/lib/debug/stats.cc +21 -27
  194. data/src/core/lib/debug/stats.h +3 -1
  195. data/src/core/lib/gpr/spinlock.h +2 -3
  196. data/src/core/lib/gpr/string.cc +2 -26
  197. data/src/core/lib/gpr/string.h +0 -16
  198. data/src/core/lib/gpr/sync_abseil.cc +2 -0
  199. data/src/core/lib/gpr/time.cc +4 -0
  200. data/src/core/lib/gpr/time_posix.cc +1 -1
  201. data/src/core/lib/gprpp/atomic.h +6 -6
  202. data/src/core/lib/gprpp/fork.cc +1 -1
  203. data/src/core/lib/gprpp/host_port.cc +29 -35
  204. data/src/core/lib/gprpp/host_port.h +14 -17
  205. data/src/core/lib/gprpp/map.h +5 -11
  206. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  207. data/src/core/lib/http/format_request.cc +46 -65
  208. data/src/core/lib/http/httpcli.cc +2 -3
  209. data/src/core/lib/http/httpcli.h +2 -3
  210. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  211. data/src/core/lib/http/parser.h +2 -3
  212. data/src/core/lib/iomgr/buffer_list.h +22 -21
  213. data/src/core/lib/iomgr/call_combiner.h +3 -2
  214. data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
  215. data/src/core/lib/iomgr/closure.h +2 -3
  216. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  217. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  218. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  219. data/src/core/lib/iomgr/error.cc +6 -9
  220. data/src/core/lib/iomgr/error.h +0 -1
  221. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  222. data/src/core/lib/iomgr/ev_apple.h +43 -0
  223. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
  224. data/src/core/lib/iomgr/ev_epollex_linux.cc +2 -3
  225. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  226. data/src/core/lib/iomgr/ev_posix.cc +2 -3
  227. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  228. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  229. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  230. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  231. data/src/core/lib/iomgr/port.h +1 -0
  232. data/src/core/lib/iomgr/python_util.h +46 -0
  233. data/src/core/lib/iomgr/resolve_address.h +4 -6
  234. data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
  235. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  236. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  237. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
  238. data/src/core/lib/iomgr/resource_quota.cc +4 -6
  239. data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
  240. data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
  241. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  242. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  243. data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -26
  244. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +8 -5
  247. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  248. data/src/core/lib/iomgr/tcp_custom.cc +2 -3
  249. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -9
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -4
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
  253. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  254. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  255. data/src/core/lib/iomgr/timer_generic.cc +2 -3
  256. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  257. data/src/core/lib/iomgr/timer_heap.h +2 -3
  258. data/src/core/lib/iomgr/udp_server.cc +9 -14
  259. data/src/core/lib/json/json.h +3 -2
  260. data/src/core/lib/json/json_reader.cc +5 -5
  261. data/src/core/lib/json/json_writer.cc +13 -12
  262. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  263. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  264. data/src/core/lib/security/credentials/credentials.cc +0 -84
  265. data/src/core/lib/security/credentials/credentials.h +8 -59
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +3 -8
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
  274. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +55 -27
  276. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +13 -0
  278. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  279. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
  280. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +38 -11
  281. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
  282. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -7
  283. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  284. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  285. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  286. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -25
  287. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
  288. data/src/core/lib/security/security_connector/ssl_utils.cc +59 -12
  289. data/src/core/lib/security/security_connector/ssl_utils.h +12 -10
  290. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +77 -51
  291. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
  292. data/src/core/lib/security/transport/auth_filters.h +0 -5
  293. data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
  294. data/src/core/lib/slice/slice_intern.cc +2 -3
  295. data/src/core/lib/slice/slice_internal.h +14 -0
  296. data/src/core/lib/slice/slice_utils.h +9 -0
  297. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  298. data/src/core/lib/surface/call.cc +2 -3
  299. data/src/core/lib/surface/call_log_batch.cc +50 -58
  300. data/src/core/lib/surface/channel.cc +53 -31
  301. data/src/core/lib/surface/channel.h +35 -4
  302. data/src/core/lib/surface/channel_ping.cc +2 -3
  303. data/src/core/lib/surface/completion_queue.cc +33 -33
  304. data/src/core/lib/surface/event_string.cc +18 -25
  305. data/src/core/lib/surface/event_string.h +3 -1
  306. data/src/core/lib/surface/init_secure.cc +1 -4
  307. data/src/core/lib/surface/server.cc +570 -369
  308. data/src/core/lib/surface/server.h +32 -0
  309. data/src/core/lib/surface/version.cc +2 -2
  310. data/src/core/lib/transport/byte_stream.h +7 -2
  311. data/src/core/lib/transport/connectivity_state.cc +7 -6
  312. data/src/core/lib/transport/connectivity_state.h +5 -3
  313. data/src/core/lib/transport/metadata.cc +3 -3
  314. data/src/core/lib/transport/metadata_batch.h +2 -3
  315. data/src/core/lib/transport/static_metadata.h +1 -1
  316. data/src/core/lib/transport/status_conversion.cc +6 -14
  317. data/src/core/lib/transport/transport.cc +2 -3
  318. data/src/core/lib/transport/transport.h +3 -2
  319. data/src/core/lib/transport/transport_op_string.cc +61 -102
  320. data/src/core/lib/uri/uri_parser.h +2 -3
  321. data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
  322. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  323. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +8 -1
  324. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  325. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -2
  326. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  327. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  328. data/src/core/tsi/fake_transport_security.cc +10 -15
  329. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  330. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  331. data/src/core/tsi/ssl_transport_security.cc +52 -39
  332. data/src/core/tsi/ssl_transport_security.h +8 -8
  333. data/src/core/tsi/ssl_types.h +0 -2
  334. data/src/core/tsi/transport_security.h +6 -9
  335. data/src/core/tsi/transport_security_grpc.h +2 -3
  336. data/src/core/tsi/transport_security_interface.h +3 -3
  337. data/src/ruby/ext/grpc/rb_call.c +9 -1
  338. data/src/ruby/ext/grpc/rb_call_credentials.c +3 -2
  339. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  340. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  341. data/src/ruby/lib/grpc/errors.rb +103 -42
  342. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  343. data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
  344. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  345. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  346. data/src/ruby/lib/grpc/structs.rb +1 -1
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  349. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
  350. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  351. data/src/ruby/spec/debug_message_spec.rb +134 -0
  352. data/src/ruby/spec/generic/service_spec.rb +2 -0
  353. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  354. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
  355. data/src/ruby/spec/pb/codegen/package_option_spec.rb +7 -1
  356. data/src/ruby/spec/support/services.rb +10 -4
  357. data/src/ruby/spec/testdata/ca.pem +18 -13
  358. data/src/ruby/spec/testdata/client.key +26 -14
  359. data/src/ruby/spec/testdata/client.pem +18 -12
  360. data/src/ruby/spec/testdata/server1.key +26 -14
  361. data/src/ruby/spec/testdata/server1.pem +20 -14
  362. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  363. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  364. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  365. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  366. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  367. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  368. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  369. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  370. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  371. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  372. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  373. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  374. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  375. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  376. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  377. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  378. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  379. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  380. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  381. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  382. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  383. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  384. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  385. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  386. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  387. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  388. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  389. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  390. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  391. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  392. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  393. data/third_party/boringssl-with-bazel/err_data.c +329 -297
  394. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  395. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
  396. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  397. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  398. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  399. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  400. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  401. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  402. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
  404. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
  405. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
  406. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  407. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  408. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  409. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
  410. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  411. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +14 -11
  412. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  413. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  414. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
  416. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
  417. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  418. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  419. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +432 -160
  420. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  421. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -14
  422. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  423. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +80 -99
  424. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
  425. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  426. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  427. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  428. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  429. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  430. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  431. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  432. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  433. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  435. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
  437. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
  438. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  439. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
  441. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
  442. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  443. data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -12
  444. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  446. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  447. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  448. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  449. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
  450. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
  451. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
  452. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +16 -0
  453. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +5 -0
  454. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
  456. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
  457. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  459. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  460. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  461. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  462. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  463. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
  464. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  465. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  466. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +172 -77
  467. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  468. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
  469. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +5 -3
  470. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  471. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  472. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  473. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  474. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
  475. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +14 -3
  476. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +28 -20
  477. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +12 -4
  478. data/third_party/boringssl-with-bazel/src/ssl/internal.h +64 -47
  479. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  480. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  481. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  482. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
  483. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
  484. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +6 -1
  485. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  486. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +64 -5
  487. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  488. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +6 -2
  489. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
  490. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
  491. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -27
  492. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
  493. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +50 -20
  494. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  495. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  496. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  497. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  498. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  499. metadata +115 -39
  500. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
  501. data/src/core/lib/gprpp/string_view.h +0 -60
  502. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  503. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
@@ -160,7 +160,7 @@ class RoundRobin : public LoadBalancingPolicy {
160
160
  RoundRobin* parent_;
161
161
 
162
162
  size_t last_picked_index_;
163
- InlinedVector<RefCountedPtr<SubchannelInterface>, 10> subchannels_;
163
+ absl::InlinedVector<RefCountedPtr<SubchannelInterface>, 10> subchannels_;
164
164
  };
165
165
 
166
166
  void ShutdownLocked() override;
@@ -25,6 +25,8 @@
25
25
 
26
26
  #include <grpc/support/alloc.h>
27
27
 
28
+ #include "absl/container/inlined_vector.h"
29
+
28
30
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
29
31
  #include "src/core/ext/filters/client_channel/server_address.h"
30
32
  // TODO(roth): Should not need the include of subchannel.h here, since
@@ -33,7 +35,6 @@
33
35
  #include "src/core/ext/filters/client_channel/subchannel_interface.h"
34
36
  #include "src/core/lib/channel/channel_args.h"
35
37
  #include "src/core/lib/debug/trace.h"
36
- #include "src/core/lib/gprpp/inlined_vector.h"
37
38
  #include "src/core/lib/gprpp/orphanable.h"
38
39
  #include "src/core/lib/gprpp/ref_counted.h"
39
40
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
@@ -62,7 +63,7 @@ class MySubchannelList
62
63
  };
63
64
 
64
65
  */
65
- // All methods will be called from within the client_channel combiner.
66
+ // All methods will be called from within the client_channel work serializer.
66
67
 
67
68
  namespace grpc_core {
68
69
 
@@ -172,7 +173,7 @@ class SubchannelData {
172
173
  template <typename SubchannelListType, typename SubchannelDataType>
173
174
  class SubchannelList : public InternallyRefCounted<SubchannelListType> {
174
175
  public:
175
- typedef InlinedVector<SubchannelDataType, 10> SubchannelVector;
176
+ typedef absl::InlinedVector<SubchannelDataType, 10> SubchannelVector;
176
177
 
177
178
  // The number of subchannels in the list.
178
179
  size_t num_subchannels() const { return subchannels_.size(); }
@@ -370,14 +371,7 @@ SubchannelList::SubchannelList(
370
371
  GRPC_ARG_SERVICE_CONFIG};
371
372
  // Create a subchannel for each address.
372
373
  for (size_t i = 0; i < addresses.size(); i++) {
373
- // TODO(roth): we should ideally hide this from the LB policy code. In
374
- // principle, if we're dealing with this special case in the client_channel
375
- // code for selecting grpclb, then we should also strip out these addresses
376
- // there if we're not using grpclb.
377
- if (addresses[i].IsBalancer()) {
378
- continue;
379
- }
380
- InlinedVector<grpc_arg, 3> args_to_add;
374
+ absl::InlinedVector<grpc_arg, 3> args_to_add;
381
375
  const size_t subchannel_address_arg_index = args_to_add.size();
382
376
  args_to_add.emplace_back(
383
377
  Subchannel::CreateSubchannelAddressArg(&addresses[i].address()));
@@ -0,0 +1,734 @@
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/str_cat.h"
25
+
26
+ #include <grpc/grpc.h>
27
+
28
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
29
+ #include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
30
+ #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
31
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
32
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
33
+ #include "src/core/lib/channel/channel_args.h"
34
+ #include "src/core/lib/gpr/string.h"
35
+ #include "src/core/lib/gprpp/orphanable.h"
36
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
37
+ #include "src/core/lib/iomgr/timer.h"
38
+ #include "src/core/lib/iomgr/work_serializer.h"
39
+
40
+ namespace grpc_core {
41
+
42
+ TraceFlag grpc_lb_weighted_target_trace(false, "weighted_target_lb");
43
+
44
+ namespace {
45
+
46
+ constexpr char kWeightedTarget[] = "weighted_target_experimental";
47
+
48
+ // How long we keep a child around for after it has been removed from
49
+ // the config.
50
+ constexpr int kChildRetentionIntervalMs = 15 * 60 * 1000;
51
+
52
+ // Config for weighted_target LB policy.
53
+ class WeightedTargetLbConfig : public LoadBalancingPolicy::Config {
54
+ public:
55
+ struct ChildConfig {
56
+ uint32_t weight;
57
+ RefCountedPtr<LoadBalancingPolicy::Config> config;
58
+ };
59
+
60
+ using TargetMap = std::map<std::string, ChildConfig>;
61
+
62
+ explicit WeightedTargetLbConfig(TargetMap target_map)
63
+ : target_map_(std::move(target_map)) {}
64
+
65
+ const char* name() const override { return kWeightedTarget; }
66
+
67
+ const TargetMap& target_map() const { return target_map_; }
68
+
69
+ private:
70
+ TargetMap target_map_;
71
+ };
72
+
73
+ // weighted_target LB policy.
74
+ class WeightedTargetLb : public LoadBalancingPolicy {
75
+ public:
76
+ explicit WeightedTargetLb(Args args);
77
+
78
+ const char* name() const override { return kWeightedTarget; }
79
+
80
+ void UpdateLocked(UpdateArgs args) override;
81
+ void ResetBackoffLocked() override;
82
+
83
+ private:
84
+ // A simple wrapper for ref-counting a picker from the child policy.
85
+ class ChildPickerWrapper : public RefCounted<ChildPickerWrapper> {
86
+ public:
87
+ explicit ChildPickerWrapper(std::unique_ptr<SubchannelPicker> picker)
88
+ : picker_(std::move(picker)) {}
89
+ PickResult Pick(PickArgs args) { return picker_->Pick(args); }
90
+
91
+ private:
92
+ std::unique_ptr<SubchannelPicker> picker_;
93
+ };
94
+
95
+ // Picks a child using stateless WRR and then delegates to that
96
+ // child's picker.
97
+ class WeightedPicker : public SubchannelPicker {
98
+ public:
99
+ // Maintains a weighted list of pickers from each child that is in
100
+ // ready state. The first element in the pair represents the end of a
101
+ // range proportional to the child's weight. The start of the range
102
+ // is the previous value in the vector and is 0 for the first element.
103
+ using PickerList = absl::InlinedVector<
104
+ std::pair<uint32_t, RefCountedPtr<ChildPickerWrapper>>, 1>;
105
+
106
+ explicit WeightedPicker(PickerList pickers)
107
+ : pickers_(std::move(pickers)) {}
108
+
109
+ PickResult Pick(PickArgs args) override;
110
+
111
+ private:
112
+ PickerList pickers_;
113
+ };
114
+
115
+ // Each WeightedChild holds a ref to its parent WeightedTargetLb.
116
+ class WeightedChild : public InternallyRefCounted<WeightedChild> {
117
+ public:
118
+ WeightedChild(RefCountedPtr<WeightedTargetLb> weighted_target_policy,
119
+ const std::string& name);
120
+ ~WeightedChild();
121
+
122
+ void Orphan() override;
123
+
124
+ void UpdateLocked(const WeightedTargetLbConfig::ChildConfig& config,
125
+ ServerAddressList addresses,
126
+ const grpc_channel_args* args);
127
+ void ResetBackoffLocked();
128
+ void DeactivateLocked();
129
+
130
+ uint32_t weight() const { return weight_; }
131
+ grpc_connectivity_state connectivity_state() const {
132
+ return connectivity_state_;
133
+ }
134
+ RefCountedPtr<ChildPickerWrapper> picker_wrapper() const {
135
+ return picker_wrapper_;
136
+ }
137
+
138
+ private:
139
+ class Helper : public ChannelControlHelper {
140
+ public:
141
+ explicit Helper(RefCountedPtr<WeightedChild> weighted_child)
142
+ : weighted_child_(std::move(weighted_child)) {}
143
+
144
+ ~Helper() { weighted_child_.reset(DEBUG_LOCATION, "Helper"); }
145
+
146
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
147
+ const grpc_channel_args& args) override;
148
+ void UpdateState(grpc_connectivity_state state,
149
+ std::unique_ptr<SubchannelPicker> picker) override;
150
+ void RequestReresolution() override;
151
+ void AddTraceEvent(TraceSeverity severity,
152
+ absl::string_view message) override;
153
+
154
+ private:
155
+ RefCountedPtr<WeightedChild> weighted_child_;
156
+ };
157
+
158
+ // Methods for dealing with the child policy.
159
+ OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
160
+ const grpc_channel_args* args);
161
+
162
+ void OnConnectivityStateUpdateLocked(
163
+ grpc_connectivity_state state,
164
+ std::unique_ptr<SubchannelPicker> picker);
165
+
166
+ static void OnDelayedRemovalTimer(void* arg, grpc_error* error);
167
+ void OnDelayedRemovalTimerLocked(grpc_error* error);
168
+
169
+ // The owning LB policy.
170
+ RefCountedPtr<WeightedTargetLb> weighted_target_policy_;
171
+
172
+ const std::string& name_;
173
+
174
+ uint32_t weight_;
175
+
176
+ OrphanablePtr<LoadBalancingPolicy> child_policy_;
177
+
178
+ RefCountedPtr<ChildPickerWrapper> picker_wrapper_;
179
+ grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_CONNECTING;
180
+ bool seen_failure_since_ready_ = false;
181
+
182
+ // States for delayed removal.
183
+ grpc_timer delayed_removal_timer_;
184
+ grpc_closure on_delayed_removal_timer_;
185
+ bool delayed_removal_timer_callback_pending_ = false;
186
+ bool shutdown_ = false;
187
+ };
188
+
189
+ ~WeightedTargetLb();
190
+
191
+ void ShutdownLocked() override;
192
+
193
+ void UpdateStateLocked();
194
+
195
+ // Current config from the resolver.
196
+ RefCountedPtr<WeightedTargetLbConfig> config_;
197
+
198
+ // Internal state.
199
+ bool shutting_down_ = false;
200
+
201
+ // Children.
202
+ std::map<std::string, OrphanablePtr<WeightedChild>> targets_;
203
+ };
204
+
205
+ //
206
+ // WeightedTargetLb::WeightedPicker
207
+ //
208
+
209
+ WeightedTargetLb::PickResult WeightedTargetLb::WeightedPicker::Pick(
210
+ PickArgs args) {
211
+ // Generate a random number in [0, total weight).
212
+ const uint32_t key = rand() % pickers_[pickers_.size() - 1].first;
213
+ // Find the index in pickers_ corresponding to key.
214
+ size_t mid = 0;
215
+ size_t start_index = 0;
216
+ size_t end_index = pickers_.size() - 1;
217
+ size_t index = 0;
218
+ while (end_index > start_index) {
219
+ mid = (start_index + end_index) / 2;
220
+ if (pickers_[mid].first > key) {
221
+ end_index = mid;
222
+ } else if (pickers_[mid].first < key) {
223
+ start_index = mid + 1;
224
+ } else {
225
+ index = mid + 1;
226
+ break;
227
+ }
228
+ }
229
+ if (index == 0) index = start_index;
230
+ GPR_ASSERT(pickers_[index].first > key);
231
+ // Delegate to the child picker.
232
+ return pickers_[index].second->Pick(args);
233
+ }
234
+
235
+ //
236
+ // WeightedTargetLb
237
+ //
238
+
239
+ WeightedTargetLb::WeightedTargetLb(Args args)
240
+ : LoadBalancingPolicy(std::move(args)) {
241
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
242
+ gpr_log(GPR_INFO, "[weighted_target_lb %p] created", this);
243
+ }
244
+ }
245
+
246
+ WeightedTargetLb::~WeightedTargetLb() {
247
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
248
+ gpr_log(GPR_INFO,
249
+ "[weighted_target_lb %p] destroying weighted_target LB policy",
250
+ this);
251
+ }
252
+ }
253
+
254
+ void WeightedTargetLb::ShutdownLocked() {
255
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
256
+ gpr_log(GPR_INFO, "[weighted_target_lb %p] shutting down", this);
257
+ }
258
+ shutting_down_ = true;
259
+ targets_.clear();
260
+ }
261
+
262
+ void WeightedTargetLb::ResetBackoffLocked() {
263
+ for (auto& p : targets_) p.second->ResetBackoffLocked();
264
+ }
265
+
266
+ void WeightedTargetLb::UpdateLocked(UpdateArgs args) {
267
+ if (shutting_down_) return;
268
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
269
+ gpr_log(GPR_INFO, "[weighted_target_lb %p] Received update", this);
270
+ }
271
+ // Update config.
272
+ config_ = std::move(args.config);
273
+ // Deactivate the targets not in the new config.
274
+ for (const auto& p : targets_) {
275
+ const std::string& name = p.first;
276
+ WeightedChild* child = p.second.get();
277
+ if (config_->target_map().find(name) == config_->target_map().end()) {
278
+ child->DeactivateLocked();
279
+ }
280
+ }
281
+ // Create any children that don't already exist.
282
+ // Note that we add all children before updating any of them, because
283
+ // an update may trigger a child to immediately update its
284
+ // connectivity state (e.g., reporting TRANSIENT_FAILURE immediately when
285
+ // receiving an empty address list), and we don't want to return an
286
+ // overall state with incomplete data.
287
+ for (const auto& p : config_->target_map()) {
288
+ const std::string& name = p.first;
289
+ auto it = targets_.find(name);
290
+ if (it == targets_.end()) {
291
+ it = targets_.emplace(std::make_pair(name, nullptr)).first;
292
+ it->second = MakeOrphanable<WeightedChild>(
293
+ Ref(DEBUG_LOCATION, "WeightedChild"), it->first);
294
+ }
295
+ }
296
+ // Update all children.
297
+ HierarchicalAddressMap address_map =
298
+ MakeHierarchicalAddressMap(args.addresses);
299
+ for (const auto& p : config_->target_map()) {
300
+ const std::string& name = p.first;
301
+ const WeightedTargetLbConfig::ChildConfig& config = p.second;
302
+ targets_[name]->UpdateLocked(config, std::move(address_map[name]),
303
+ args.args);
304
+ }
305
+ UpdateStateLocked();
306
+ }
307
+
308
+ void WeightedTargetLb::UpdateStateLocked() {
309
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
310
+ gpr_log(GPR_INFO,
311
+ "[weighted_target_lb %p] scanning children to determine "
312
+ "connectivity state",
313
+ this);
314
+ }
315
+ // Construct a new picker which maintains a map of all child pickers
316
+ // that are ready. Each child is represented by a portion of the range
317
+ // proportional to its weight, such that the total range is the sum of the
318
+ // weights of all children.
319
+ WeightedPicker::PickerList picker_list;
320
+ uint32_t end = 0;
321
+ // Also count the number of children in each state, to determine the
322
+ // overall state.
323
+ size_t num_connecting = 0;
324
+ size_t num_idle = 0;
325
+ size_t num_transient_failures = 0;
326
+ for (const auto& p : targets_) {
327
+ const std::string& child_name = p.first;
328
+ const WeightedChild* child = p.second.get();
329
+ // Skip the targets that are not in the latest update.
330
+ if (config_->target_map().find(child_name) == config_->target_map().end()) {
331
+ continue;
332
+ }
333
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
334
+ gpr_log(GPR_INFO,
335
+ "[weighted_target_lb %p] child=%s state=%s weight=%d picker=%p",
336
+ this, child_name.c_str(),
337
+ ConnectivityStateName(child->connectivity_state()),
338
+ child->weight(), child->picker_wrapper().get());
339
+ }
340
+ switch (child->connectivity_state()) {
341
+ case GRPC_CHANNEL_READY: {
342
+ end += child->weight();
343
+ picker_list.push_back(std::make_pair(end, child->picker_wrapper()));
344
+ break;
345
+ }
346
+ case GRPC_CHANNEL_CONNECTING: {
347
+ ++num_connecting;
348
+ break;
349
+ }
350
+ case GRPC_CHANNEL_IDLE: {
351
+ ++num_idle;
352
+ break;
353
+ }
354
+ case GRPC_CHANNEL_TRANSIENT_FAILURE: {
355
+ ++num_transient_failures;
356
+ break;
357
+ }
358
+ default:
359
+ GPR_UNREACHABLE_CODE(return );
360
+ }
361
+ }
362
+ // Determine aggregated connectivity state.
363
+ grpc_connectivity_state connectivity_state;
364
+ if (!picker_list.empty()) {
365
+ connectivity_state = GRPC_CHANNEL_READY;
366
+ } else if (num_connecting > 0) {
367
+ connectivity_state = GRPC_CHANNEL_CONNECTING;
368
+ } else if (num_idle > 0) {
369
+ connectivity_state = GRPC_CHANNEL_IDLE;
370
+ } else {
371
+ connectivity_state = GRPC_CHANNEL_TRANSIENT_FAILURE;
372
+ }
373
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
374
+ gpr_log(GPR_INFO, "[weighted_target_lb %p] connectivity changed to %s",
375
+ this, ConnectivityStateName(connectivity_state));
376
+ }
377
+ std::unique_ptr<SubchannelPicker> picker;
378
+ switch (connectivity_state) {
379
+ case GRPC_CHANNEL_READY:
380
+ picker = absl::make_unique<WeightedPicker>(std::move(picker_list));
381
+ break;
382
+ case GRPC_CHANNEL_CONNECTING:
383
+ case GRPC_CHANNEL_IDLE:
384
+ picker =
385
+ absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker"));
386
+ break;
387
+ default:
388
+ picker = absl::make_unique<TransientFailurePicker>(
389
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
390
+ "weighted_target: all children report state TRANSIENT_FAILURE"));
391
+ }
392
+ channel_control_helper()->UpdateState(connectivity_state, std::move(picker));
393
+ }
394
+
395
+ //
396
+ // WeightedTargetLb::WeightedChild
397
+ //
398
+
399
+ WeightedTargetLb::WeightedChild::WeightedChild(
400
+ RefCountedPtr<WeightedTargetLb> weighted_target_policy,
401
+ const std::string& name)
402
+ : weighted_target_policy_(std::move(weighted_target_policy)), name_(name) {
403
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
404
+ gpr_log(GPR_INFO, "[weighted_target_lb %p] created WeightedChild %p for %s",
405
+ weighted_target_policy_.get(), this, name_.c_str());
406
+ }
407
+ GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this,
408
+ grpc_schedule_on_exec_ctx);
409
+ }
410
+
411
+ WeightedTargetLb::WeightedChild::~WeightedChild() {
412
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
413
+ gpr_log(GPR_INFO,
414
+ "[weighted_target_lb %p] WeightedChild %p %s: destroying child",
415
+ weighted_target_policy_.get(), this, name_.c_str());
416
+ }
417
+ weighted_target_policy_.reset(DEBUG_LOCATION, "WeightedChild");
418
+ }
419
+
420
+ void WeightedTargetLb::WeightedChild::Orphan() {
421
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
422
+ gpr_log(GPR_INFO,
423
+ "[weighted_target_lb %p] WeightedChild %p %s: shutting down child",
424
+ weighted_target_policy_.get(), this, name_.c_str());
425
+ }
426
+ // Remove the child policy's interested_parties pollset_set from the
427
+ // xDS policy.
428
+ grpc_pollset_set_del_pollset_set(
429
+ child_policy_->interested_parties(),
430
+ weighted_target_policy_->interested_parties());
431
+ child_policy_.reset();
432
+ // Drop our ref to the child's picker, in case it's holding a ref to
433
+ // the child.
434
+ picker_wrapper_.reset();
435
+ if (delayed_removal_timer_callback_pending_) {
436
+ delayed_removal_timer_callback_pending_ = false;
437
+ grpc_timer_cancel(&delayed_removal_timer_);
438
+ }
439
+ shutdown_ = true;
440
+ Unref();
441
+ }
442
+
443
+ OrphanablePtr<LoadBalancingPolicy>
444
+ WeightedTargetLb::WeightedChild::CreateChildPolicyLocked(
445
+ const grpc_channel_args* args) {
446
+ LoadBalancingPolicy::Args lb_policy_args;
447
+ lb_policy_args.work_serializer = weighted_target_policy_->work_serializer();
448
+ lb_policy_args.args = args;
449
+ lb_policy_args.channel_control_helper =
450
+ absl::make_unique<Helper>(this->Ref(DEBUG_LOCATION, "Helper"));
451
+ OrphanablePtr<LoadBalancingPolicy> lb_policy =
452
+ MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
453
+ &grpc_lb_weighted_target_trace);
454
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
455
+ gpr_log(GPR_INFO,
456
+ "[weighted_target_lb %p] WeightedChild %p %s: Created new child "
457
+ "policy handler %p",
458
+ weighted_target_policy_.get(), this, name_.c_str(),
459
+ lb_policy.get());
460
+ }
461
+ // Add the xDS's interested_parties pollset_set to that of the newly created
462
+ // child policy. This will make the child policy progress upon activity on
463
+ // xDS LB, which in turn is tied to the application's call.
464
+ grpc_pollset_set_add_pollset_set(
465
+ lb_policy->interested_parties(),
466
+ weighted_target_policy_->interested_parties());
467
+ return lb_policy;
468
+ }
469
+
470
+ void WeightedTargetLb::WeightedChild::UpdateLocked(
471
+ const WeightedTargetLbConfig::ChildConfig& config,
472
+ ServerAddressList addresses, const grpc_channel_args* args) {
473
+ if (weighted_target_policy_->shutting_down_) return;
474
+ // Update child weight.
475
+ weight_ = config.weight;
476
+ // Reactivate if needed.
477
+ if (delayed_removal_timer_callback_pending_) {
478
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
479
+ gpr_log(GPR_INFO,
480
+ "[weighted_target_lb %p] WeightedChild %p %s: reactivating",
481
+ weighted_target_policy_.get(), this, name_.c_str());
482
+ }
483
+ delayed_removal_timer_callback_pending_ = false;
484
+ grpc_timer_cancel(&delayed_removal_timer_);
485
+ }
486
+ // Create child policy if needed.
487
+ if (child_policy_ == nullptr) {
488
+ child_policy_ = CreateChildPolicyLocked(args);
489
+ }
490
+ // Construct update args.
491
+ UpdateArgs update_args;
492
+ update_args.config = config.config;
493
+ update_args.addresses = std::move(addresses);
494
+ update_args.args = grpc_channel_args_copy(args);
495
+ // Update the policy.
496
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
497
+ gpr_log(GPR_INFO,
498
+ "[weighted_target_lb %p] WeightedChild %p %s: Updating child "
499
+ "policy handler %p",
500
+ weighted_target_policy_.get(), this, name_.c_str(),
501
+ child_policy_.get());
502
+ }
503
+ child_policy_->UpdateLocked(std::move(update_args));
504
+ }
505
+
506
+ void WeightedTargetLb::WeightedChild::ResetBackoffLocked() {
507
+ child_policy_->ResetBackoffLocked();
508
+ }
509
+
510
+ void WeightedTargetLb::WeightedChild::OnConnectivityStateUpdateLocked(
511
+ grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
512
+ // Cache the picker in the WeightedChild.
513
+ picker_wrapper_ = MakeRefCounted<ChildPickerWrapper>(std::move(picker));
514
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
515
+ gpr_log(GPR_INFO,
516
+ "[weighted_target_lb %p] WeightedChild %p %s: connectivity "
517
+ "state update: state=%s picker_wrapper=%p",
518
+ weighted_target_policy_.get(), this, name_.c_str(),
519
+ ConnectivityStateName(state), picker_wrapper_.get());
520
+ }
521
+ // If the child reports IDLE, immediately tell it to exit idle.
522
+ if (state == GRPC_CHANNEL_IDLE) child_policy_->ExitIdleLocked();
523
+ // Decide what state to report for aggregation purposes.
524
+ // If we haven't seen a failure since the last time we were in state
525
+ // READY, then we report the state change as-is. However, once we do see
526
+ // a failure, we report TRANSIENT_FAILURE and ignore any subsequent state
527
+ // changes until we go back into state READY.
528
+ if (!seen_failure_since_ready_) {
529
+ if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
530
+ seen_failure_since_ready_ = true;
531
+ }
532
+ } else {
533
+ if (state != GRPC_CHANNEL_READY) return;
534
+ seen_failure_since_ready_ = false;
535
+ }
536
+ connectivity_state_ = state;
537
+ // Notify the LB policy.
538
+ weighted_target_policy_->UpdateStateLocked();
539
+ }
540
+
541
+ void WeightedTargetLb::WeightedChild::DeactivateLocked() {
542
+ // If already deactivated, don't do that again.
543
+ if (weight_ == 0) return;
544
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
545
+ gpr_log(GPR_INFO,
546
+ "[weighted_target_lb %p] WeightedChild %p %s: deactivating",
547
+ weighted_target_policy_.get(), this, name_.c_str());
548
+ }
549
+ // Set the child weight to 0 so that future picker won't contain this child.
550
+ weight_ = 0;
551
+ // Start a timer to delete the child.
552
+ Ref(DEBUG_LOCATION, "WeightedChild+timer").release();
553
+ delayed_removal_timer_callback_pending_ = true;
554
+ grpc_timer_init(&delayed_removal_timer_,
555
+ ExecCtx::Get()->Now() + kChildRetentionIntervalMs,
556
+ &on_delayed_removal_timer_);
557
+ }
558
+
559
+ void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimer(void* arg,
560
+ grpc_error* error) {
561
+ WeightedChild* self = static_cast<WeightedChild*>(arg);
562
+ GRPC_ERROR_REF(error); // ref owned by lambda
563
+ self->weighted_target_policy_->work_serializer()->Run(
564
+ [self, error]() { self->OnDelayedRemovalTimerLocked(error); },
565
+ DEBUG_LOCATION);
566
+ }
567
+
568
+ void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimerLocked(
569
+ grpc_error* error) {
570
+ if (error == GRPC_ERROR_NONE && delayed_removal_timer_callback_pending_ &&
571
+ !shutdown_ && weight_ == 0) {
572
+ delayed_removal_timer_callback_pending_ = false;
573
+ weighted_target_policy_->targets_.erase(name_);
574
+ }
575
+ Unref(DEBUG_LOCATION, "WeightedChild+timer");
576
+ GRPC_ERROR_UNREF(error);
577
+ }
578
+
579
+ //
580
+ // WeightedTargetLb::WeightedChild::Helper
581
+ //
582
+
583
+ RefCountedPtr<SubchannelInterface>
584
+ WeightedTargetLb::WeightedChild::Helper::CreateSubchannel(
585
+ const grpc_channel_args& args) {
586
+ if (weighted_child_->weighted_target_policy_->shutting_down_) return nullptr;
587
+ return weighted_child_->weighted_target_policy_->channel_control_helper()
588
+ ->CreateSubchannel(args);
589
+ }
590
+
591
+ void WeightedTargetLb::WeightedChild::Helper::UpdateState(
592
+ grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
593
+ if (weighted_child_->weighted_target_policy_->shutting_down_) return;
594
+ weighted_child_->OnConnectivityStateUpdateLocked(state, std::move(picker));
595
+ }
596
+
597
+ void WeightedTargetLb::WeightedChild::Helper::RequestReresolution() {
598
+ if (weighted_child_->weighted_target_policy_->shutting_down_) return;
599
+ weighted_child_->weighted_target_policy_->channel_control_helper()
600
+ ->RequestReresolution();
601
+ }
602
+
603
+ void WeightedTargetLb::WeightedChild::Helper::AddTraceEvent(
604
+ TraceSeverity severity, absl::string_view message) {
605
+ if (weighted_child_->weighted_target_policy_->shutting_down_) return;
606
+ weighted_child_->weighted_target_policy_->channel_control_helper()
607
+ ->AddTraceEvent(severity, message);
608
+ }
609
+
610
+ //
611
+ // factory
612
+ //
613
+
614
+ class WeightedTargetLbFactory : public LoadBalancingPolicyFactory {
615
+ public:
616
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
617
+ LoadBalancingPolicy::Args args) const override {
618
+ return MakeOrphanable<WeightedTargetLb>(std::move(args));
619
+ }
620
+
621
+ const char* name() const override { return kWeightedTarget; }
622
+
623
+ RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
624
+ const Json& json, grpc_error** error) const override {
625
+ GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
626
+ if (json.type() == Json::Type::JSON_NULL) {
627
+ // weighted_target was mentioned as a policy in the deprecated
628
+ // loadBalancingPolicy field or in the client API.
629
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
630
+ "field:loadBalancingPolicy error:weighted_target policy requires "
631
+ "configuration. Please use loadBalancingConfig field of service "
632
+ "config instead.");
633
+ return nullptr;
634
+ }
635
+ std::vector<grpc_error*> error_list;
636
+ // Weight map.
637
+ WeightedTargetLbConfig::TargetMap target_map;
638
+ auto it = json.object_value().find("targets");
639
+ if (it == json.object_value().end()) {
640
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
641
+ "field:targets error:required field not present"));
642
+ } else if (it->second.type() != Json::Type::OBJECT) {
643
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
644
+ "field:targets error:type should be object"));
645
+ } else {
646
+ for (const auto& p : it->second.object_value()) {
647
+ WeightedTargetLbConfig::ChildConfig child_config;
648
+ std::vector<grpc_error*> child_errors =
649
+ ParseChildConfig(p.second, &child_config);
650
+ if (!child_errors.empty()) {
651
+ // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
652
+ // string is not static in this case.
653
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
654
+ absl::StrCat("field:targets key:", p.first).c_str());
655
+ for (grpc_error* child_error : child_errors) {
656
+ error = grpc_error_add_child(error, child_error);
657
+ }
658
+ error_list.push_back(error);
659
+ } else {
660
+ target_map[p.first] = std::move(child_config);
661
+ }
662
+ }
663
+ }
664
+ if (!error_list.empty()) {
665
+ *error = GRPC_ERROR_CREATE_FROM_VECTOR(
666
+ "weighted_target_experimental LB policy config", &error_list);
667
+ return nullptr;
668
+ }
669
+ return MakeRefCounted<WeightedTargetLbConfig>(std::move(target_map));
670
+ }
671
+
672
+ private:
673
+ static std::vector<grpc_error*> ParseChildConfig(
674
+ const Json& json, WeightedTargetLbConfig::ChildConfig* child_config) {
675
+ std::vector<grpc_error*> error_list;
676
+ if (json.type() != Json::Type::OBJECT) {
677
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
678
+ "value should be of type object"));
679
+ return error_list;
680
+ }
681
+ // Weight.
682
+ auto it = json.object_value().find("weight");
683
+ if (it == json.object_value().end()) {
684
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
685
+ "required field \"weight\" not specified"));
686
+ } else if (it->second.type() != Json::Type::NUMBER) {
687
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
688
+ "field:weight error:must be of type number"));
689
+ } else {
690
+ int weight = gpr_parse_nonnegative_int(it->second.string_value().c_str());
691
+ if (weight == -1) {
692
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
693
+ "field:weight error:unparseable value"));
694
+ } else if (weight == 0) {
695
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
696
+ "field:weight error:value must be greater than zero"));
697
+ } else {
698
+ child_config->weight = weight;
699
+ }
700
+ }
701
+ // Child policy.
702
+ it = json.object_value().find("childPolicy");
703
+ if (it != json.object_value().end()) {
704
+ grpc_error* parse_error = GRPC_ERROR_NONE;
705
+ child_config->config =
706
+ LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(it->second,
707
+ &parse_error);
708
+ if (child_config->config == nullptr) {
709
+ GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
710
+ std::vector<grpc_error*> child_errors;
711
+ child_errors.push_back(parse_error);
712
+ error_list.push_back(
713
+ GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors));
714
+ }
715
+ }
716
+ return error_list;
717
+ }
718
+ };
719
+
720
+ } // namespace
721
+
722
+ } // namespace grpc_core
723
+
724
+ //
725
+ // Plugin registration
726
+ //
727
+
728
+ void grpc_lb_policy_weighted_target_init() {
729
+ grpc_core::LoadBalancingPolicyRegistry::Builder::
730
+ RegisterLoadBalancingPolicyFactory(
731
+ absl::make_unique<grpc_core::WeightedTargetLbFactory>());
732
+ }
733
+
734
+ void grpc_lb_policy_weighted_target_shutdown() {}