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
@@ -19,73 +19,102 @@
19
19
  #include "src/core/ext/xds/xds_lb_policy_registry.h"
20
20
 
21
21
  #include <stddef.h>
22
+ #include <stdint.h>
22
23
 
23
24
  #include <string>
24
25
  #include <utility>
25
- #include <vector>
26
26
 
27
- #include "absl/memory/memory.h"
28
- #include "absl/status/status.h"
29
27
  #include "absl/strings/str_cat.h"
30
- #include "absl/strings/str_format.h"
28
+ #include "absl/types/optional.h"
29
+ #include "absl/types/variant.h"
31
30
  #include "envoy/config/core/v3/extension.upb.h"
32
31
  #include "envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h"
33
32
  #include "envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h"
34
- #include "google/protobuf/any.upb.h"
35
- #include "google/protobuf/struct.upb.h"
36
- #include "google/protobuf/struct.upbdefs.h"
37
33
  #include "google/protobuf/wrappers.upb.h"
38
- #include "upb/arena.h"
39
- #include "upb/json_encode.h"
40
- #include "upb/status.h"
41
- #include "upb/upb.hpp"
42
- #include "xds/type/v3/typed_struct.upb.h"
43
34
 
44
- #include "src/core/ext/xds/upb_utils.h"
45
35
  #include "src/core/ext/xds/xds_common_types.h"
46
36
  #include "src/core/lib/config/core_configuration.h"
37
+ #include "src/core/lib/gprpp/validation_errors.h"
47
38
  #include "src/core/lib/load_balancing/lb_policy_registry.h"
48
39
 
