grpc 1.50.0 → 1.51.0

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 (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +131 -42
  3. data/include/grpc/event_engine/event_engine.h +10 -3
  4. data/include/grpc/event_engine/slice_buffer.h +17 -0
  5. data/include/grpc/grpc.h +0 -10
  6. data/include/grpc/impl/codegen/grpc_types.h +1 -5
  7. data/include/grpc/impl/codegen/port_platform.h +0 -3
  8. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  11. data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
  12. data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
  13. data/src/core/ext/filters/client_channel/client_channel.h +3 -4
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
  15. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  17. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  18. data/src/core/ext/filters/client_channel/connector.h +1 -1
  19. data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
  20. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  21. data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
  22. data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
  32. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
  34. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
  36. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
  53. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  54. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
  55. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
  59. data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
  60. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  61. data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
  62. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
  63. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  64. data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
  65. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  70. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  71. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
  73. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  74. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
  75. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
  77. data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
  78. data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
  79. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
  86. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
  92. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  93. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
  94. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
  96. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
  97. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
  98. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
  99. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
  102. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
  103. data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
  104. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
  105. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  106. data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
  107. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
  108. data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
  109. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  110. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  111. data/src/core/ext/xds/xds_api.cc +15 -68
  112. data/src/core/ext/xds/xds_api.h +3 -7
  113. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  116. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  117. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  118. data/src/core/ext/xds/xds_client.cc +122 -90
  119. data/src/core/ext/xds/xds_client.h +7 -2
  120. data/src/core/ext/xds/xds_client_grpc.cc +5 -24
  121. data/src/core/ext/xds/xds_cluster.cc +291 -183
  122. data/src/core/ext/xds/xds_cluster.h +11 -15
  123. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
  124. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
  125. data/src/core/ext/xds/xds_common_types.cc +208 -141
  126. data/src/core/ext/xds/xds_common_types.h +19 -13
  127. data/src/core/ext/xds/xds_endpoint.cc +214 -129
  128. data/src/core/ext/xds/xds_endpoint.h +4 -7
  129. data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
  130. data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
  131. data/src/core/ext/xds/xds_http_filters.cc +60 -73
  132. data/src/core/ext/xds/xds_http_filters.h +67 -19
  133. data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
  134. data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
  135. data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
  136. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  137. data/src/core/ext/xds/xds_listener.cc +459 -417
  138. data/src/core/ext/xds/xds_listener.h +43 -47
  139. data/src/core/ext/xds/xds_resource_type.h +3 -11
  140. data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
  141. data/src/core/ext/xds/xds_route_config.cc +94 -80
  142. data/src/core/ext/xds/xds_route_config.h +10 -10
  143. data/src/core/ext/xds/xds_routing.cc +2 -1
  144. data/src/core/ext/xds/xds_routing.h +2 -0
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
  146. data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
  147. data/src/core/lib/address_utils/parse_address.cc +11 -10
  148. data/src/core/lib/channel/channel_args.h +16 -1
  149. data/src/core/lib/channel/channel_stack.cc +23 -20
  150. data/src/core/lib/channel/channel_stack.h +17 -4
  151. data/src/core/lib/channel/channel_stack_builder.cc +4 -7
  152. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  153. data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
  154. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  155. data/src/core/lib/channel/channel_trace.cc +4 -5
  156. data/src/core/lib/channel/channelz.cc +1 -1
  157. data/src/core/lib/channel/connected_channel.cc +695 -35
  158. data/src/core/lib/channel/connected_channel.h +0 -4
  159. data/src/core/lib/channel/promise_based_filter.cc +1004 -140
  160. data/src/core/lib/channel/promise_based_filter.h +364 -87
  161. data/src/core/lib/compression/message_compress.cc +5 -5
  162. data/src/core/lib/debug/event_log.cc +88 -0
  163. data/src/core/lib/debug/event_log.h +81 -0
  164. data/src/core/lib/debug/histogram_view.cc +69 -0
  165. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  166. data/src/core/lib/debug/stats.cc +22 -119
  167. data/src/core/lib/debug/stats.h +29 -35
  168. data/src/core/lib/debug/stats_data.cc +224 -73
  169. data/src/core/lib/debug/stats_data.h +263 -122
  170. data/src/core/lib/event_engine/common_closures.h +71 -0
  171. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  172. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  173. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  174. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  175. data/src/core/lib/event_engine/poller.h +10 -4
  176. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  177. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  178. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  179. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  180. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  181. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  182. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
  183. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  184. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  185. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  186. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  187. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  188. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  189. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
  190. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  191. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  192. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  193. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  194. data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
  195. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
  196. data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
  197. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  198. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  199. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  200. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  201. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  202. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  203. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  204. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  205. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  206. data/src/core/lib/event_engine/slice.cc +7 -6
  207. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  208. data/src/core/lib/event_engine/thread_pool.cc +106 -25
  209. data/src/core/lib/event_engine/thread_pool.h +32 -9
  210. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  211. data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
  212. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  213. data/src/core/lib/experiments/config.cc +1 -1
  214. data/src/core/lib/experiments/experiments.cc +13 -2
  215. data/src/core/lib/experiments/experiments.h +8 -1
  216. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  217. data/src/core/lib/gpr/log_linux.cc +3 -4
  218. data/src/core/lib/gpr/string.h +1 -1
  219. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  220. data/src/core/lib/gprpp/load_file.cc +75 -0
  221. data/src/core/lib/gprpp/load_file.h +33 -0
  222. data/src/core/lib/gprpp/per_cpu.h +46 -0
  223. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  224. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  225. data/src/core/lib/gprpp/status_helper.h +1 -3
  226. data/src/core/lib/gprpp/strerror.cc +41 -0
  227. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
  228. data/src/core/lib/gprpp/thd_windows.cc +1 -2
  229. data/src/core/lib/gprpp/time.cc +3 -4
  230. data/src/core/lib/gprpp/time.h +13 -2
  231. data/src/core/lib/gprpp/validation_errors.h +18 -1
  232. data/src/core/lib/http/httpcli.cc +40 -44
  233. data/src/core/lib/http/httpcli.h +6 -5
  234. data/src/core/lib/http/httpcli_security_connector.cc +4 -6
  235. data/src/core/lib/http/parser.cc +54 -65
  236. data/src/core/lib/iomgr/buffer_list.cc +105 -116
  237. data/src/core/lib/iomgr/buffer_list.h +60 -44
  238. data/src/core/lib/iomgr/call_combiner.cc +11 -10
  239. data/src/core/lib/iomgr/call_combiner.h +3 -4
  240. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  241. data/src/core/lib/iomgr/closure.h +49 -5
  242. data/src/core/lib/iomgr/combiner.cc +2 -2
  243. data/src/core/lib/iomgr/endpoint.h +1 -1
  244. data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
  245. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  246. data/src/core/lib/iomgr/error.cc +27 -42
  247. data/src/core/lib/iomgr/error.h +22 -152
  248. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  249. data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
  250. data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
  251. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  252. data/src/core/lib/iomgr/exec_ctx.h +2 -3
  253. data/src/core/lib/iomgr/executor.cc +1 -2
  254. data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
  255. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  256. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  257. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
  258. data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
  259. data/src/core/lib/iomgr/load_file.cc +5 -9
  260. data/src/core/lib/iomgr/lockfree_event.cc +10 -10
  261. data/src/core/lib/iomgr/pollset_windows.cc +4 -4
  262. data/src/core/lib/iomgr/python_util.h +2 -2
  263. data/src/core/lib/iomgr/resolve_address.cc +8 -3
  264. data/src/core/lib/iomgr/resolve_address.h +3 -4
  265. data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
  266. data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
  267. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  268. data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
  269. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  270. data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
  271. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
  272. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  273. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  274. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
  275. data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
  276. data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
  277. data/src/core/lib/iomgr/tcp_posix.cc +92 -108
  278. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
  279. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  280. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
  281. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
  282. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  283. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
  284. data/src/core/lib/iomgr/tcp_windows.cc +27 -34
  285. data/src/core/lib/iomgr/timer.h +8 -8
  286. data/src/core/lib/iomgr/timer_generic.cc +9 -15
  287. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  288. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
  289. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  290. data/src/core/lib/json/json_channel_args.h +42 -0
  291. data/src/core/lib/json/json_object_loader.cc +7 -2
  292. data/src/core/lib/json/json_object_loader.h +22 -0
  293. data/src/core/lib/json/json_util.cc +5 -5
  294. data/src/core/lib/json/json_util.h +4 -4
  295. data/src/core/lib/load_balancing/lb_policy.cc +1 -1
  296. data/src/core/lib/load_balancing/lb_policy.h +4 -0
  297. data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
  298. data/src/core/lib/matchers/matchers.cc +3 -4
  299. data/src/core/lib/promise/activity.cc +16 -2
  300. data/src/core/lib/promise/activity.h +38 -15
  301. data/src/core/lib/promise/arena_promise.h +80 -51
  302. data/src/core/lib/promise/context.h +13 -6
  303. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  304. data/src/core/lib/promise/detail/promise_factory.h +58 -10
  305. data/src/core/lib/promise/detail/status.h +28 -0
  306. data/src/core/lib/promise/detail/switch.h +1455 -0
  307. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
  308. data/src/core/lib/promise/for_each.h +129 -0
  309. data/src/core/lib/promise/loop.h +7 -5
  310. data/src/core/lib/promise/map_pipe.h +87 -0
  311. data/src/core/lib/promise/pipe.cc +19 -0
  312. data/src/core/lib/promise/pipe.h +505 -0
  313. data/src/core/lib/promise/poll.h +13 -0
  314. data/src/core/lib/promise/seq.h +3 -5
  315. data/src/core/lib/promise/sleep.cc +5 -4
  316. data/src/core/lib/promise/sleep.h +1 -2
  317. data/src/core/lib/promise/try_concurrently.h +341 -0
  318. data/src/core/lib/promise/try_seq.h +10 -13
  319. data/src/core/lib/resolver/server_address.cc +1 -0
  320. data/src/core/lib/resolver/server_address.h +1 -3
  321. data/src/core/lib/resource_quota/api.cc +0 -1
  322. data/src/core/lib/resource_quota/arena.cc +19 -0
  323. data/src/core/lib/resource_quota/arena.h +89 -0
  324. data/src/core/lib/resource_quota/memory_quota.cc +1 -0
  325. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  326. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  327. data/src/core/lib/security/authorization/matchers.cc +25 -22
  328. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  329. data/src/core/lib/security/context/security_context.h +10 -0
  330. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  331. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  333. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  334. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  335. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
  341. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  342. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
  345. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
  346. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  350. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
  354. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
  355. data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
  356. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
  357. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
  358. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
  359. data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
  360. data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
  361. data/src/core/lib/security/transport/security_handshaker.cc +53 -53
  362. data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
  363. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  364. data/src/core/lib/security/util/json_util.cc +4 -5
  365. data/src/core/lib/service_config/service_config.h +1 -1
  366. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  367. data/src/core/lib/service_config/service_config_impl.h +14 -17
  368. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  369. data/src/core/lib/service_config/service_config_parser.h +14 -10
  370. data/src/core/lib/slice/b64.cc +2 -2
  371. data/src/core/lib/slice/slice.cc +7 -1
  372. data/src/core/lib/slice/slice.h +19 -6
  373. data/src/core/lib/slice/slice_buffer.cc +13 -14
  374. data/src/core/lib/slice/slice_internal.h +13 -21
  375. data/src/core/lib/slice/slice_refcount.h +34 -19
  376. data/src/core/lib/surface/byte_buffer.cc +3 -4
  377. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  378. data/src/core/lib/surface/call.cc +1366 -239
  379. data/src/core/lib/surface/call.h +44 -0
  380. data/src/core/lib/surface/call_details.cc +3 -3
  381. data/src/core/lib/surface/call_trace.cc +113 -0
  382. data/src/core/lib/surface/call_trace.h +30 -0
  383. data/src/core/lib/surface/channel.cc +44 -49
  384. data/src/core/lib/surface/channel.h +9 -1
  385. data/src/core/lib/surface/channel_ping.cc +1 -1
  386. data/src/core/lib/surface/channel_stack_type.cc +4 -0
  387. data/src/core/lib/surface/channel_stack_type.h +2 -0
  388. data/src/core/lib/surface/completion_queue.cc +38 -52
  389. data/src/core/lib/surface/init.cc +8 -39
  390. data/src/core/lib/surface/init_internally.h +8 -0
  391. data/src/core/lib/surface/lame_client.cc +10 -8
  392. data/src/core/lib/surface/server.cc +48 -70
  393. data/src/core/lib/surface/server.h +3 -4
  394. data/src/core/lib/surface/validate_metadata.cc +11 -12
  395. data/src/core/lib/surface/version.cc +2 -2
  396. data/src/core/lib/transport/connectivity_state.cc +2 -2
  397. data/src/core/lib/transport/error_utils.cc +34 -28
  398. data/src/core/lib/transport/error_utils.h +3 -3
  399. data/src/core/lib/transport/handshaker.cc +14 -14
  400. data/src/core/lib/transport/handshaker.h +1 -1
  401. data/src/core/lib/transport/handshaker_factory.h +26 -0
  402. data/src/core/lib/transport/handshaker_registry.cc +8 -2
  403. data/src/core/lib/transport/handshaker_registry.h +3 -4
  404. data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
  405. data/src/core/lib/transport/metadata_batch.h +17 -1
  406. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  407. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  408. data/src/core/lib/transport/transport.cc +63 -17
  409. data/src/core/lib/transport/transport.h +64 -68
  410. data/src/core/lib/transport/transport_impl.h +1 -1
  411. data/src/core/lib/transport/transport_op_string.cc +7 -6
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
  413. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
  416. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  417. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  418. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  419. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  420. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
  421. data/src/core/tsi/fake_transport_security.cc +3 -3
  422. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
  423. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  424. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
  425. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
  426. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
  427. data/src/ruby/lib/grpc/version.rb +1 -1
  428. data/src/ruby/spec/channel_spec.rb +0 -43
  429. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  430. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  431. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  432. data/third_party/zlib/compress.c +3 -3
  433. data/third_party/zlib/crc32.c +21 -12
  434. data/third_party/zlib/deflate.c +112 -106
  435. data/third_party/zlib/deflate.h +2 -2
  436. data/third_party/zlib/gzlib.c +1 -1
  437. data/third_party/zlib/gzread.c +3 -5
  438. data/third_party/zlib/gzwrite.c +1 -1
  439. data/third_party/zlib/infback.c +10 -7
  440. data/third_party/zlib/inflate.c +5 -2
  441. data/third_party/zlib/inftrees.c +2 -2
  442. data/third_party/zlib/inftrees.h +1 -1
  443. data/third_party/zlib/trees.c +61 -62
  444. data/third_party/zlib/uncompr.c +2 -2
  445. data/third_party/zlib/zconf.h +16 -3
  446. data/third_party/zlib/zlib.h +10 -10
  447. data/third_party/zlib/zutil.c +9 -7
  448. data/third_party/zlib/zutil.h +1 -0
  449. metadata +55 -18
  450. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  451. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  452. data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
  453. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  454. data/src/core/lib/gpr/murmur_hash.h +0 -29
  455. data/src/core/lib/gpr/tls.h +0 -156
  456. data/src/core/lib/promise/call_push_pull.h +0 -148
  457. data/src/core/lib/slice/slice_api.cc +0 -39
  458. data/src/core/lib/slice/slice_buffer_api.cc +0 -35
  459. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -0,0 +1,364 @@
1
+ //
2
+ // Copyright 2022 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include <cstdint>
20
+ #include <map>
21
+ #include <memory>
22
+ #include <string>
23
+ #include <utility>
24
+ #include <vector>
25
+
26
+ #include "absl/status/status.h"
27
+ #include "absl/status/statusor.h"
28
+ #include "absl/strings/str_cat.h"
29
+ #include "absl/strings/string_view.h"
30
+
31
+ #include <grpc/event_engine/event_engine.h>
32
+ #include <grpc/impl/codegen/connectivity_state.h>
33
+ #include <grpc/support/log.h>
34
+
35
+ #include "src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.h"
36
+ #include "src/core/ext/xds/xds_client_stats.h"
37
+ #include "src/core/lib/channel/channel_args.h"
38
+ #include "src/core/lib/config/core_configuration.h"
39
+ #include "src/core/lib/debug/trace.h"
40
+ #include "src/core/lib/gprpp/debug_location.h"
41
+ #include "src/core/lib/gprpp/orphanable.h"
42
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
43
+ #include "src/core/lib/gprpp/validation_errors.h"
44
+ #include "src/core/lib/iomgr/pollset_set.h"
45
+ #include "src/core/lib/json/json.h"
46
+ #include "src/core/lib/json/json_args.h"
47
+ #include "src/core/lib/json/json_object_loader.h"
48
+ #include "src/core/lib/load_balancing/lb_policy.h"
49
+ #include "src/core/lib/load_balancing/lb_policy_factory.h"
50
+ #include "src/core/lib/load_balancing/lb_policy_registry.h"
51
+ #include "src/core/lib/load_balancing/subchannel_interface.h"
52
+ #include "src/core/lib/resolver/server_address.h"
53
+ #include "src/core/lib/transport/connectivity_state.h"
54
+
55
+ namespace grpc_core {
56
+
57
+ TraceFlag grpc_xds_wrr_locality_lb_trace(false, "xds_wrr_locality_lb");
58
+
59
+ namespace {
60
+
61
+ constexpr absl::string_view kXdsWrrLocality = "xds_wrr_locality_experimental";
62
+
63
+ // Config for xds_wrr_locality LB policy.
64
+ class XdsWrrLocalityLbConfig : public LoadBalancingPolicy::Config {
65
+ public:
66
+ XdsWrrLocalityLbConfig() = default;
67
+
68
+ XdsWrrLocalityLbConfig(const XdsWrrLocalityLbConfig&) = delete;
69
+ XdsWrrLocalityLbConfig& operator=(const XdsWrrLocalityLbConfig&) = delete;
70
+
71
+ XdsWrrLocalityLbConfig(XdsWrrLocalityLbConfig&& other) = delete;
72
+ XdsWrrLocalityLbConfig& operator=(XdsWrrLocalityLbConfig&& other) = delete;
73
+
74
+ absl::string_view name() const override { return kXdsWrrLocality; }
75
+
76
+ const Json& child_config() const { return child_config_; }
77
+
78
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
79
+ // Note: The "childPolicy" field requires custom processing, so
80
+ // it's handled in JsonPostLoad() instead.
81
+ static const auto* loader =
82
+ JsonObjectLoader<XdsWrrLocalityLbConfig>().Finish();
83
+ return loader;
84
+ }
85
+
86
+ void JsonPostLoad(const Json& json, const JsonArgs&,
87
+ ValidationErrors* errors) {
88
+ ValidationErrors::ScopedField field(errors, ".childPolicy");
89
+ auto it = json.object_value().find("childPolicy");
90
+ if (it == json.object_value().end()) {
91
+ errors->AddError("field not present");
92
+ return;
93
+ }
94
+ auto lb_config =
95
+ CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
96
+ it->second);
97
+ if (!lb_config.ok()) {
98
+ errors->AddError(lb_config.status().message());
99
+ return;
100
+ }
101
+ child_config_ = it->second;
102
+ }
103
+
104
+ private:
105
+ Json child_config_;
106
+ };
107
+
108
+ // xds_wrr_locality LB policy.
109
+ class XdsWrrLocalityLb : public LoadBalancingPolicy {
110
+ public:
111
+ explicit XdsWrrLocalityLb(Args args);
112
+
113
+ absl::string_view name() const override { return kXdsWrrLocality; }
114
+
115
+ absl::Status UpdateLocked(UpdateArgs args) override;
116
+ void ExitIdleLocked() override;
117
+ void ResetBackoffLocked() override;
118
+
119
+ private:
120
+ class Helper : public ChannelControlHelper {
121
+ public:
122
+ explicit Helper(RefCountedPtr<XdsWrrLocalityLb> xds_wrr_locality)
123
+ : xds_wrr_locality_(std::move(xds_wrr_locality)) {}
124
+
125
+ ~Helper() override { xds_wrr_locality_.reset(DEBUG_LOCATION, "Helper"); }
126
+
127
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
128
+ ServerAddress address, const ChannelArgs& args) override;
129
+ void UpdateState(grpc_connectivity_state state, const absl::Status& status,
130
+ std::unique_ptr<SubchannelPicker> picker) override;
131
+ void RequestReresolution() override;
132
+ absl::string_view GetAuthority() override;
133
+ grpc_event_engine::experimental::EventEngine* GetEventEngine() override;
134
+ void AddTraceEvent(TraceSeverity severity,
135
+ absl::string_view message) override;
136
+
137
+ private:
138
+ RefCountedPtr<XdsWrrLocalityLb> xds_wrr_locality_;
139
+ };
140
+
141
+ ~XdsWrrLocalityLb() override;
142
+
143
+ void ShutdownLocked() override;
144
+
145
+ OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
146
+ const ChannelArgs& args);
147
+
148
+ OrphanablePtr<LoadBalancingPolicy> child_policy_;
149
+ };
150
+
151
+ //
152
+ // XdsWrrLocalityLb
153
+ //
154
+
155
+ XdsWrrLocalityLb::XdsWrrLocalityLb(Args args)
156
+ : LoadBalancingPolicy(std::move(args)) {}
157
+
158
+ XdsWrrLocalityLb::~XdsWrrLocalityLb() {
159
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_wrr_locality_lb_trace)) {
160
+ gpr_log(GPR_INFO, "[xds_wrr_locality_lb %p] destroying", this);
161
+ }
162
+ }
163
+
164
+ void XdsWrrLocalityLb::ShutdownLocked() {
165
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_wrr_locality_lb_trace)) {
166
+ gpr_log(GPR_INFO, "[xds_wrr_locality_lb %p] shutting down", this);
167
+ }
168
+ if (child_policy_ != nullptr) {
169
+ grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
170
+ interested_parties());
171
+ child_policy_.reset();
172
+ }
173
+ }
174
+
175
+ void XdsWrrLocalityLb::ExitIdleLocked() {
176
+ if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
177
+ }
178
+
179
+ void XdsWrrLocalityLb::ResetBackoffLocked() {
180
+ if (child_policy_ != nullptr) child_policy_->ResetBackoffLocked();
181
+ }
182
+
183
+ absl::Status XdsWrrLocalityLb::UpdateLocked(UpdateArgs args) {
184
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_wrr_locality_lb_trace)) {
185
+ gpr_log(GPR_INFO, "[xds_wrr_locality_lb %p] Received update", this);
186
+ }
187
+ RefCountedPtr<XdsWrrLocalityLbConfig> config = std::move(args.config);
188
+ // Scan the addresses to find the weight for each locality.
189
+ std::map<std::string, uint32_t> locality_weights;
190
+ if (args.addresses.ok()) {
191
+ for (const auto& address : *args.addresses) {
192
+ auto* attribute = static_cast<const XdsLocalityAttribute*>(
193
+ address.GetAttribute(kXdsLocalityNameAttributeKey));
194
+ if (attribute != nullptr) {
195
+ auto p = locality_weights.emplace(
196
+ attribute->locality_name()->AsHumanReadableString(),
197
+ attribute->weight());
198
+ if (!p.second && p.first->second != attribute->weight()) {
199
+ gpr_log(GPR_ERROR,
200
+ "INTERNAL ERROR: xds_wrr_locality found different weights "
201
+ "for locality %s (%d vs %d); using first value",
202
+ p.first->first.c_str(), p.first->second, attribute->weight());
203
+ }
204
+ }
205
+ }
206
+ }
207
+ // Construct the config for the weighted_target policy.
208
+ Json::Object weighted_targets;
209
+ for (const auto& p : locality_weights) {
210
+ const std::string& locality_name = p.first;
211
+ uint32_t weight = p.second;
212
+ // Add weighted target entry.
213
+ weighted_targets[locality_name] = Json::Object{
214
+ {"weight", weight},
215
+ {"childPolicy", config->child_config()},
216
+ };
217
+ }
218
+ Json child_config_json = Json::Array{
219
+ Json::Object{
220
+ {"weighted_target_experimental",
221
+ Json::Object{
222
+ {"targets", std::move(weighted_targets)},
223
+ }},
224
+ },
225
+ };
226
+ // Parse config.
227
+ auto child_config =
228
+ CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
229
+ child_config_json);
230
+ if (!child_config.ok()) {
231
+ // This should never happen, but if it does, we basically have no
232
+ // way to fix it, so we put the channel in TRANSIENT_FAILURE.
233
+ gpr_log(GPR_ERROR,
234
+ "[xds_wrr_locality %p] error parsing generated child policy "
235
+ "config -- putting channel in TRANSIENT_FAILURE: %s",
236
+ this, child_config.status().ToString().c_str());
237
+ absl::Status status = absl::InternalError(absl::StrCat(
238
+ "xds_wrr_locality LB policy: error parsing generated child policy "
239
+ "config: ",
240
+ child_config.status().ToString()));
241
+ channel_control_helper()->UpdateState(
242
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
243
+ std::make_unique<TransientFailurePicker>(status));
244
+ return status;
245
+ }
246
+ // Create child policy if needed (i.e., on first update).
247
+ if (child_policy_ == nullptr) {
248
+ child_policy_ = CreateChildPolicyLocked(args.args);
249
+ }
250
+ // Construct update args.
251
+ UpdateArgs update_args;
252
+ update_args.addresses = std::move(args.addresses);
253
+ update_args.config = std::move(*child_config);
254
+ update_args.resolution_note = std::move(args.resolution_note);
255
+ update_args.args = std::move(args.args);
256
+ // Update the policy.
257
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_wrr_locality_lb_trace)) {
258
+ gpr_log(GPR_INFO, "[xds_wrr_locality_lb %p] updating child policy %p", this,
259
+ child_policy_.get());
260
+ }
261
+ return child_policy_->UpdateLocked(std::move(update_args));
262
+ }
263
+
264
+ OrphanablePtr<LoadBalancingPolicy> XdsWrrLocalityLb::CreateChildPolicyLocked(
265
+ const ChannelArgs& args) {
266
+ LoadBalancingPolicy::Args lb_policy_args;
267
+ lb_policy_args.work_serializer = work_serializer();
268
+ lb_policy_args.args = args;
269
+ lb_policy_args.channel_control_helper =
270
+ std::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
271
+ auto lb_policy =
272
+ CoreConfiguration::Get().lb_policy_registry().CreateLoadBalancingPolicy(
273
+ "weighted_target_experimental", std::move(lb_policy_args));
274
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_wrr_locality_lb_trace)) {
275
+ gpr_log(GPR_INFO, "[xds_wrr_locality_lb %p] created new child policy %p",
276
+ this, lb_policy.get());
277
+ }
278
+ // Add our interested_parties pollset_set to that of the newly created
279
+ // child policy. This will make the child policy progress upon activity on
280
+ // this LB policy, which in turn is tied to the application's call.
281
+ grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
282
+ interested_parties());
283
+ return lb_policy;
284
+ }
285
+
286
+ //
287
+ // XdsWrrLocalityLb::Helper
288
+ //
289
+
290
+ RefCountedPtr<SubchannelInterface> XdsWrrLocalityLb::Helper::CreateSubchannel(
291
+ ServerAddress address, const ChannelArgs& args) {
292
+ return xds_wrr_locality_->channel_control_helper()->CreateSubchannel(
293
+ std::move(address), args);
294
+ }
295
+
296
+ void XdsWrrLocalityLb::Helper::UpdateState(
297
+ grpc_connectivity_state state, const absl::Status& status,
298
+ std::unique_ptr<SubchannelPicker> picker) {
299
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_wrr_locality_lb_trace)) {
300
+ gpr_log(
301
+ GPR_INFO,
302
+ "[xds_wrr_locality_lb %p] update from child: state=%s (%s) picker=%p",
303
+ xds_wrr_locality_.get(), ConnectivityStateName(state),
304
+ status.ToString().c_str(), picker.get());
305
+ }
306
+ xds_wrr_locality_->channel_control_helper()->UpdateState(state, status,
307
+ std::move(picker));
308
+ }
309
+
310
+ void XdsWrrLocalityLb::Helper::RequestReresolution() {
311
+ xds_wrr_locality_->channel_control_helper()->RequestReresolution();
312
+ }
313
+
314
+ absl::string_view XdsWrrLocalityLb::Helper::GetAuthority() {
315
+ return xds_wrr_locality_->channel_control_helper()->GetAuthority();
316
+ }
317
+
318
+ grpc_event_engine::experimental::EventEngine*
319
+ XdsWrrLocalityLb::Helper::GetEventEngine() {
320
+ return xds_wrr_locality_->channel_control_helper()->GetEventEngine();
321
+ }
322
+
323
+ void XdsWrrLocalityLb::Helper::AddTraceEvent(TraceSeverity severity,
324
+ absl::string_view message) {
325
+ xds_wrr_locality_->channel_control_helper()->AddTraceEvent(severity, message);
326
+ }
327
+
328
+ //
329
+ // factory
330
+ //
331
+
332
+ class XdsWrrLocalityLbFactory : public LoadBalancingPolicyFactory {
333
+ public:
334
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
335
+ LoadBalancingPolicy::Args args) const override {
336
+ return MakeOrphanable<XdsWrrLocalityLb>(std::move(args));
337
+ }
338
+
339
+ absl::string_view name() const override { return kXdsWrrLocality; }
340
+
341
+ absl::StatusOr<RefCountedPtr<LoadBalancingPolicy::Config>>
342
+ ParseLoadBalancingConfig(const Json& json) const override {
343
+ if (json.type() == Json::Type::JSON_NULL) {
344
+ // xds_wrr_locality was mentioned as a policy in the deprecated
345
+ // loadBalancingPolicy field or in the client API.
346
+ return absl::InvalidArgumentError(
347
+ "field:loadBalancingPolicy error:xds_wrr_locality policy requires "
348
+ "configuration. Please use loadBalancingConfig field of service "
349
+ "config instead.");
350
+ }
351
+ return LoadRefCountedFromJson<XdsWrrLocalityLbConfig>(
352
+ json, JsonArgs(),
353
+ "errors validating xds_wrr_locality LB policy config");
354
+ }
355
+ };
356
+
357
+ } // namespace
358
+
359
+ void RegisterXdsWrrLocalityLbPolicy(CoreConfiguration::Builder* builder) {
360
+ builder->lb_policy_registry()->RegisterLoadBalancingPolicyFactory(
361
+ std::make_unique<XdsWrrLocalityLbFactory>());
362
+ }
363
+
364
+ } // namespace grpc_core
@@ -16,6 +16,9 @@
16
16
 
