grpc 1.28.0.pre2 → 1.31.0.pre1

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 (660) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +8313 -11862
  3. data/include/grpc/grpc.h +2 -2
  4. data/include/grpc/grpc_security.h +30 -9
  5. data/include/grpc/grpc_security_constants.h +4 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +23 -23
  7. data/include/grpc/impl/codegen/port_platform.h +6 -34
  8. data/include/grpc/module.modulemap +24 -39
  9. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -12
  10. data/src/core/ext/filters/client_channel/client_channel.cc +618 -482
  11. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  12. data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
  13. data/src/core/ext/filters/client_channel/config_selector.h +93 -0
  14. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
  15. data/src/core/ext/filters/client_channel/health/health_check_client.cc +9 -22
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
  18. data/src/core/ext/filters/client_channel/http_proxy.cc +23 -14
  19. data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
  20. data/src/core/ext/filters/client_channel/lb_policy.h +44 -33
  21. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +297 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +83 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +311 -497
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  30. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +9 -17
  33. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +117 -41
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +1142 -0
  39. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +10 -7
  40. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  41. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  42. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  43. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +78 -61
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +41 -40
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +22 -24
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +12 -10
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +79 -122
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +199 -163
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  53. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +46 -45
  54. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +64 -12
  58. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  59. data/src/core/ext/filters/client_channel/resolver_registry.cc +19 -17
  60. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +21 -22
  62. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
  63. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +73 -217
  64. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +45 -27
  65. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  66. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  67. data/src/core/ext/filters/client_channel/service_config.cc +104 -144
  68. data/src/core/ext/filters/client_channel/service_config.h +28 -98
  69. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  70. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  71. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  72. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  73. data/src/core/ext/filters/client_channel/subchannel.cc +55 -25
  74. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  75. data/src/core/ext/filters/client_channel/xds/xds_api.cc +1200 -246
  76. data/src/core/ext/filters/client_channel/xds/xds_api.h +130 -44
  77. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +90 -29
  78. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +9 -4
  79. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
  80. data/src/core/ext/filters/client_channel/xds/xds_client.cc +839 -431
  81. data/src/core/ext/filters/client_channel/xds/xds_client.h +84 -33
  82. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
  83. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +40 -28
  84. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -33
  85. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  86. data/src/core/ext/filters/http/http_filters_plugin.cc +28 -12
  87. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  88. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +399 -0
  89. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +31 -0
  90. data/src/core/ext/filters/message_size/message_size_filter.cc +61 -88
  91. data/src/core/ext/filters/message_size/message_size_filter.h +10 -4
  92. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +386 -350
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
  94. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
  96. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
  97. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +42 -26
  99. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  100. data/src/core/ext/transport/chttp2/transport/flow_control.cc +25 -30
  101. data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
  102. data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
  103. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
  104. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  105. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  106. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  107. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
  108. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  109. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  111. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
  112. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  114. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  119. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  120. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  121. data/src/core/ext/transport/chttp2/transport/internal.h +27 -21
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
  123. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  124. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -22
  125. data/src/core/ext/transport/inproc/inproc_transport.cc +54 -15
  126. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
  127. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
  128. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
  129. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -876
  130. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  131. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +429 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  133. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +198 -0
  134. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +388 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
  137. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
  138. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +23 -10
  139. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +352 -310
  140. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
  141. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +42 -34
  142. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +7 -7
  144. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  145. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +79 -61
  146. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
  147. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +55 -49
  148. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +79 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +48 -27
  151. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +258 -214
  152. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
  153. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +51 -45
  154. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +71 -0
  156. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
  157. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +107 -100
  158. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
  159. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +157 -122
  160. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  161. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +9 -9
  162. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
  163. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +173 -73
  164. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  165. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +88 -0
  166. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +2 -1
  167. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
  168. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
  169. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
  170. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +2 -1
  171. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
  172. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
  173. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -1
  174. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
  175. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +53 -38
  176. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  177. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +70 -62
  178. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
  179. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
  180. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
  181. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +95 -63
  182. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
  183. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -1
  184. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +3 -2
  185. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
  186. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
  187. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +9 -10
  188. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
  189. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
  190. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
  191. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
  192. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
  193. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -1
  194. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +68 -46
  195. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +770 -722
  196. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
  197. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
  198. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
  199. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
  200. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +2 -1
  201. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
  202. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
  203. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +305 -210
  204. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
  205. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
  206. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  207. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  208. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  209. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +1 -2
  210. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  211. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +22 -16
  212. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  213. data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
  214. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
  215. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +48 -11
  216. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
  217. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
  218. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
  219. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
  220. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  221. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
  222. data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
  223. data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
  224. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
  225. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
  226. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
  227. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
  228. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
  229. data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
  230. data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
  231. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
  232. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +12 -11
  233. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +421 -389
  234. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
  235. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
  236. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
  237. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
  238. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
  239. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
  240. data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
  244. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
  245. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
  246. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
  247. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
  248. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
  249. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
  250. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  251. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +64 -0
  252. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
  253. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
  254. data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
  255. data/src/core/ext/upb-generated/validate/validate.upb.h +569 -562
  256. data/src/core/lib/channel/channel_args.cc +15 -14
  257. data/src/core/lib/channel/channel_args.h +3 -1
  258. data/src/core/lib/channel/channel_stack.h +20 -13
  259. data/src/core/lib/channel/channel_trace.cc +2 -6
  260. data/src/core/lib/channel/channelz.cc +10 -21
  261. data/src/core/lib/channel/channelz.h +3 -2
  262. data/src/core/lib/channel/channelz_registry.cc +5 -3
  263. data/src/core/lib/channel/connected_channel.cc +7 -5
  264. data/src/core/lib/channel/context.h +1 -1
  265. data/src/core/lib/channel/handshaker.cc +11 -13
  266. data/src/core/lib/channel/handshaker.h +4 -2
  267. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  268. data/src/core/lib/channel/status_util.cc +2 -3
  269. data/src/core/lib/compression/message_compress.cc +5 -1
  270. data/src/core/lib/debug/stats.cc +21 -27
  271. data/src/core/lib/debug/stats.h +3 -1
  272. data/src/core/lib/gpr/log_linux.cc +6 -8
  273. data/src/core/lib/gpr/log_posix.cc +6 -8
  274. data/src/core/lib/gpr/spinlock.h +2 -3
  275. data/src/core/lib/gpr/string.cc +10 -33
  276. data/src/core/lib/gpr/string.h +4 -18
  277. data/src/core/lib/gpr/sync_abseil.cc +2 -0
  278. data/src/core/lib/gpr/time.cc +4 -0
  279. data/src/core/lib/gpr/time_posix.cc +1 -1
  280. data/src/core/lib/gprpp/atomic.h +6 -6
  281. data/src/core/lib/gprpp/fork.cc +1 -1
  282. data/src/core/lib/gprpp/global_config_env.cc +8 -6
  283. data/src/core/lib/gprpp/host_port.cc +29 -35
  284. data/src/core/lib/gprpp/host_port.h +14 -17
  285. data/src/core/lib/gprpp/map.h +5 -11
  286. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  287. data/src/core/lib/gprpp/sync.h +9 -0
  288. data/src/core/lib/http/format_request.cc +46 -65
  289. data/src/core/lib/http/httpcli.cc +15 -13
  290. data/src/core/lib/http/httpcli.h +2 -3
  291. data/src/core/lib/http/httpcli_security_connector.cc +10 -10
  292. data/src/core/lib/http/parser.h +2 -3
  293. data/src/core/lib/iomgr/buffer_list.h +22 -21
  294. data/src/core/lib/iomgr/call_combiner.h +3 -2
  295. data/src/core/lib/iomgr/cfstream_handle.cc +4 -2
  296. data/src/core/lib/iomgr/closure.h +2 -3
  297. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  298. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  299. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  300. data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
  301. data/src/core/lib/iomgr/error.cc +6 -9
  302. data/src/core/lib/iomgr/error.h +0 -1
  303. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  304. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  305. data/src/core/lib/iomgr/ev_apple.h +43 -0
  306. data/src/core/lib/iomgr/ev_epoll1_linux.cc +25 -29
  307. data/src/core/lib/iomgr/ev_epollex_linux.cc +17 -24
  308. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -8
  309. data/src/core/lib/iomgr/ev_posix.cc +4 -3
  310. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  311. data/src/core/lib/iomgr/iomgr.cc +10 -0
  312. data/src/core/lib/iomgr/iomgr.h +10 -0
  313. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  314. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  315. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  316. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  317. data/src/core/lib/iomgr/port.h +2 -21
  318. data/src/core/lib/iomgr/python_util.h +46 -0
  319. data/src/core/lib/iomgr/resolve_address.h +4 -6
  320. data/src/core/lib/iomgr/resolve_address_custom.cc +42 -57
  321. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  322. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  323. data/src/core/lib/iomgr/resolve_address_windows.cc +16 -25
  324. data/src/core/lib/iomgr/resource_quota.cc +38 -37
  325. data/src/core/lib/iomgr/sockaddr_utils.cc +29 -33
  326. data/src/core/lib/iomgr/sockaddr_utils.h +10 -15
  327. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  328. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  329. data/src/core/lib/iomgr/socket_utils_common_posix.cc +102 -81
  330. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  331. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  332. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -18
  333. data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
  334. data/src/core/lib/iomgr/tcp_client_posix.cc +30 -36
  335. data/src/core/lib/iomgr/tcp_client_windows.cc +10 -11
  336. data/src/core/lib/iomgr/tcp_custom.cc +3 -4
  337. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  338. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  339. data/src/core/lib/iomgr/tcp_server.h +7 -5
  340. data/src/core/lib/iomgr/tcp_server_custom.cc +11 -23
  341. data/src/core/lib/iomgr/tcp_server_posix.cc +38 -44
  342. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
  343. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -8
  344. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +10 -18
  345. data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
  346. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  347. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  348. data/src/core/lib/iomgr/timer_generic.cc +15 -15
  349. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  350. data/src/core/lib/iomgr/timer_heap.h +2 -3
  351. data/src/core/lib/iomgr/udp_server.cc +32 -36
  352. data/src/core/lib/iomgr/udp_server.h +5 -2
  353. data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
  354. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  355. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
  356. data/src/core/lib/json/json.h +3 -2
  357. data/src/core/lib/json/json_reader.cc +25 -26
  358. data/src/core/lib/json/json_writer.cc +13 -12
  359. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  360. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  361. data/src/core/lib/security/credentials/credentials.cc +0 -84
  362. data/src/core/lib/security/credentials/credentials.h +13 -62
  363. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  364. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  365. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -17
  366. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  367. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  368. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  369. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  370. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
  371. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  372. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
  373. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  374. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +73 -54
  375. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
  376. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +19 -6
  377. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  378. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
  379. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
  380. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
  381. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +48 -11
  382. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
  383. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -17
  384. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  385. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  386. data/src/core/lib/security/security_connector/security_connector.cc +2 -0
  387. data/src/core/lib/security/security_connector/security_connector.h +2 -2
  388. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +38 -36
  389. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +8 -5
  390. data/src/core/lib/security/security_connector/ssl_utils.cc +89 -21
  391. data/src/core/lib/security/security_connector/ssl_utils.h +18 -12
  392. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +101 -72
  393. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
  394. data/src/core/lib/security/transport/auth_filters.h +0 -5
  395. data/src/core/lib/security/transport/client_auth_filter.cc +11 -11
  396. data/src/core/lib/security/util/json_util.cc +12 -13
  397. data/src/core/lib/slice/slice.cc +38 -1
  398. data/src/core/lib/slice/slice_intern.cc +2 -3
  399. data/src/core/lib/slice/slice_internal.h +15 -0
  400. data/src/core/lib/slice/slice_utils.h +9 -0
  401. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  402. data/src/core/lib/surface/call.cc +42 -44
  403. data/src/core/lib/surface/call_log_batch.cc +50 -58
  404. data/src/core/lib/surface/channel.cc +53 -31
  405. data/src/core/lib/surface/channel.h +35 -4
  406. data/src/core/lib/surface/channel_ping.cc +2 -3
  407. data/src/core/lib/surface/completion_queue.cc +304 -47
  408. data/src/core/lib/surface/completion_queue.h +8 -0
  409. data/src/core/lib/surface/event_string.cc +18 -25
  410. data/src/core/lib/surface/event_string.h +3 -1
  411. data/src/core/lib/surface/init.cc +2 -0
  412. data/src/core/lib/surface/init_secure.cc +1 -4
  413. data/src/core/lib/surface/server.cc +971 -837
  414. data/src/core/lib/surface/server.h +66 -12
  415. data/src/core/lib/surface/version.cc +2 -2
  416. data/src/core/lib/transport/byte_stream.h +7 -2
  417. data/src/core/lib/transport/connectivity_state.cc +7 -6
  418. data/src/core/lib/transport/connectivity_state.h +5 -3
  419. data/src/core/lib/transport/metadata.cc +3 -3
  420. data/src/core/lib/transport/metadata_batch.h +2 -3
  421. data/src/core/lib/transport/static_metadata.h +1 -1
  422. data/src/core/lib/transport/status_conversion.cc +6 -14
  423. data/src/core/lib/transport/transport.cc +2 -3
  424. data/src/core/lib/transport/transport.h +9 -2
  425. data/src/core/lib/transport/transport_op_string.cc +61 -102
  426. data/src/core/lib/uri/uri_parser.cc +8 -15
  427. data/src/core/lib/uri/uri_parser.h +2 -3
  428. data/src/core/plugin_registry/grpc_plugin_registry.cc +24 -4
  429. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  430. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +31 -14
  431. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  432. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +34 -2
  433. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  434. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
  435. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  436. data/src/core/tsi/fake_transport_security.cc +10 -15
  437. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  438. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  439. data/src/core/tsi/ssl_transport_security.cc +154 -50
  440. data/src/core/tsi/ssl_transport_security.h +22 -10
  441. data/src/core/tsi/ssl_types.h +0 -2
  442. data/src/core/tsi/transport_security.h +6 -9
  443. data/src/core/tsi/transport_security_grpc.h +2 -3
  444. data/src/core/tsi/transport_security_interface.h +8 -3
  445. data/src/ruby/ext/grpc/extconf.rb +5 -2
  446. data/src/ruby/ext/grpc/rb_call.c +12 -3
  447. data/src/ruby/ext/grpc/rb_call.h +4 -0
  448. data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
  449. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  450. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  451. data/src/ruby/lib/grpc/errors.rb +103 -42
  452. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  453. data/src/ruby/lib/grpc/generic/interceptors.rb +5 -5
  454. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  455. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  456. data/src/ruby/lib/grpc/structs.rb +1 -1
  457. data/src/ruby/lib/grpc/version.rb +1 -1
  458. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  459. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
  460. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  461. data/src/ruby/spec/debug_message_spec.rb +134 -0
  462. data/src/ruby/spec/generic/service_spec.rb +2 -0
  463. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  464. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
  465. data/src/ruby/spec/pb/codegen/package_option_spec.rb +7 -1
  466. data/src/ruby/spec/support/services.rb +10 -4
  467. data/src/ruby/spec/testdata/ca.pem +18 -13
  468. data/src/ruby/spec/testdata/client.key +26 -14
  469. data/src/ruby/spec/testdata/client.pem +18 -12
  470. data/src/ruby/spec/testdata/server1.key +26 -14
  471. data/src/ruby/spec/testdata/server1.pem +20 -14
  472. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  473. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  474. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  475. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  476. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  477. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  478. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  481. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  482. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  483. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  484. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  485. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  486. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  487. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  488. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  489. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  490. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  491. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  492. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  493. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  494. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  495. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  496. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  497. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  498. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  499. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  500. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  501. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  502. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  503. data/third_party/boringssl-with-bazel/err_data.c +335 -297
  504. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  505. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
  506. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
  507. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
  508. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  509. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  510. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
  511. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
  512. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
  513. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
  514. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  515. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  516. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
  517. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
  518. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  519. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  520. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  521. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  522. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  523. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  524. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
  525. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
  526. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +385 -0
  527. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +56 -0
  528. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  529. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  530. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +143 -0
  531. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  532. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  533. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
  534. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  535. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +25 -12
  536. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  537. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  538. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  539. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
  540. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
  541. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  542. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  543. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +434 -161
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  545. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +18 -25
  546. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  547. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +104 -122
  548. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +740 -0
  549. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  550. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  551. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  552. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  553. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  554. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  555. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  556. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  557. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  558. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  559. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  560. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
  561. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
  562. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
  563. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  564. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
  565. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
  566. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
  567. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
  568. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  569. data/third_party/boringssl-with-bazel/src/crypto/mem.c +47 -16
  570. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  571. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
  572. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
  573. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  574. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  576. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  577. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +249 -0
  578. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1227 -0
  579. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +682 -0
  580. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
  581. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
  582. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
  583. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  584. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
  585. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
  586. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +57 -0
  587. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
  588. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +33 -9
  589. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
  590. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
  591. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
  592. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
  593. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
  594. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
  595. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
  596. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  597. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
  598. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +6 -2
  599. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
  600. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
  601. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  602. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  603. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  604. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  605. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
  606. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  607. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
  608. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  609. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  610. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +191 -79
  611. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  612. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +282 -0
  613. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +791 -715
  614. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  615. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  616. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  617. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  618. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
  619. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +23 -5
  620. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +30 -22
  621. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +21 -4
  622. data/third_party/boringssl-with-bazel/src/ssl/internal.h +74 -54
  623. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  624. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  625. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  626. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
  627. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
  628. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +34 -1
  629. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  630. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +44 -5
  631. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  632. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
  633. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +51 -26
  634. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
  635. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
  636. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +129 -48
  637. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
  638. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +55 -22
  639. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  640. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  641. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  642. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  643. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  644. data/third_party/upb/upb/decode.c +467 -504
  645. data/third_party/upb/upb/encode.c +163 -121
  646. data/third_party/upb/upb/msg.c +130 -64
  647. data/third_party/upb/upb/msg.h +418 -14
  648. data/third_party/upb/upb/port_def.inc +35 -6
  649. data/third_party/upb/upb/port_undef.inc +8 -1
  650. data/third_party/upb/upb/table.c +53 -75
  651. data/third_party/upb/upb/table.int.h +11 -43
  652. data/third_party/upb/upb/upb.c +148 -124
  653. data/third_party/upb/upb/upb.h +65 -147
  654. data/third_party/upb/upb/upb.hpp +86 -0
  655. metadata +122 -41
  656. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1908
  657. data/src/core/lib/gprpp/string_view.h +0 -60
  658. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  659. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
  660. data/third_party/upb/upb/generated_util.h +0 -105
