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
@@ -22,12 +22,12 @@
22
22
 
23
23
  #include <utility>
24
24
 
25
- #include "absl/memory/memory.h"
26
25
  #include "absl/status/status.h"
27
26
  #include "absl/status/statusor.h"
28
27
  #include "absl/strings/str_cat.h"
29
28
  #include "absl/strings/str_join.h"
30
29
  #include "absl/strings/strip.h"
30
+ #include "absl/types/variant.h"
31
31
  #include "envoy/config/cluster/v3/circuit_breaker.upb.h"
32
32
  #include "envoy/config/cluster/v3/cluster.upb.h"
33
33
  #include "envoy/config/cluster/v3/cluster.upbdefs.h"
@@ -48,14 +48,32 @@
48
48
  #include <grpc/support/log.h>
49
49
 
50
50
  #include "src/core/ext/xds/upb_utils.h"
51
+ #include "src/core/ext/xds/xds_client.h"
51
52
  #include "src/core/ext/xds/xds_common_types.h"
53
+ #include "src/core/ext/xds/xds_lb_policy_registry.h"
52
54
  #include "src/core/ext/xds/xds_resource_type.h"
55
+ #include "src/core/lib/config/core_configuration.h"
53
56
  #include "src/core/lib/debug/trace.h"
57
+ #include "src/core/lib/gpr/string.h"
58
+ #include "src/core/lib/gprpp/env.h"
54
59
  #include "src/core/lib/gprpp/host_port.h"
60
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
55
61
  #include "src/core/lib/gprpp/time.h"
62
+ #include "src/core/lib/gprpp/validation_errors.h"
63
+ #include "src/core/lib/load_balancing/lb_policy_registry.h"
64
+ #include "src/core/lib/matchers/matchers.h"
56
65
 