17
17
  #include <algorithm>
18
18
 
19
+ #include "absl/status/status.h"
20
+
21
+ #include "src/core/lib/gprpp/status_helper.h"
19
22
  #include "src/core/lib/iomgr/port.h" // IWYU pragma: keep
20
23
 
21
24
  #ifdef GRPC_HAVE_UNIX_SOCKET
@@ -28,7 +31,6 @@
28
31
  #include <string>
29
32
  #include <utility>
30
33
 
31
- #include "absl/memory/memory.h"
32
34
  #include "absl/status/statusor.h"
33
35
  #include "absl/strings/str_cat.h"
34
36
  #include "absl/strings/string_view.h"
@@ -44,7 +46,6 @@
44
46
  #include "src/core/lib/iomgr/resolved_address.h"
45
47
  #include "src/core/lib/resolver/resolver.h"
46
48
  #include "src/core/lib/resolver/resolver_factory.h"
47
- #include "src/core/lib/resolver/resolver_registry.h"
48
49
  #include "src/core/lib/resolver/server_address.h"
49
50
  #include "src/core/lib/uri/uri_parser.h"
50
51
 
@@ -94,7 +95,7 @@ class BinderResolverFactory : public ResolverFactory {
94
95
  absl::string_view path, grpc_resolved_address* resolved_addr) {
95
96
  path = absl::StripPrefix(path, "/");
96
97
  if (path.empty()) {
97
- return GRPC_ERROR_CREATE_FROM_CPP_STRING("path is empty");
98
+ return GRPC_ERROR_CREATE("path is empty");
98
99
  }
99
100
  // Store parsed path in a unix socket so it can be reinterpreted as
100
101
  // sockaddr. An invalid address family (AF_MAX) is set to make sure it won't
@@ -106,14 +107,14 @@ class BinderResolverFactory : public ResolverFactory {
106
107
  static_assert(sizeof(un->sun_path) >= 101,
107
108
  "unix socket path size is unexpectedly short");
108
109
  if (path.size() + 1 > sizeof(un->sun_path)) {
109
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
110
+ return GRPC_ERROR_CREATE(
110
111
  absl::StrCat(path, " is too long to be handled"));
111
112
  }
112
113
  // `un` has already be set to zero, no need to append null after the string
113
114
  memcpy(un->sun_path, path.data(), path.size());
114
115
  resolved_addr->len =
115
116
  static_cast<socklen_t>(sizeof(un->sun_family) + path.size() + 1);
116
- return GRPC_ERROR_NONE;
117
+ return absl::OkStatus();
117
118
  }
118
119
 
119
120
  static bool ParseUri(const URI& uri, ServerAddressList* addresses) {
@@ -124,9 +125,8 @@ class BinderResolverFactory : public ResolverFactory {
124
125
  return false;
125
126
  }
126
127
  grpc_error_handle error = BinderAddrPopulate(uri.path(), &addr);
127
- if (!GRPC_ERROR_IS_NONE(error)) {
128
- gpr_log(GPR_ERROR, "%s", grpc_error_std_string(error).c_str());
129
- GRPC_ERROR_UNREF(error);
128
+ if (!error.ok()) {
129
+ gpr_log(GPR_ERROR, "%s", StatusToString(error).c_str());
130
130
  return false;
131
131
  }
132
132
  }
@@ -141,7 +141,7 @@ class BinderResolverFactory : public ResolverFactory {
141
141
 
142
142
  void RegisterBinderResolver(CoreConfiguration::Builder* builder) {
143
143
  builder->resolver_registry()->RegisterResolverFactory(
144
- absl::make_unique<BinderResolverFactory>());
144
+ std::make_unique<BinderResolverFactory>());
145
145
  }
146
146
 
147
147
  } // namespace grpc_core
@@ -28,14 +28,12 @@
28
28
  #include <vector>
29
29
 
30
30
  #include "absl/base/thread_annotations.h"
31
- #include "absl/memory/memory.h"
32
31
  #include "absl/status/status.h"
33
32
  #include "absl/status/statusor.h"
34
33
  #include "absl/strings/string_view.h"
35
34
  #include "absl/strings/strip.h"
36
35
  #include "absl/types/optional.h"
37
36
 
38
- #include <grpc/event_engine/event_engine.h>
39
37
  #include <grpc/impl/codegen/grpc_types.h>
40
38
  #include <grpc/support/alloc.h>
41
39
  #include <grpc/support/log.h>
@@ -47,6 +45,7 @@
47
45
  #include "src/core/lib/gprpp/memory.h"
48
46
  #include "src/core/lib/gprpp/orphanable.h"
49
47
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
48
+ #include "src/core/lib/gprpp/status_helper.h"
50
49
  #include "src/core/lib/gprpp/sync.h"
51
50
  #include "src/core/lib/gprpp/time.h"
52
51
  #include "src/core/lib/iomgr/closure.h"
@@ -80,7 +79,6 @@
80
79
  #include "src/core/lib/iomgr/gethostname.h"
81
80
  #include "src/core/lib/iomgr/resolve_address.h"
82
81
  #include "src/core/lib/json/json.h"
83
- #include "src/core/lib/resolver/resolver_registry.h"
84
82
  #include "src/core/lib/resolver/server_address.h"
85
83
  #include "src/core/lib/service_config/service_config_impl.h"
86
84
  #include "src/core/lib/transport/error_utils.h"
@@ -142,7 +140,7 @@ class AresClientChannelDNSResolver : public PollingResolver {
142
140
  &service_config_json_, resolver_->query_timeout_ms_));