@@ -0,0 +1,83 @@
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
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_CHILD_POLICY_HANDLER_H
18
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_CHILD_POLICY_HANDLER_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
23
+ #include "src/core/lib/debug/trace.h"
24
+ #include "src/core/lib/gprpp/orphanable.h"
25
+
26
+ namespace grpc_core {
27
+
28
+ // A class that makes it easy to gracefully switch child policies.
29
+ //
30
+ // Callers should instantiate this instead of using
31
+ // LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(). Once
32
+ // instantiated, this object will automatically take care of
33
+ // constructing the child policy as needed upon receiving an update.
34
+ class ChildPolicyHandler : public LoadBalancingPolicy {
35
+ public:
36
+ ChildPolicyHandler(Args args, TraceFlag* tracer)
37
+ : LoadBalancingPolicy(std::move(args)), tracer_(tracer) {}
38
+
39
+ virtual const char* name() const override { return "child_policy_handler"; }
40
+
41
+ void UpdateLocked(UpdateArgs args) override;
42
+ void ExitIdleLocked() override;
43
+ void ResetBackoffLocked() override;
44
+
45
+ // Returns true if transitioning from the old config to the new config
46
+ // requires instantiating a new policy object.
47
+ virtual bool ConfigChangeRequiresNewPolicyInstance(
48
+ LoadBalancingPolicy::Config* old_config,
49
+ LoadBalancingPolicy::Config* new_config) const;
50
+
51
+ // Instantiates a new policy of the specified name.
52
+ // May be overridden by subclasses to avoid recursion when an LB
53
+ // policy factory returns a ChildPolicyHandler.
54
+ virtual OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
55
+ const char* name, LoadBalancingPolicy::Args args) const;
56
+
57
+ private:
58
+ class Helper;
59
+
60
+ void ShutdownLocked() override;
61
+
62
+ OrphanablePtr<LoadBalancingPolicy> CreateChildPolicy(
63
+ const char* child_policy_name, const grpc_channel_args& args);
64
+
65
+ // Passed in from caller at construction time.
66
+ TraceFlag* tracer_;
67
+
68
+ bool shutting_down_ = false;
69
+
70
+ // The most recent config passed to UpdateLocked().
71
+ // If pending_child_policy_ is non-null, this is the config passed to
72
+ // pending_child_policy_; otherwise, it's the config passed to child_policy_.
73
+ RefCountedPtr<LoadBalancingPolicy::Config> current_config_;
74
+
75
+ // Child LB policy.
76
+ OrphanablePtr<LoadBalancingPolicy> child_policy_;
77
+ OrphanablePtr<LoadBalancingPolicy> pending_child_policy_;
78
+ };
79
+
80
+ } // namespace grpc_core
81
+
82
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_CHILD_POLICY_HANDLER_H \
83
+ */
@@ -64,6 +64,13 @@
64
64
  #include <limits.h>
65
65
  #include <string.h>
66
66
 
67
+ #include "absl/container/inlined_vector.h"
68
+ #include "absl/strings/str_cat.h"
69
+ #include "absl/strings/str_format.h"
70
+ #include "absl/strings/str_join.h"
71
+
72
+ #include "upb/upb.hpp"
73
+
67
74
  #include <grpc/byte_buffer_reader.h>
68
75
  #include <grpc/grpc.h>
69
76
  #include <grpc/support/alloc.h>
@@ -71,8 +78,10 @@
71
78
  #include <grpc/support/time.h>
72
79
 
73
80
  #include "src/core/ext/filters/client_channel/client_channel.h"
81
+ #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
74
82
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h"
75
83
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h"
84
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
76
85
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h"
77
86
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
78
87
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h"
@@ -89,7 +98,6 @@
89
98
  #include "src/core/lib/gprpp/memory.h"
90
99
  #include "src/core/lib/gprpp/orphanable.h"
91
100
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
92
- #include "src/core/lib/iomgr/combiner.h"
93
101
  #include "src/core/lib/iomgr/sockaddr.h"
94
102
  #include "src/core/lib/iomgr/sockaddr_utils.h"
95
103
  #include "src/core/lib/iomgr/timer.h"
@@ -123,16 +131,21 @@ constexpr char kGrpclb[] = "grpclb";
123
131
 
124
132
  class GrpcLbConfig : public LoadBalancingPolicy::Config {
125
133
  public:
126
- explicit GrpcLbConfig(RefCountedPtr<LoadBalancingPolicy::Config> child_policy)
127
- : child_policy_(std::move(child_policy)) {}
134
+ GrpcLbConfig(RefCountedPtr<LoadBalancingPolicy::Config> child_policy,
135
+ std::string service_name)
136
+ : child_policy_(std::move(child_policy)),
137
+ service_name_(std::move(service_name)) {}
128
138
  const char* name() const override { return kGrpclb; }
129
139
 
130
140
  RefCountedPtr<LoadBalancingPolicy::Config> child_policy() const {
131
141
  return child_policy_;
132
142
  }
133
143
 
144
+ const std::string& service_name() const { return service_name_; }
145
+
134
146
  private:
135
147
  RefCountedPtr<LoadBalancingPolicy::Config> child_policy_;
148
+ std::string service_name_;
136
149
  };
137
150
 
