grpc 1.50.0.pre1 → 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 +57 -20
  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,11 +19,13 @@
19
19
  #include "src/core/ext/xds/xds_endpoint.h"
20
20
 
21
21
  #include <stdlib.h>
22
+ #include <string.h>
22
23
 
23
24
  #include <algorithm>
25
+ #include <limits>
26
+ #include <set>
24
27
  #include <vector>
25
28
 
26
- #include "absl/memory/memory.h"
27
29
  #include "absl/status/status.h"
28
30
  #include "absl/status/statusor.h"
29
31
  #include "absl/strings/str_cat.h"
@@ -44,8 +46,11 @@
44
46
  #include "src/core/ext/xds/upb_utils.h"
45
47
  #include "src/core/ext/xds/xds_resource_type.h"
46
48
  #include "src/core/lib/address_utils/parse_address.h"
49
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
47
50
  #include "src/core/lib/channel/channel_args.h"
48
51
  #include "src/core/lib/debug/trace.h"
52
+ #include "src/core/lib/gprpp/validation_errors.h"
53
+ #include "src/core/lib/iomgr/resolved_address.h"
49
54
 
50
55
  namespace grpc_core {
51
56
 
@@ -78,6 +83,7 @@ bool XdsEndpointResource::Priority::operator==(const Priority& other) const {
78
83
 
79
84
  std::string XdsEndpointResource::Priority::ToString() const {
80
85
  std::vector<std::string> locality_strings;
86
+ locality_strings.reserve(localities.size());
81
87
  for (const auto& p : localities) {
82
88
  locality_strings.emplace_back(p.second.ToString());
83
89
  }
@@ -140,47 +146,78 @@ void MaybeLogClusterLoadAssignment(
140
146
  }
141
147
  }
142
148
 
143
- absl::StatusOr<absl::optional<ServerAddress>> ServerAddressParse(
144
- const envoy_config_endpoint_v3_LbEndpoint* lb_endpoint) {
145
- // If health_status is not HEALTHY or UNKNOWN, skip this endpoint.
149
+ absl::optional<ServerAddress> ServerAddressParse(
150
+ const envoy_config_endpoint_v3_LbEndpoint* lb_endpoint,
151
+ ValidationErrors* errors) {
152
+ // health_status
153
+ // If not HEALTHY or UNKNOWN, skip this endpoint.
146
154
  const int32_t health_status =
147
155
  envoy_config_endpoint_v3_LbEndpoint_health_status(lb_endpoint);
148
156
  if (health_status != envoy_config_core_v3_UNKNOWN &&
149
157
  health_status != envoy_config_core_v3_HEALTHY) {
150
158
  return absl::nullopt;
151
159
  }
152
- // Find the ip:port.
153
- const envoy_config_endpoint_v3_Endpoint* endpoint =
154
- envoy_config_endpoint_v3_LbEndpoint_endpoint(lb_endpoint);
155
- const envoy_config_core_v3_Address* address =
156
- envoy_config_endpoint_v3_Endpoint_address(endpoint);
157
- const envoy_config_core_v3_SocketAddress* socket_address =
158
- envoy_config_core_v3_Address_socket_address(address);
159
- std::string address_str = UpbStringToStdString(
160
- envoy_config_core_v3_SocketAddress_address(socket_address));
161
- uint32_t port = envoy_config_core_v3_SocketAddress_port_value(socket_address);
162
- if (GPR_UNLIKELY(port >> 16) != 0) {
163
- return absl::InvalidArgumentError("Invalid port.");
164
- }
165
- // Find load_balancing_weight for the endpoint.
160
+ // load_balancing_weight
166
161
  uint32_t weight = 1;
167
- const google_protobuf_UInt32Value* load_balancing_weight =
168
- envoy_config_endpoint_v3_LbEndpoint_load_balancing_weight(lb_endpoint);
169
- if (load_balancing_weight != nullptr) {
170
- weight = google_protobuf_UInt32Value_value(load_balancing_weight);
171
- if (weight == 0) {
172
- return absl::InvalidArgumentError("Invalid endpoint weight of 0.");
162
+ {
163
+ ValidationErrors::ScopedField field(errors, ".load_balancing_weight");
164
+ const google_protobuf_UInt32Value* load_balancing_weight =
165
+ envoy_config_endpoint_v3_LbEndpoint_load_balancing_weight(lb_endpoint);
166
+ if (load_balancing_weight != nullptr) {
167
+ weight = google_protobuf_UInt32Value_value(load_balancing_weight);
168
+ if (weight == 0) {
169
+ errors->AddError("must be greater than 0");
170
+ }
171
+ }
172
+ }
173
+ // endpoint
174
+ grpc_resolved_address grpc_address;
175
+ {
176
+ ValidationErrors::ScopedField field(errors, ".endpoint");
177
+ const envoy_config_endpoint_v3_Endpoint* endpoint =
178
+ envoy_config_endpoint_v3_LbEndpoint_endpoint(lb_endpoint);
179
+ if (endpoint == nullptr) {
180
+ errors->AddError("field not present");
181
+ return absl::nullopt;
182
+ }
183
+ ValidationErrors::ScopedField field2(errors, ".address");
184
+ const envoy_config_core_v3_Address* address =
185
+ envoy_config_endpoint_v3_Endpoint_address(endpoint);
186
+ if (address == nullptr) {
187
+ errors->AddError("field not present");
188
+ return absl::nullopt;
189
+ }
190
+ ValidationErrors::ScopedField field3(errors, ".socket_address");
191
+ const envoy_config_core_v3_SocketAddress* socket_address =
192
+ envoy_config_core_v3_Address_socket_address(address);
193
+ if (socket_address == nullptr) {
194
+ errors->AddError("field not present");
195
+ return absl::nullopt;
196
+ }
197
+ std::string address_str = UpbStringToStdString(
198
+ envoy_config_core_v3_SocketAddress_address(socket_address));
199
+ uint32_t port;
200
+ {
201
+ ValidationErrors::ScopedField field(errors, ".port_value");
202
+ port = envoy_config_core_v3_SocketAddress_port_value(socket_address);
203
+ if (GPR_UNLIKELY(port >> 16) != 0) {
204
+ errors->AddError("invalid port");
205
+ return absl::nullopt;
206
+ }
207
+ }
208
+ auto addr = StringToSockaddr(address_str, port);
209
+ if (!addr.ok()) {
210
+ errors->AddError(addr.status().message());
211
+ } else {
212
+ grpc_address = *addr;
173
213
  }
174
214
  }
175
- // Populate grpc_resolved_address.
176
- auto addr = StringToSockaddr(address_str, port);
177
- if (!addr.ok()) return addr.status();
178
- // Append the address to the list.
215
+ // Convert to ServerAddress.
179
216
  std::map<const char*, std::unique_ptr<ServerAddress::AttributeInterface>>
180
217
  attributes;
181
218
  attributes[ServerAddressWeightAttribute::kServerAddressWeightAttributeKey] =
182
- absl::make_unique<ServerAddressWeightAttribute>(weight);
183
- return ServerAddress(*addr, ChannelArgs(), std::move(attributes));
219
+ std::make_unique<ServerAddressWeightAttribute>(weight);
220
+ return ServerAddress(grpc_address, ChannelArgs(), std::move(attributes));
184
221
  }
185
222
 
186
223
  struct ParsedLocality {
@@ -188,156 +225,205 @@ struct ParsedLocality {
188
225
  XdsEndpointResource::Priority::Locality locality;
189
226
  };
190
227
 
191
- absl::StatusOr<ParsedLocality> LocalityParse(
192
- const envoy_config_endpoint_v3_LocalityLbEndpoints* locality_lb_endpoints) {
228
+ struct ResolvedAddressLessThan {
229
+ bool operator()(const grpc_resolved_address& a1,
230
+ const grpc_resolved_address& a2) const {
231
+ if (a1.len != a2.len) return a1.len < a2.len;
232
+ return memcmp(a1.addr, a2.addr, a1.len) < 0;
233
+ }
234
+ };
235
+ using ResolvedAddressSet =
236
+ std::set<grpc_resolved_address, ResolvedAddressLessThan>;
237
+
238
+ absl::optional<ParsedLocality> LocalityParse(
239
+ const envoy_config_endpoint_v3_LocalityLbEndpoints* locality_lb_endpoints,
240
+ ResolvedAddressSet* address_set, ValidationErrors* errors) {
241
+ const size_t original_error_size = errors->size();
193
242
  ParsedLocality parsed_locality;
194
- // Parse LB weight.
243
+ // load_balancing_weight
244
+ // If LB weight is not specified or 0, it means this locality is assigned
245
+ // no load.
195
246
  const google_protobuf_UInt32Value* lb_weight =
196
247
  envoy_config_endpoint_v3_LocalityLbEndpoints_load_balancing_weight(
197
248
  locality_lb_endpoints);
198
- // If LB weight is not specified, it means this locality is assigned no load.
199
249
  parsed_locality.locality.lb_weight =
200
250
  lb_weight != nullptr ? google_protobuf_UInt32Value_value(lb_weight) : 0;
201
- if (parsed_locality.locality.lb_weight == 0) return parsed_locality;
202
- // Parse locality name.
251
+ if (parsed_locality.locality.lb_weight == 0) return absl::nullopt;
252
+ // locality
203
253
  const envoy_config_core_v3_Locality* locality =
204
254
  envoy_config_endpoint_v3_LocalityLbEndpoints_locality(
205
255
  locality_lb_endpoints);
206
256
  if (locality == nullptr) {
207
- return absl::InvalidArgumentError("Empty locality.");
257
+ ValidationErrors::ScopedField field(errors, ".locality");
258
+ errors->AddError("field not present");
259
+ return absl::nullopt;
208
260
  }
261
+ // region
209
262
  std::string region =
210
263
  UpbStringToStdString(envoy_config_core_v3_Locality_region(locality));
264
+ // zone
211
265
  std::string zone =
212
266
  UpbStringToStdString(envoy_config_core_v3_Locality_zone(locality));
267
+ // sub_zone
213
268
  std::string sub_zone =
214
269
  UpbStringToStdString(envoy_config_core_v3_Locality_sub_zone(locality));
215
270
  parsed_locality.locality.name = MakeRefCounted<XdsLocalityName>(
216
271
  std::move(region), std::move(zone), std::move(sub_zone));
217
- // Parse the addresses.
272
+ // lb_endpoints
218
273
  size_t size;
219
274
  const envoy_config_endpoint_v3_LbEndpoint* const* lb_endpoints =
220
275
  envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(
221
276
  locality_lb_endpoints, &size);
222
277
  for (size_t i = 0; i < size; ++i) {
223
- auto address = ServerAddressParse(lb_endpoints[i]);
224
- if (!address.ok()) return address.status();
225
- if (address->has_value()) {
226
- parsed_locality.locality.endpoints.push_back(std::move(**address));
278
+ ValidationErrors::ScopedField field(errors,
279
+ absl::StrCat(".lb_endpoints[", i, "]"));
280
+ auto address = ServerAddressParse(lb_endpoints[i], errors);
281
+ if (address.has_value()) {
282
+ bool inserted = address_set->insert(address->address()).second;
283
+ if (!inserted) {
284
+ errors->AddError(absl::StrCat(
285
+ "duplicate endpoint address \"",
286
+ grpc_sockaddr_to_uri(&address->address()).value_or("<unknown>"),
287
+ "\""));
288
+ }
289
+ parsed_locality.locality.endpoints.push_back(std::move(*address));
227
290
  }
228
291
  }
229
- // Parse the priority.
292
+ // priority
230
293
  parsed_locality.priority =
231
294
  envoy_config_endpoint_v3_LocalityLbEndpoints_priority(
232
295
  locality_lb_endpoints);
296
+ // Return result.
297
+ if (original_error_size != errors->size()) return absl::nullopt;
233
298
  return parsed_locality;
234
299
  }
235
300
 
236
- absl::Status DropParseAndAppend(
301
+ void DropParseAndAppend(
237
302
  const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload*
238
303
  drop_overload,
239
- XdsEndpointResource::DropConfig* drop_config) {
240
- // Get the category.
304
+ XdsEndpointResource::DropConfig* drop_config, ValidationErrors* errors) {
305
+ // category
241
306
  std::string category = UpbStringToStdString(
242
307
  envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_category(
243
308
  drop_overload));
244
309
  if (category.empty()) {
245
- return absl::InvalidArgumentError("Empty drop category name");
310
+ ValidationErrors::ScopedField field(errors, ".category");
311
+ errors->AddError("empty drop category name");
246
312
  }
247
- // Get the drop rate (per million).
248
- const envoy_type_v3_FractionalPercent* drop_percentage =
249
- envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_drop_percentage(
250
- drop_overload);
251
- uint32_t numerator =
252
- envoy_type_v3_FractionalPercent_numerator(drop_percentage);
253
- const auto denominator =
254
- static_cast<envoy_type_v3_FractionalPercent_DenominatorType>(
255
- envoy_type_v3_FractionalPercent_denominator(drop_percentage));
256
- // Normalize to million.
257
- switch (denominator) {
258
- case envoy_type_v3_FractionalPercent_HUNDRED:
259
- numerator *= 10000;
260
- break;
261
- case envoy_type_v3_FractionalPercent_TEN_THOUSAND:
262
- numerator *= 100;
263
- break;
264
- case envoy_type_v3_FractionalPercent_MILLION:
265
- break;
266
- default:
267
- return absl::InvalidArgumentError(
268
- "drop config: unknown denominator type");
313
+ // drop_percentage
314
+ uint32_t numerator;
315
+ {
316
+ ValidationErrors::ScopedField field(errors, ".drop_percentage");
317
+ const envoy_type_v3_FractionalPercent* drop_percentage =
318
+ envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_drop_percentage(
319
+ drop_overload);
320
+ if (drop_percentage == nullptr) {
321
+ errors->AddError("field not present");
322
+ return;
323
+ }
324
+ numerator = envoy_type_v3_FractionalPercent_numerator(drop_percentage);
325
+ {
326
+ ValidationErrors::ScopedField field(errors, ".denominator");
327
+ const int denominator =
328
+ envoy_type_v3_FractionalPercent_denominator(drop_percentage);
329
+ // Normalize to million.
330
+ switch (denominator) {
331
+ case envoy_type_v3_FractionalPercent_HUNDRED:
332
+ numerator *= 10000;
333
+ break;
334
+ case envoy_type_v3_FractionalPercent_TEN_THOUSAND:
335
+ numerator *= 100;
336
+ break;
337
+ case envoy_type_v3_FractionalPercent_MILLION:
338
+ break;
339
+ default:
340
+ errors->AddError("unknown denominator type");
341
+ }
342
+ }
343
+ // Cap numerator to 1000000.
344
+ numerator = std::min(numerator, 1000000u);
269
345
  }
270
- // Cap numerator to 1000000.
271
- numerator = std::min(numerator, 1000000u);
346
+ // Add category.
272
347
  drop_config->AddCategory(std::move(category), numerator);
273
- return absl::OkStatus();
274
348
  }
275
349
 
276
350
  absl::StatusOr<XdsEndpointResource> EdsResourceParse(
277
351
  const XdsResourceType::DecodeContext& /*context*/,
278
352
  const envoy_config_endpoint_v3_ClusterLoadAssignment*
279
- cluster_load_assignment,
280
- bool /*is_v2*/) {
353
+ cluster_load_assignment) {
354
+ ValidationErrors errors;
281
355
  XdsEndpointResource eds_resource;
282
- std::vector<std::string> errors;
283
- // Get the endpoints.
284
- size_t locality_size;
285
- const envoy_config_endpoint_v3_LocalityLbEndpoints* const* endpoints =
286
- envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
287
- cluster_load_assignment, &locality_size);
288
- for (size_t j = 0; j < locality_size; ++j) {
289
- auto parsed_locality = LocalityParse(endpoints[j]);
290
- if (!parsed_locality.ok()) {
291
- errors.emplace_back(parsed_locality.status().message());
292
- continue;
356
+ // endpoints
357
+ {
358
+ ValidationErrors::ScopedField field(&errors, "endpoints");
359
+ ResolvedAddressSet address_set;
360
+ size_t locality_size;
361
+ const envoy_config_endpoint_v3_LocalityLbEndpoints* const* endpoints =
362
+ envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
363
+ cluster_load_assignment, &locality_size);
364
+ for (size_t i = 0; i < locality_size; ++i) {
365
+ ValidationErrors::ScopedField field(&errors, absl::StrCat("[", i, "]"));
366
+ auto parsed_locality = LocalityParse(endpoints[i], &address_set, &errors);
367
+ if (parsed_locality.has_value()) {
368
+ GPR_ASSERT(parsed_locality->locality.lb_weight != 0);
369
+ // Make sure prorities is big enough. Note that they might not
370
+ // arrive in priority order.
371
+ if (eds_resource.priorities.size() < parsed_locality->priority + 1) {
372
+ eds_resource.priorities.resize(parsed_locality->priority + 1);
373
+ }
374
+ auto& locality_map =
375
+ eds_resource.priorities[parsed_locality->priority].localities;
376
+ auto it = locality_map.find(parsed_locality->locality.name.get());
377
+ if (it != locality_map.end()) {
378
+ errors.AddError(absl::StrCat(
379
+ "duplicate locality ",
380
+ parsed_locality->locality.name->AsHumanReadableString(),
381
+ " found in priority ", parsed_locality->priority));
382
+ } else {
383
+ locality_map.emplace(parsed_locality->locality.name.get(),
384
+ std::move(parsed_locality->locality));
385
+ }
386
+ }
293
387
  }
294
- // Filter out locality with weight 0.
295
- if (parsed_locality->locality.lb_weight == 0) continue;
296
- // Make sure prorities is big enough. Note that they might not
297
- // arrive in priority order.
298
- if (eds_resource.priorities.size() < parsed_locality->priority + 1) {
299
- eds_resource.priorities.resize(parsed_locality->priority + 1);
300
- }
301
- auto& locality_map =
302
- eds_resource.priorities[parsed_locality->priority].localities;
303
- auto it = locality_map.find(parsed_locality->locality.name.get());
304
- if (it != locality_map.end()) {
305
- errors.emplace_back(
306
- absl::StrCat("duplicate locality ",
307
- parsed_locality->locality.name->AsHumanReadableString(),
308
- " found in priority ", parsed_locality->priority));
309
- } else {
310
- locality_map.emplace(parsed_locality->locality.name.get(),
311
- std::move(parsed_locality->locality));
388
+ for (size_t i = 0; i < eds_resource.priorities.size(); ++i) {
389
+ const auto& priority = eds_resource.priorities[i];
390
+ if (priority.localities.empty()) {
391
+ errors.AddError(absl::StrCat("priority ", i, " empty"));
392
+ } else {
393
+ // Check that the sum of the locality weights in this priority
394
+ // does not exceed the max value for a uint32.
395
+ uint64_t total_weight = 0;
396
+ for (const auto& p : priority.localities) {
397
+ total_weight += p.second.lb_weight;
398
+ if (total_weight > std::numeric_limits<uint32_t>::max()) {
399
+ errors.AddError(
400
+ absl::StrCat("sum of locality weights for priority ", i,
401
+ " exceeds uint32 max"));
402
+ break;
403
+ }
404
+ }
405
+ }
312
406
  }
313
407
  }
314
- for (const auto& priority : eds_resource.priorities) {
315
- if (priority.localities.empty()) {
316
- errors.emplace_back("sparse priority list");
317
- }
318
- }
319
- // Get the drop config.
408
+ // policy
320
409
  eds_resource.drop_config = MakeRefCounted<XdsEndpointResource::DropConfig>();
321
- const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy* policy =
322
- envoy_config_endpoint_v3_ClusterLoadAssignment_policy(
323
- cluster_load_assignment);
410
+ const auto* policy = envoy_config_endpoint_v3_ClusterLoadAssignment_policy(
411
+ cluster_load_assignment);
324
412
  if (policy != nullptr) {
413
+ ValidationErrors::ScopedField field(&errors, "policy");
325
414
  size_t drop_size;
326
- const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload* const*
327
- drop_overload =
328
- envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
329
- policy, &drop_size);
330
- for (size_t j = 0; j < drop_size; ++j) {
331
- absl::Status status =
332
- DropParseAndAppend(drop_overload[j], eds_resource.drop_config.get());
333
- if (!status.ok()) errors.emplace_back(status.message());
415
+ const auto* const* drop_overload =
416
+ envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
417
+ policy, &drop_size);
418
+ for (size_t i = 0; i < drop_size; ++i) {
419
+ ValidationErrors::ScopedField field(
420
+ &errors, absl::StrCat(".drop_overloads[", i, "]"));
421
+ DropParseAndAppend(drop_overload[i], eds_resource.drop_config.get(),
422
+ &errors);
334
423
  }
335
424
  }
336
425
  // Return result.
337
- if (!errors.empty()) {
338
- return absl::InvalidArgumentError(absl::StrCat(
339
- "errors parsing EDS resource: [", absl::StrJoin(errors, "; "), "]"));
340
- }
426
+ if (!errors.ok()) return errors.status("errors parsing EDS resource");
341
427
  return eds_resource;
342
428
  }
343
429
 
@@ -345,7 +431,7 @@ absl::StatusOr<XdsEndpointResource> EdsResourceParse(
345
431
 
346
432
  XdsResourceType::DecodeResult XdsEndpointResourceType::Decode(
347
433
  const XdsResourceType::DecodeContext& context,
348
- absl::string_view serialized_resource, bool is_v2) const {
434
+ absl::string_view serialized_resource) const {
349
435
  DecodeResult result;
350
436
  // Parse serialized proto.
351
437
  auto* resource = envoy_config_endpoint_v3_ClusterLoadAssignment_parse(
@@ -359,7 +445,7 @@ XdsResourceType::DecodeResult XdsEndpointResourceType::Decode(
359
445
  // Validate resource.
360
446
  result.name = UpbStringToStdString(
361
447
  envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(resource));
362
- auto eds_resource = EdsResourceParse(context, resource, is_v2);
448
+ auto eds_resource = EdsResourceParse(context, resource);
363
449
  if (!eds_resource.ok()) {
364
450
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
365
451
  gpr_log(GPR_ERROR, "[xds_client %p] invalid ClusterLoadAssignment %s: %s",
@@ -373,9 +459,8 @@ XdsResourceType::DecodeResult XdsEndpointResourceType::Decode(
373
459
  context.client, result.name->c_str(),
374
460
  eds_resource->ToString().c_str());
375
461
  }
376
- auto resource = absl::make_unique<ResourceDataSubclass>();
377
- resource->resource = std::move(*eds_resource);
378
- result.resource = std::move(resource);
462
+ result.resource =
463
+ std::make_unique<XdsEndpointResource>(std::move(*eds_resource));
379
464
  }
380
465
  return result;
381
466
  }
@@ -32,6 +32,7 @@
32
32
  #include "envoy/config/endpoint/v3/endpoint.upbdefs.h"
33
33
  #include "upb/def.h"
34
34
 
35
+ #include "src/core/ext/xds/xds_client.h"
35
36
  #include "src/core/ext/xds/xds_client_stats.h"
36
37
  #include "src/core/ext/xds/xds_resource_type.h"
37
38
  #include "src/core/ext/xds/xds_resource_type_impl.h"
@@ -41,7 +42,7 @@
41
42
 
42
43
  namespace grpc_core {
43
44
 
44
- struct XdsEndpointResource {
45
+ struct XdsEndpointResource : public XdsResourceType::ResourceData {
45
46
  struct Priority {
46
47
  struct Locality {
47
48
  RefCountedPtr<XdsLocalityName> name;
@@ -124,15 +125,11 @@ class XdsEndpointResourceType
124
125
  absl::string_view type_url() const override {
125
126
  return "envoy.config.endpoint.v3.ClusterLoadAssignment";
126
127
  }
127
- absl::string_view v2_type_url() const override {
128
- return "envoy.api.v2.ClusterLoadAssignment";
129
- }
130
128
 
131
129
  DecodeResult Decode(const XdsResourceType::DecodeContext& context,
132
- absl::string_view serialized_resource,
133
- bool is_v2) const override;
130
+ absl::string_view serialized_resource) const override;
134
131
 
135
- void InitUpbSymtab(upb_DefPool* symtab) const override {
132
+ void InitUpbSymtab(XdsClient*, upb_DefPool* symtab) const override {
136
133
  envoy_config_endpoint_v3_ClusterLoadAssignment_getmsgdef(symtab);
137
134
  }
138
135
  };