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
@@ -20,14 +20,13 @@
20
20
 
21
21
  #include <stdint.h>
22
22
 
23
- #include <map>
24
23
  #include <string>
25
24
  #include <utility>
26
25
 
27
- #include "absl/status/status.h"
28
26
  #include "absl/status/statusor.h"
29
27
  #include "absl/strings/str_cat.h"
30
28
  #include "absl/strings/string_view.h"
29
+ #include "absl/types/variant.h"
31
30
  #include "envoy/extensions/filters/common/fault/v3/fault.upb.h"
32
31
  #include "envoy/extensions/filters/http/fault/v3/fault.upb.h"
33
32
  #include "envoy/extensions/filters/http/fault/v3/fault.upbdefs.h"
@@ -38,19 +37,18 @@
38
37
  #include <grpc/status.h>
39
38
 
40
39
  #include "src/core/ext/filters/fault_injection/fault_injection_filter.h"
40
+ #include "src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h"
41
41
  #include "src/core/ext/xds/xds_common_types.h"
42
42
  #include "src/core/ext/xds/xds_http_filters.h"
43
43
  #include "src/core/lib/channel/channel_args.h"
44
44
  #include "src/core/lib/channel/status_util.h"
45
45
  #include "src/core/lib/gprpp/time.h"
46
+ #include "src/core/lib/gprpp/validation_errors.h"
46
47
  #include "src/core/lib/json/json.h"
47
48
  #include "src/core/lib/transport/status_conversion.h"
48
49
 