143
141
  GRPC_CARES_TRACE_LOG(
144
142
  "resolver:%p Started resolving TXT records. txt_request_:%p",
145
- resolver_.get(), srv_request_.get());
143
+ resolver_.get(), txt_request_.get());
146
144
  }
147
145
  }
148
146
 
@@ -259,7 +257,7 @@ std::string ChooseServiceConfig(char* service_config_choice_json,
259
257
  return "";
260
258
  }
261
259
  if (json->type() != Json::Type::ARRAY) {
262
- *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
260
+ *error = GRPC_ERROR_CREATE(
263
261
  "Service Config Choices, error: should be of type array");
264
262
  return "";
265
263
  }
@@ -267,7 +265,7 @@ std::string ChooseServiceConfig(char* service_config_choice_json,
267
265
  std::vector<grpc_error_handle> error_list;
268
266
  for (const Json& choice : json->array_value()) {
269
267
  if (choice.type() != Json::Type::OBJECT) {
270
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
268
+ error_list.push_back(GRPC_ERROR_CREATE(
271
269
  "Service Config Choice, error: should be of type object"));
272
270
  continue;
273
271
  }
@@ -275,7 +273,7 @@ std::string ChooseServiceConfig(char* service_config_choice_json,
275
273
  auto it = choice.object_value().find("clientLanguage");
276
274
  if (it != choice.object_value().end()) {
277
275
  if (it->second.type() != Json::Type::ARRAY) {
278
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
276
+ error_list.push_back(GRPC_ERROR_CREATE(
279
277
  "field:clientLanguage error:should be of type array"));
280
278
  } else if (!ValueInJsonArray(it->second.array_value(), "c++")) {
281
279
  continue;
@@ -285,7 +283,7 @@ std::string ChooseServiceConfig(char* service_config_choice_json,
285
283
  it = choice.object_value().find("clientHostname");
286
284
  if (it != choice.object_value().end()) {
287
285
  if (it->second.type() != Json::Type::ARRAY) {
288
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
286
+ error_list.push_back(GRPC_ERROR_CREATE(
289
287
  "field:clientHostname error:should be of type array"));
290
288
  } else {
291
289
  char* hostname = grpc_gethostname();
@@ -299,13 +297,13 @@ std::string ChooseServiceConfig(char* service_config_choice_json,
299
297
  it = choice.object_value().find("percentage");
300
298
  if (it != choice.object_value().end()) {
301
299
  if (it->second.type() != Json::Type::NUMBER) {
302
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
300
+ error_list.push_back(GRPC_ERROR_CREATE(
303
301
  "field:percentage error:should be of type number"));
304
302
  } else {
305
303
  int random_pct = rand() % 100;
306
304
  int percentage;
307
305
  if (sscanf(it->second.string_value().c_str(), "%d", &percentage) != 1) {
308
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
306
+ error_list.push_back(GRPC_ERROR_CREATE(
309
307
  "field:percentage error:should be of type integer"));
310
308
  } else if (random_pct > percentage || percentage == 0) {
311
309
  continue;
@@ -315,10 +313,10 @@ std::string ChooseServiceConfig(char* service_config_choice_json,
315
313
  // Found service config.
316
314
  it = choice.object_value().find("serviceConfig");
317
315
  if (it == choice.object_value().end()) {
318
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
316
+ error_list.push_back(GRPC_ERROR_CREATE(
319
317
  "field:serviceConfig error:required field missing"));
320
318
  } else if (it->second.type() != Json::Type::OBJECT) {
321
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
319
+ error_list.push_back(GRPC_ERROR_CREATE(
322
320
  "field:serviceConfig error:should be of type object"));
323
321
  } else if (service_config == nullptr) {
324
322
  service_config = &it->second;
@@ -407,14 +405,13 @@ AresClientChannelDNSResolver::AresRequestWrapper::OnResolvedLocked(
407
405
  result.addresses = ServerAddressList();
408
406
  }
409
407
  if (service_config_json_ != nullptr) {
410
- grpc_error_handle service_config_error = GRPC_ERROR_NONE;
408
+ grpc_error_handle service_config_error;
411
409
  std::string service_config_string =
412
410
  ChooseServiceConfig(service_config_json_, &service_config_error);
413
- if (!GRPC_ERROR_IS_NONE(service_config_error)) {
411
+ if (!service_config_error.ok()) {
414
412
  result.service_config = absl::UnavailableError(
415
413
  absl::StrCat("failed to parse service config: ",
416
- grpc_error_std_string(service_config_error)));
417
- GRPC_ERROR_UNREF(service_config_error);
414
+ StatusToString(service_config_error)));
418
415
  } else if (!service_config_string.empty()) {
419
416
  GRPC_CARES_TRACE_LOG("resolver:%p selected service config choice: %s",
420
417
  this, service_config_string.c_str());
@@ -433,9 +430,9 @@ AresClientChannelDNSResolver::AresRequestWrapper::OnResolvedLocked(
433
430
  }
434
431
  } else {
435
432
  GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed: %s", this,
436
- grpc_error_std_string(error).c_str());
433
+ StatusToString(error).c_str());
437
434
  std::string error_message;
438
- grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION, &error_message);
435
+ grpc_error_get_str(error, StatusStrProperty::kDescription, &error_message);
439
436
  absl::Status status = absl::UnavailableError(
440
437
  absl::StrCat("DNS resolution failed for ", resolver_->name_to_resolve(),
441
438
  ": ", error_message));
@@ -508,7 +505,7 @@ class AresDNSResolver : public DNSResolver {
508
505
  grpc_cancel_ares_request(grpc_ares_request_.get());
509
506
  } else {
510
507
  completed_ = true;
511
- OnDnsLookupDone(this, GRPC_ERROR_CANCELLED);
508
+ OnDnsLookupDone(this, absl::CancelledError());
512
509
  }
513
510
  grpc_pollset_set_del_pollset_set(pollset_set_, interested_parties_);
514
511
  return true;
@@ -618,7 +615,7 @@ class AresDNSResolver : public DNSResolver {
618
615
 
619
616
  void OnComplete(grpc_error_handle error) override {
620
617
  GRPC_CARES_TRACE_LOG("AresHostnameRequest:%p OnComplete", this);
621
- if (!GRPC_ERROR_IS_NONE(error)) {
618
+ if (!error.ok()) {
622
619
  on_resolve_address_done_(grpc_error_to_absl_status(error));
623
620
  return;
624
621
  }
@@ -668,7 +665,7 @@ class AresDNSResolver : public DNSResolver {
668
665
 
669
666
  void OnComplete(grpc_error_handle error) override {
670
667
  GRPC_CARES_TRACE_LOG("AresSRVRequest:%p OnComplete", this);
671
- if (!GRPC_ERROR_IS_NONE(error)) {
668
+ if (!error.ok()) {
672
669
  on_resolve_address_done_(grpc_error_to_absl_status(error));
673
670
  return;
674
671
  }
@@ -716,7 +713,7 @@ class AresDNSResolver : public DNSResolver {
716
713
 
717
714
  void OnComplete(grpc_error_handle error) override {
718
715
  GRPC_CARES_TRACE_LOG("AresSRVRequest:%p OnComplete", this);
719
- if (!GRPC_ERROR_IS_NONE(error)) {
716
+ if (!error.ok()) {
720
717
  on_resolved_(grpc_error_to_absl_status(error));
721
718
  return;
722
719
  }
@@ -729,12 +726,6 @@ class AresDNSResolver : public DNSResolver {
729
726
  const std::function<void(absl::StatusOr<std::string>)> on_resolved_;
730
727
  };
731
728
 
732
- // gets the singleton instance, possibly creating it first
733
- static AresDNSResolver* GetOrCreate() {
734
- static AresDNSResolver* instance = new AresDNSResolver();
735
- return instance;
736
- }
737
-
738
729
  TaskHandle LookupHostname(
739
730
  std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
740
731
  on_resolved,
@@ -812,7 +803,7 @@ class AresDNSResolver : public DNSResolver {
812
803
  }
813
804
 
814
805
  // the previous default DNS resolver, used to delegate blocking DNS calls to
815
- DNSResolver* default_resolver_ = GetDNSResolver();
806
+ std::shared_ptr<DNSResolver> default_resolver_ = GetDNSResolver();
816
807
  Mutex mu_;
817
808
  grpc_event_engine::experimental::LookupTaskHandleSet open_requests_
818
809
  ABSL_GUARDED_BY(mu_);
@@ -839,7 +830,7 @@ bool UseAresDnsResolver() {
839
830
  void RegisterAresDnsResolver(CoreConfiguration::Builder* builder) {
840
831
  if (UseAresDnsResolver()) {
841
832
  builder->resolver_registry()->RegisterResolverFactory(
842
- absl::make_unique<AresClientChannelDNSResolverFactory>());
833
+ std::make_unique<AresClientChannelDNSResolverFactory>());
843
834
  }
844
835
  }
845
836
 
@@ -849,11 +840,11 @@ void grpc_resolver_dns_ares_init() {
849
840
  if (grpc_core::UseAresDnsResolver()) {
850
841
  address_sorting_init();
851
842
  grpc_error_handle error = grpc_ares_init();
852
- if (!GRPC_ERROR_IS_NONE(error)) {
843
+ if (!error.ok()) {
853
844
  GRPC_LOG_IF_ERROR("grpc_ares_init() failed", error);
854
845
  return;
855
846
  }
856
- grpc_core::SetDNSResolver(grpc_core::AresDNSResolver::GetOrCreate());
847
+ grpc_core::ResetDNSResolver(std::make_unique<grpc_core::AresDNSResolver>());
857
848
  }
858
849
  }
859
850
 
@@ -21,7 +21,6 @@
21
21
  #include <string>
22
22
 
23
23
  #include "absl/base/thread_annotations.h"
24
- #include "absl/memory/memory.h"
25
24
 
26
25
  #include "src/core/lib/gprpp/sync.h"
27
26
  #include "src/core/lib/iomgr/closure.h"
@@ -108,7 +107,7 @@ class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory {
108
107
  };
109
108
 
110
109
  std::unique_ptr<GrpcPolledFdFactory> NewGrpcPolledFdFactory(Mutex* /* mu */) {
111
- return absl::make_unique<GrpcPolledFdFactoryPosix>();
110
+ return std::make_unique<GrpcPolledFdFactoryPosix>();
112
111
  }
113
112
 
114
113
  } // namespace grpc_core