138
151
  class GrpcLb : public LoadBalancingPolicy {
@@ -177,11 +190,11 @@ class GrpcLb : public LoadBalancingPolicy {
177
190
  static void OnBalancerMessageReceived(void* arg, grpc_error* error);
178
191
  static void OnBalancerStatusReceived(void* arg, grpc_error* error);
179
192
 
180
- static void MaybeSendClientLoadReportLocked(void* arg, grpc_error* error);
181
- static void ClientLoadReportDoneLocked(void* arg, grpc_error* error);
182
- static void OnInitialRequestSentLocked(void* arg, grpc_error* error);
183
- static void OnBalancerMessageReceivedLocked(void* arg, grpc_error* error);
184
- static void OnBalancerStatusReceivedLocked(void* arg, grpc_error* error);
193
+ void MaybeSendClientLoadReportLocked(grpc_error* error);
194
+ void ClientLoadReportDoneLocked(grpc_error* error);
195
+ void OnInitialRequestSentLocked();
196
+ void OnBalancerMessageReceivedLocked();
197
+ void OnBalancerStatusReceivedLocked(grpc_error* error);
185
198
 
186
199
  // The owning LB policy.
187
200
  RefCountedPtr<LoadBalancingPolicy> grpclb_policy_;
@@ -232,7 +245,7 @@ class GrpcLb : public LoadBalancingPolicy {
232
245
  const std::vector<GrpcLbServer>& serverlist() const { return serverlist_; }
233
246
 
234
247
  // Returns a text representation suitable for logging.
235
- grpc_core::UniquePtr<char> AsText() const;
248
+ std::string AsText() const;
236
249
 
237
250
  // Extracts all non-drop entries into a ServerAddressList.
238
251
  ServerAddressList GetServerAddressList(
@@ -246,16 +259,16 @@ class GrpcLb : public LoadBalancingPolicy {
246
259
  // should not be dropped.
247
260
  //
248
261
  // Note: This is called from the picker, so it will be invoked in
249
- // the channel's data plane combiner, NOT the control plane
250
- // combiner. It should not be accessed by any other part of the LB
262
+ // the channel's data plane mutex, NOT the control plane
263
+ // work_serializer. It should not be accessed by any other part of the LB
251
264
  // policy.
252
265
  const char* ShouldDrop();
253
266
 
254
267
  private:
255
268
  std::vector<GrpcLbServer> serverlist_;
256
269
 
257
- // Guarded by the channel's data plane combiner, NOT the control
258
- // plane combiner. It should not be accessed by anything but the
270
+ // Guarded by the channel's data plane mutex, NOT the control
271
+ // plane work_serializer. It should not be accessed by anything but the
259
272
  // picker via the ShouldDrop() method.
260
273
  size_t drop_index_ = 0;
261
274
  };
@@ -294,16 +307,42 @@ class GrpcLb : public LoadBalancingPolicy {
294
307
  void UpdateState(grpc_connectivity_state state,
295
308
  std::unique_ptr<SubchannelPicker> picker) override;
296
309
  void RequestReresolution() override;
297
- void AddTraceEvent(TraceSeverity severity, StringView message) override;
310
+ void AddTraceEvent(TraceSeverity severity,
311
+ absl::string_view message) override;
298
312
 
299
- void set_child(LoadBalancingPolicy* child) { child_ = child; }
313
+ private:
314
+ RefCountedPtr<GrpcLb> parent_;
315
+ };
316
+
317
+ class StateWatcher : public AsyncConnectivityStateWatcherInterface {
318
+ public:
319
+ explicit StateWatcher(RefCountedPtr<GrpcLb> parent)
320
+ : AsyncConnectivityStateWatcherInterface(parent->work_serializer()),
321
+ parent_(std::move(parent)) {}
322
+
323
+ ~StateWatcher() { parent_.reset(DEBUG_LOCATION, "StateWatcher"); }
300
324
 
301
325
  private:
302
- bool CalledByPendingChild() const;
303
- bool CalledByCurrentChild() const;
326
+ void OnConnectivityStateChange(grpc_connectivity_state new_state) override {
327
+ if (parent_->fallback_at_startup_checks_pending_ &&
328
+ new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
329
+ // In TRANSIENT_FAILURE. Cancel the fallback timer and go into
330
+ // fallback mode immediately.
331
+ gpr_log(GPR_INFO,
332
+ "[grpclb %p] balancer channel in state TRANSIENT_FAILURE; "
333
+ "entering fallback mode",
334
+ parent_.get());
335
+ parent_->fallback_at_startup_checks_pending_ = false;
336
+ grpc_timer_cancel(&parent_->lb_fallback_timer_);
337
+ parent_->fallback_mode_ = true;
338
+ parent_->CreateOrUpdateChildPolicyLocked();
339
+ // Cancel the watch, since we don't care about the channel state once we
340
+ // go into fallback mode.
341
+ parent_->CancelBalancerChannelConnectivityWatchLocked();
342
+ }
343
+ }
304
344
 
305
345
  RefCountedPtr<GrpcLb> parent_;
306
- LoadBalancingPolicy* child_ = nullptr;
307
346
  };
308
347
 
309
348
  ~GrpcLb();
@@ -313,32 +352,31 @@ class GrpcLb : public LoadBalancingPolicy {
313
352
  // Helper functions used in UpdateLocked().
314
353
  void ProcessAddressesAndChannelArgsLocked(const ServerAddressList& addresses,
315
354
  const grpc_channel_args& args);
316
- static void OnBalancerChannelConnectivityChanged(void* arg,
317
- grpc_error* error);
318
- static void OnBalancerChannelConnectivityChangedLocked(void* arg,
319
- grpc_error* error);
355
+
320
356
  void CancelBalancerChannelConnectivityWatchLocked();
321
357
 
322
358
  // Methods for dealing with fallback state.
323
359
  void MaybeEnterFallbackModeAfterStartup();
324
360
  static void OnFallbackTimer(void* arg, grpc_error* error);
325
- static void OnFallbackTimerLocked(void* arg, grpc_error* error);
361
+ void OnFallbackTimerLocked(grpc_error* error);
326
362
 
327
363
  // Methods for dealing with the balancer call.
328
364
  void StartBalancerCallLocked();
329
365
  void StartBalancerCallRetryTimerLocked();
330
366
  static void OnBalancerCallRetryTimer(void* arg, grpc_error* error);
331
- static void OnBalancerCallRetryTimerLocked(void* arg, grpc_error* error);
367
+ void OnBalancerCallRetryTimerLocked(grpc_error* error);
332
368
 
333
369
  // Methods for dealing with the child policy.
334
370
  grpc_channel_args* CreateChildPolicyArgsLocked(
335
371
  bool is_backend_from_grpclb_load_balancer);
336
372
  OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
337
- const char* name, const grpc_channel_args* args);
373
+ const grpc_channel_args* args);
338
374
  void CreateOrUpdateChildPolicyLocked();
339
375
 
340
376
  // Who the client is trying to communicate with.
341
377
  const char* server_name_ = nullptr;
378
+ // Configurations for the policy.
379
+ RefCountedPtr<GrpcLbConfig> config_;
342
380
 
343
381
  // Current channel args from the resolver.
344
382
  grpc_channel_args* args_ = nullptr;
@@ -348,6 +386,7 @@ class GrpcLb : public LoadBalancingPolicy {
348
386
 
349
387
  // The channel for communicating with the LB server.
350
388
  grpc_channel* lb_channel_ = nullptr;
389
+ StateWatcher* watcher_ = nullptr;
351
390
  // Response generator to inject address updates into lb_channel_.
352
391
  RefCountedPtr<FakeResolverResponseGenerator> response_generator_;
353
392
 
@@ -380,16 +419,9 @@ class GrpcLb : public LoadBalancingPolicy {
380
419
  bool fallback_at_startup_checks_pending_ = false;
381
420
  grpc_timer lb_fallback_timer_;
382
421
  grpc_closure lb_on_fallback_;
383
- grpc_connectivity_state lb_channel_connectivity_ = GRPC_CHANNEL_IDLE;
384
- grpc_closure lb_channel_on_connectivity_changed_;
385
422
 
386
423
  // The child policy to use for the backends.
387
424
  OrphanablePtr<LoadBalancingPolicy> child_policy_;
388
- // When switching child policies, the new policy will be stored here
389
- // until it reports READY, at which point it will be moved to child_policy_.
390
- OrphanablePtr<LoadBalancingPolicy> pending_child_policy_;
391
- // The child policy config.
392
- RefCountedPtr<LoadBalancingPolicy::Config> child_policy_config_;
393
425
  // Child policy in state READY.
394
426
  bool child_policy_ready_ = false;
395
427
  };
@@ -423,28 +455,22 @@ void ParseServer(const GrpcLbServer& server, grpc_resolved_address* addr) {
423
455
  }
424
456
  }
425
457
 
426
- grpc_core::UniquePtr<char> GrpcLb::Serverlist::AsText() const {
427
- gpr_strvec entries;
428
- gpr_strvec_init(&entries);
458
+ std::string GrpcLb::Serverlist::AsText() const {
459
+ std::vector<std::string> entries;
429
460
  for (size_t i = 0; i < serverlist_.size(); ++i) {
430
461
  const GrpcLbServer& server = serverlist_[i];
431
- char* ipport;
462
+ std::string ipport;
432
463
  if (server.drop) {
433
- ipport = gpr_strdup("(drop)");
464
+ ipport = "(drop)";
434
465
  } else {
435
466
  grpc_resolved_address addr;
436
467
  ParseServer(server, &addr);
437
- grpc_sockaddr_to_string(&ipport, &addr, false);
468
+ ipport = grpc_sockaddr_to_string(&addr, false);
438
469
  }
439
- char* entry;
440
- gpr_asprintf(&entry, " %" PRIuPTR ": %s token=%s\n", i, ipport,
441
- server.load_balance_token);
442
- gpr_free(ipport);
443
- gpr_strvec_add(&entries, entry);
470
+ entries.push_back(absl::StrFormat(" %" PRIuPTR ": %s token=%s\n", i,
471
+ ipport, server.load_balance_token));
444
472
  }
445
- grpc_core::UniquePtr<char> result(gpr_strvec_flatten(&entries, nullptr));
446
- gpr_strvec_destroy(&entries);
447
- return result;
473
+ return absl::StrJoin(entries, "");
448
474
  }
449
475
 
450
476
  // vtables for channel args for LB token and client stats.
@@ -527,16 +553,14 @@ ServerAddressList GrpcLb::Serverlist::GetServerAddressList(
527
553
  memcpy(lb_token, server.load_balance_token, lb_token_length);
528
554
  lb_token[lb_token_length] = '\0';
529
555
  } else {
530
- char* uri = grpc_sockaddr_to_uri(&addr);
531
556
  gpr_log(GPR_INFO,
532
557
  "Missing LB token for backend address '%s'. The empty token will "
533
558
  "be used instead",
534
- uri);
535
- gpr_free(uri);
559
+ grpc_sockaddr_to_uri(&addr).c_str());
536
560
  lb_token[0] = '\0';
537
561
  }
538
562
  // Add address.
539
- InlinedVector<grpc_arg, 2> args_to_add;
563
+ absl::InlinedVector<grpc_arg, 2> args_to_add;
540
564
  args_to_add.emplace_back(grpc_channel_arg_pointer_create(
541
565
  const_cast<char*>(GRPC_ARG_GRPCLB_ADDRESS_LB_TOKEN), lb_token,
542
566
  &lb_token_arg_vtable));
@@ -607,7 +631,7 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
607
631
  // how to interpret it.
608
632
  args.initial_metadata->Add(
609
633
  kGrpcLbClientStatsMetadataKey,
610
- StringView(reinterpret_cast<const char*>(client_stats), 0));
634
+ absl::string_view(reinterpret_cast<const char*>(client_stats), 0));
611
635
  // Update calls-started.
612
636
  client_stats->AddCallStarted();
613
637
  }
@@ -629,46 +653,15 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
629
653
  // GrpcLb::Helper
630
654
  //
631
655
 
632
- bool GrpcLb::Helper::CalledByPendingChild() const {
633
- GPR_ASSERT(child_ != nullptr);
634
- return child_ == parent_->pending_child_policy_.get();
635
- }
636
-
637
- bool GrpcLb::Helper::CalledByCurrentChild() const {
638
- GPR_ASSERT(child_ != nullptr);
639
- return child_ == parent_->child_policy_.get();
640
- }
641
-
642
656
  RefCountedPtr<SubchannelInterface> GrpcLb::Helper::CreateSubchannel(
643
657
  const grpc_channel_args& args) {
644
- if (parent_->shutting_down_ ||
645
- (!CalledByPendingChild() && !CalledByCurrentChild())) {
646
- return nullptr;
647
- }
658
+ if (parent_->shutting_down_) return nullptr;
648
659
  return parent_->channel_control_helper()->CreateSubchannel(args);
649
660
  }
650
661
 
651
662
  void GrpcLb::Helper::UpdateState(grpc_connectivity_state state,
652
663
  std::unique_ptr<SubchannelPicker> picker) {
653
664
  if (parent_->shutting_down_) return;
654
- // If this request is from the pending child policy, ignore it until
655
- // it reports READY, at which point we swap it into place.
656
- if (CalledByPendingChild()) {
657
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
658
- gpr_log(GPR_INFO,
659
- "[grpclb %p helper %p] pending child policy %p reports state=%s",
660
- parent_.get(), this, parent_->pending_child_policy_.get(),
661
- ConnectivityStateName(state));
662
- }
663
- if (state != GRPC_CHANNEL_READY) return;
664
- grpc_pollset_set_del_pollset_set(
665
- parent_->child_policy_->interested_parties(),
666
- parent_->interested_parties());
667
- parent_->child_policy_ = std::move(parent_->pending_child_policy_);
668
- } else if (!CalledByCurrentChild()) {
669
- // This request is from an outdated child, so ignore it.
670
- return;
671
- }
672
665
  // Record whether child policy reports READY.
673
666
  parent_->child_policy_ready_ = state == GRPC_CHANNEL_READY;
674
667
  // Enter fallback mode if needed.
@@ -721,16 +714,6 @@ void GrpcLb::Helper::UpdateState(grpc_connectivity_state state,
721
714
 
722
715
  void GrpcLb::Helper::RequestReresolution() {
723
716
  if (parent_->shutting_down_) return;
724
- const LoadBalancingPolicy* latest_child_policy =
725
- parent_->pending_child_policy_ != nullptr
726
- ? parent_->pending_child_policy_.get()
727
- : parent_->child_policy_.get();
728
- if (child_ != latest_child_policy) return;
729
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
730
- gpr_log(GPR_INFO,
731
- "[grpclb %p] Re-resolution requested from %schild policy (%p).",
732
- parent_.get(), CalledByPendingChild() ? "pending " : "", child_);
733
- }
734
717
  // If we are talking to a balancer, we expect to get updated addresses
735
718
  // from the balancer, so we can ignore the re-resolution request from
736
719
  // the child policy. Otherwise, pass the re-resolution request up to the
@@ -741,11 +724,9 @@ void GrpcLb::Helper::RequestReresolution() {
741
724
  }
742
725
  }
743
726
 
744
- void GrpcLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) {
745
- if (parent_->shutting_down_ ||
746
- (!CalledByPendingChild() && !CalledByCurrentChild())) {
747
- return;
748
- }
727
+ void GrpcLb::Helper::AddTraceEvent(TraceSeverity severity,
728
+ absl::string_view message) {
729
+ if (parent_->shutting_down_) return;
749
730
  parent_->channel_control_helper()->AddTraceEvent(severity, message);
750
731
  }
751
732
 
@@ -764,6 +745,15 @@ GrpcLb::BalancerCallState::BalancerCallState(
764
745
  // the polling entities from client_channel.
765
746
  GPR_ASSERT(grpclb_policy()->server_name_ != nullptr);
766
747
  GPR_ASSERT(grpclb_policy()->server_name_[0] != '\0');
748
+ // Closure Initialization
749
+ GRPC_CLOSURE_INIT(&lb_on_initial_request_sent_, OnInitialRequestSent, this,
750
+ grpc_schedule_on_exec_ctx);
751
+ GRPC_CLOSURE_INIT(&lb_on_balancer_message_received_,
752
+ OnBalancerMessageReceived, this, grpc_schedule_on_exec_ctx);
753
+ GRPC_CLOSURE_INIT(&lb_on_balancer_status_received_, OnBalancerStatusReceived,
754
+ this, grpc_schedule_on_exec_ctx);
755
+ GRPC_CLOSURE_INIT(&client_load_report_closure_, MaybeSendClientLoadReport,
756
+ this, grpc_schedule_on_exec_ctx);
767
757
  const grpc_millis deadline =
768
758
  grpclb_policy()->lb_call_timeout_ms_ == 0
769
759
  ? GRPC_MILLIS_INF_FUTURE
@@ -775,8 +765,11 @@ GrpcLb::BalancerCallState::BalancerCallState(
775
765
  nullptr, deadline, nullptr);
776
766
  // Init the LB call request payload.
777
767
  upb::Arena arena;
778
- grpc_slice request_payload_slice =
779
- GrpcLbRequestCreate(grpclb_policy()->server_name_, arena.ptr());
768
+ grpc_slice request_payload_slice = GrpcLbRequestCreate(
769
+ grpclb_policy()->config_->service_name().empty()
770
+ ? grpclb_policy()->server_name_
771
+ : grpclb_policy()->config_->service_name().c_str(),
772
+ arena.ptr());
780
773
  send_message_payload_ =
781
774
  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
782
775
  grpc_slice_unref_internal(request_payload_slice);
@@ -840,8 +833,6 @@ void GrpcLb::BalancerCallState::StartQuery() {
840
833
  // with the callback.
841
834
  auto self = Ref(DEBUG_LOCATION, "on_initial_request_sent");
842
835
  self.release();
843
- GRPC_CLOSURE_INIT(&lb_on_initial_request_sent_, OnInitialRequestSent, this,
844
- grpc_schedule_on_exec_ctx);
845
836
  call_error = grpc_call_start_batch_and_execute(
846
837
  lb_call_, ops, (size_t)(op - ops), &lb_on_initial_request_sent_);
847
838
  GPR_ASSERT(GRPC_CALL_OK == call_error);
@@ -864,8 +855,6 @@ void GrpcLb::BalancerCallState::StartQuery() {
864
855
  // with the callback.
865
856
  self = Ref(DEBUG_LOCATION, "on_message_received");
866
857
  self.release();
867
- GRPC_CLOSURE_INIT(&lb_on_balancer_message_received_,
868
- OnBalancerMessageReceived, this, grpc_schedule_on_exec_ctx);
869
858
  call_error = grpc_call_start_batch_and_execute(
870
859
  lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_message_received_);
871
860
  GPR_ASSERT(GRPC_CALL_OK == call_error);
@@ -882,8 +871,6 @@ void GrpcLb::BalancerCallState::StartQuery() {
882
871
  // This callback signals the end of the LB call, so it relies on the initial
883
872
  // ref instead of a new ref. When it's invoked, it's the initial ref that is
884
873
  // unreffed.
885
- GRPC_CLOSURE_INIT(&lb_on_balancer_status_received_, OnBalancerStatusReceived,
886
- this, grpc_schedule_on_exec_ctx);
887
874
  call_error = grpc_call_start_batch_and_execute(
888
875
  lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_status_received_);
889
876
  GPR_ASSERT(GRPC_CALL_OK == call_error);
@@ -902,28 +889,27 @@ void GrpcLb::BalancerCallState::ScheduleNextClientLoadReportLocked() {
902
889
  void GrpcLb::BalancerCallState::MaybeSendClientLoadReport(void* arg,
903
890
  grpc_error* error) {
904
891
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
905
- lb_calld->grpclb_policy()->combiner()->Run(
906
- GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_,
907
- MaybeSendClientLoadReportLocked, lb_calld, nullptr),
908
- GRPC_ERROR_REF(error));
892
+ GRPC_ERROR_REF(error); // ref owned by lambda
893
+ lb_calld->grpclb_policy()->work_serializer()->Run(
894
+ [lb_calld, error]() { lb_calld->MaybeSendClientLoadReportLocked(error); },
895
+ DEBUG_LOCATION);
909
896
  }
910
897
 
911
898
  void GrpcLb::BalancerCallState::MaybeSendClientLoadReportLocked(
912
- void* arg, grpc_error* error) {
913
- BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
914
- GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
915
- lb_calld->client_load_report_timer_callback_pending_ = false;
916
- if (error != GRPC_ERROR_NONE || lb_calld != grpclb_policy->lb_calld_.get()) {
917
- lb_calld->Unref(DEBUG_LOCATION, "client_load_report");
899
+ grpc_error* error) {
900
+ client_load_report_timer_callback_pending_ = false;
901
+ if (error != GRPC_ERROR_NONE || this != grpclb_policy()->lb_calld_.get()) {
902
+ Unref(DEBUG_LOCATION, "client_load_report");
903
+ GRPC_ERROR_UNREF(error);
918
904
  return;
919
905
  }
920
906
  // If we've already sent the initial request, then we can go ahead and send
921
907
  // the load report. Otherwise, we need to wait until the initial request has
922
908
  // been sent to send this (see OnInitialRequestSentLocked()).
923
- if (lb_calld->send_message_payload_ == nullptr) {
924
- lb_calld->SendClientLoadReportLocked();
909
+ if (send_message_payload_ == nullptr) {
910
+ SendClientLoadReportLocked();
925
911
  } else {
926
- lb_calld->client_load_report_is_due_ = true;
912
+ client_load_report_is_due_ = true;
927
913
  }
928
914
  }
929
915
 
@@ -982,140 +968,125 @@ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
982
968
  void GrpcLb::BalancerCallState::ClientLoadReportDone(void* arg,
983
969
  grpc_error* error) {
984
970
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
985
- lb_calld->grpclb_policy()->combiner()->Run(
986
- GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_,
987
- ClientLoadReportDoneLocked, lb_calld, nullptr),
988
- GRPC_ERROR_REF(error));
971
+ GRPC_ERROR_REF(error); // ref owned by lambda
972
+ lb_calld->grpclb_policy()->work_serializer()->Run(
973
+ [lb_calld, error]() { lb_calld->ClientLoadReportDoneLocked(error); },
974
+ DEBUG_LOCATION);
989
975
  }
990
976
 
991
- void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(void* arg,
992
- grpc_error* error) {
993
- BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
994
- GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
995
- grpc_byte_buffer_destroy(lb_calld->send_message_payload_);
996
- lb_calld->send_message_payload_ = nullptr;
997
- if (error != GRPC_ERROR_NONE || lb_calld != grpclb_policy->lb_calld_.get()) {
998
- lb_calld->Unref(DEBUG_LOCATION, "client_load_report");
977
+ void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(grpc_error* error) {
978
+ grpc_byte_buffer_destroy(send_message_payload_);
979
+ send_message_payload_ = nullptr;
980
+ if (error != GRPC_ERROR_NONE || this != grpclb_policy()->lb_calld_.get()) {
981
+ Unref(DEBUG_LOCATION, "client_load_report");
982
+ GRPC_ERROR_UNREF(error);
999
983
  return;
1000
984
  }
1001
- lb_calld->ScheduleNextClientLoadReportLocked();
985
+ ScheduleNextClientLoadReportLocked();
1002
986
  }
1003
987
 
1004
988
  void GrpcLb::BalancerCallState::OnInitialRequestSent(void* arg,
1005
- grpc_error* error) {
989
+ grpc_error* /*error*/) {
1006
990
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
1007
- lb_calld->grpclb_policy()->combiner()->Run(
1008
- GRPC_CLOSURE_INIT(&lb_calld->lb_on_initial_request_sent_,
1009
- OnInitialRequestSentLocked, lb_calld, nullptr),
1010
- GRPC_ERROR_REF(error));
991
+ lb_calld->grpclb_policy()->work_serializer()->Run(
992
+ [lb_calld]() { lb_calld->OnInitialRequestSentLocked(); }, DEBUG_LOCATION);
1011
993
  }
1012
994
 
1013
- void GrpcLb::BalancerCallState::OnInitialRequestSentLocked(
1014
- void* arg, grpc_error* /*error*/) {
1015
- BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
1016
- grpc_byte_buffer_destroy(lb_calld->send_message_payload_);
1017
- lb_calld->send_message_payload_ = nullptr;
995
+ void GrpcLb::BalancerCallState::OnInitialRequestSentLocked() {
996
+ grpc_byte_buffer_destroy(send_message_payload_);
997
+ send_message_payload_ = nullptr;
1018
998
  // If we attempted to send a client load report before the initial request was
1019
999
  // sent (and this lb_calld is still in use), send the load report now.
1020
- if (lb_calld->client_load_report_is_due_ &&
1021
- lb_calld == lb_calld->grpclb_policy()->lb_calld_.get()) {
1022
- lb_calld->SendClientLoadReportLocked();
1023
- lb_calld->client_load_report_is_due_ = false;
1000
+ if (client_load_report_is_due_ && this == grpclb_policy()->lb_calld_.get()) {
1001
+ SendClientLoadReportLocked();
1002
+ client_load_report_is_due_ = false;
1024
1003
  }
1025
- lb_calld->Unref(DEBUG_LOCATION, "on_initial_request_sent");
1004
+ Unref(DEBUG_LOCATION, "on_initial_request_sent");
1026
1005
  }
1027
1006
 
1028
- void GrpcLb::BalancerCallState::OnBalancerMessageReceived(void* arg,
1029
- grpc_error* error) {
1007
+ void GrpcLb::BalancerCallState::OnBalancerMessageReceived(
1008
+ void* arg, grpc_error* /*error*/) {
1030
1009
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
1031
- lb_calld->grpclb_policy()->combiner()->Run(
1032
- GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_message_received_,
1033
- OnBalancerMessageReceivedLocked, lb_calld, nullptr),
1034
- GRPC_ERROR_REF(error));
1010
+ lb_calld->grpclb_policy()->work_serializer()->Run(
1011
+ [lb_calld]() { lb_calld->OnBalancerMessageReceivedLocked(); },
1012
+ DEBUG_LOCATION);
1035
1013
  }
1036
1014
 
1037
- void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked(
1038
- void* arg, grpc_error* /*error*/) {
1039
- BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
1040
- GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
1015
+ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked() {
1041
1016
  // Null payload means the LB call was cancelled.
1042
- if (lb_calld != grpclb_policy->lb_calld_.get() ||
1043
- lb_calld->recv_message_payload_ == nullptr) {
1044
- lb_calld->Unref(DEBUG_LOCATION, "on_message_received");
1017
+ if (this != grpclb_policy()->lb_calld_.get() ||
1018
+ recv_message_payload_ == nullptr) {
1019
+ Unref(DEBUG_LOCATION, "on_message_received");
1045
1020
  return;
1046
1021
  }
1047
1022
  grpc_byte_buffer_reader bbr;
1048
- grpc_byte_buffer_reader_init(&bbr, lb_calld->recv_message_payload_);
1023
+ grpc_byte_buffer_reader_init(&bbr, recv_message_payload_);
1049
1024
  grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
1050
1025
  grpc_byte_buffer_reader_destroy(&bbr);
1051
- grpc_byte_buffer_destroy(lb_calld->recv_message_payload_);
1052
- lb_calld->recv_message_payload_ = nullptr;
1026
+ grpc_byte_buffer_destroy(recv_message_payload_);
1027
+ recv_message_payload_ = nullptr;
1053
1028
  GrpcLbResponse response;
1054
1029
  upb::Arena arena;
1055
1030
  if (!GrpcLbResponseParse(response_slice, arena.ptr(), &response) ||
1056
- (response.type == response.INITIAL && lb_calld->seen_initial_response_)) {
1031
+ (response.type == response.INITIAL && seen_initial_response_)) {
1057
1032
  char* response_slice_str =
1058
1033
  grpc_dump_slice(response_slice, GPR_DUMP_ASCII | GPR_DUMP_HEX);
1059
1034
  gpr_log(GPR_ERROR,
1060
1035
  "[grpclb %p] lb_calld=%p: Invalid LB response received: '%s'. "
1061
1036
  "Ignoring.",
1062
- grpclb_policy, lb_calld, response_slice_str);
1037
+ grpclb_policy(), this, response_slice_str);
1063
1038
  gpr_free(response_slice_str);
1064
1039
  } else {
1065
1040
  switch (response.type) {
1066
1041
  case response.INITIAL: {
1067
1042
  if (response.client_stats_report_interval != 0) {
1068
- lb_calld->client_stats_report_interval_ =
1043
+ client_stats_report_interval_ =
1069
1044
  GPR_MAX(GPR_MS_PER_SEC, response.client_stats_report_interval);
1070
1045
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1071
1046
  gpr_log(GPR_INFO,
1072
1047
  "[grpclb %p] lb_calld=%p: Received initial LB response "
1073
1048
  "message; client load reporting interval = %" PRId64
1074
1049
  " milliseconds",
1075
- grpclb_policy, lb_calld,
1076
- lb_calld->client_stats_report_interval_);
1050
+ grpclb_policy(), this, client_stats_report_interval_);
1077
1051
  }
1078
1052
  } else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1079
1053
  gpr_log(GPR_INFO,
1080
1054
  "[grpclb %p] lb_calld=%p: Received initial LB response "
1081
1055
  "message; client load reporting NOT enabled",
1082
- grpclb_policy, lb_calld);
1056
+ grpclb_policy(), this);
1083
1057
  }
1084
- lb_calld->seen_initial_response_ = true;
1058
+ seen_initial_response_ = true;
1085
1059
  break;
1086
1060
  }
1087
1061
  case response.SERVERLIST: {
1088
- GPR_ASSERT(lb_calld->lb_call_ != nullptr);
1062
+ GPR_ASSERT(lb_call_ != nullptr);
1089
1063
  auto serverlist_wrapper =
1090
1064
  MakeRefCounted<Serverlist>(std::move(response.serverlist));
1091
1065
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1092
- grpc_core::UniquePtr<char> serverlist_text =
1093
- serverlist_wrapper->AsText();
1094
1066
  gpr_log(GPR_INFO,
1095
1067
  "[grpclb %p] lb_calld=%p: Serverlist with %" PRIuPTR
1096
1068
  " servers received:\n%s",
1097
- grpclb_policy, lb_calld,
1069
+ grpclb_policy(), this,
1098
1070
  serverlist_wrapper->serverlist().size(),
1099
- serverlist_text.get());
1071
+ serverlist_wrapper->AsText().c_str());
1100
1072
  }
1101
- lb_calld->seen_serverlist_ = true;
1073
+ seen_serverlist_ = true;
1102
1074
  // Start sending client load report only after we start using the
1103
1075
  // serverlist returned from the current LB call.
1104
- if (lb_calld->client_stats_report_interval_ > 0 &&
1105
- lb_calld->client_stats_ == nullptr) {
1106
- lb_calld->client_stats_ = MakeRefCounted<GrpcLbClientStats>();
1076
+ if (client_stats_report_interval_ > 0 && client_stats_ == nullptr) {
1077
+ client_stats_ = MakeRefCounted<GrpcLbClientStats>();
1107
1078
  // Ref held by callback.
1108
- lb_calld->Ref(DEBUG_LOCATION, "client_load_report").release();
1109
- lb_calld->ScheduleNextClientLoadReportLocked();
1079
+ Ref(DEBUG_LOCATION, "client_load_report").release();
1080
+ ScheduleNextClientLoadReportLocked();
1110
1081
  }
1111
1082
  // Check if the serverlist differs from the previous one.
1112
- if (grpclb_policy->serverlist_ != nullptr &&
1113
- *grpclb_policy->serverlist_ == *serverlist_wrapper) {
1083
+ if (grpclb_policy()->serverlist_ != nullptr &&
1084
+ *grpclb_policy()->serverlist_ == *serverlist_wrapper) {
1114
1085
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1115
1086
  gpr_log(GPR_INFO,
1116
1087
  "[grpclb %p] lb_calld=%p: Incoming server list identical "
1117
1088
  "to current, ignoring.",
1118
- grpclb_policy, lb_calld);
1089
+ grpclb_policy(), this);
1119
1090
  }
1120
1091
  } else { // New serverlist.
1121
1092
  // Dispose of the fallback.
@@ -1137,155 +1108,135 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked(
1137
1108
  // the grpclb implementation at this point, since we're deprecating
1138
1109
  // it in favor of the xds policy. We will implement this the
1139
1110
  // right way in the xds policy instead.
1140
- if (grpclb_policy->fallback_mode_) {
1111
+ if (grpclb_policy()->fallback_mode_) {
1141
1112
  gpr_log(GPR_INFO,
1142
1113
  "[grpclb %p] Received response from balancer; exiting "
1143
1114
  "fallback mode",
1144
- grpclb_policy);
1145
- grpclb_policy->fallback_mode_ = false;
1115
+ grpclb_policy());
1116
+ grpclb_policy()->fallback_mode_ = false;
1146
1117
  }
1147
- if (grpclb_policy->fallback_at_startup_checks_pending_) {
1148
- grpclb_policy->fallback_at_startup_checks_pending_ = false;
1149
- grpc_timer_cancel(&grpclb_policy->lb_fallback_timer_);
1150
- grpclb_policy->CancelBalancerChannelConnectivityWatchLocked();
1118
+ if (grpclb_policy()->fallback_at_startup_checks_pending_) {
1119
+ grpclb_policy()->fallback_at_startup_checks_pending_ = false;
1120
+ grpc_timer_cancel(&grpclb_policy()->lb_fallback_timer_);
1121
+ grpclb_policy()->CancelBalancerChannelConnectivityWatchLocked();
1151
1122
  }
1152
1123
  // Update the serverlist in the GrpcLb instance. This serverlist
1153
1124
  // instance will be destroyed either upon the next update or when the
1154
1125
  // GrpcLb instance is destroyed.
1155
- grpclb_policy->serverlist_ = std::move(serverlist_wrapper);
1156
- grpclb_policy->CreateOrUpdateChildPolicyLocked();
1126
+ grpclb_policy()->serverlist_ = std::move(serverlist_wrapper);
1127
+ grpclb_policy()->CreateOrUpdateChildPolicyLocked();
1157
1128
  }
1158
1129
  break;
1159
1130
  }
1160
1131
  case response.FALLBACK: {
1161
- if (!grpclb_policy->fallback_mode_) {
1132
+ if (!grpclb_policy()->fallback_mode_) {
1162
1133
  gpr_log(GPR_INFO,
1163
1134
  "[grpclb %p] Entering fallback mode as requested by balancer",
1164
- grpclb_policy);
1165
- if (grpclb_policy->fallback_at_startup_checks_pending_) {
1166
- grpclb_policy->fallback_at_startup_checks_pending_ = false;
1167
- grpc_timer_cancel(&grpclb_policy->lb_fallback_timer_);
1168
- grpclb_policy->CancelBalancerChannelConnectivityWatchLocked();
1135
+ grpclb_policy());
1136
+ if (grpclb_policy()->fallback_at_startup_checks_pending_) {
1137
+ grpclb_policy()->fallback_at_startup_checks_pending_ = false;
1138
+ grpc_timer_cancel(&grpclb_policy()->lb_fallback_timer_);
1139
+ grpclb_policy()->CancelBalancerChannelConnectivityWatchLocked();
1169
1140
  }
1170
- grpclb_policy->fallback_mode_ = true;
1171
- grpclb_policy->CreateOrUpdateChildPolicyLocked();
1141
+ grpclb_policy()->fallback_mode_ = true;
1142
+ grpclb_policy()->CreateOrUpdateChildPolicyLocked();
1172
1143
  // Reset serverlist, so that if the balancer exits fallback
1173
1144
  // mode by sending the same serverlist we were previously
1174
1145
  // using, we don't incorrectly ignore it as a duplicate.
1175
- grpclb_policy->serverlist_.reset();
1146
+ grpclb_policy()->serverlist_.reset();
1176
1147
  }
1177
1148
  break;
1178
1149
  }
1179
1150
  }
1180
1151
  }
1181
1152
  grpc_slice_unref_internal(response_slice);
1182
- if (!grpclb_policy->shutting_down_) {
1153
+ if (!grpclb_policy()->shutting_down_) {
1183
1154
  // Keep listening for serverlist updates.
1184
1155
  grpc_op op;
1185
1156
  memset(&op, 0, sizeof(op));
1186
1157
  op.op = GRPC_OP_RECV_MESSAGE;
1187
- op.data.recv_message.recv_message = &lb_calld->recv_message_payload_;
1158
+ op.data.recv_message.recv_message = &recv_message_payload_;
1188
1159
  op.flags = 0;
1189
1160
  op.reserved = nullptr;
1190
1161
  // Reuse the "OnBalancerMessageReceivedLocked" ref taken in StartQuery().
1191
- GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_message_received_,
1192
- GrpcLb::BalancerCallState::OnBalancerMessageReceived,
1193
- lb_calld, grpc_schedule_on_exec_ctx);
1194
1162
  const grpc_call_error call_error = grpc_call_start_batch_and_execute(
1195
- lb_calld->lb_call_, &op, 1,
1196
- &lb_calld->lb_on_balancer_message_received_);
1163
+ lb_call_, &op, 1, &lb_on_balancer_message_received_);
1197
1164
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1198
1165
  } else {
1199
- lb_calld->Unref(DEBUG_LOCATION, "on_message_received+grpclb_shutdown");
1166
+ Unref(DEBUG_LOCATION, "on_message_received+grpclb_shutdown");
1200
1167
  }
1201
1168
  }
1202
1169
 
1203
1170
  void GrpcLb::BalancerCallState::OnBalancerStatusReceived(void* arg,
1204
1171
  grpc_error* error) {
1205
1172
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
1206
- lb_calld->grpclb_policy()->combiner()->Run(
1207
- GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_status_received_,
1208
- OnBalancerStatusReceivedLocked, lb_calld, nullptr),
1209
- GRPC_ERROR_REF(error));
1173
+ GRPC_ERROR_REF(error); // owned by lambda
1174
+ lb_calld->grpclb_policy()->work_serializer()->Run(
1175
+ [lb_calld, error]() { lb_calld->OnBalancerStatusReceivedLocked(error); },
1176
+ DEBUG_LOCATION);
1210
1177
  }
1211
1178
 
1212
1179
  void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked(
1213
- void* arg, grpc_error* error) {
1214
- BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
1215
- GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
1216
- GPR_ASSERT(lb_calld->lb_call_ != nullptr);
1180
+ grpc_error* error) {
1181
+ GPR_ASSERT(lb_call_ != nullptr);
1217
1182
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1218
- char* status_details =
1219
- grpc_slice_to_c_string(lb_calld->lb_call_status_details_);
1183
+ char* status_details = grpc_slice_to_c_string(lb_call_status_details_);
1220
1184
  gpr_log(GPR_INFO,
1221
1185
  "[grpclb %p] lb_calld=%p: Status from LB server received. "
1222
1186
  "Status = %d, details = '%s', (lb_call: %p), error '%s'",
1223
- grpclb_policy, lb_calld, lb_calld->lb_call_status_, status_details,
1224
- lb_calld->lb_call_, grpc_error_string(error));
1187
+ grpclb_policy(), this, lb_call_status_, status_details, lb_call_,
1188
+ grpc_error_string(error));
1225
1189
  gpr_free(status_details);
1226
1190
  }
1191
+ GRPC_ERROR_UNREF(error);
1227
1192
  // If this lb_calld is still in use, this call ended because of a failure so
1228
1193
  // we want to retry connecting. Otherwise, we have deliberately ended this
1229
1194
  // call and no further action is required.
1230
- if (lb_calld == grpclb_policy->lb_calld_.get()) {
1195
+ if (this == grpclb_policy()->lb_calld_.get()) {
1231
1196
  // If the fallback-at-startup checks are pending, go into fallback mode
1232
1197
  // immediately. This short-circuits the timeout for the fallback-at-startup
1233
1198
  // case.
1234
- if (grpclb_policy->fallback_at_startup_checks_pending_) {
1235
- GPR_ASSERT(!lb_calld->seen_serverlist_);
1199
+ if (grpclb_policy()->fallback_at_startup_checks_pending_) {
1200
+ GPR_ASSERT(!seen_serverlist_);
1236
1201
  gpr_log(GPR_INFO,
1237
1202
  "[grpclb %p] Balancer call finished without receiving "
1238
1203
  "serverlist; entering fallback mode",
1239
- grpclb_policy);
1240
- grpclb_policy->fallback_at_startup_checks_pending_ = false;
1241
- grpc_timer_cancel(&grpclb_policy->lb_fallback_timer_);
1242
- grpclb_policy->CancelBalancerChannelConnectivityWatchLocked();
1243
- grpclb_policy->fallback_mode_ = true;
1244
- grpclb_policy->CreateOrUpdateChildPolicyLocked();
1204
+ grpclb_policy());
1205
+ grpclb_policy()->fallback_at_startup_checks_pending_ = false;
1206
+ grpc_timer_cancel(&grpclb_policy()->lb_fallback_timer_);
1207
+ grpclb_policy()->CancelBalancerChannelConnectivityWatchLocked();
1208
+ grpclb_policy()->fallback_mode_ = true;
1209
+ grpclb_policy()->CreateOrUpdateChildPolicyLocked();
1245
1210
  } else {
1246
1211
  // This handles the fallback-after-startup case.
1247
- grpclb_policy->MaybeEnterFallbackModeAfterStartup();
1212
+ grpclb_policy()->MaybeEnterFallbackModeAfterStartup();
1248
1213
  }
1249
- grpclb_policy->lb_calld_.reset();
1250
- GPR_ASSERT(!grpclb_policy->shutting_down_);
1251
- grpclb_policy->channel_control_helper()->RequestReresolution();
1252
- if (lb_calld->seen_initial_response_) {
1214
+ grpclb_policy()->lb_calld_.reset();
1215
+ GPR_ASSERT(!grpclb_policy()->shutting_down_);
1216
+ grpclb_policy()->channel_control_helper()->RequestReresolution();
1217
+ if (seen_initial_response_) {
1253
1218
  // If we lose connection to the LB server, reset the backoff and restart
1254
1219
  // the LB call immediately.
1255
- grpclb_policy->lb_call_backoff_.Reset();
1256
- grpclb_policy->StartBalancerCallLocked();
1220
+ grpclb_policy()->lb_call_backoff_.Reset();
1221
+ grpclb_policy()->StartBalancerCallLocked();
1257
1222
  } else {
1258
1223
  // If this LB call fails establishing any connection to the LB server,
1259
1224
  // retry later.
1260
- grpclb_policy->StartBalancerCallRetryTimerLocked();
1225
+ grpclb_policy()->StartBalancerCallRetryTimerLocked();
1261
1226
  }
1262
1227
  }
1263
- lb_calld->Unref(DEBUG_LOCATION, "lb_call_ended");
1228
+ Unref(DEBUG_LOCATION, "lb_call_ended");
1264
1229
  }
1265
1230
 
1266
1231
  //
1267
1232
  // helper code for creating balancer channel
1268
1233
  //
1269
1234
 
1270
- ServerAddressList ExtractBalancerAddresses(const ServerAddressList& addresses) {
1271
- ServerAddressList balancer_addresses;
1272
- for (size_t i = 0; i < addresses.size(); ++i) {
1273
- if (addresses[i].IsBalancer()) {
1274
- // Strip out the is_balancer channel arg, since we don't want to
1275
- // recursively use the grpclb policy in the channel used to talk to
1276
- // the balancers. Note that we do NOT strip out the balancer_name
1277
- // channel arg, since we need that to set the authority correctly
1278
- // to talk to the balancers.
1279
- static const char* args_to_remove[] = {
1280
- GRPC_ARG_ADDRESS_IS_BALANCER,
1281
- };
1282
- balancer_addresses.emplace_back(
1283
- addresses[i].address(),
1284
- grpc_channel_args_copy_and_remove(addresses[i].args(), args_to_remove,
1285
- GPR_ARRAY_SIZE(args_to_remove)));
1286
- }
1287
- }
1288
- return balancer_addresses;
1235
+ ServerAddressList ExtractBalancerAddresses(const grpc_channel_args& args) {
1236
+ const ServerAddressList* addresses =
1237
+ FindGrpclbBalancerAddressesInChannelArgs(args);
1238
+ if (addresses != nullptr) return *addresses;
1239
+ return ServerAddressList();
1289
1240
  }
1290
1241
 
1291
1242
  /* Returns the channel args for the LB channel, used to create a bidirectional
@@ -1329,7 +1280,7 @@ grpc_channel_args* BuildBalancerChannelArgs(
1329
1280
  GRPC_ARG_CHANNELZ_CHANNEL_NODE,
1330
1281
  };
1331
1282
  // Channel args to add.
1332
- InlinedVector<grpc_arg, 3> args_to_add;
1283
+ absl::InlinedVector<grpc_arg, 3> args_to_add;
1333
1284
  // The fake resolver response generator, which we use to inject
1334
1285
  // address updates into the LB channel.
1335
1286
  args_to_add.emplace_back(
@@ -1371,6 +1322,11 @@ GrpcLb::GrpcLb(Args args)
1371
1322
  .set_jitter(GRPC_GRPCLB_RECONNECT_JITTER)
1372
1323
  .set_max_backoff(GRPC_GRPCLB_RECONNECT_MAX_BACKOFF_SECONDS *
1373
1324
  1000)) {
1325
+ // Closure Initialization
1326
+ GRPC_CLOSURE_INIT(&lb_on_fallback_, &GrpcLb::OnFallbackTimer, this,
1327
+ grpc_schedule_on_exec_ctx);
1328
+ GRPC_CLOSURE_INIT(&lb_on_call_retry_, &GrpcLb::OnBalancerCallRetryTimer, this,
1329
+ grpc_schedule_on_exec_ctx);
1374
1330
  // Record server name.
1375
1331
  const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI);
1376
1332
  const char* server_uri = grpc_channel_arg_get_string(arg);
@@ -1405,19 +1361,15 @@ void GrpcLb::ShutdownLocked() {
1405
1361
  grpc_timer_cancel(&lb_call_retry_timer_);
1406
1362
  }
1407
1363
  if (fallback_at_startup_checks_pending_) {
1364
+ fallback_at_startup_checks_pending_ = false;
1408
1365
  grpc_timer_cancel(&lb_fallback_timer_);
1409
1366
  CancelBalancerChannelConnectivityWatchLocked();
1410
1367
  }
1411
1368
  if (child_policy_ != nullptr) {
1412
1369
  grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
1413
1370
  interested_parties());
1371
+ child_policy_.reset();
1414
1372
  }
1415
- if (pending_child_policy_ != nullptr) {
1416
- grpc_pollset_set_del_pollset_set(
1417
- pending_child_policy_->interested_parties(), interested_parties());
1418
- }
1419
- child_policy_.reset();
1420
- pending_child_policy_.reset();
1421
1373
  // We destroy the LB channel here instead of in our destructor because
1422
1374
  // destroying the channel triggers a last callback to
1423
1375
  // OnBalancerChannelConnectivityChangedLocked(), and we need to be
@@ -1439,19 +1391,12 @@ void GrpcLb::ResetBackoffLocked() {
1439
1391
  if (child_policy_ != nullptr) {
1440
1392
  child_policy_->ResetBackoffLocked();
1441
1393
  }
1442
- if (pending_child_policy_ != nullptr) {
1443
- pending_child_policy_->ResetBackoffLocked();
1444
- }
1445
1394
  }
1446
1395
 
1447
1396
  void GrpcLb::UpdateLocked(UpdateArgs args) {
1448
1397
  const bool is_initial_update = lb_channel_ == nullptr;
1449
- auto* grpclb_config = static_cast<const GrpcLbConfig*>(args.config.get());
1450
- if (grpclb_config != nullptr) {
1451
- child_policy_config_ = grpclb_config->child_policy();
1452
- } else {
1453
- child_policy_config_ = nullptr;
1454
- }
1398
+ config_ = args.config;
1399
+ GPR_ASSERT(config_ != nullptr);
1455
1400
  ProcessAddressesAndChannelArgsLocked(args.addresses, *args.args);
1456
1401
  // Update the existing child policy.
1457
1402
  if (child_policy_ != nullptr) CreateOrUpdateChildPolicyLocked();
@@ -1462,8 +1407,6 @@ void GrpcLb::UpdateLocked(UpdateArgs args) {
1462
1407
  // Start timer.
1463
1408
  grpc_millis deadline = ExecCtx::Get()->Now() + fallback_at_startup_timeout_;
1464
1409
  Ref(DEBUG_LOCATION, "on_fallback_timer").release(); // Ref for callback
1465
- GRPC_CLOSURE_INIT(&lb_on_fallback_, &GrpcLb::OnFallbackTimer, this,
1466
- grpc_schedule_on_exec_ctx);
1467
1410
  grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_);
1468
1411
  // Start watching the channel's connectivity state. If the channel
1469
1412
  // goes into state TRANSIENT_FAILURE before the timer fires, we go into
@@ -1472,15 +1415,10 @@ void GrpcLb::UpdateLocked(UpdateArgs args) {
1472
1415
  grpc_channel_get_channel_stack(lb_channel_));
1473
1416
  GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
1474
1417
  // Ref held by callback.
1475
- Ref(DEBUG_LOCATION, "watch_lb_channel_connectivity").release();
1476
- GRPC_CLOSURE_INIT(&lb_channel_on_connectivity_changed_,
1477
- &GrpcLb::OnBalancerChannelConnectivityChanged, this,
1478
- grpc_schedule_on_exec_ctx);
1479
- grpc_client_channel_watch_connectivity_state(
1480
- client_channel_elem,
1481
- grpc_polling_entity_create_from_pollset_set(interested_parties()),
1482
- &lb_channel_connectivity_, &lb_channel_on_connectivity_changed_,
1483
- nullptr);
1418
+ watcher_ = new StateWatcher(Ref(DEBUG_LOCATION, "StateWatcher"));
1419
+ grpc_client_channel_start_connectivity_watch(
1420
+ client_channel_elem, GRPC_CHANNEL_IDLE,
1421
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
1484
1422
  // Start balancer call.
1485
1423
  StartBalancerCallLocked();
1486
1424
  }
@@ -1490,27 +1428,25 @@ void GrpcLb::UpdateLocked(UpdateArgs args) {
1490
1428
  // helpers for UpdateLocked()
1491
1429
  //
1492
1430
 
1493
- // Returns the backend addresses extracted from the given addresses.
1494
- ServerAddressList ExtractBackendAddresses(const ServerAddressList& addresses) {
1431
+ ServerAddressList AddNullLbTokenToAddresses(
1432
+ const ServerAddressList& addresses) {
1495
1433
  static const char* lb_token = "";
1496
1434
  grpc_arg arg = grpc_channel_arg_pointer_create(
1497
1435
  const_cast<char*>(GRPC_ARG_GRPCLB_ADDRESS_LB_TOKEN),
1498
1436
  const_cast<char*>(lb_token), &lb_token_arg_vtable);
1499
- ServerAddressList backend_addresses;
1437
+ ServerAddressList addresses_out;
1500
1438
  for (size_t i = 0; i < addresses.size(); ++i) {
1501
- if (!addresses[i].IsBalancer()) {
1502
- backend_addresses.emplace_back(
1503
- addresses[i].address(),
1504
- grpc_channel_args_copy_and_add(addresses[i].args(), &arg, 1));
1505
- }
1439
+ addresses_out.emplace_back(
1440
+ addresses[i].address(),
1441
+ grpc_channel_args_copy_and_add(addresses[i].args(), &arg, 1));
1506
1442
  }
1507
- return backend_addresses;
1443
+ return addresses_out;
1508
1444
  }
1509
1445
 
1510
1446
  void GrpcLb::ProcessAddressesAndChannelArgsLocked(
1511
1447
  const ServerAddressList& addresses, const grpc_channel_args& args) {
1512
1448
  // Update fallback address list.
1513
- fallback_backend_addresses_ = ExtractBackendAddresses(addresses);
1449
+ fallback_backend_addresses_ = AddNullLbTokenToAddresses(addresses);
1514
1450
  // Make sure that GRPC_ARG_LB_POLICY_NAME is set in channel args,
1515
1451
  // since we use this to trigger the client_load_reporting filter.
1516
1452
  static const char* args_to_remove[] = {GRPC_ARG_LB_POLICY_NAME};
@@ -1520,16 +1456,15 @@ void GrpcLb::ProcessAddressesAndChannelArgsLocked(
1520
1456
  args_ = grpc_channel_args_copy_and_add_and_remove(
1521
1457
  &args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &new_arg, 1);
1522
1458
  // Construct args for balancer channel.
1523
- ServerAddressList balancer_addresses = ExtractBalancerAddresses(addresses);
1459
+ ServerAddressList balancer_addresses = ExtractBalancerAddresses(args);
1524
1460
  grpc_channel_args* lb_channel_args = BuildBalancerChannelArgs(
1525
1461
  balancer_addresses, response_generator_.get(), &args);
1526
1462
  // Create balancer channel if needed.
1527
1463
  if (lb_channel_ == nullptr) {
1528
- char* uri_str;
1529
- gpr_asprintf(&uri_str, "fake:///%s", server_name_);
1530
- lb_channel_ = CreateGrpclbBalancerChannel(uri_str, *lb_channel_args);
1464
+ std::string uri_str = absl::StrCat("fake:///", server_name_);
1465
+ lb_channel_ =
1466
+ CreateGrpclbBalancerChannel(uri_str.c_str(), *lb_channel_args);
1531
1467
  GPR_ASSERT(lb_channel_ != nullptr);
1532
- gpr_free(uri_str);
1533
1468
  }
1534
1469
  // Propagate updates to the LB channel (pick_first) through the fake
1535
1470
  // resolver.
@@ -1539,60 +1474,11 @@ void GrpcLb::ProcessAddressesAndChannelArgsLocked(
1539
1474
  response_generator_->SetResponse(std::move(result));
1540
1475
  }
1541
1476
 
1542
- void GrpcLb::OnBalancerChannelConnectivityChanged(void* arg,
1543
- grpc_error* error) {
1544
- GrpcLb* self = static_cast<GrpcLb*>(arg);
1545
- self->combiner()->Run(
1546
- GRPC_CLOSURE_INIT(&self->lb_channel_on_connectivity_changed_,
1547
- &GrpcLb::OnBalancerChannelConnectivityChangedLocked,
1548
- self, nullptr),
1549
- GRPC_ERROR_REF(error));
1550
- }
1551
-
1552
- void GrpcLb::OnBalancerChannelConnectivityChangedLocked(void* arg,
1553
- grpc_error* /*error*/) {
1554
- GrpcLb* self = static_cast<GrpcLb*>(arg);
1555
- if (!self->shutting_down_ && self->fallback_at_startup_checks_pending_) {
1556
- if (self->lb_channel_connectivity_ != GRPC_CHANNEL_TRANSIENT_FAILURE) {
1557
- // Not in TRANSIENT_FAILURE. Renew connectivity watch.
1558
- grpc_channel_element* client_channel_elem =
1559
- grpc_channel_stack_last_element(
1560
- grpc_channel_get_channel_stack(self->lb_channel_));
1561
- GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
1562
- GRPC_CLOSURE_INIT(&self->lb_channel_on_connectivity_changed_,
1563
- &GrpcLb::OnBalancerChannelConnectivityChanged, self,
1564
- grpc_schedule_on_exec_ctx);
1565
- grpc_client_channel_watch_connectivity_state(
1566
- client_channel_elem,
1567
- grpc_polling_entity_create_from_pollset_set(
1568
- self->interested_parties()),
1569
- &self->lb_channel_connectivity_,
1570
- &self->lb_channel_on_connectivity_changed_, nullptr);
1571
- return; // Early out so we don't drop the ref below.
1572
- }
1573
- // In TRANSIENT_FAILURE. Cancel the fallback timer and go into
1574
- // fallback mode immediately.
1575
- gpr_log(GPR_INFO,
1576
- "[grpclb %p] balancer channel in state TRANSIENT_FAILURE; "
1577
- "entering fallback mode",
1578
- self);
1579
- self->fallback_at_startup_checks_pending_ = false;
1580
- grpc_timer_cancel(&self->lb_fallback_timer_);
1581
- self->fallback_mode_ = true;
1582
- self->CreateOrUpdateChildPolicyLocked();
1583
- }
1584
- // Done watching connectivity state, so drop ref.
1585
- self->Unref(DEBUG_LOCATION, "watch_lb_channel_connectivity");
1586
- }
1587
-
1588
1477
  void GrpcLb::CancelBalancerChannelConnectivityWatchLocked() {
1589
1478
  grpc_channel_element* client_channel_elem = grpc_channel_stack_last_element(
1590
1479
  grpc_channel_get_channel_stack(lb_channel_));
1591
1480
  GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
1592
- grpc_client_channel_watch_connectivity_state(
1593
- client_channel_elem,
1594
- grpc_polling_entity_create_from_pollset_set(interested_parties()),
1595
- nullptr, &lb_channel_on_connectivity_changed_, nullptr);
1481
+ grpc_client_channel_stop_connectivity_watch(client_channel_elem, watcher_);
1596
1482
  }
1597
1483
 
1598
1484
  //
@@ -1631,33 +1517,30 @@ void GrpcLb::StartBalancerCallRetryTimerLocked() {
1631
1517
  // with the callback.
1632
1518
  auto self = Ref(DEBUG_LOCATION, "on_balancer_call_retry_timer");
1633
1519
  self.release();
1634
- GRPC_CLOSURE_INIT(&lb_on_call_retry_, &GrpcLb::OnBalancerCallRetryTimer, this,
1635
- grpc_schedule_on_exec_ctx);
1636
1520
  retry_timer_callback_pending_ = true;
1637
1521
  grpc_timer_init(&lb_call_retry_timer_, next_try, &lb_on_call_retry_);
1638
1522
  }
1639
1523
 
1640
1524
  void GrpcLb::OnBalancerCallRetryTimer(void* arg, grpc_error* error) {
1641
1525
  GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1642
- grpclb_policy->combiner()->Run(
1643
- GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_call_retry_,
1644
- &GrpcLb::OnBalancerCallRetryTimerLocked, grpclb_policy,
1645
- nullptr),
1646
- GRPC_ERROR_REF(error));
1526
+ GRPC_ERROR_REF(error); // ref owned by lambda
1527
+ grpclb_policy->work_serializer()->Run(
1528
+ [grpclb_policy, error]() {
1529
+ grpclb_policy->OnBalancerCallRetryTimerLocked(error);
1530
+ },
1531
+ DEBUG_LOCATION);
1647
1532
  }
1648
1533
 
1649
- void GrpcLb::OnBalancerCallRetryTimerLocked(void* arg, grpc_error* error) {
1650
- GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1651
- grpclb_policy->retry_timer_callback_pending_ = false;
1652
- if (!grpclb_policy->shutting_down_ && error == GRPC_ERROR_NONE &&
1653
- grpclb_policy->lb_calld_ == nullptr) {
1534
+ void GrpcLb::OnBalancerCallRetryTimerLocked(grpc_error* error) {
1535
+ retry_timer_callback_pending_ = false;
1536
+ if (!shutting_down_ && error == GRPC_ERROR_NONE && lb_calld_ == nullptr) {
1654
1537
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1655
- gpr_log(GPR_INFO, "[grpclb %p] Restarting call to LB server",
1656
- grpclb_policy);
1538
+ gpr_log(GPR_INFO, "[grpclb %p] Restarting call to LB server", this);
1657
1539
  }
1658
- grpclb_policy->StartBalancerCallLocked();
1540
+ StartBalancerCallLocked();
1659
1541
  }
1660
- grpclb_policy->Unref(DEBUG_LOCATION, "on_balancer_call_retry_timer");
1542
+ Unref(DEBUG_LOCATION, "on_balancer_call_retry_timer");
1543
+ GRPC_ERROR_UNREF(error);
1661
1544
  }
1662
1545
 
1663
1546
  //
@@ -1684,28 +1567,28 @@ void GrpcLb::MaybeEnterFallbackModeAfterStartup() {
1684
1567
 
1685
1568
  void GrpcLb::OnFallbackTimer(void* arg, grpc_error* error) {
1686
1569
  GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1687
- grpclb_policy->combiner()->Run(
1688
- GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_fallback_,
1689
- &GrpcLb::OnFallbackTimerLocked, grpclb_policy, nullptr),
1690
- GRPC_ERROR_REF(error));
1570
+ GRPC_ERROR_REF(error); // ref owned by lambda
1571
+ grpclb_policy->work_serializer()->Run(
1572
+ [grpclb_policy, error]() { grpclb_policy->OnFallbackTimerLocked(error); },
1573
+ DEBUG_LOCATION);
1691
1574
  }
1692
1575
 
1693
- void GrpcLb::OnFallbackTimerLocked(void* arg, grpc_error* error) {
1694
- GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1576
+ void GrpcLb::OnFallbackTimerLocked(grpc_error* error) {
1695
1577
  // If we receive a serverlist after the timer fires but before this callback
1696
1578
  // actually runs, don't fall back.
1697
- if (grpclb_policy->fallback_at_startup_checks_pending_ &&
1698
- !grpclb_policy->shutting_down_ && error == GRPC_ERROR_NONE) {
1579
+ if (fallback_at_startup_checks_pending_ && !shutting_down_ &&
1580
+ error == GRPC_ERROR_NONE) {
1699
1581
  gpr_log(GPR_INFO,
1700
1582
  "[grpclb %p] No response from balancer after fallback timeout; "
1701
1583
  "entering fallback mode",
1702
- grpclb_policy);
1703
- grpclb_policy->fallback_at_startup_checks_pending_ = false;
1704
- grpclb_policy->CancelBalancerChannelConnectivityWatchLocked();
1705
- grpclb_policy->fallback_mode_ = true;
1706
- grpclb_policy->CreateOrUpdateChildPolicyLocked();
1584
+ this);
1585
+ fallback_at_startup_checks_pending_ = false;
1586
+ CancelBalancerChannelConnectivityWatchLocked();
1587
+ fallback_mode_ = true;
1588
+ CreateOrUpdateChildPolicyLocked();
1707
1589
  }
1708
- grpclb_policy->Unref(DEBUG_LOCATION, "on_fallback_timer");
1590
+ Unref(DEBUG_LOCATION, "on_fallback_timer");
1591
+ GRPC_ERROR_UNREF(error);
1709
1592
  }
1710
1593
 
1711
1594
  //
@@ -1714,7 +1597,7 @@ void GrpcLb::OnFallbackTimerLocked(void* arg, grpc_error* error) {
1714
1597
 
1715
1598
  grpc_channel_args* GrpcLb::CreateChildPolicyArgsLocked(
1716
1599
  bool is_backend_from_grpclb_load_balancer) {
1717
- InlinedVector<grpc_arg, 2> args_to_add;
1600
+ absl::InlinedVector<grpc_arg, 2> args_to_add;
1718
1601
  args_to_add.emplace_back(grpc_channel_arg_integer_create(
1719
1602
  const_cast<char*>(GRPC_ARG_ADDRESS_IS_BACKEND_FROM_GRPCLB_LOAD_BALANCER),
1720
1603
  is_backend_from_grpclb_load_balancer));
@@ -1727,25 +1610,17 @@ grpc_channel_args* GrpcLb::CreateChildPolicyArgsLocked(
1727
1610
  }
1728
1611
 
1729
1612
  OrphanablePtr<LoadBalancingPolicy> GrpcLb::CreateChildPolicyLocked(
1730
- const char* name, const grpc_channel_args* args) {
1731
- Helper* helper = new Helper(Ref());
1613
+ const grpc_channel_args* args) {
1732
1614
  LoadBalancingPolicy::Args lb_policy_args;
1733
- lb_policy_args.combiner = combiner();
1615
+ lb_policy_args.work_serializer = work_serializer();
1734
1616
  lb_policy_args.args = args;
1735
- lb_policy_args.channel_control_helper =
1736
- std::unique_ptr<ChannelControlHelper>(helper);
1617
+ lb_policy_args.channel_control_helper = absl::make_unique<Helper>(Ref());
1737
1618
  OrphanablePtr<LoadBalancingPolicy> lb_policy =
1738
- LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
1739
- name, std::move(lb_policy_args));
1740
- if (GPR_UNLIKELY(lb_policy == nullptr)) {
1741
- gpr_log(GPR_ERROR, "[grpclb %p] Failure creating child policy %s", this,
1742
- name);
1743
- return nullptr;
1744
- }
1745
- helper->set_child(lb_policy.get());
1619
+ MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
1620
+ &grpc_lb_glb_trace);
1746
1621
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1747
- gpr_log(GPR_INFO, "[grpclb %p] Created new child policy %s (%p)", this,
1748
- name, lb_policy.get());
1622
+ gpr_log(GPR_INFO, "[grpclb %p] Created new child policy handler (%p)", this,
1623
+ lb_policy.get());
1749
1624
  }
1750
1625
  // Add the gRPC LB's interested_parties pollset_set to that of the newly
1751
1626
  // created child policy. This will make the child policy progress upon
@@ -1775,98 +1650,17 @@ void GrpcLb::CreateOrUpdateChildPolicyLocked() {
1775
1650
  update_args.args =
1776
1651
  CreateChildPolicyArgsLocked(is_backend_from_grpclb_load_balancer);
1777
1652
  GPR_ASSERT(update_args.args != nullptr);
1778
- update_args.config = child_policy_config_;
1779
- // If the child policy name changes, we need to create a new child
1780
- // policy. When this happens, we leave child_policy_ as-is and store
1781
- // the new child policy in pending_child_policy_. Once the new child
1782
- // policy transitions into state READY, we swap it into child_policy_,
1783
- // replacing the original child policy. So pending_child_policy_ is
1784
- // non-null only between when we apply an update that changes the child
1785
- // policy name and when the new child reports state READY.
1786
- //
1787
- // Updates can arrive at any point during this transition. We always
1788
- // apply updates relative to the most recently created child policy,
1789
- // even if the most recent one is still in pending_child_policy_. This
1790
- // is true both when applying the updates to an existing child policy
1791
- // and when determining whether we need to create a new policy.
1792
- //
1793
- // As a result of this, there are several cases to consider here:
1794
- //
1795
- // 1. We have no existing child policy (i.e., we have started up but
1796
- // have not yet received a serverlist from the balancer or gone
1797
- // into fallback mode; in this case, both child_policy_ and
1798
- // pending_child_policy_ are null). In this case, we create a
1799
- // new child policy and store it in child_policy_.
1800
- //
1801
- // 2. We have an existing child policy and have no pending child policy
1802
- // from a previous update (i.e., either there has not been a
1803
- // previous update that changed the policy name, or we have already
1804
- // finished swapping in the new policy; in this case, child_policy_
1805
- // is non-null but pending_child_policy_ is null). In this case:
1806
- // a. If child_policy_->name() equals child_policy_name, then we
1807
- // update the existing child policy.
1808
- // b. If child_policy_->name() does not equal child_policy_name,
1809
- // we create a new policy. The policy will be stored in
1810
- // pending_child_policy_ and will later be swapped into
1811
- // child_policy_ by the helper when the new child transitions
1812
- // into state READY.
1813
- //
1814
- // 3. We have an existing child policy and have a pending child policy
1815
- // from a previous update (i.e., a previous update set
1816
- // pending_child_policy_ as per case 2b above and that policy has
1817
- // not yet transitioned into state READY and been swapped into
1818
- // child_policy_; in this case, both child_policy_ and
1819
- // pending_child_policy_ are non-null). In this case:
1820
- // a. If pending_child_policy_->name() equals child_policy_name,
1821
- // then we update the existing pending child policy.
1822
- // b. If pending_child_policy->name() does not equal
1823
- // child_policy_name, then we create a new policy. The new
1824
- // policy is stored in pending_child_policy_ (replacing the one
1825
- // that was there before, which will be immediately shut down)
1826
- // and will later be swapped into child_policy_ by the helper
1827
- // when the new child transitions into state READY.
1828
- const char* child_policy_name = child_policy_config_ == nullptr
1829
- ? "round_robin"
1830
- : child_policy_config_->name();
1831
- const bool create_policy =
1832
- // case 1
1833
- child_policy_ == nullptr ||
1834
- // case 2b
1835
- (pending_child_policy_ == nullptr &&
1836
- strcmp(child_policy_->name(), child_policy_name) != 0) ||
1837
- // case 3b
1838
- (pending_child_policy_ != nullptr &&
1839
- strcmp(pending_child_policy_->name(), child_policy_name) != 0);
1840
- LoadBalancingPolicy* policy_to_update = nullptr;
1841
- if (create_policy) {
1842
- // Cases 1, 2b, and 3b: create a new child policy.
1843
- // If child_policy_ is null, we set it (case 1), else we set
1844
- // pending_child_policy_ (cases 2b and 3b).
1845
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1846
- gpr_log(GPR_INFO, "[grpclb %p] Creating new %schild policy %s", this,
1847
- child_policy_ == nullptr ? "" : "pending ", child_policy_name);
1848
- }
1849
- // Swap the policy into place.
1850
- auto& lb_policy =
1851
- child_policy_ == nullptr ? child_policy_ : pending_child_policy_;
1852
- lb_policy = CreateChildPolicyLocked(child_policy_name, update_args.args);
1853
- policy_to_update = lb_policy.get();
1854
- } else {
1855
- // Cases 2a and 3a: update an existing policy.
1856
- // If we have a pending child policy, send the update to the pending
1857
- // policy (case 3a), else send it to the current policy (case 2a).
1858
- policy_to_update = pending_child_policy_ != nullptr
1859
- ? pending_child_policy_.get()
1860
- : child_policy_.get();
1653
+ update_args.config = config_->child_policy();
1654
+ // Create child policy if needed.
1655
+ if (child_policy_ == nullptr) {
1656
+ child_policy_ = CreateChildPolicyLocked(update_args.args);
1861
1657
  }
1862
- GPR_ASSERT(policy_to_update != nullptr);
1863
1658
  // Update the policy.
1864
1659
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1865
- gpr_log(GPR_INFO, "[grpclb %p] Updating %schild policy %p", this,
1866
- policy_to_update == pending_child_policy_.get() ? "pending " : "",
1867
- policy_to_update);
1660
+ gpr_log(GPR_INFO, "[grpclb %p] Updating child policy handler %p", this,
1661
+ child_policy_.get());
1868
1662
  }
1869
- policy_to_update->UpdateLocked(std::move(update_args));
1663
+ child_policy_->UpdateLocked(std::move(update_args));
1870
1664
  }
1871
1665
 
1872
1666
  //
@@ -1886,24 +1680,44 @@ class GrpcLbFactory : public LoadBalancingPolicyFactory {
1886
1680
  const Json& json, grpc_error** error) const override {
1887
1681
  GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
1888
1682
  if (json.type() == Json::Type::JSON_NULL) {
1889
- return MakeRefCounted<GrpcLbConfig>(nullptr);
1683
+ return MakeRefCounted<GrpcLbConfig>(nullptr, "");
1890
1684
  }
1891
1685
  std::vector<grpc_error*> error_list;
1892
- RefCountedPtr<LoadBalancingPolicy::Config> child_policy;
1893
- auto it = json.object_value().find("childPolicy");
1686
+ Json child_policy_config_json_tmp;
1687
+ const Json* child_policy_config_json;
1688
+ std::string service_name;
1689
+ auto it = json.object_value().find("serviceName");
1894
1690
  if (it != json.object_value().end()) {
1895
- grpc_error* parse_error = GRPC_ERROR_NONE;
1896
- child_policy = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1897
- it->second, &parse_error);
1898
- if (parse_error != GRPC_ERROR_NONE) {
1899
- std::vector<grpc_error*> child_errors;
1900
- child_errors.push_back(parse_error);
1901
- error_list.push_back(
1902
- GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors));
1691
+ const Json& service_name_json = it->second;
1692
+ if (service_name_json.type() != Json::Type::STRING) {
1693
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1694
+ "field:serviceName error:type should be string"));
1695
+ } else {
1696
+ service_name = service_name_json.string_value();
1903
1697
  }
1904
1698
  }
1699
+ it = json.object_value().find("childPolicy");
1700
+ if (it == json.object_value().end()) {
1701
+ child_policy_config_json_tmp = Json::Array{Json::Object{
1702
+ {"round_robin", Json::Object()},
1703
+ }};
1704
+ child_policy_config_json = &child_policy_config_json_tmp;
1705
+ } else {
1706
+ child_policy_config_json = &it->second;
1707
+ }
1708
+ grpc_error* parse_error = GRPC_ERROR_NONE;
1709
+ RefCountedPtr<LoadBalancingPolicy::Config> child_policy_config =
1710
+ LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1711
+ *child_policy_config_json, &parse_error);
1712
+ if (parse_error != GRPC_ERROR_NONE) {
1713
+ std::vector<grpc_error*> child_errors;
1714
+ child_errors.push_back(parse_error);
1715
+ error_list.push_back(
1716
+ GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors));
1717
+ }
1905
1718
  if (error_list.empty()) {
1906
- return MakeRefCounted<GrpcLbConfig>(std::move(child_policy));
1719
+ return MakeRefCounted<GrpcLbConfig>(std::move(child_policy_config),
1720
+ std::move(service_name));
1907
1721
  } else {
1908
1722
  *error = GRPC_ERROR_CREATE_FROM_VECTOR("GrpcLb Parser", &error_list);
1909
1723
  return nullptr;