49
50
  namespace grpc_core {
50
51
 
51
- const char* kXdsHttpFaultFilterConfigName =
52
- "envoy.extensions.filters.http.fault.v3.HTTPFault";
53
-
54
52
  namespace {
55
53
 
56
54
  uint32_t GetDenominator(const envoy_type_v3_FractionalPercent* fraction) {
@@ -72,13 +70,36 @@ uint32_t GetDenominator(const envoy_type_v3_FractionalPercent* fraction) {
72
70
  return 100;
73
71
  }
74
72
 
75
- absl::StatusOr<Json> ParseHttpFaultIntoJson(
76
- upb_StringView serialized_http_fault, upb_Arena* arena) {
73
+ } // namespace
74
+
75
+ absl::string_view XdsHttpFaultFilter::ConfigProtoName() const {
76
+ return "envoy.extensions.filters.http.fault.v3.HTTPFault";
77
+ }
78
+
79
+ absl::string_view XdsHttpFaultFilter::OverrideConfigProtoName() const {
80
+ return "";
81
+ }
82
+
83
+ void XdsHttpFaultFilter::PopulateSymtab(upb_DefPool* symtab) const {
84
+ envoy_extensions_filters_http_fault_v3_HTTPFault_getmsgdef(symtab);
85
+ }
86
+
87
+ absl::optional<XdsHttpFilterImpl::FilterConfig>
88
+ XdsHttpFaultFilter::GenerateFilterConfig(XdsExtension extension,
89
+ upb_Arena* arena,
90
+ ValidationErrors* errors) const {
91
+ absl::string_view* serialized_filter_config =
92
+ absl::get_if<absl::string_view>(&extension.value);
93
+ if (serialized_filter_config == nullptr) {
94
+ errors->AddError("could not parse fault injection filter config");
95
+ return absl::nullopt;
96
+ }
77
97
  auto* http_fault = envoy_extensions_filters_http_fault_v3_HTTPFault_parse(
78
- serialized_http_fault.data, serialized_http_fault.size, arena);
98
+ serialized_filter_config->data(), serialized_filter_config->size(),
99
+ arena);
79
100
  if (http_fault == nullptr) {
80
- return absl::InvalidArgumentError(
81
- "could not parse fault injection filter config");
101
+ errors->AddError("could not parse fault injection filter config");
102
+ return absl::nullopt;
82
103
  }
83
104
  // NOTE(lidiz): Here, we are manually translating the upb messages into the
84
105
  // JSON form of the filter config as part of method config, which will be
@@ -93,6 +114,7 @@ absl::StatusOr<Json> ParseHttpFaultIntoJson(
93
114
  const auto* fault_abort =
94
115
  envoy_extensions_filters_http_fault_v3_HTTPFault_abort(http_fault);
95
116
  if (fault_abort != nullptr) {
117
+ ValidationErrors::ScopedField field(errors, ".abort");
96
118
  grpc_status_code abort_grpc_status_code = GRPC_STATUS_OK;
97
119
  // Try if gRPC status code is set first
98
120
  int abort_grpc_status_code_raw =
@@ -101,8 +123,9 @@ absl::StatusOr<Json> ParseHttpFaultIntoJson(
101
123
  if (abort_grpc_status_code_raw != 0) {
102
124
  if (!grpc_status_code_from_int(abort_grpc_status_code_raw,
103
125
  &abort_grpc_status_code)) {
104
- return absl::InvalidArgumentError(absl::StrCat(
105
- "invalid gRPC status code: ", abort_grpc_status_code_raw));
126
+ ValidationErrors::ScopedField field(errors, ".grpc_status");
127
+ errors->AddError(absl::StrCat("invalid gRPC status code: ",
128
+ abort_grpc_status_code_raw));
106
129
  }
107
130
  } else {
108
131
  // if gRPC status code is empty, check http status
@@ -129,22 +152,26 @@ absl::StatusOr<Json> ParseHttpFaultIntoJson(
129
152
  auto* percent =
130
153
  envoy_extensions_filters_http_fault_v3_FaultAbort_percentage(
131
154
  fault_abort);
132
- fault_injection_policy_json["abortPercentageNumerator"] =
133
- Json(envoy_type_v3_FractionalPercent_numerator(percent));
134
- fault_injection_policy_json["abortPercentageDenominator"] =
135
- Json(GetDenominator(percent));
155
+ if (percent != nullptr) {
156
+ fault_injection_policy_json["abortPercentageNumerator"] =
157
+ envoy_type_v3_FractionalPercent_numerator(percent);
158
+ fault_injection_policy_json["abortPercentageDenominator"] =
159
+ GetDenominator(percent);
160
+ }
136
161
  }
137
162
  // Section 2: Parse the delay injection config
138
163
  const auto* fault_delay =
139
164
  envoy_extensions_filters_http_fault_v3_HTTPFault_delay(http_fault);
140
165
  if (fault_delay != nullptr) {
166
+ ValidationErrors::ScopedField field(errors, ".delay");
141
167
  // Parse the delay duration
142
168
  const auto* delay_duration =
143
169
  envoy_extensions_filters_common_fault_v3_FaultDelay_fixed_delay(
144
170
  fault_delay);
145
171
  if (delay_duration != nullptr) {
146
- fault_injection_policy_json["delay"] =
147
- ParseDuration(delay_duration).ToJsonString();
172
+ ValidationErrors::ScopedField field(errors, ".fixed_delay");
173
+ Duration duration = ParseDuration(delay_duration, errors);
174
+ fault_injection_policy_json["delay"] = duration.ToJsonString();
148
175
  }
149
176
  // Set the headers if we enabled header delay injection control
150
177
  if (envoy_extensions_filters_common_fault_v3_FaultDelay_has_header_delay(
@@ -158,10 +185,12 @@ absl::StatusOr<Json> ParseHttpFaultIntoJson(
158
185
  auto* percent =
159
186
  envoy_extensions_filters_common_fault_v3_FaultDelay_percentage(
160
187
  fault_delay);
161
- fault_injection_policy_json["delayPercentageNumerator"] =
162
- Json(envoy_type_v3_FractionalPercent_numerator(percent));
163
- fault_injection_policy_json["delayPercentageDenominator"] =
164
- Json(GetDenominator(percent));
188
+ if (percent != nullptr) {
189
+ fault_injection_policy_json["delayPercentageNumerator"] =
190
+ envoy_type_v3_FractionalPercent_numerator(percent);
191
+ fault_injection_policy_json["delayPercentageDenominator"] =
192
+ GetDenominator(percent);
193
+ }
165
194
  }
166
195
  // Section 3: Parse the maximum active faults
167
196
  const auto* max_fault_wrapper =
@@ -171,32 +200,16 @@ absl::StatusOr<Json> ParseHttpFaultIntoJson(
171
200
  fault_injection_policy_json["maxFaults"] =
172
201
  google_protobuf_UInt32Value_value(max_fault_wrapper);
173
202
  }
174
- return fault_injection_policy_json;
175
- }
176
-
177
- } // namespace
178
-
179
- void XdsHttpFaultFilter::PopulateSymtab(upb_DefPool* symtab) const {
180
- envoy_extensions_filters_http_fault_v3_HTTPFault_getmsgdef(symtab);
181
- }
182
-
183
- absl::StatusOr<XdsHttpFilterImpl::FilterConfig>
184
- XdsHttpFaultFilter::GenerateFilterConfig(
185
- upb_StringView serialized_filter_config, upb_Arena* arena) const {
186
- absl::StatusOr<Json> parse_result =
187
- ParseHttpFaultIntoJson(serialized_filter_config, arena);
188
- if (!parse_result.ok()) {
189
- return parse_result.status();
190
- }
191
- return FilterConfig{kXdsHttpFaultFilterConfigName, std::move(*parse_result)};
203
+ return FilterConfig{ConfigProtoName(),
204
+ std::move(fault_injection_policy_json)};
192
205
  }
193
206
 
194
- absl::StatusOr<XdsHttpFilterImpl::FilterConfig>
207
+ absl::optional<XdsHttpFilterImpl::FilterConfig>
195
208
  XdsHttpFaultFilter::GenerateFilterConfigOverride(
196
- upb_StringView serialized_filter_config, upb_Arena* arena) const {
209
+ XdsExtension extension, upb_Arena* arena, ValidationErrors* errors) const {
197
210
  // HTTPFault filter has the same message type in HTTP connection manager's
198
211
  // filter config and in overriding filter config field.
199
- return GenerateFilterConfig(serialized_filter_config, arena);
212
+ return GenerateFilterConfig(std::move(extension), arena, errors);
200
213
  }
201
214
 
202
215
  const grpc_channel_filter* XdsHttpFaultFilter::channel_filter() const {
@@ -20,47 +20,39 @@
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
22
  #include "absl/status/statusor.h"
23
+ #include "absl/strings/string_view.h"
24
+ #include "absl/types/optional.h"
23
25
  #include "upb/arena.h"
24
26
  #include "upb/def.h"
25
- #include "upb/upb.h"
26
27
 
28
+ #include "src/core/ext/xds/xds_common_types.h"
27
29
  #include "src/core/ext/xds/xds_http_filters.h"
28
30
  #include "src/core/lib/channel/channel_args.h"
29
31
  #include "src/core/lib/channel/channel_fwd.h"
32
+ #include "src/core/lib/gprpp/validation_errors.h"
30
33
 
31
34
  namespace grpc_core {
32
35
 
33
- extern const char* kXdsHttpFaultFilterConfigName;
34
-
35
36
  class XdsHttpFaultFilter : public XdsHttpFilterImpl {
36
37
  public:
37
- // Overrides the PopulateSymtab method
38
+ absl::string_view ConfigProtoName() const override;
39
+ absl::string_view OverrideConfigProtoName() const override;
38
40
  void PopulateSymtab(upb_DefPool* symtab) const override;
39
-
40
- // Overrides the GenerateFilterConfig method
41
- absl::StatusOr<FilterConfig> GenerateFilterConfig(
42
- upb_StringView serialized_filter_config, upb_Arena* arena) const override;
43
-
44
- // Overrides the GenerateFilterConfigOverride method
45
- absl::StatusOr<FilterConfig> GenerateFilterConfigOverride(
46
- upb_StringView serialized_filter_config, upb_Arena* arena) const override;
47
-
48
- // Overrides the channel_filter method
41
+ absl::optional<FilterConfig> GenerateFilterConfig(
42
+ XdsExtension extension, upb_Arena* arena,
43
+ ValidationErrors* errors) const override;
44
+ absl::optional<FilterConfig> GenerateFilterConfigOverride(
45
+ XdsExtension extension, upb_Arena* arena,
46
+ ValidationErrors* errors) const override;
49
47
  const grpc_channel_filter* channel_filter() const override;
50
-
51
- // Overrides the ModifyChannelArgs method
52
48
  ChannelArgs ModifyChannelArgs(const ChannelArgs& args) const override;
53
-
54
- // Overrides the GenerateServiceConfig method
55
49
  absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
56
50
  const FilterConfig& hcm_filter_config,
57
51
  const FilterConfig* filter_config_override) const override;
58
-
59
52
  bool IsSupportedOnClients() const override { return true; }
60
-
61
53
  bool IsSupportedOnServers() const override { return false; }
62
54
  };
63
55
 
64
56
  } // namespace grpc_core
65
57
 
66
- #endif /* GRPC_CORE_EXT_XDS_XDS_HTTP_FAULT_FILTER_H */
58
+ #endif // GRPC_CORE_EXT_XDS_XDS_HTTP_FAULT_FILTER_H
@@ -23,107 +23,94 @@
23
23
  #include <utility>
24
24
  #include <vector>
25
25
 
26
- #include "absl/memory/memory.h"
27
- #include "absl/status/status.h"
26
+ #include "absl/types/variant.h"
28
27
  #include "envoy/extensions/filters/http/router/v3/router.upb.h"
29
28
  #include "envoy/extensions/filters/http/router/v3/router.upbdefs.h"
30
29
 
30
+ #include <grpc/support/log.h>
31
+
31
32
  #include "src/core/ext/xds/xds_http_fault_filter.h"
32
33
  #include "src/core/ext/xds/xds_http_rbac_filter.h"
33
34
 
34
35
  namespace grpc_core {
35
36
 
36
- const char* kXdsHttpRouterFilterConfigName =
37
- "envoy.extensions.filters.http.router.v3.Router";
37
+ //
38
+ // XdsHttpRouterFilter
39
+ //
38
40
 
39
- namespace {
41
+ absl::string_view XdsHttpRouterFilter::ConfigProtoName() const {
42
+ return "envoy.extensions.filters.http.router.v3.Router";
43
+ }
40
44
 
41
- class XdsHttpRouterFilter : public XdsHttpFilterImpl {
42
- public:
43
- void PopulateSymtab(upb_DefPool* symtab) const override {
44
- envoy_extensions_filters_http_router_v3_Router_getmsgdef(symtab);
45
- }
45
+ absl::string_view XdsHttpRouterFilter::OverrideConfigProtoName() const {
46
+ return "";
47
+ }
46
48
 
47
- absl::StatusOr<FilterConfig> GenerateFilterConfig(
48
- upb_StringView serialized_filter_config,
49
- upb_Arena* arena) const override {
50
- if (envoy_extensions_filters_http_router_v3_Router_parse(
51
- serialized_filter_config.data, serialized_filter_config.size,
52
- arena) == nullptr) {
53
- return absl::InvalidArgumentError("could not parse router filter config");
54
- }
55
- return FilterConfig{kXdsHttpRouterFilterConfigName, Json()};
56
- }
49
+ void XdsHttpRouterFilter::PopulateSymtab(upb_DefPool* symtab) const {
50
+ envoy_extensions_filters_http_router_v3_Router_getmsgdef(symtab);
51
+ }
57
52
 
58
- absl::StatusOr<FilterConfig> GenerateFilterConfigOverride(
59
- upb_StringView /*serialized_filter_config*/,
60
- upb_Arena* /*arena*/) const override {
61
- return absl::InvalidArgumentError(
62
- "router filter does not support config override");
53
+ absl::optional<XdsHttpFilterImpl::FilterConfig>
54
+ XdsHttpRouterFilter::GenerateFilterConfig(XdsExtension extension,
55
+ upb_Arena* arena,
56
+ ValidationErrors* errors) const {
57
+ absl::string_view* serialized_filter_config =
58
+ absl::get_if<absl::string_view>(&extension.value);
59
+ if (serialized_filter_config == nullptr) {
60
+ errors->AddError("could not parse router filter config");
61
+ return absl::nullopt;
63
62
  }
64
-
65
- const grpc_channel_filter* channel_filter() const override { return nullptr; }
66
-
67
- // No-op. This will never be called, since channel_filter() returns null.
68
- absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
69
- const FilterConfig& /*hcm_filter_config*/,
70
- const FilterConfig* /*filter_config_override*/) const override {
71
- return absl::UnimplementedError("router filter should never be called");
63
+ if (envoy_extensions_filters_http_router_v3_Router_parse(
64
+ serialized_filter_config->data(), serialized_filter_config->size(),
65
+ arena) == nullptr) {
66
+ errors->AddError("could not parse router filter config");
67
+ return absl::nullopt;
72
68
  }
69
+ return FilterConfig{ConfigProtoName(), Json()};
70
+ }
73
71
 
74
- bool IsSupportedOnClients() const override { return true; }
75
-
76
- bool IsSupportedOnServers() const override { return true; }
77
-
78
- bool IsTerminalFilter() const override { return true; }
79
- };
80
-
81
- using FilterOwnerList = std::vector<std::unique_ptr<XdsHttpFilterImpl>>;
82
- using FilterRegistryMap = std::map<absl::string_view, XdsHttpFilterImpl*>;
72
+ absl::optional<XdsHttpFilterImpl::FilterConfig>
73
+ XdsHttpRouterFilter::GenerateFilterConfigOverride(
74
+ XdsExtension /*extension*/, upb_Arena* /*arena*/,
75
+ ValidationErrors* errors) const {
76
+ errors->AddError("router filter does not support config override");
77
+ return absl::nullopt;
78
+ }
83
79
 
84
- FilterOwnerList* g_filters = nullptr;
85
- FilterRegistryMap* g_filter_registry = nullptr;
80
+ //
81
+ // XdsHttpFilterRegistry
82
+ //
86
83
 
87
- } // namespace
84
+ XdsHttpFilterRegistry::XdsHttpFilterRegistry(bool register_builtins) {
85
+ if (register_builtins) {
86
+ RegisterFilter(std::make_unique<XdsHttpRouterFilter>());
87
+ RegisterFilter(std::make_unique<XdsHttpFaultFilter>());
88
+ RegisterFilter(std::make_unique<XdsHttpRbacFilter>());
89
+ }
90
+ }
88
91
 
89
92
  void XdsHttpFilterRegistry::RegisterFilter(
90
- std::unique_ptr<XdsHttpFilterImpl> filter,
91
- const std::set<absl::string_view>& config_proto_type_names) {
92
- for (auto config_proto_type_name : config_proto_type_names) {
93
- (*g_filter_registry)[config_proto_type_name] = filter.get();
93
+ std::unique_ptr<XdsHttpFilterImpl> filter) {
94
+ GPR_ASSERT(
95
+ registry_map_.emplace(filter->ConfigProtoName(), filter.get()).second);
96
+ auto override_proto_name = filter->OverrideConfigProtoName();
97
+ if (!override_proto_name.empty()) {
98
+ GPR_ASSERT(registry_map_.emplace(override_proto_name, filter.get()).second);
94
99
  }
95
- g_filters->push_back(std::move(filter));
100
+ owning_list_.push_back(std::move(filter));
96
101
  }
97
102
 
98
103
  const XdsHttpFilterImpl* XdsHttpFilterRegistry::GetFilterForType(
99
- absl::string_view proto_type_name) {
100
- auto it = g_filter_registry->find(proto_type_name);
101
- if (it == g_filter_registry->end()) return nullptr;
104
+ absl::string_view proto_type_name) const {
105
+ auto it = registry_map_.find(proto_type_name);
106
+ if (it == registry_map_.end()) return nullptr;
102
107
  return it->second;
103
108
  }
104
109
 
105
- void XdsHttpFilterRegistry::PopulateSymtab(upb_DefPool* symtab) {
106
- for (const auto& filter : *g_filters) {
110
+ void XdsHttpFilterRegistry::PopulateSymtab(upb_DefPool* symtab) const {
111
+ for (const auto& filter : owning_list_) {
107
112
  filter->PopulateSymtab(symtab);
108
113
  }
109
114
  }
110
115
 
111
- void XdsHttpFilterRegistry::Init() {
112
- g_filters = new FilterOwnerList;
113
- g_filter_registry = new FilterRegistryMap;
114
- RegisterFilter(absl::make_unique<XdsHttpRouterFilter>(),
115
- {kXdsHttpRouterFilterConfigName});
116
- RegisterFilter(absl::make_unique<XdsHttpFaultFilter>(),
117
- {kXdsHttpFaultFilterConfigName});
118
- RegisterFilter(absl::make_unique<XdsHttpRbacFilter>(),
119
- {kXdsHttpRbacFilterConfigName});
120
- RegisterFilter(absl::make_unique<XdsHttpRbacFilter>(),
121
- {kXdsHttpRbacFilterConfigOverrideName});
122
- }
123
-
124
- void XdsHttpFilterRegistry::Shutdown() {
125
- delete g_filter_registry;
126
- delete g_filters;
127
- }
128
-
129
116
  } // namespace grpc_core
@@ -19,25 +19,28 @@
19
19
 
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
+ #include <map>
22
23
  #include <memory>
23
- #include <set>
24
24
  #include <string>
25
+ #include <utility>
26
+ #include <vector>
25
27
 
28
+ #include "absl/status/status.h"
26
29
  #include "absl/status/statusor.h"
27
30
  #include "absl/strings/str_cat.h"
28
31
  #include "absl/strings/string_view.h"
32
+ #include "absl/types/optional.h"
29
33
  #include "upb/arena.h"
30
34
  #include "upb/def.h"
31
- #include "upb/upb.h"
32
35
 
36
+ #include "src/core/ext/xds/xds_common_types.h"
33
37
  #include "src/core/lib/channel/channel_args.h"
34
38
  #include "src/core/lib/channel/channel_fwd.h"
39
+ #include "src/core/lib/gprpp/validation_errors.h"
35
40
  #include "src/core/lib/json/json.h"
36
41
 
37
42
  namespace grpc_core {
38
43
 
39
- extern const char* kXdsHttpRouterFilterConfigName;
40
-
41
44
  class XdsHttpFilterImpl {
42
45
  public:
43
46
  struct FilterConfig {
@@ -69,25 +72,33 @@ class XdsHttpFilterImpl {
69
72
 
70
73
  virtual ~XdsHttpFilterImpl() = default;
71
74
 
75
+ // Returns the top-level filter config proto message name.
76
+ virtual absl::string_view ConfigProtoName() const = 0;
77
+
78
+ // Returns the override filter config proto message name.
79
+ // If empty, no override type is supported.
80
+ virtual absl::string_view OverrideConfigProtoName() const = 0;
81
+
72
82
  // Loads the proto message into the upb symtab.
73
83
  virtual void PopulateSymtab(upb_DefPool* symtab) const = 0;
74
84
 
75
85
  // Generates a Config from the xDS filter config proto.
76
86
  // Used for the top-level config in the HCM HTTP filter list.
77
- virtual absl::StatusOr<FilterConfig> GenerateFilterConfig(
78
- upb_StringView serialized_filter_config, upb_Arena* arena) const = 0;
87
+ virtual absl::optional<FilterConfig> GenerateFilterConfig(
88
+ XdsExtension extension, upb_Arena* arena,
89
+ ValidationErrors* errors) const = 0;
79
90
 
80
91
  // Generates a Config from the xDS filter config proto.
81
92
  // Used for the typed_per_filter_config override in VirtualHost and Route.
82
- virtual absl::StatusOr<FilterConfig> GenerateFilterConfigOverride(
83
- upb_StringView serialized_filter_config, upb_Arena* arena) const = 0;
93
+ virtual absl::optional<FilterConfig> GenerateFilterConfigOverride(
94
+ XdsExtension extension, upb_Arena* arena,
95
+ ValidationErrors* errors) const = 0;
84
96
 
85
97
  // C-core channel filter implementation.
86
98
  virtual const grpc_channel_filter* channel_filter() const = 0;
87
99
 
88
100
  // Modifies channel args that may affect service config parsing (not
89
101
  // visible to the channel as a whole).
90
- // Takes ownership of args. Caller takes ownership of return value.
91
102
  virtual ChannelArgs ModifyChannelArgs(const ChannelArgs& args) const {
92
103
  return args;
93
104
  }
@@ -112,22 +123,59 @@ class XdsHttpFilterImpl {
112
123
  virtual bool IsTerminalFilter() const { return false; }
113
124
  };
114
125
 
126
+ class XdsHttpRouterFilter : public XdsHttpFilterImpl {
127
+ public:
128
+ absl::string_view ConfigProtoName() const override;
129
+ absl::string_view OverrideConfigProtoName() const override;
130
+ void PopulateSymtab(upb_DefPool* symtab) const override;
131
+ absl::optional<FilterConfig> GenerateFilterConfig(
132
+ XdsExtension extension, upb_Arena* arena,
133
+ ValidationErrors* errors) const override;
134
+ absl::optional<FilterConfig> GenerateFilterConfigOverride(
135
+ XdsExtension extension, upb_Arena* arena,
136
+ ValidationErrors* errors) const override;
137
+ const grpc_channel_filter* channel_filter() const override { return nullptr; }
138
+ absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
139
+ const FilterConfig& /*hcm_filter_config*/,
140
+ const FilterConfig* /*filter_config_override*/) const override {
141
+ // This will never be called, since channel_filter() returns null.
142
+ return absl::UnimplementedError("router filter should never be called");
143
+ }
144
+ bool IsSupportedOnClients() const override { return true; }
145
+ bool IsSupportedOnServers() const override { return true; }
146
+ bool IsTerminalFilter() const override { return true; }
147
+ };
148
+
115
149
  class XdsHttpFilterRegistry {
116
150
  public:
117
- static void RegisterFilter(
118
- std::unique_ptr<XdsHttpFilterImpl> filter,
119
- const std::set<absl::string_view>& config_proto_type_names);
151
+ explicit XdsHttpFilterRegistry(bool register_builtins = true);
152
+
153
+ // Not copyable.
154
+ XdsHttpFilterRegistry(const XdsHttpFilterRegistry&) = delete;
155
+ XdsHttpFilterRegistry& operator=(const XdsHttpFilterRegistry&) = delete;
156
+
157
+ // Movable.
158
+ XdsHttpFilterRegistry(XdsHttpFilterRegistry&& other) noexcept
159
+ : owning_list_(std::move(other.owning_list_)),
160
+ registry_map_(std::move(other.registry_map_)) {}
161
+ XdsHttpFilterRegistry& operator=(XdsHttpFilterRegistry&& other) noexcept {
162
+ owning_list_ = std::move(other.owning_list_);
163
+ registry_map_ = std::move(other.registry_map_);
164
+ return *this;
165
+ }
166
+
167
+ void RegisterFilter(std::unique_ptr<XdsHttpFilterImpl> filter);
120
168
 
121
- static const XdsHttpFilterImpl* GetFilterForType(
122
- absl::string_view proto_type_name);
169
+ const XdsHttpFilterImpl* GetFilterForType(
170
+ absl::string_view proto_type_name) const;
123
171
 
124
- static void PopulateSymtab(upb_DefPool* symtab);
172
+ void PopulateSymtab(upb_DefPool* symtab) const;
125
173
 
126
- // Global init and shutdown.
127
- static void Init();
128
- static void Shutdown();
174
+ private:
175
+ std::vector<std::unique_ptr<XdsHttpFilterImpl>> owning_list_;
176
+ std::map<absl::string_view, XdsHttpFilterImpl*> registry_map_;
129
177
  };
130
178
 
131
179
  } // namespace grpc_core
132
180
 
133
- #endif /* GRPC_CORE_EXT_XDS_XDS_HTTP_FILTERS_H */
181
+ #endif // GRPC_CORE_EXT_XDS_XDS_HTTP_FILTERS_H