57
66
  namespace grpc_core {
58
67
 
68
+ // TODO(roth): Remove once custom LB policy support is no longer experimental.
69
+ bool XdsCustomLbPolicyEnabled() {
70
+ auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_CUSTOM_LB_CONFIG");
71
+ if (!value.has_value()) return false;
72
+ bool parsed_value;
73
+ bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
74
+ return parse_succeeded && parsed_value;
75
+ }
76
+
59
77
  //
60
78
  // XdsClusterResource
61
79
  //
@@ -87,11 +105,8 @@ std::string XdsClusterResource::ToString() const {
87
105
  contents.push_back(absl::StrCat("lrs_load_reporting_server_name=",
88
106
  lrs_load_reporting_server->server_uri()));
89
107
  }
90
- contents.push_back(absl::StrCat("lb_policy=", lb_policy));
91
- if (lb_policy == "RING_HASH") {
92
- contents.push_back(absl::StrCat("min_ring_size=", min_ring_size));
93
- contents.push_back(absl::StrCat("max_ring_size=", max_ring_size));
94
- }
108
+ contents.push_back(
109
+ absl::StrCat("lb_policy_config=", Json{lb_policy_config}.Dump()));
95
110
  contents.push_back(
96
111
  absl::StrCat("max_concurrent_requests=", max_concurrent_requests));
97
112
  return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
@@ -103,260 +118,338 @@ std::string XdsClusterResource::ToString() const {
103
118
 
104
119
  namespace {
105
120
 
106
- absl::StatusOr<CommonTlsContext> UpstreamTlsContextParse(
121
+ CommonTlsContext UpstreamTlsContextParse(
107
122
  const XdsResourceType::DecodeContext& context,
108
- const envoy_config_core_v3_TransportSocket* transport_socket) {
109
- auto* typed_config =
123
+ const envoy_config_core_v3_TransportSocket* transport_socket,
124
+ ValidationErrors* errors) {
125
+ ValidationErrors::ScopedField field(errors, ".typed_config");
126
+ const auto* typed_config =
110
127
  envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
111
- if (typed_config == nullptr) {
112
- return absl::InvalidArgumentError("transport_socket.typed_config not set");
113
- }
114
- absl::string_view type_url = absl::StripPrefix(
115
- UpbStringToAbsl(google_protobuf_Any_type_url(typed_config)),
116
- "type.googleapis.com/");
117
- if (type_url !=
128
+ auto extension = ExtractXdsExtension(context, typed_config, errors);
129
+ if (!extension.has_value()) return {};
130
+ if (extension->type !=
118
131
  "envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext") {
119
- return absl::InvalidArgumentError(
120
- absl::StrCat("Unrecognized transport socket type: ", type_url));
132
+ ValidationErrors::ScopedField field(errors, ".type_url");
133
+ errors->AddError("unsupported transport socket type");
134
+ return {};
121
135
  }
122
- const upb_StringView encoded_upstream_tls_context =
123
- google_protobuf_Any_value(typed_config);
124
- auto* upstream_tls_context =
136
+ absl::string_view* serialized_upstream_tls_context =
137
+ absl::get_if<absl::string_view>(&extension->value);
138
+ if (serialized_upstream_tls_context == nullptr) {
139
+ errors->AddError("can't decode UpstreamTlsContext");
140
+ return {};
141
+ }
142
+ const auto* upstream_tls_context =
125
143
  envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
126
- encoded_upstream_tls_context.data, encoded_upstream_tls_context.size,
127
- context.arena);
144
+ serialized_upstream_tls_context->data(),
145
+ serialized_upstream_tls_context->size(), context.arena);
128
146
  if (upstream_tls_context == nullptr) {
129
- return absl::InvalidArgumentError("Can't decode upstream tls context.");
147
+ errors->AddError("can't decode UpstreamTlsContext");
148
+ return {};
130
149
  }
131
- auto* common_tls_context_proto =
150
+ ValidationErrors::ScopedField field3(errors, ".common_tls_context");
151
+ const auto* common_tls_context_proto =
132
152
  envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
133
153
  upstream_tls_context);
134
154
  CommonTlsContext common_tls_context;
135
155
  if (common_tls_context_proto != nullptr) {
136
- auto common_context =
137
- CommonTlsContext::Parse(context, common_tls_context_proto);
138
- if (!common_context.ok()) {
139
- return absl::InvalidArgumentError(
140
- absl::StrCat("Error parsing UpstreamTlsContext: ",
141
- common_context.status().message()));
142
- }
143
- common_tls_context = std::move(*common_context);
156
+ common_tls_context =
157
+ CommonTlsContext::Parse(context, common_tls_context_proto, errors);
144
158
  }
145
159
  if (common_tls_context.certificate_validation_context
146
160
  .ca_certificate_provider_instance.instance_name.empty()) {
147
- return absl::InvalidArgumentError(
148
- "UpstreamTlsContext: TLS configuration provided but no "
149
- "ca_certificate_provider_instance found.");
161
+ errors->AddError("no CA certificate provider instance configured");
150
162
  }
151
163
  return common_tls_context;
152
164
  }
153
165
 
154
- absl::Status CdsLogicalDnsParse(const envoy_config_cluster_v3_Cluster* cluster,
155
- XdsClusterResource* cds_update) {
166
+ void EdsConfigParse(const envoy_config_cluster_v3_Cluster* cluster,
167
+ XdsClusterResource* cds_update, ValidationErrors* errors) {
168
+ ValidationErrors::ScopedField field(errors, ".eds_cluster_config");
169
+ const envoy_config_cluster_v3_Cluster_EdsClusterConfig* eds_cluster_config =
170
+ envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
171
+ if (eds_cluster_config == nullptr) {
172
+ errors->AddError("field not present");
173
+ } else {
174
+ ValidationErrors::ScopedField field(errors, ".eds_config");
175
+ const envoy_config_core_v3_ConfigSource* eds_config =
176
+ envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
177
+ eds_cluster_config);
178
+ if (eds_config == nullptr) {
179
+ errors->AddError("field not present");
180
+ } else {
181
+ if (!envoy_config_core_v3_ConfigSource_has_ads(eds_config) &&
182
+ !envoy_config_core_v3_ConfigSource_has_self(eds_config)) {
183
+ errors->AddError("ConfigSource is not ads or self");
184
+ }
185
+ // Record EDS service_name (if any).
186
+ upb_StringView service_name =
187
+ envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
188
+ eds_cluster_config);
189
+ if (service_name.size != 0) {
190
+ cds_update->eds_service_name = UpbStringToStdString(service_name);
191
+ }
192
+ }
193
+ }
194
+ }
195
+
196
+ void LogicalDnsParse(const envoy_config_cluster_v3_Cluster* cluster,
197
+ XdsClusterResource* cds_update, ValidationErrors* errors) {
198
+ ValidationErrors::ScopedField field(errors, ".load_assignment");
156
199
  const auto* load_assignment =
157
200
  envoy_config_cluster_v3_Cluster_load_assignment(cluster);
158
201
  if (load_assignment == nullptr) {
159
- return absl::InvalidArgumentError(
160
- "load_assignment not present for LOGICAL_DNS cluster");
202
+ errors->AddError("field not present for LOGICAL_DNS cluster");
203
+ return;
161
204
  }
205
+ ValidationErrors::ScopedField field2(errors, ".endpoints");
162
206
  size_t num_localities;
163
207
  const auto* const* localities =
164
208
  envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(load_assignment,
165
209
  &num_localities);
166
210
  if (num_localities != 1) {
167
- return absl::InvalidArgumentError(
168
- absl::StrCat("load_assignment for LOGICAL_DNS cluster must have "
169
- "exactly one locality, found ",
170
- num_localities));
211
+ errors->AddError(absl::StrCat(
212
+ "must contain exactly one locality for LOGICAL_DNS cluster, found ",
213
+ num_localities));
214
+ return;
171
215
  }
216
+ ValidationErrors::ScopedField field3(errors, "[0].lb_endpoints");
172
217
  size_t num_endpoints;
173
218
  const auto* const* endpoints =
174
219
  envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(localities[0],
175
220
  &num_endpoints);
176
221
  if (num_endpoints != 1) {
177
- return absl::InvalidArgumentError(
178
- absl::StrCat("locality for LOGICAL_DNS cluster must have "
179
- "exactly one endpoint, found ",
180
- num_endpoints));
222
+ errors->AddError(absl::StrCat(
223
+ "must contain exactly one endpoint for LOGICAL_DNS cluster, found ",
224
+ num_endpoints));
225
+ return;
181
226
  }
227
+ ValidationErrors::ScopedField field4(errors, "[0].endpoint");
182
228
  const auto* endpoint =
183
229
  envoy_config_endpoint_v3_LbEndpoint_endpoint(endpoints[0]);
184
230
  if (endpoint == nullptr) {
185
- return absl::InvalidArgumentError("LbEndpoint endpoint field not set");
231
+ errors->AddError("field not present");
232
+ return;
186
233
  }
234
+ ValidationErrors::ScopedField field5(errors, ".address");
187
235
  const auto* address = envoy_config_endpoint_v3_Endpoint_address(endpoint);
188
236
  if (address == nullptr) {
189
- return absl::InvalidArgumentError("Endpoint address field not set");
237
+ errors->AddError("field not present");
238
+ return;
190
239
  }
240
+ ValidationErrors::ScopedField field6(errors, ".socket_address");
191
241
  const auto* socket_address =
192
242
  envoy_config_core_v3_Address_socket_address(address);
193
243
  if (socket_address == nullptr) {
194
- return absl::InvalidArgumentError("Address socket_address field not set");
244
+ errors->AddError("field not present");
245
+ return;
195
246
  }
196
247
  if (envoy_config_core_v3_SocketAddress_resolver_name(socket_address).size !=
197
248
  0) {
198
- return absl::InvalidArgumentError(
249
+ ValidationErrors::ScopedField field(errors, ".resolver_name");
250
+ errors->AddError(
199
251
  "LOGICAL_DNS clusters must NOT have a custom resolver name set");
200
252
  }
201
253
  absl::string_view address_str = UpbStringToAbsl(
202
254
  envoy_config_core_v3_SocketAddress_address(socket_address));
203
255
  if (address_str.empty()) {
204
- return absl::InvalidArgumentError("SocketAddress address field not set");
256
+ ValidationErrors::ScopedField field(errors, ".address");
257
+ errors->AddError("field not present");
205
258
  }
206
259
  if (!envoy_config_core_v3_SocketAddress_has_port_value(socket_address)) {
207
- return absl::InvalidArgumentError("SocketAddress port_value field not set");
260
+ ValidationErrors::ScopedField field(errors, ".port_value");
261
+ errors->AddError("field not present");
208
262
  }
209
263
  cds_update->dns_hostname = JoinHostPort(
210
264
  address_str,
211
265
  envoy_config_core_v3_SocketAddress_port_value(socket_address));
212
- return absl::OkStatus();
213
266
  }
214
267
 
215
- absl::StatusOr<XdsClusterResource> CdsResourceParse(
216
- const XdsResourceType::DecodeContext& context,
217
- const envoy_config_cluster_v3_Cluster* cluster, bool /*is_v2*/) {
218
- XdsClusterResource cds_update;
219
- std::vector<std::string> errors;
220
- // Check the cluster_discovery_type.
221
- if (!envoy_config_cluster_v3_Cluster_has_type(cluster) &&
222
- !envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
223
- errors.emplace_back("DiscoveryType not found.");
224
- } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
225
- envoy_config_cluster_v3_Cluster_EDS) {
226
- cds_update.cluster_type = XdsClusterResource::ClusterType::EDS;
227
- // Check the EDS config source.
228
- const envoy_config_cluster_v3_Cluster_EdsClusterConfig* eds_cluster_config =
229
- envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
230
- const envoy_config_core_v3_ConfigSource* eds_config =
231
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
232
- eds_cluster_config);
233
- if (!envoy_config_core_v3_ConfigSource_has_ads(eds_config) &&
234
- !envoy_config_core_v3_ConfigSource_has_self(eds_config)) {
235
- errors.emplace_back("EDS ConfigSource is not ADS or SELF.");
236
- }
237
- // Record EDS service_name (if any).
238
- upb_StringView service_name =
239
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
240
- eds_cluster_config);
241
- if (service_name.size != 0) {
242
- cds_update.eds_service_name = UpbStringToStdString(service_name);
243
- }
244
- } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
245
- envoy_config_cluster_v3_Cluster_LOGICAL_DNS) {
246
- cds_update.cluster_type = XdsClusterResource::ClusterType::LOGICAL_DNS;
247
- absl::Status status = CdsLogicalDnsParse(cluster, &cds_update);
248
- if (!status.ok()) errors.emplace_back(status.message());
249
- } else {
250
- const auto* custom_cluster_type =
251
- envoy_config_cluster_v3_Cluster_cluster_type(cluster);
252
- if (custom_cluster_type == nullptr) {
253
- errors.push_back("DiscoveryType is not valid.");
254
- } else {
255
- const auto* typed_config =
256
- envoy_config_cluster_v3_Cluster_CustomClusterType_typed_config(
257
- custom_cluster_type);
258
- if (typed_config == nullptr) {
259
- errors.push_back("cluster_type.typed_config not set");
260
- } else {
261
- absl::string_view type_url = absl::StripPrefix(
262
- UpbStringToAbsl(google_protobuf_Any_type_url(typed_config)),
263
- "type.googleapis.com/");
264
- if (type_url !=
265
- "envoy.extensions.clusters.aggregate.v3.ClusterConfig") {
266
- errors.push_back(
267
- absl::StrCat("unknown cluster_type extension: ", type_url));
268
- } else {
269
- cds_update.cluster_type = XdsClusterResource::ClusterType::AGGREGATE;
270
- // Retrieve aggregate clusters.
271
- const upb_StringView aggregate_cluster_config_upb_stringview =
272
- google_protobuf_Any_value(typed_config);
273
- const auto* aggregate_cluster_config =
274
- envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(
275
- aggregate_cluster_config_upb_stringview.data,
276
- aggregate_cluster_config_upb_stringview.size, context.arena);
277
- if (aggregate_cluster_config == nullptr) {
278
- errors.emplace_back("Can't parse aggregate cluster.");
279
- } else {
280
- size_t size;
281
- const upb_StringView* clusters =
282
- envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(
283
- aggregate_cluster_config, &size);
284
- for (size_t i = 0; i < size; ++i) {
285
- const upb_StringView cluster = clusters[i];
286
- cds_update.prioritized_cluster_names.emplace_back(
287
- UpbStringToStdString(cluster));
288
- }
289
- }
290
- }
268
+ void AggregateClusterParse(const XdsResourceType::DecodeContext& context,
269
+ absl::string_view serialized_config,
270
+ XdsClusterResource* cds_update,
271
+ ValidationErrors* errors) {
272
+ const auto* aggregate_cluster_config =
273
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(
274
+ serialized_config.data(), serialized_config.size(), context.arena);
275
+ if (aggregate_cluster_config == nullptr) {
276
+ errors->AddError("can't parse aggregate cluster config");
277
+ return;
278
+ }
279
+ size_t size;
280
+ const upb_StringView* clusters =
281
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(
282
+ aggregate_cluster_config, &size);
283
+ for (size_t i = 0; i < size; ++i) {
284
+ cds_update->prioritized_cluster_names.emplace_back(
285
+ UpbStringToStdString(clusters[i]));
286
+ }
287
+ }
288
+
289
+ void ParseLbPolicyConfig(const XdsResourceType::DecodeContext& context,
290
+ const envoy_config_cluster_v3_Cluster* cluster,
291
+ XdsClusterResource* cds_update,
292
+ ValidationErrors* errors) {
293
+ // First, check the new load_balancing_policy field.
294
+ if (XdsCustomLbPolicyEnabled()) {
295
+ const auto* load_balancing_policy =
296
+ envoy_config_cluster_v3_Cluster_load_balancing_policy(cluster);
297
+ if (load_balancing_policy != nullptr) {
298
+ const auto& registry =
299
+ static_cast<const GrpcXdsBootstrap&>(context.client->bootstrap())
300
+ .lb_policy_registry();
301
+ ValidationErrors::ScopedField field(errors, ".load_balancing_policy");
302
+ const size_t original_error_count = errors->size();
303
+ cds_update->lb_policy_config = registry.ConvertXdsLbPolicyConfig(
304
+ context, load_balancing_policy, errors);
305
+ // If there were no conversion errors, validate that the converted config
306
+ // parses with the gRPC LB policy registry.
307
+ if (original_error_count == errors->size()) {
308
+ auto config =
309
+ CoreConfiguration::Get()
310
+ .lb_policy_registry()
311
+ .ParseLoadBalancingConfig(cds_update->lb_policy_config);
312
+ if (!config.ok()) errors->AddError(config.status().message());
291
313
  }
314
+ return;
292
315
  }
293
316
  }
294
- // Check the LB policy.
317
+ // Didn't find load_balancing_policy field, so fall back to the old
318
+ // lb_policy enum field.
295
319
  if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
296
320
  envoy_config_cluster_v3_Cluster_ROUND_ROBIN) {
297
- cds_update.lb_policy = "ROUND_ROBIN";
321
+ cds_update->lb_policy_config = {
322
+ Json::Object{
323
+ {"xds_wrr_locality_experimental",
324
+ Json::Object{
325
+ {"childPolicy",
326
+ Json::Array{
327
+ Json::Object{
328
+ {"round_robin", Json::Object()},
329
+ },
330
+ }},
331
+ }},
332
+ },
333
+ };
298
334
  } else if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
299
335
  envoy_config_cluster_v3_Cluster_RING_HASH) {
300
- cds_update.lb_policy = "RING_HASH";
301
336
  // Record ring hash lb config
302
337
  auto* ring_hash_config =
303
338
  envoy_config_cluster_v3_Cluster_ring_hash_lb_config(cluster);
339
+ uint64_t min_ring_size = 1024;
340
+ uint64_t max_ring_size = 8388608;
304
341
  if (ring_hash_config != nullptr) {
305
- const google_protobuf_UInt64Value* max_ring_size =
342
+ ValidationErrors::ScopedField field(errors, ".ring_hash_lb_config");
343
+ const google_protobuf_UInt64Value* uint64_value =
306
344
  envoy_config_cluster_v3_Cluster_RingHashLbConfig_maximum_ring_size(
307
345
  ring_hash_config);
308
- if (max_ring_size != nullptr) {
309
- cds_update.max_ring_size =
310
- google_protobuf_UInt64Value_value(max_ring_size);
311
- if (cds_update.max_ring_size > 8388608 ||
312
- cds_update.max_ring_size == 0) {
313
- errors.emplace_back(
314
- "max_ring_size is not in the range of 1 to 8388608.");
346
+ if (uint64_value != nullptr) {
347
+ ValidationErrors::ScopedField field(errors, ".maximum_ring_size");
348
+ max_ring_size = google_protobuf_UInt64Value_value(uint64_value);
349
+ if (max_ring_size > 8388608 || max_ring_size == 0) {
350
+ errors->AddError("must be in the range of 1 to 8388608");
315
351
  }
316
352
  }
317
- const google_protobuf_UInt64Value* min_ring_size =
353
+ uint64_value =
318
354
  envoy_config_cluster_v3_Cluster_RingHashLbConfig_minimum_ring_size(
319
355
  ring_hash_config);
320
- if (min_ring_size != nullptr) {
321
- cds_update.min_ring_size =
322
- google_protobuf_UInt64Value_value(min_ring_size);
323
- if (cds_update.min_ring_size > 8388608 ||
324
- cds_update.min_ring_size == 0) {
325
- errors.emplace_back(
326
- "min_ring_size is not in the range of 1 to 8388608.");
356
+ if (uint64_value != nullptr) {
357
+ ValidationErrors::ScopedField field(errors, ".minimum_ring_size");
358
+ min_ring_size = google_protobuf_UInt64Value_value(uint64_value);
359
+ if (min_ring_size > 8388608 || min_ring_size == 0) {
360
+ errors->AddError("must be in the range of 1 to 8388608");
327
361
  }
328
- if (cds_update.min_ring_size > cds_update.max_ring_size) {
329
- errors.emplace_back(
330
- "min_ring_size cannot be greater than max_ring_size.");
362
+ if (min_ring_size > max_ring_size) {
363
+ errors->AddError("cannot be greater than maximum_ring_size");
331
364
  }
332
365
  }
333
366
  if (envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
334
367
  ring_hash_config) !=
335
368
  envoy_config_cluster_v3_Cluster_RingHashLbConfig_XX_HASH) {
336
- errors.emplace_back("ring hash lb config has invalid hash function.");
369
+ ValidationErrors::ScopedField field(errors, ".hash_function");
370
+ errors->AddError("invalid hash function");
337
371
  }
338
372
  }
373
+ cds_update->lb_policy_config = {
374
+ Json::Object{
375
+ {"ring_hash_experimental",
376
+ Json::Object{
377
+ {"minRingSize", min_ring_size},
378
+ {"maxRingSize", max_ring_size},
379
+ }},
380
+ },
381
+ };
339
382
  } else {
340
- errors.emplace_back("LB policy is not supported.");
383
+ ValidationErrors::ScopedField field(errors, ".lb_policy");
384
+ errors->AddError("LB policy is not supported");
341
385
  }
386
+ }
387
+
388
+ absl::StatusOr<XdsClusterResource> CdsResourceParse(
389
+ const XdsResourceType::DecodeContext& context,
390
+ const envoy_config_cluster_v3_Cluster* cluster) {
391
+ XdsClusterResource cds_update;
392
+ ValidationErrors errors;
393
+ // Check the cluster discovery type.
394
+ if (envoy_config_cluster_v3_Cluster_type(cluster) ==
395
+ envoy_config_cluster_v3_Cluster_EDS) {
396
+ cds_update.cluster_type = XdsClusterResource::ClusterType::EDS;
397
+ EdsConfigParse(cluster, &cds_update, &errors);
398
+ } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
399
+ envoy_config_cluster_v3_Cluster_LOGICAL_DNS) {
400
+ cds_update.cluster_type = XdsClusterResource::ClusterType::LOGICAL_DNS;
401
+ LogicalDnsParse(cluster, &cds_update, &errors);
402
+ } else if (envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
403
+ ValidationErrors::ScopedField field(&errors, ".cluster_type");
404
+ const auto* custom_cluster_type =
405
+ envoy_config_cluster_v3_Cluster_cluster_type(cluster);
406
+ GPR_ASSERT(custom_cluster_type != nullptr);
407
+ ValidationErrors::ScopedField field2(&errors, ".typed_config");
408
+ const auto* typed_config =
409
+ envoy_config_cluster_v3_Cluster_CustomClusterType_typed_config(
410
+ custom_cluster_type);
411
+ if (typed_config == nullptr) {
412
+ errors.AddError("field not present");
413
+ } else {
414
+ absl::string_view type_url = absl::StripPrefix(
415
+ UpbStringToAbsl(google_protobuf_Any_type_url(typed_config)),
416
+ "type.googleapis.com/");
417
+ if (type_url != "envoy.extensions.clusters.aggregate.v3.ClusterConfig") {
418
+ ValidationErrors::ScopedField field(&errors, ".type_url");
419
+ errors.AddError(
420
+ absl::StrCat("unknown cluster_type extension: ", type_url));
421
+ } else {
422
+ cds_update.cluster_type = XdsClusterResource::ClusterType::AGGREGATE;
423
+ // Retrieve aggregate clusters.
424
+ ValidationErrors::ScopedField field(
425
+ &errors,
426
+ ".value[envoy.extensions.clusters.aggregate.v3.ClusterConfig]");
427
+ absl::string_view serialized_config =
428
+ UpbStringToAbsl(google_protobuf_Any_value(typed_config));
429
+ AggregateClusterParse(context, serialized_config, &cds_update, &errors);
430
+ }
431
+ }
432
+ } else {
433
+ ValidationErrors::ScopedField field(&errors, ".type");
434
+ errors.AddError("unknown discovery type");
435
+ }
436
+ // Check the LB policy.
437
+ ParseLbPolicyConfig(context, cluster, &cds_update, &errors);
438
+ // transport_socket
342
439
  auto* transport_socket =
343
440
  envoy_config_cluster_v3_Cluster_transport_socket(cluster);
344
441
  if (transport_socket != nullptr) {
345
- auto common_tls_context =
346
- UpstreamTlsContextParse(context, transport_socket);
347
- if (!common_tls_context.ok()) {
348
- errors.emplace_back(absl::StrCat("Error parsing security configuration: ",
349
- common_tls_context.status().message()));
350
- } else {
351
- cds_update.common_tls_context = std::move(*common_tls_context);
352
- }
442
+ ValidationErrors::ScopedField field(&errors, ".transport_socket");
443
+ cds_update.common_tls_context =
444
+ UpstreamTlsContextParse(context, transport_socket, &errors);
353
445
  }
354
446
  // Record LRS server name (if any).
355
447
  const envoy_config_core_v3_ConfigSource* lrs_server =
356
448
  envoy_config_cluster_v3_Cluster_lrs_server(cluster);
357
449
  if (lrs_server != nullptr) {
358
450
  if (!envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
359
- errors.emplace_back("LRS ConfigSource is not self.");
451
+ ValidationErrors::ScopedField field(&errors, ".lrs_server");
452
+ errors.AddError("ConfigSource is not self");
360
453
  }
361
454
  cds_update.lrs_load_reporting_server.emplace(
362
455
  static_cast<const GrpcXdsBootstrap::GrpcXdsServer&>(context.server));
@@ -387,30 +480,31 @@ absl::StatusOr<XdsClusterResource> CdsResourceParse(
387
480
  }
388
481
  }
389
482
  }
390
- // As long as outlier detection field is present in the cluster update,
391
- // we will end up with a outlier detection in the cluster resource which will
392
- // lead to the creation of outlier detection in discovery mechanism. Values
393
- // for outlier detection will be based on fields received and
394
- // default values.
395
- if (XdsOutlierDetectionEnabled() &&
396
- envoy_config_cluster_v3_Cluster_has_outlier_detection(cluster)) {
483
+ // Outlier detection config.
484
+ if (envoy_config_cluster_v3_Cluster_has_outlier_detection(cluster)) {
485
+ ValidationErrors::ScopedField field(&errors, ".outlier_detection");
397
486
  OutlierDetectionConfig outlier_detection_update;
398
487
  const envoy_config_cluster_v3_OutlierDetection* outlier_detection =
399
488
  envoy_config_cluster_v3_Cluster_outlier_detection(cluster);
400
489
  const google_protobuf_Duration* duration =
401
490
  envoy_config_cluster_v3_OutlierDetection_interval(outlier_detection);
402
491
  if (duration != nullptr) {
403
- outlier_detection_update.interval = ParseDuration(duration);
492
+ ValidationErrors::ScopedField field(&errors, ".interval");
493
+ outlier_detection_update.interval = ParseDuration(duration, &errors);
404
494
  }
405
495
  duration = envoy_config_cluster_v3_OutlierDetection_base_ejection_time(
406
496
  outlier_detection);
407
497
  if (duration != nullptr) {
408
- outlier_detection_update.base_ejection_time = ParseDuration(duration);
498
+ ValidationErrors::ScopedField field(&errors, ".base_ejection_time");
499
+ outlier_detection_update.base_ejection_time =
500
+ ParseDuration(duration, &errors);
409
501
  }
410
502
  duration = envoy_config_cluster_v3_OutlierDetection_max_ejection_time(
411
503
  outlier_detection);
412
504
  if (duration != nullptr) {
413
- outlier_detection_update.max_ejection_time = ParseDuration(duration);
505
+ ValidationErrors::ScopedField field(&errors, ".max_ejection_time");
506
+ outlier_detection_update.max_ejection_time =
507
+ ParseDuration(duration, &errors);
414
508
  }
415
509
  const google_protobuf_UInt32Value* max_ejection_percent =
416
510
  envoy_config_cluster_v3_OutlierDetection_max_ejection_percent(
@@ -418,6 +512,10 @@ absl::StatusOr<XdsClusterResource> CdsResourceParse(
418
512
  if (max_ejection_percent != nullptr) {
419
513
  outlier_detection_update.max_ejection_percent =
420
514
  google_protobuf_UInt32Value_value(max_ejection_percent);
515
+ if (outlier_detection_update.max_ejection_percent > 100) {
516
+ ValidationErrors::ScopedField field(&errors, ".max_ejection_percent");
517
+ errors.AddError("value must be <= 100");
518
+ }
421
519
  }
422
520
  const google_protobuf_UInt32Value* enforcing_success_rate =
423
521
  envoy_config_cluster_v3_OutlierDetection_enforcing_success_rate(
@@ -425,6 +523,10 @@ absl::StatusOr<XdsClusterResource> CdsResourceParse(
425
523
  if (enforcing_success_rate != nullptr) {
426
524
  uint32_t enforcement_percentage =
427
525
  google_protobuf_UInt32Value_value(enforcing_success_rate);
526
+ if (enforcement_percentage > 100) {
527
+ ValidationErrors::ScopedField field(&errors, ".enforcing_success_rate");
528
+ errors.AddError("value must be <= 100");
529
+ }
428
530
  if (enforcement_percentage != 0) {
429
531
  OutlierDetectionConfig::SuccessRateEjection success_rate_ejection;
430
532
  success_rate_ejection.enforcement_percentage = enforcement_percentage;
@@ -458,6 +560,11 @@ absl::StatusOr<XdsClusterResource> CdsResourceParse(
458
560
  if (enforcing_failure_percentage != nullptr) {
459
561
  uint32_t enforcement_percentage =
460
562
  google_protobuf_UInt32Value_value(enforcing_failure_percentage);
563
+ if (enforcement_percentage > 100) {
564
+ ValidationErrors::ScopedField field(&errors,
565
+ ".enforcing_failure_percentage");
566
+ errors.AddError("value must be <= 100");
567
+ }
461
568
  if (enforcement_percentage != 0) {
462
569
  OutlierDetectionConfig::FailurePercentageEjection
463
570
  failure_percentage_ejection;
@@ -483,6 +590,11 @@ absl::StatusOr<XdsClusterResource> CdsResourceParse(
483
590
  if (threshold != nullptr) {
484
591
  failure_percentage_ejection.threshold =
485
592
  google_protobuf_UInt32Value_value(threshold);
593
+ if (enforcement_percentage > 100) {
594
+ ValidationErrors::ScopedField field(
595
+ &errors, ".failure_percentage_threshold");
596
+ errors.AddError("value must be <= 100");
597
+ }
486
598
  }
487
599
  outlier_detection_update.failure_percentage_ejection =
488
600
  failure_percentage_ejection;
@@ -491,10 +603,7 @@ absl::StatusOr<XdsClusterResource> CdsResourceParse(
491
603
  cds_update.outlier_detection = outlier_detection_update;
492
604
  }
493
605
  // Return result.
494
- if (!errors.empty()) {
495
- return absl::InvalidArgumentError(absl::StrCat(
496
- "errors parsing CDS resource: [", absl::StrJoin(errors, "; "), "]"));
497
- }
606
+ if (!errors.ok()) return errors.status("errors validating Cluster resource");
498
607
  return cds_update;
499
608
  }
500
609
 
@@ -514,7 +623,7 @@ void MaybeLogCluster(const XdsResourceType::DecodeContext& context,
514
623
 
515
624
  XdsResourceType::DecodeResult XdsClusterResourceType::Decode(
516
625
  const XdsResourceType::DecodeContext& context,
517
- absl::string_view serialized_resource, bool is_v2) const {
626
+ absl::string_view serialized_resource) const {
518
627
  DecodeResult result;
519
628
  // Parse serialized proto.
520
629
  auto* resource = envoy_config_cluster_v3_Cluster_parse(
@@ -528,7 +637,7 @@ XdsResourceType::DecodeResult XdsClusterResourceType::Decode(
528
637
  // Validate resource.
529
638
  result.name =
530
639
  UpbStringToStdString(envoy_config_cluster_v3_Cluster_name(resource));
531
- auto cds_resource = CdsResourceParse(context, resource, is_v2);
640
+ auto cds_resource = CdsResourceParse(context, resource);
532
641
  if (!cds_resource.ok()) {
533
642
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
534
643
  gpr_log(GPR_ERROR, "[xds_client %p] invalid Cluster %s: %s",
@@ -541,9 +650,8 @@ XdsResourceType::DecodeResult XdsClusterResourceType::Decode(
541
650
  gpr_log(GPR_INFO, "[xds_client %p] parsed Cluster %s: %s", context.client,
542
651
  result.name->c_str(), cds_resource->ToString().c_str());
543
652
  }
544
- auto resource = absl::make_unique<ResourceDataSubclass>();
545
- resource->resource = std::move(*cds_resource);
546
- result.resource = std::move(resource);
653
+ result.resource =
654
+ std::make_unique<XdsClusterResource>(std::move(*cds_resource));
547
655
  }
548
656
  return result;
549
657
  }