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
@@ -0,0 +1,89 @@
1
+ //
2
+ // Copyright 2019 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 "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
20
+
21
+ #include "src/core/lib/channel/channel_args.h"
22
+ #include "src/core/lib/gpr/useful.h"
23
+
24
+ // Channel arg key for the list of balancer addresses.
25
+ #define GRPC_ARG_GRPCLB_BALANCER_ADDRESSES "grpc.grpclb_balancer_addresses"
26
+ // Channel arg key for a string indicating an address's balancer name.
27
+ #define GRPC_ARG_ADDRESS_BALANCER_NAME "grpc.address_balancer_name"
28
+
29
+ namespace grpc_core {
30
+
31
+ namespace {
32
+
33
+ void* BalancerAddressesArgCopy(void* p) {
34
+ ServerAddressList* address_list = static_cast<ServerAddressList*>(p);
35
+ return new ServerAddressList(*address_list);
36
+ }
37
+
38
+ void BalancerAddressesArgDestroy(void* p) {
39
+ ServerAddressList* address_list = static_cast<ServerAddressList*>(p);
40
+ delete address_list;
41
+ }
42
+
43
+ int BalancerAddressesArgCmp(void* p, void* q) {
44
+ ServerAddressList* address_list1 = static_cast<ServerAddressList*>(p);
45
+ ServerAddressList* address_list2 = static_cast<ServerAddressList*>(q);
46
+ if (address_list1 == nullptr || address_list2 == nullptr) {
47
+ return GPR_ICMP(address_list1, address_list2);
48
+ }
49
+ if (address_list1->size() > address_list2->size()) return 1;
50
+ if (address_list1->size() < address_list2->size()) return -1;
51
+ for (size_t i = 0; i < address_list1->size(); ++i) {
52
+ int retval = (*address_list1)[i].Cmp((*address_list2)[i]);
53
+ if (retval != 0) return retval;
54
+ }
55
+ return 0;
56
+ }
57
+
58
+ const grpc_arg_pointer_vtable kBalancerAddressesArgVtable = {
59
+ BalancerAddressesArgCopy, BalancerAddressesArgDestroy,
60
+ BalancerAddressesArgCmp};
61
+
62
+ } // namespace
63
+
64
+ grpc_arg CreateGrpclbBalancerAddressesArg(
65
+ const ServerAddressList* address_list) {
66
+ return grpc_channel_arg_pointer_create(
67
+ const_cast<char*>(GRPC_ARG_GRPCLB_BALANCER_ADDRESSES),
68
+ const_cast<ServerAddressList*>(address_list),
69
+ &kBalancerAddressesArgVtable);
70
+ }
71
+
72
+ const ServerAddressList* FindGrpclbBalancerAddressesInChannelArgs(
73
+ const grpc_channel_args& args) {
74
+ return grpc_channel_args_find_pointer<const ServerAddressList>(
75
+ &args, const_cast<char*>(GRPC_ARG_GRPCLB_BALANCER_ADDRESSES));
76
+ }
77
+
78
+ grpc_arg CreateGrpclbBalancerNameArg(const char* balancer_name) {
79
+ return grpc_channel_arg_string_create(
80
+ const_cast<char*>(GRPC_ARG_ADDRESS_BALANCER_NAME),
81
+ const_cast<char*>(balancer_name));
82
+ }
83
+
84
+ const char* FindGrpclbBalancerNameInChannelArgs(const grpc_channel_args& args) {
85
+ return grpc_channel_args_find_string(
86
+ &args, const_cast<char*>(GRPC_ARG_ADDRESS_BALANCER_NAME));
87
+ }
88
+
89
+ } // namespace grpc_core
@@ -0,0 +1,40 @@
1
+ //
2
+ // Copyright 2019 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
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_BALANCER_ADDRESSES_H
18
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_BALANCER_ADDRESSES_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <grpc/impl/codegen/grpc_types.h>
23
+
24
+ #include "src/core/ext/filters/client_channel/server_address.h"
25
+
26
+ namespace grpc_core {
27
+
28
+ grpc_arg CreateGrpclbBalancerAddressesArg(
29
+ const ServerAddressList* address_list);
30
+ const ServerAddressList* FindGrpclbBalancerAddressesInChannelArgs(
31
+ const grpc_channel_args& args);
32
+
33
+ grpc_arg CreateGrpclbBalancerNameArg(const char* balancer_name);
34
+ const char* FindGrpclbBalancerNameInChannelArgs(const grpc_channel_args& args);
35
+
36
+ } // namespace grpc_core
37
+
38
+ #endif /* \
39
+ GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_BALANCER_ADDRESSES_H \
40
+ */
@@ -22,11 +22,14 @@
22
22
 
23
23
  #include <string.h>
24
24
 
25
+ #include "absl/container/inlined_vector.h"
26
+
25
27
  #include <grpc/grpc_security.h>
26
28
  #include <grpc/support/alloc.h>
27
29
  #include <grpc/support/string_util.h>
28
30
 
29
31
  #include "src/core/ext/filters/client_channel/client_channel.h"
32
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
30
33
  #include "src/core/ext/filters/client_channel/server_address.h"
31
34
  #include "src/core/lib/channel/channel_args.h"
32
35
  #include "src/core/lib/gpr/string.h"