49
40
  namespace grpc_core {
50
41
 
51
42
  namespace {
52
43
 
44
+ class RoundRobinLbPolicyConfigFactory
45
+ : public XdsLbPolicyRegistry::ConfigFactory {
46
+ public:
47
+ Json::Object ConvertXdsLbPolicyConfig(
48
+ const XdsLbPolicyRegistry* /*registry*/,
49
+ const XdsResourceType::DecodeContext& /*context*/,
50
+ absl::string_view /*configuration*/, ValidationErrors* /*errors*/,
51
+ int /*recursion_depth*/) override {
52
+ return Json::Object{{"round_robin", Json::Object()}};
53
+ }
54
+
55
+ absl::string_view type() override { return Type(); }
56
+
57
+ static absl::string_view Type() {
58
+ return "envoy.extensions.load_balancing_policies.round_robin.v3.RoundRobin";
59
+ }
60
+ };
61
+
53
62
  class RingHashLbPolicyConfigFactory
54
63
  : public XdsLbPolicyRegistry::ConfigFactory {
55
64
  public:
56
- absl::StatusOr<Json::Object> ConvertXdsLbPolicyConfig(
65
+ Json::Object ConvertXdsLbPolicyConfig(
66
+ const XdsLbPolicyRegistry* /*registry*/,
57
67
  const XdsResourceType::DecodeContext& context,
58
- absl::string_view configuration, int /* recursion_depth */) override {
68
+ absl::string_view configuration, ValidationErrors* errors,
69
+ int /*recursion_depth*/) override {
59
70
  const auto* resource =
60
71
  envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_parse(
61
72
  configuration.data(), configuration.size(), context.arena);
62
73
  if (resource == nullptr) {
63
- return absl::InvalidArgumentError(
64
- "Can't decode RingHash loadbalancing policy");
74
+ errors->AddError("can't decode RingHash LB policy config");
75
+ return {};
65
76
  }
66
77
  if (envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_hash_function(
67
78
  resource) !=
68
- envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_XX_HASH) {
69
- return absl::InvalidArgumentError(
70
- "Invalid hash function provided for RingHash loadbalancing policy. "
71
- "Only XX_HASH is supported.");
79
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_XX_HASH &&
80
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_hash_function(
81
+ resource) !=
82
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_DEFAULT_HASH) {
83
+ ValidationErrors::ScopedField field(errors, ".hash_function");
84
+ errors->AddError("unsupported value (must be XX_HASH)");
72
85
  }
73
- Json::Object json;
74
- const auto* min_ring_size =
75
- envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_minimum_ring_size(
86
+ uint64_t max_ring_size = 8388608;
87
+ const auto* uint64_value =
88
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_maximum_ring_size(
76
89
  resource);
77
- if (min_ring_size != nullptr) {
78
- json.emplace("minRingSize",
79
- google_protobuf_UInt64Value_value(min_ring_size));
90
+ if (uint64_value != nullptr) {
91
+ max_ring_size = google_protobuf_UInt64Value_value(uint64_value);
92
+ if (max_ring_size == 0 || max_ring_size > 8388608) {
93
+ ValidationErrors::ScopedField field(errors, ".maximum_ring_size");
94
+ errors->AddError("value must be in the range [1, 8388608]");
95
+ }
80
96
  }
81
- const auto* max_ring_size =
82
- envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_maximum_ring_size(
97
+ uint64_t min_ring_size = 1024;
98
+ uint64_value =
99
+ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_minimum_ring_size(
83
100
  resource);
84
- if (max_ring_size != nullptr) {
85
- json.emplace("maxRingSize",
86
- google_protobuf_UInt64Value_value(max_ring_size));
101
+ if (uint64_value != nullptr) {
102
+ min_ring_size = google_protobuf_UInt64Value_value(uint64_value);
103
+ ValidationErrors::ScopedField field(errors, ".minimum_ring_size");
104
+ if (min_ring_size == 0 || min_ring_size > 8388608) {
105
+ errors->AddError("value must be in the range [1, 8388608]");
106
+ }
107
+ if (min_ring_size > max_ring_size) {
108
+ errors->AddError("cannot be greater than maximum_ring_size");
109
+ }
87
110
  }
88
- return Json::Object{{"ring_hash_experimental", std::move(json)}};
111
+ return Json::Object{
112
+ {"ring_hash_experimental",
113
+ Json::Object{
114
+ {"minRingSize", min_ring_size},
115
+ {"maxRingSize", max_ring_size},
116
+ }},
117
+ };
89
118
  }
90
119
 
91
120
  absl::string_view type() override { return Type(); }
@@ -95,53 +124,34 @@ class RingHashLbPolicyConfigFactory
95
124
  }
96
125
  };
97
126
 
98
- class RoundRobinLbPolicyConfigFactory
99
- : public XdsLbPolicyRegistry::ConfigFactory {
100
- public:
101
- absl::StatusOr<Json::Object> ConvertXdsLbPolicyConfig(
102
- const XdsResourceType::DecodeContext& /* context */,
103
- absl::string_view /* configuration */,
104
- int /* recursion_depth */) override {
105
- return Json::Object{{"round_robin", Json::Object()}};
106
- }
107
-
108
- absl::string_view type() override { return Type(); }
109
-
110
- static absl::string_view Type() {
111
- return "envoy.extensions.load_balancing_policies.round_robin.v3.RoundRobin";
112
- }
113
- };
114
-
115
127
  class WrrLocalityLbPolicyConfigFactory
116
128
  : public XdsLbPolicyRegistry::ConfigFactory {
117
129
  public:
118
- absl::StatusOr<Json::Object> ConvertXdsLbPolicyConfig(
130
+ Json::Object ConvertXdsLbPolicyConfig(
131
+ const XdsLbPolicyRegistry* registry,
119
132
  const XdsResourceType::DecodeContext& context,
120
- absl::string_view configuration, int recursion_depth) override {
133
+ absl::string_view configuration, ValidationErrors* errors,
134
+ int recursion_depth) override {
121
135
  const auto* resource =
122
136
  envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_parse(
123
137
  configuration.data(), configuration.size(), context.arena);
124
138
  if (resource == nullptr) {
125
- return absl::InvalidArgumentError(
126
- "Can't decode WrrLocality loadbalancing policy");
139
+ errors->AddError("can't decode WrrLocality LB policy config");
140
+ return {};
127
141
  }
142
+ ValidationErrors::ScopedField field(errors, ".endpoint_picking_policy");
128
143
  const auto* endpoint_picking_policy =
129
144
  envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_endpoint_picking_policy(
130
145
  resource);
131
146
  if (endpoint_picking_policy == nullptr) {
132
- return absl::InvalidArgumentError(
133
- "WrrLocality: endpoint_picking_policy not found");
134
- }
135
- auto child_policy = XdsLbPolicyRegistry::ConvertXdsLbPolicyConfig(
136
- context, endpoint_picking_policy, recursion_depth + 1);
137
- if (!child_policy.ok()) {
138
- return absl::InvalidArgumentError(
139
- absl::StrCat("Error parsing WrrLocality load balancing policy: ",
140
- child_policy.status().message()));
147
+ errors->AddError("field not present");
148
+ return {};
141
149
  }
150
+ auto child_policy = registry->ConvertXdsLbPolicyConfig(
151
+ context, endpoint_picking_policy, errors, recursion_depth + 1);
142
152
  return Json::Object{
143
153
  {"xds_wrr_locality_experimental",
144
- Json::Object{{"child_policy", *std::move(child_policy)}}}};
154
+ Json::Object{{"childPolicy", std::move(child_policy)}}}};
145
155
  }
146
156
 
147
157
  absl::string_view type() override { return Type(); }
@@ -152,139 +162,82 @@ class WrrLocalityLbPolicyConfigFactory
152
162
  }
153
163
  };
154
164
 
155
- absl::StatusOr<Json> ParseStructToJson(
156
- const XdsResourceType::DecodeContext& context,
157
- const google_protobuf_Struct* resource) {
158
- upb::Status status;
159
- const auto* msg_def = google_protobuf_Struct_getmsgdef(context.symtab);
160
- size_t json_size = upb_JsonEncode(resource, msg_def, context.symtab, 0,
161
- nullptr, 0, status.ptr());
162
- if (json_size == static_cast<size_t>(-1)) {
163
- return absl::InvalidArgumentError(
164
- absl::StrCat("Error parsing google::Protobuf::Struct: ",
165
- upb_Status_ErrorMessage(status.ptr())));
166
- }
167
- void* buf = upb_Arena_Malloc(context.arena, json_size + 1);
168
- upb_JsonEncode(resource, msg_def, context.symtab, 0,
169
- reinterpret_cast<char*>(buf), json_size + 1, status.ptr());
170
- auto json = Json::Parse(reinterpret_cast<char*>(buf));
171
- if (!json.ok()) {
172
- // This should not happen
173
- return absl::InternalError(
174
- absl::StrCat("Error parsing JSON form of google::Protobuf::Struct "
175
- "produced by upb library: ",
176
- json.status().ToString()));
177
- }
178
- return std::move(*json);
179
- }
180
-
181
165
  } // namespace
182
166
 
183
167
  //
184
168
  // XdsLbPolicyRegistry
185
169
  //
186
170
 
187
- absl::StatusOr<Json::Array> XdsLbPolicyRegistry::ConvertXdsLbPolicyConfig(
171
+ XdsLbPolicyRegistry::XdsLbPolicyRegistry() {
172
+ policy_config_factories_.emplace(
173
+ RingHashLbPolicyConfigFactory::Type(),
174
+ std::make_unique<RingHashLbPolicyConfigFactory>());
175
+ policy_config_factories_.emplace(
176
+ RoundRobinLbPolicyConfigFactory::Type(),
177
+ std::make_unique<RoundRobinLbPolicyConfigFactory>());
178
+ policy_config_factories_.emplace(
179
+ WrrLocalityLbPolicyConfigFactory::Type(),
180
+ std::make_unique<WrrLocalityLbPolicyConfigFactory>());
181
+ }
182
+
183
+ Json::Array XdsLbPolicyRegistry::ConvertXdsLbPolicyConfig(
188
184
  const XdsResourceType::DecodeContext& context,
189
185
  const envoy_config_cluster_v3_LoadBalancingPolicy* lb_policy,
190
- int recursion_depth) {
186
+ ValidationErrors* errors, int recursion_depth) const {
191
187
  constexpr int kMaxRecursionDepth = 16;
192
188
  if (recursion_depth >= kMaxRecursionDepth) {
193
- return absl::InvalidArgumentError(
194
- absl::StrFormat("LoadBalancingPolicy configuration has a recursion "
195
- "depth of more than %d.",
196
- kMaxRecursionDepth));
189
+ errors->AddError(
190
+ absl::StrCat("exceeded max recursion depth of ", kMaxRecursionDepth));
191
+ return {};
197
192
  }
193
+ const size_t original_error_size = errors->size();
198
194
  size_t size = 0;
199
195
  const auto* policies =
200
196
  envoy_config_cluster_v3_LoadBalancingPolicy_policies(lb_policy, &size);
201
197
  for (size_t i = 0; i < size; ++i) {
202
- absl::StatusOr<Json::Object> policy;
198
+ ValidationErrors::ScopedField field(
199
+ errors, absl::StrCat(".policies[", i, "].typed_extension_config"));
203
200
  const auto* typed_extension_config =
204
201
  envoy_config_cluster_v3_LoadBalancingPolicy_Policy_typed_extension_config(
205
202
  policies[i]);
206
203
  if (typed_extension_config == nullptr) {
207
- return absl::InvalidArgumentError(
208
- "Error parsing LoadBalancingPolicy::Policy - Missing "
209
- "typed_extension_config field");
204
+ errors->AddError("field not present");
205
+ return {};
210
206
  }
207
+ ValidationErrors::ScopedField field2(errors, ".typed_config");
211
208
  const auto* typed_config =
212
209
  envoy_config_core_v3_TypedExtensionConfig_typed_config(
213
210
  typed_extension_config);
214
211
  if (typed_config == nullptr) {
215
- return absl::InvalidArgumentError(
216
- "Error parsing LoadBalancingPolicy::Policy - Missing "
217
- "TypedExtensionConfig::typed_config field");
212
+ errors->AddError("field not present");
213
+ return {};
218
214
  }
219
- auto type = ExtractExtensionTypeName(context, typed_config);
220
- if (!type.ok()) {
221
- return absl::InvalidArgumentError(absl::StrCat(
222
- "Error parsing "
223
- "LoadBalancingPolicy::Policy::TypedExtensionConfig::typed_config: ",
224
- type.status().message()));
225
- }
226
- absl::string_view value =
227
- UpbStringToAbsl(google_protobuf_Any_value(typed_config));
228
- auto config_factory_it = Get()->policy_config_factories_.find(type->type);
229
- if (config_factory_it != Get()->policy_config_factories_.end()) {
230
- policy = config_factory_it->second->ConvertXdsLbPolicyConfig(
231
- context, value, recursion_depth);
232
- if (!policy.ok()) {
233
- return absl::InvalidArgumentError(
234
- absl::StrCat("Error parsing "
235
- "LoadBalancingPolicy::Policy::TypedExtensionConfig::"
236
- "typed_config to JSON: ",
237
- policy.status().message()));
238
- }
239
- } else if (type->typed_struct != nullptr) {
240
- // Custom lb policy config
241
- std::string custom_type = std::string(type->type);
242
- if (!CoreConfiguration::Get()
243
- .lb_policy_registry()
244
- .LoadBalancingPolicyExists(custom_type.c_str(), nullptr)) {
245
- // Skip unsupported custom lb policy.
246
- continue;
215
+ auto extension = ExtractXdsExtension(context, typed_config, errors);
216
+ if (!extension.has_value()) return {};
217
+ // Check for registered LB policy type.
218
+ absl::string_view* serialized_value =
219
+ absl::get_if<absl::string_view>(&extension->value);
220
+ if (serialized_value != nullptr) {
221
+ auto config_factory_it = policy_config_factories_.find(extension->type);
222
+ if (config_factory_it != policy_config_factories_.end()) {
223
+ return Json::Array{config_factory_it->second->ConvertXdsLbPolicyConfig(
224
+ this, context, *serialized_value, errors, recursion_depth)};
247
225
  }
248
- // Convert typed struct to json.
249
- auto value = xds_type_v3_TypedStruct_value(type->typed_struct);
250
- if (value == nullptr) {
251
- policy = Json::Object{{std::move(custom_type), Json() /* null */}};
252
- } else {
253
- auto parsed_value = ParseStructToJson(context, value);
254
- if (!parsed_value.ok()) {
255
- return absl::InvalidArgumentError(absl::StrCat(
256
- "Error parsing LoadBalancingPolicy: Custom Policy: ", custom_type,
257
- ": ", parsed_value.status().message()));
258
- }
259
- policy =
260
- Json::Object{{std::move(custom_type), *(std::move(parsed_value))}};
261
- }
262
- } else {
263
- // Unsupported type. Skipping entry.
264
- continue;
265
226
  }
266
- return Json::Array{std::move(policy.value())};
227
+ // Check for custom LB policy type.
228
+ Json* json = absl::get_if<Json>(&extension->value);
229
+ if (json != nullptr &&
230
+ CoreConfiguration::Get().lb_policy_registry().LoadBalancingPolicyExists(
231
+ extension->type, nullptr)) {
232
+ return Json::Array{
233
+ Json::Object{{std::string(extension->type), std::move(*json)}}};
234
+ }
235
+ // Unsupported type. Continue to next entry.
267
236
  }
268
- return absl::InvalidArgumentError(
269
- "No supported load balancing policy config found.");
270
- }
271
-
272
- XdsLbPolicyRegistry::XdsLbPolicyRegistry() {
273
- policy_config_factories_.emplace(
274
- RingHashLbPolicyConfigFactory::Type(),
275
- absl::make_unique<RingHashLbPolicyConfigFactory>());
276
- policy_config_factories_.emplace(
277
- RoundRobinLbPolicyConfigFactory::Type(),
278
- absl::make_unique<RoundRobinLbPolicyConfigFactory>());
279
- policy_config_factories_.emplace(
280
- WrrLocalityLbPolicyConfigFactory::Type(),
281
- absl::make_unique<WrrLocalityLbPolicyConfigFactory>());
282
- }
283
-
284
- XdsLbPolicyRegistry* XdsLbPolicyRegistry::Get() {
285
- // This is thread-safe since C++11
286
- static XdsLbPolicyRegistry* instance = new XdsLbPolicyRegistry();
287
- return instance;
237
+ if (original_error_size == errors->size()) {
238
+ errors->AddError("no supported load balancing policy config found");
239
+ }
240
+ return {};
288
241
  }
289
242
 
290
243
  } // namespace grpc_core
@@ -22,11 +22,11 @@
22
22
  #include <map>
23
23
  #include <memory>
24
24
 
25
- #include "absl/status/statusor.h"
26
25
  #include "absl/strings/string_view.h"
27
26
  #include "envoy/config/cluster/v3/cluster.upb.h"
28
27
 
29
28
  #include "src/core/ext/xds/xds_resource_type.h"
29
+ #include "src/core/lib/gprpp/validation_errors.h"
30
30
  #include "src/core/lib/json/json.h"
31
31
 
32
32
  namespace grpc_core {
@@ -37,29 +37,28 @@ class XdsLbPolicyRegistry {
37
37
  public:
38
38
  class ConfigFactory {
39
39
  public:
40
- virtual ~ConfigFactory() {}
41
- virtual absl::StatusOr<Json::Object> ConvertXdsLbPolicyConfig(
40
+ virtual ~ConfigFactory() = default;
41
+ virtual Json::Object ConvertXdsLbPolicyConfig(
42
+ const XdsLbPolicyRegistry* registry,
42
43
  const XdsResourceType::DecodeContext& context,
43
- absl::string_view configuration, int recursion_depth) = 0;
44
-
44
+ absl::string_view configuration, ValidationErrors* errors,
45
+ int recursion_depth) = 0;
45
46
  virtual absl::string_view type() = 0;
46
47
  };
47
48
 
49
+ XdsLbPolicyRegistry();
50
+
48
51
  // Converts an xDS cluster load balancing policy message to gRPC's JSON
49
52
  // format. An error is returned if none of the lb policies in the list are
50
53
  // supported, or if a supported lb policy configuration conversion fails. \a
51
54
  // recursion_depth indicates the current depth of the tree if lb_policy
52
55
  // configuration recursively holds other lb policies.
53
- static absl::StatusOr<Json::Array> ConvertXdsLbPolicyConfig(
56
+ Json::Array ConvertXdsLbPolicyConfig(
54
57
  const XdsResourceType::DecodeContext& context,
55
58
  const envoy_config_cluster_v3_LoadBalancingPolicy* lb_policy,
56
- int recursion_depth = 0);
59
+ ValidationErrors* errors, int recursion_depth = 0) const;
57
60
 
58
61
  private:
59
- XdsLbPolicyRegistry();
60
-
61
- static XdsLbPolicyRegistry* Get();
62
-
63
62
  // A map of config factories that goes from the type of the lb policy config
64
63
  // to the config factory.
65
64
  std::map<absl::string_view /* Owned by ConfigFactory */,