@@ -50,13 +53,12 @@ RefCountedPtr CreateTargetAuthorityTable(
50
53
  static_cast<TargetAuthorityTable::Entry*>(
51
54
  gpr_zalloc(sizeof(*target_authority_entries) * addresses.size()));
52
55
  for (size_t i = 0; i < addresses.size(); ++i) {
53
- char* addr_str;
54
- GPR_ASSERT(
55
- grpc_sockaddr_to_string(&addr_str, &addresses[i].address(), true) > 0);
56
- target_authority_entries[i].key = grpc_slice_from_copied_string(addr_str);
57
- gpr_free(addr_str);
58
- char* balancer_name = grpc_channel_arg_get_string(grpc_channel_args_find(
59
- addresses[i].args(), GRPC_ARG_ADDRESS_BALANCER_NAME));
56
+ std::string addr_str =
57
+ grpc_sockaddr_to_string(&addresses[i].address(), true);
58
+ target_authority_entries[i].key =
59
+ grpc_slice_from_copied_string(addr_str.c_str());
60
+ const char* balancer_name =
61
+ FindGrpclbBalancerNameInChannelArgs(*addresses[i].args());
60
62
  target_authority_entries[i].value.reset(gpr_strdup(balancer_name));
61
63
  }
62
64
  RefCountedPtr<TargetAuthorityTable> target_authority_table =
@@ -70,8 +72,8 @@ RefCountedPtr CreateTargetAuthorityTable(
70
72
 
71
73
  grpc_channel_args* ModifyGrpclbBalancerChannelArgs(
72
74
  const ServerAddressList& addresses, grpc_channel_args* args) {
73
- InlinedVector<const char*, 1> args_to_remove;
74
- InlinedVector<grpc_arg, 2> args_to_add;
75
+ absl::InlinedVector<const char*, 1> args_to_remove;
76
+ absl::InlinedVector<grpc_arg, 2> args_to_add;
75
77
  // Add arg for targets info table.
76
78
  RefCountedPtr<TargetAuthorityTable> target_authority_table =
77
79
  CreateTargetAuthorityTable(addresses);
@@ -23,7 +23,8 @@
23
23
 
24
24
  #include <grpc/support/atm.h>
25
25
 
26
- #include "src/core/lib/gprpp/inlined_vector.h"
26
+ #include "absl/container/inlined_vector.h"
27
+
27
28
  #include "src/core/lib/gprpp/memory.h"
28
29
  #include "src/core/lib/gprpp/ref_counted.h"
29
30
  #include "src/core/lib/gprpp/sync.h"
@@ -40,7 +41,7 @@ class GrpcLbClientStats : public RefCounted {
40
41
  : token(std::move(token)), count(count) {}
41
42
  };
42
43
 
43
- typedef InlinedVector<DropTokenCount, 10> DroppedCallCounts;
44
+ typedef absl::InlinedVector<DropTokenCount, 10> DroppedCallCounts;
44
45
 
45
46
  void AddCallStarted();
46
47
  void AddCallFinished(bool finished_with_client_failed_to_send,
@@ -0,0 +1,871 @@
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
+
22
+ #include "absl/strings/str_cat.h"
23
+
24
+ #include <grpc/grpc.h>
25
+
26
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
27
+ #include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
28
+ #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
29
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
30
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
31
+ #include "src/core/lib/channel/channel_args.h"
32
+ #include "src/core/lib/gprpp/orphanable.h"
33
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
34
+ #include "src/core/lib/iomgr/timer.h"
35
+ #include "src/core/lib/iomgr/work_serializer.h"
36
+
37
+ namespace grpc_core {
38
+
39
+ TraceFlag grpc_lb_priority_trace(false, "priority_lb");
40
+
41
+ namespace {
42
+
43
+ constexpr char kPriority[] = "priority_experimental";
44
+
45
+ // How long we keep a child around for after it is no longer being used
46
+ // (either because it has been removed from the config or because we
47
+ // have switched to a higher-priority child).
48
+ constexpr int kChildRetentionIntervalMs = 15 * 60 * 1000;
49
+
50
+ // Default for how long we wait for a newly created child to get connected
51
+ // before starting to attempt the next priority. Overridable via channel arg.
52
+ constexpr int kDefaultChildFailoverTimeoutMs = 10000;
53
+
54
+ // Config for priority LB policy.
55
+ class PriorityLbConfig : public LoadBalancingPolicy::Config {
56
+ public:
57
+ PriorityLbConfig(
58
+ std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>>
59
+ children,
60
+ std::vector<std::string> priorities)
61
+ : children_(std::move(children)), priorities_(std::move(priorities)) {}
62
+
63
+ const char* name() const override { return kPriority; }
64
+
65
+ const std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>>&
66
+ children() const {
67
+ return children_;
68
+ }
69
+ const std::vector<std::string>& priorities() const { return priorities_; }
70
+
71
+ private:
72
+ const std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>>
73
+ children_;
74
+ const std::vector<std::string> priorities_;
75
+ };
76
+
77
+ // priority LB policy.
78
+ class PriorityLb : public LoadBalancingPolicy {
79
+ public:
80
+ explicit PriorityLb(Args args);
81
+
82
+ const char* name() const override { return kPriority; }
83
+
84
+ void UpdateLocked(UpdateArgs args) override;
85
+ void ExitIdleLocked() override;
86
+ void ResetBackoffLocked() override;
87
+
88
+ private:
89
+ // Each ChildPriority holds a ref to the PriorityLb.
90
+ class ChildPriority : public InternallyRefCounted<ChildPriority> {
91
+ public:
92
+ ChildPriority(RefCountedPtr<PriorityLb> priority_policy, std::string name);
93
+
94
+ ~ChildPriority() {
95
+ priority_policy_.reset(DEBUG_LOCATION, "ChildPriority");
96
+ }
97
+
98
+ const std::string& name() const { return name_; }
99
+
100
+ void UpdateLocked(RefCountedPtr<LoadBalancingPolicy::Config> config);
101
+ void ExitIdleLocked();
102
+ void ResetBackoffLocked();
103
+ void DeactivateLocked();
104
+ void MaybeReactivateLocked();
105
+ void MaybeCancelFailoverTimerLocked();
106
+
107
+ void Orphan() override;
108
+
109
+ std::unique_ptr<SubchannelPicker> GetPicker() {
110
+ return absl::make_unique<RefCountedPickerWrapper>(picker_wrapper_);
111
+ }
112
+
113
+ grpc_connectivity_state connectivity_state() const {
114
+ return connectivity_state_;
115
+ }
116
+ bool failover_timer_callback_pending() const {
117
+ return failover_timer_callback_pending_;
118
+ }
119
+
120
+ private:
121
+ // A simple wrapper for ref-counting a picker from the child policy.
122
+ class RefCountedPicker : public RefCounted<RefCountedPicker> {
123
+ public:
124
+ explicit RefCountedPicker(std::unique_ptr<SubchannelPicker> picker)
125
+ : picker_(std::move(picker)) {}
126
+ PickResult Pick(PickArgs args) { return picker_->Pick(args); }
127
+
128
+ private:
129
+ std::unique_ptr<SubchannelPicker> picker_;
130
+ };
131
+
132
+ // A non-ref-counted wrapper for RefCountedPicker.
133
+ class RefCountedPickerWrapper : public SubchannelPicker {
134
+ public:
135
+ explicit RefCountedPickerWrapper(RefCountedPtr<RefCountedPicker> picker)
136
+ : picker_(std::move(picker)) {}
137
+ PickResult Pick(PickArgs args) override { return picker_->Pick(args); }
138
+
139
+ private:
140
+ RefCountedPtr<RefCountedPicker> picker_;
141
+ };
142
+
143
+ class Helper : public ChannelControlHelper {
144
+ public:
145
+ explicit Helper(RefCountedPtr<ChildPriority> priority)
146
+ : priority_(std::move(priority)) {}
147
+
148
+ ~Helper() { priority_.reset(DEBUG_LOCATION, "Helper"); }
149
+
150
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
151
+ const grpc_channel_args& args) override;
152
+ void UpdateState(grpc_connectivity_state state,
153
+ std::unique_ptr<SubchannelPicker> picker) override;
154
+ void RequestReresolution() override;
155
+ void AddTraceEvent(TraceSeverity severity,
156
+ absl::string_view message) override;
157
+
158
+ private:
159
+ RefCountedPtr<ChildPriority> priority_;
160
+ };
161
+
162
+ // Methods for dealing with the child policy.
163
+ OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
164
+ const grpc_channel_args* args);
165
+
166
+ void OnConnectivityStateUpdateLocked(
167
+ grpc_connectivity_state state,
168
+ std::unique_ptr<SubchannelPicker> picker);
169
+
170
+ void StartFailoverTimerLocked();
171
+
172
+ static void OnFailoverTimer(void* arg, grpc_error* error);
173
+ void OnFailoverTimerLocked(grpc_error* error);
174
+ static void OnDeactivationTimer(void* arg, grpc_error* error);
175
+ void OnDeactivationTimerLocked(grpc_error* error);
176
+
177
+ RefCountedPtr<PriorityLb> priority_policy_;
178
+ const std::string name_;
179
+
180
+ OrphanablePtr<LoadBalancingPolicy> child_policy_;
181
+
182
+ grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_CONNECTING;
183
+ RefCountedPtr<RefCountedPicker> picker_wrapper_;
184
+
185
+ // States for delayed removal.
186
+ grpc_timer deactivation_timer_;
187
+ grpc_closure on_deactivation_timer_;
188
+ bool deactivation_timer_callback_pending_ = false;
189
+
190
+ // States of failover.
191
+ grpc_timer failover_timer_;
192
+ grpc_closure on_failover_timer_;
193
+ bool failover_timer_callback_pending_ = false;
194
+ };
195
+
196
+ ~PriorityLb();
197
+
198
+ void ShutdownLocked() override;
199
+
200
+ // Returns UINT32_MAX if child is not in current priority list.
201
+ uint32_t GetChildPriorityLocked(const std::string& child_name) const;
202
+
203
+ void HandleChildConnectivityStateChangeLocked(ChildPriority* child);
204
+ void DeleteChild(ChildPriority* child);
205
+
206
+ void TryNextPriorityLocked(bool report_connecting);
207
+ void SelectPriorityLocked(uint32_t priority);
208
+
209
+ const int child_failover_timeout_ms_;
210
+
211
+ // Current channel args and config from the resolver.
212
+ const grpc_channel_args* args_ = nullptr;
213
+ RefCountedPtr<PriorityLbConfig> config_;
214
+ HierarchicalAddressMap addresses_;
215
+
216
+ // Internal state.
217
+ bool shutting_down_ = false;
218
+
219
+ std::map<std::string, OrphanablePtr<ChildPriority>> children_;
220
+ // The priority that is being used.
221
+ uint32_t current_priority_ = UINT32_MAX;
222
+ // Points to the current child from before the most recent update.
223
+ // We will continue to use this child until we decide which of the new
224
+ // children to use.
225
+ ChildPriority* current_child_from_before_update_ = nullptr;
226
+ };
227
+
228
+ //
229
+ // PriorityLb
230
+ //
231
+
232
+ PriorityLb::PriorityLb(Args args)
233
+ : LoadBalancingPolicy(std::move(args)),
234
+ child_failover_timeout_ms_(grpc_channel_args_find_integer(
235
+ args.args, GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS,
236
+ {kDefaultChildFailoverTimeoutMs, 0, INT_MAX})) {
237
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
238
+ gpr_log(GPR_INFO, "[priority_lb %p] created", this);
239
+ }
240
+ }
241
+
242
+ PriorityLb::~PriorityLb() {
243
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
244
+ gpr_log(GPR_INFO, "[priority_lb %p] destroying priority LB policy", this);
245
+ }
246
+ grpc_channel_args_destroy(args_);
247
+ }
248
+
249
+ void PriorityLb::ShutdownLocked() {
250
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
251
+ gpr_log(GPR_INFO, "[priority_lb %p] shutting down", this);
252
+ }
253
+ shutting_down_ = true;
254
+ children_.clear();
255
+ }
256
+
257
+ void PriorityLb::ExitIdleLocked() {
258
+ if (current_priority_ != UINT32_MAX) {
259
+ const std::string& child_name = config_->priorities()[current_priority_];
260
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
261
+ gpr_log(GPR_INFO,
262
+ "[priority_lb %p] exiting IDLE for current priority %d child %s",
263
+ this, current_priority_, child_name.c_str());
264
+ }
265
+ children_[child_name]->ExitIdleLocked();
266
+ }
267
+ }
268
+
269
+ void PriorityLb::ResetBackoffLocked() {
270
+ for (const auto& p : children_) p.second->ResetBackoffLocked();
271
+ }
272
+
273
+ void PriorityLb::UpdateLocked(UpdateArgs args) {
274
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
275
+ gpr_log(GPR_INFO, "[priority_lb %p] received update", this);
276
+ }
277
+ // Save current child.
278
+ if (current_priority_ != UINT32_MAX) {
279
+ const std::string& child_name = config_->priorities()[current_priority_];
280
+ current_child_from_before_update_ = children_[child_name].get();
281
+ // Unset current_priority_, since it was an index into the old
282
+ // config's priority list and may no longer be valid. It will be
283
+ // reset later by TryNextPriorityLocked(), but we unset it here in
284
+ // case updating any of our children triggers a state update.
285
+ current_priority_ = UINT32_MAX;
286
+ }
287
+ // Update config.
288
+ config_ = std::move(args.config);
289
+ // Update args.
290
+ grpc_channel_args_destroy(args_);
291
+ args_ = args.args;
292
+ args.args = nullptr;
293
+ // Update addresses.
294
+ addresses_ = MakeHierarchicalAddressMap(args.addresses);
295
+ // Check all existing children against the new config.
296
+ for (const auto& p : children_) {
297
+ const std::string& child_name = p.first;
298
+ auto& child = p.second;
299
+ auto config_it = config_->children().find(child_name);
300
+ if (config_it == config_->children().end()) {
301
+ // Existing child not found in new config. Deactivate it.
302
+ child->DeactivateLocked();
303
+ } else {
304
+ // Existing child found in new config. Update it.
305
+ child->UpdateLocked(config_it->second);
306
+ }
307
+ }
308
+ // Try to get connected.
309
+ TryNextPriorityLocked(/*report_connecting=*/children_.empty());
310
+ }
311
+
312
+ uint32_t PriorityLb::GetChildPriorityLocked(
313
+ const std::string& child_name) const {
314
+ for (uint32_t priority = 0; priority < config_->priorities().size();
315
+ ++priority) {
316
+ if (config_->priorities()[priority] == child_name) return priority;
317
+ }
318
+ return UINT32_MAX;
319
+ }
320
+
321
+ void PriorityLb::HandleChildConnectivityStateChangeLocked(
322
+ ChildPriority* child) {
323
+ // Special case for the child that was the current child before the
324
+ // most recent update.
325
+ if (child == current_child_from_before_update_) {
326
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
327
+ gpr_log(GPR_INFO,
328
+ "[priority_lb %p] state update for current child from before "
329
+ "config update",
330
+ this);
331
+ }
332
+ if (child->connectivity_state() == GRPC_CHANNEL_READY ||
333
+ child->connectivity_state() == GRPC_CHANNEL_IDLE) {
334
+ // If it's still READY or IDLE, we stick with this child, so pass
335
+ // the new picker up to our parent.
336
+ channel_control_helper()->UpdateState(child->connectivity_state(),
337
+ child->GetPicker());
338
+ } else {
339
+ // If it's no longer READY or IDLE, we should stop using it.
340
+ // We already started trying other priorities as a result of the
341
+ // update, but calling TryNextPriorityLocked() ensures that we will
342
+ // properly select between CONNECTING and TRANSIENT_FAILURE as the
343
+ // new state to report to our parent.
344
+ current_child_from_before_update_ = nullptr;
345
+ TryNextPriorityLocked(/*report_connecting=*/true);
346
+ }
347
+ return;
348
+ }
349
+ // Otherwise, find the child's priority.
350
+ uint32_t child_priority = GetChildPriorityLocked(child->name());
351
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
352
+ gpr_log(GPR_INFO, "[priority_lb %p] state update for priority %d, child %s",
353
+ this, child_priority, child->name().c_str());
354
+ }
355
+ // Ignore priorities not in the current config.
356
+ if (child_priority == UINT32_MAX) return;
357
+ // Ignore lower-than-current priorities.
358
+ if (child_priority > current_priority_) return;
359
+ // If a child reports TRANSIENT_FAILURE, start trying the next priority.
360
+ // Note that even if this is for a higher-than-current priority, we
361
+ // may still need to create some children between this priority and
362
+ // the current one (e.g., if we got an update that inserted new
363
+ // priorities ahead of the current one).
364
+ if (child->connectivity_state() == GRPC_CHANNEL_TRANSIENT_FAILURE) {
365
+ TryNextPriorityLocked(
366
+ /*report_connecting=*/child_priority == current_priority_);
367
+ return;
368
+ }
369
+ // The update is for a higher-than-current priority (or for any
370
+ // priority if we don't have any current priority).
371
+ if (child_priority < current_priority_) {
372
+ // If the child reports READY or IDLE, switch to that priority.
373
+ // Otherwise, ignore the update.
374
+ if (child->connectivity_state() == GRPC_CHANNEL_READY ||
375
+ child->connectivity_state() == GRPC_CHANNEL_IDLE) {
376
+ SelectPriorityLocked(child_priority);
377
+ }
378
+ return;
379
+ }
380
+ // The current priority has returned a new picker, so pass it up to
381
+ // our parent.
382
+ channel_control_helper()->UpdateState(child->connectivity_state(),
383
+ child->GetPicker());
384
+ }
385
+
386
+ void PriorityLb::DeleteChild(ChildPriority* child) {
387
+ // If this was the current child from before the most recent update,
388
+ // stop using it. We already started trying other priorities as a
389
+ // result of the update, but calling TryNextPriorityLocked() ensures that
390
+ // we will properly select between CONNECTING and TRANSIENT_FAILURE as the
391
+ // new state to report to our parent.
392
+ if (current_child_from_before_update_ == child) {
393
+ current_child_from_before_update_ = nullptr;
394
+ TryNextPriorityLocked(/*report_connecting=*/true);
395
+ }
396
+ children_.erase(child->name());
397
+ }
398
+
399
+ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
400
+ for (uint32_t priority = 0; priority < config_->priorities().size();
401
+ ++priority) {
402
+ // If the child for the priority does not exist yet, create it.
403
+ const std::string& child_name = config_->priorities()[priority];
404
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
405
+ gpr_log(GPR_INFO, "[priority_lb %p] trying priority %d, child %s", this,
406
+ priority, child_name.c_str());
407
+ }
408
+ auto& child = children_[child_name];
409
+ if (child == nullptr) {
410
+ if (report_connecting) {
411
+ channel_control_helper()->UpdateState(
412
+ GRPC_CHANNEL_CONNECTING,
413
+ absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker")));
414
+ }
415
+ child = MakeOrphanable<ChildPriority>(
416
+ Ref(DEBUG_LOCATION, "ChildPriority"), child_name);
417
+ child->UpdateLocked(config_->children().find(child_name)->second);
418
+ return;
419
+ }
420
+ // The child already exists.
421
+ child->MaybeReactivateLocked();
422
+ // If the child is in state READY or IDLE, switch to it.
423
+ if (child->connectivity_state() == GRPC_CHANNEL_READY ||
424
+ child->connectivity_state() == GRPC_CHANNEL_IDLE) {
425
+ SelectPriorityLocked(priority);
426
+ return;
427
+ }
428
+ // Child is not READY or IDLE.
429
+ // If its failover timer is still pending, give it time to fire.
430
+ if (child->failover_timer_callback_pending()) {
431
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
432
+ gpr_log(GPR_INFO,
433
+ "[priority_lb %p] priority %d, child %s: child still "
434
+ "attempting to connect, will wait",
435
+ this, priority, child_name.c_str());
436
+ }
437
+ if (report_connecting) {
438
+ channel_control_helper()->UpdateState(
439
+ GRPC_CHANNEL_CONNECTING,
440
+ absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker")));
441
+ }
442
+ return;
443
+ }
444
+ // Child has been failing for a while. Move on to the next priority.
445
+ }
446
+ // If there are no more priorities to try, report TRANSIENT_FAILURE.
447
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
448
+ gpr_log(GPR_INFO,
449
+ "[priority_lb %p] no priority reachable, putting channel in "
450
+ "TRANSIENT_FAILURE",
451
+ this);
452
+ }
453
+ current_priority_ = UINT32_MAX;
454
+ current_child_from_before_update_ = nullptr;
455
+ grpc_error* error = grpc_error_set_int(
456
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready priority"),
457
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
458
+ channel_control_helper()->UpdateState(
459
+ GRPC_CHANNEL_TRANSIENT_FAILURE,
460
+ absl::make_unique<TransientFailurePicker>(error));
461
+ }
462
+
463
+ void PriorityLb::SelectPriorityLocked(uint32_t priority) {
464
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
465
+ gpr_log(GPR_INFO, "[priority_lb %p] selected priority %d, child %s", this,
466
+ priority, config_->priorities()[priority].c_str());
467
+ }
468
+ current_priority_ = priority;
469
+ current_child_from_before_update_ = nullptr;
470
+ // Deactivate lower priorities.
471
+ for (uint32_t p = priority + 1; p < config_->priorities().size(); ++p) {
472
+ const std::string& child_name = config_->priorities()[p];
473
+ auto it = children_.find(child_name);
474
+ if (it != children_.end()) it->second->DeactivateLocked();
475
+ }
476
+ // Update picker.
477
+ auto& child = children_[config_->priorities()[priority]];
478
+ channel_control_helper()->UpdateState(child->connectivity_state(),
479
+ child->GetPicker());
480
+ }
481
+
482
+ //
483
+ // PriorityLb::ChildPriority
484
+ //
485
+
486
+ PriorityLb::ChildPriority::ChildPriority(
487
+ RefCountedPtr<PriorityLb> priority_policy, std::string name)
488
+ : priority_policy_(std::move(priority_policy)), name_(std::move(name)) {
489
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
490
+ gpr_log(GPR_INFO, "[priority_lb %p] creating child %s (%p)",
491
+ priority_policy_.get(), name_.c_str(), this);
492
+ }
493
+ GRPC_CLOSURE_INIT(&on_failover_timer_, OnFailoverTimer, this,
494
+ grpc_schedule_on_exec_ctx);
495
+ GRPC_CLOSURE_INIT(&on_deactivation_timer_, OnDeactivationTimer, this,
496
+ grpc_schedule_on_exec_ctx);
497
+ // Start the failover timer.
498
+ StartFailoverTimerLocked();
499
+ }
500
+
501
+ void PriorityLb::ChildPriority::Orphan() {
502
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
503
+ gpr_log(GPR_INFO, "[priority_lb %p] child %s (%p): orphaned",
504
+ priority_policy_.get(), name_.c_str(), this);
505
+ }
506
+ MaybeCancelFailoverTimerLocked();
507
+ if (deactivation_timer_callback_pending_) {
508
+ grpc_timer_cancel(&deactivation_timer_);
509
+ }
510
+ // Remove the child policy's interested_parties pollset_set from the
511
+ // xDS policy.
512
+ grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
513
+ priority_policy_->interested_parties());
514
+ child_policy_.reset();
515
+ // Drop our ref to the child's picker, in case it's holding a ref to
516
+ // the child.
517
+ picker_wrapper_.reset();
518
+ if (deactivation_timer_callback_pending_) {
519
+ grpc_timer_cancel(&deactivation_timer_);
520
+ }
521
+ Unref(DEBUG_LOCATION, "ChildPriority+Orphan");
522
+ }
523
+
524
+ void PriorityLb::ChildPriority::UpdateLocked(
525
+ RefCountedPtr<LoadBalancingPolicy::Config> config) {
526
+ if (priority_policy_->shutting_down_) return;
527
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
528
+ gpr_log(GPR_INFO, "[priority_lb %p] child %s (%p): start update",
529
+ priority_policy_.get(), name_.c_str(), this);
530
+ }
531
+ // Create policy if needed.
532
+ if (child_policy_ == nullptr) {
533
+ child_policy_ = CreateChildPolicyLocked(priority_policy_->args_);
534
+ }
535
+ // Construct update args.
536
+ UpdateArgs update_args;
537
+ update_args.config = std::move(config);
538
+ update_args.addresses = priority_policy_->addresses_[name_];
539
+ update_args.args = grpc_channel_args_copy(priority_policy_->args_);
540
+ // Update the policy.
541
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
542
+ gpr_log(GPR_INFO,
543
+ "[priority_lb %p] child %s (%p): updating child policy handler %p",
544
+ priority_policy_.get(), name_.c_str(), this, child_policy_.get());
545
+ }
546
+ child_policy_->UpdateLocked(std::move(update_args));
547
+ }
548
+
549
+ OrphanablePtr<LoadBalancingPolicy>
550
+ PriorityLb::ChildPriority::CreateChildPolicyLocked(
551
+ const grpc_channel_args* args) {
552
+ LoadBalancingPolicy::Args lb_policy_args;
553
+ lb_policy_args.work_serializer = priority_policy_->work_serializer();
554
+ lb_policy_args.args = args;
555
+ lb_policy_args.channel_control_helper =
556
+ absl::make_unique<Helper>(this->Ref(DEBUG_LOCATION, "Helper"));
557
+ OrphanablePtr<LoadBalancingPolicy> lb_policy =
558
+ MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
559
+ &grpc_lb_priority_trace);
560
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
561
+ gpr_log(GPR_INFO,
562
+ "[priority_lb %p] child %s (%p): created new child policy "
563
+ "handler %p",
564
+ priority_policy_.get(), name_.c_str(), this, lb_policy.get());
565
+ }
566
+ // Add the parent's interested_parties pollset_set to that of the newly
567
+ // created child policy. This will make the child policy progress upon
568
+ // activity on the parent LB, which in turn is tied to the application's call.
569
+ grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
570
+ priority_policy_->interested_parties());
571
+ return lb_policy;
572
+ }
573
+
574
+ void PriorityLb::ChildPriority::ExitIdleLocked() {
575
+ if (connectivity_state_ == GRPC_CHANNEL_IDLE &&
576
+ !failover_timer_callback_pending_) {
577
+ StartFailoverTimerLocked();
578
+ }
579
+ child_policy_->ExitIdleLocked();
580
+ }
581
+
582
+ void PriorityLb::ChildPriority::ResetBackoffLocked() {
583
+ child_policy_->ResetBackoffLocked();
584
+ }
585
+
586
+ void PriorityLb::ChildPriority::OnConnectivityStateUpdateLocked(
587
+ grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
588
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
589
+ gpr_log(GPR_INFO,
590
+ "[priority_lb %p] child %s (%p): state update: %s, picker %p",
591
+ priority_policy_.get(), name_.c_str(), this,
592
+ ConnectivityStateName(state), picker.get());
593
+ }
594
+ // Store the state and picker.
595
+ connectivity_state_ = state;
596
+ picker_wrapper_ = MakeRefCounted<RefCountedPicker>(std::move(picker));
597
+ // If READY or TRANSIENT_FAILURE, cancel failover timer.
598
+ if (state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
599
+ MaybeCancelFailoverTimerLocked();
600
+ }
601
+ // Notify the parent policy.
602
+ priority_policy_->HandleChildConnectivityStateChangeLocked(this);
603
+ }
604
+
605
+ void PriorityLb::ChildPriority::StartFailoverTimerLocked() {
606
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
607
+ gpr_log(GPR_INFO,
608
+ "[priority_lb %p] child %s (%p): starting failover timer for %d ms",
609
+ priority_policy_.get(), name_.c_str(), this,
610
+ priority_policy_->child_failover_timeout_ms_);
611
+ }
612
+ Ref(DEBUG_LOCATION, "ChildPriority+OnFailoverTimerLocked").release();
613
+ grpc_timer_init(
614
+ &failover_timer_,
615
+ ExecCtx::Get()->Now() + priority_policy_->child_failover_timeout_ms_,
616
+ &on_failover_timer_);
617
+ failover_timer_callback_pending_ = true;
618
+ }
619
+
620
+ void PriorityLb::ChildPriority::MaybeCancelFailoverTimerLocked() {
621
+ if (failover_timer_callback_pending_) {
622
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
623
+ gpr_log(GPR_INFO,
624
+ "[priority_lb %p] child %s (%p): cancelling failover timer",
625
+ priority_policy_.get(), name_.c_str(), this);
626
+ }
627
+ grpc_timer_cancel(&failover_timer_);
628
+ failover_timer_callback_pending_ = false;
629
+ }
630
+ }
631
+
632
+ void PriorityLb::ChildPriority::OnFailoverTimer(void* arg, grpc_error* error) {
633
+ ChildPriority* self = static_cast<ChildPriority*>(arg);
634
+ GRPC_ERROR_REF(error); // ref owned by lambda
635
+ self->priority_policy_->work_serializer()->Run(
636
+ [self, error]() { self->OnFailoverTimerLocked(error); }, DEBUG_LOCATION);
637
+ }
638
+
639
+ void PriorityLb::ChildPriority::OnFailoverTimerLocked(grpc_error* error) {
640
+ if (error == GRPC_ERROR_NONE && failover_timer_callback_pending_ &&
641
+ !priority_policy_->shutting_down_) {
642
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
643
+ gpr_log(GPR_INFO,
644
+ "[priority_lb %p] child %s (%p): failover timer fired, "
645
+ "reporting TRANSIENT_FAILURE",
646
+ priority_policy_.get(), name_.c_str(), this);
647
+ }
648
+ failover_timer_callback_pending_ = false;
649
+ OnConnectivityStateUpdateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE, nullptr);
650
+ }
651
+ Unref(DEBUG_LOCATION, "ChildPriority+OnFailoverTimerLocked");
652
+ GRPC_ERROR_UNREF(error);
653
+ }
654
+
655
+ void PriorityLb::ChildPriority::DeactivateLocked() {
656
+ // If already deactivated, don't do it again.
657
+ if (deactivation_timer_callback_pending_) return;
658
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
659
+ gpr_log(GPR_INFO,
660
+ "[priority_lb %p] child %s (%p): deactivating -- will remove in %d "
661
+ "ms.",
662
+ priority_policy_.get(), name_.c_str(), this,
663
+ kChildRetentionIntervalMs);
664
+ }
665
+ MaybeCancelFailoverTimerLocked();
666
+ // Start a timer to delete the child.
667
+ Ref(DEBUG_LOCATION, "ChildPriority+timer").release();
668
+ grpc_timer_init(&deactivation_timer_,
669
+ ExecCtx::Get()->Now() + kChildRetentionIntervalMs,
670
+ &on_deactivation_timer_);
671
+ deactivation_timer_callback_pending_ = true;
672
+ }
673
+
674
+ void PriorityLb::ChildPriority::MaybeReactivateLocked() {
675
+ if (deactivation_timer_callback_pending_) {
676
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
677
+ gpr_log(GPR_INFO, "[priority_lb %p] child %s (%p): reactivating",
678
+ priority_policy_.get(), name_.c_str(), this);
679
+ }
680
+ deactivation_timer_callback_pending_ = false;
681
+ grpc_timer_cancel(&deactivation_timer_);
682
+ }
683
+ }
684
+
685
+ void PriorityLb::ChildPriority::OnDeactivationTimer(void* arg,
686
+ grpc_error* error) {
687
+ ChildPriority* self = static_cast<ChildPriority*>(arg);
688
+ GRPC_ERROR_REF(error); // ref owned by lambda
689
+ self->priority_policy_->work_serializer()->Run(
690
+ [self, error]() { self->OnDeactivationTimerLocked(error); },
691
+ DEBUG_LOCATION);
692
+ }
693
+
694
+ void PriorityLb::ChildPriority::OnDeactivationTimerLocked(grpc_error* error) {
695
+ if (error == GRPC_ERROR_NONE && deactivation_timer_callback_pending_ &&
696
+ !priority_policy_->shutting_down_) {
697
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
698
+ gpr_log(GPR_INFO,
699
+ "[priority_lb %p] child %s (%p): deactivation timer fired, "
700
+ "deleting child",
701
+ priority_policy_.get(), name_.c_str(), this);
702
+ }
703
+ deactivation_timer_callback_pending_ = false;
704
+ priority_policy_->DeleteChild(this);
705
+ }
706
+ Unref(DEBUG_LOCATION, "ChildPriority+timer");
707
+ GRPC_ERROR_UNREF(error);
708
+ }
709
+
710
+ //
711
+ // PriorityLb::ChildPriority::Helper
712
+ //
713
+
714
+ void PriorityLb::ChildPriority::Helper::RequestReresolution() {
715
+ if (priority_->priority_policy_->shutting_down_) return;
716
+ priority_->priority_policy_->channel_control_helper()->RequestReresolution();
717
+ }
718
+
719
+ RefCountedPtr<SubchannelInterface>
720
+ PriorityLb::ChildPriority::Helper::CreateSubchannel(
721
+ const grpc_channel_args& args) {
722
+ if (priority_->priority_policy_->shutting_down_) return nullptr;
723
+ return priority_->priority_policy_->channel_control_helper()
724
+ ->CreateSubchannel(args);
725
+ }
726
+
727
+ void PriorityLb::ChildPriority::Helper::UpdateState(
728
+ grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
729
+ if (priority_->priority_policy_->shutting_down_) return;
730
+ // Notify the priority.
731
+ priority_->OnConnectivityStateUpdateLocked(state, std::move(picker));
732
+ }
733
+
734
+ void PriorityLb::ChildPriority::Helper::AddTraceEvent(
735
+ TraceSeverity severity, absl::string_view message) {
736
+ if (priority_->priority_policy_->shutting_down_) return;
737
+ priority_->priority_policy_->channel_control_helper()->AddTraceEvent(severity,
738
+ message);
739
+ }
740
+
741
+ //
742
+ // factory
743
+ //
744
+
745
+ class PriorityLbFactory : public LoadBalancingPolicyFactory {
746
+ public:
747
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
748
+ LoadBalancingPolicy::Args args) const override {
749
+ return MakeOrphanable<PriorityLb>(std::move(args));
750
+ }
751
+
752
+ const char* name() const override { return kPriority; }
753
+
754
+ RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
755
+ const Json& json, grpc_error** error) const override {
756
+ GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
757
+ if (json.type() == Json::Type::JSON_NULL) {
758
+ // priority was mentioned as a policy in the deprecated
759
+ // loadBalancingPolicy field or in the client API.
760
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
761
+ "field:loadBalancingPolicy error:priority policy requires "
762
+ "configuration. Please use loadBalancingConfig field of service "
763
+ "config instead.");
764
+ return nullptr;
765
+ }
766
+ std::vector<grpc_error*> error_list;
767
+ // Children.
768
+ std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>> children;
769
+ auto it = json.object_value().find("children");
770
+ if (it == json.object_value().end()) {
771
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
772
+ "field:children error:required field missing"));
773
+ } else if (it->second.type() != Json::Type::OBJECT) {
774
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
775
+ "field:children error:type should be object"));
776
+ } else {
777
+ const Json::Object& object = it->second.object_value();
778
+ for (const auto& p : object) {
779
+ const std::string& child_name = p.first;
780
+ const Json& element = p.second;
781
+ if (element.type() != Json::Type::OBJECT) {
782
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
783
+ absl::StrCat("field:children key:", child_name,
784
+ " error:should be type object")
785
+ .c_str()));
786
+ } else {
787
+ auto it2 = element.object_value().find("config");
788
+ if (it2 == element.object_value().end()) {
789
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
790
+ absl::StrCat("field:children key:", child_name,
791
+ " error:missing 'config' field")
792
+ .c_str()));
793
+ } else {
794
+ grpc_error* parse_error = GRPC_ERROR_NONE;
795
+ auto config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
796
+ it2->second, &parse_error);
797
+ if (config == nullptr) {
798
+ GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
799
+ error_list.push_back(
800
+ GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(
801
+ absl::StrCat("field:children key:", child_name).c_str(),
802
+ &parse_error, 1));
803
+ GRPC_ERROR_UNREF(parse_error);
804
+ }
805
+ children[child_name] = std::move(config);
806
+ }
807
+ }
808
+ }
809
+ }
810
+ // Priorities.
811
+ std::vector<std::string> priorities;
812
+ it = json.object_value().find("priorities");
813
+ if (it == json.object_value().end()) {
814
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
815
+ "field:priorities error:required field missing"));
816
+ } else if (it->second.type() != Json::Type::ARRAY) {
817
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
818
+ "field:priorities error:type should be array"));
819
+ } else {
820
+ const Json::Array& array = it->second.array_value();
821
+ for (size_t i = 0; i < array.size(); ++i) {
822
+ const Json& element = array[i];
823
+ if (element.type() != Json::Type::STRING) {
824
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
825
+ absl::StrCat("field:priorities element:", i,
826
+ " error:should be type string")
827
+ .c_str()));
828
+ } else if (children.find(element.string_value()) == children.end()) {
829
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
830
+ absl::StrCat("field:priorities element:", i,
831
+ " error:unknown child '", element.string_value(),
832
+ "'")
833
+ .c_str()));
834
+ } else {
835
+ priorities.emplace_back(element.string_value());
836
+ }
837
+ }
838
+ if (priorities.size() != children.size()) {
839
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
840
+ absl::StrCat("field:priorities error:priorities size (",
841
+ priorities.size(), ") != children size (",
842
+ children.size(), ")")
843
+ .c_str()));
844
+ }
845
+ }
846
+ if (error_list.empty()) {
847
+ return MakeRefCounted<PriorityLbConfig>(std::move(children),
848
+ std::move(priorities));
849
+ } else {
850
+ *error = GRPC_ERROR_CREATE_FROM_VECTOR(
851
+ "priority_experimental LB policy config", &error_list);
852
+ return nullptr;
853
+ }
854
+ }
855
+ };
856
+
857
+ } // namespace
858
+
859
+ } // namespace grpc_core
860
+
861
+ //
862
+ // Plugin registration
863
+ //
864
+
865
+ void grpc_lb_policy_priority_init() {
866
+ grpc_core::LoadBalancingPolicyRegistry::Builder::
867
+ RegisterLoadBalancingPolicyFactory(
868
+ absl::make_unique<grpc_core::PriorityLbFactory>());
869
+ }
870
+
871
+ void grpc_lb_policy_priority_shutdown() {}