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
@@ -69,7 +69,6 @@
69
69
  #include <vector>
70
70
 
71
71
  #include "absl/container/inlined_vector.h"
72
- #include "absl/memory/memory.h"
73
72
  #include "absl/status/status.h"
74
73
  #include "absl/status/statusor.h"
75
74
  #include "absl/strings/str_cat.h"
@@ -106,13 +105,13 @@
106
105
  #include "src/core/lib/channel/channelz.h"
107
106
  #include "src/core/lib/config/core_configuration.h"
108
107
  #include "src/core/lib/debug/trace.h"
109
- #include "src/core/lib/event_engine/default_event_engine.h"
110
108
  #include "src/core/lib/gpr/string.h"
111
109
  #include "src/core/lib/gpr/useful.h"
112
110
  #include "src/core/lib/gprpp/debug_location.h"
113
111
  #include "src/core/lib/gprpp/orphanable.h"
114
112
  #include "src/core/lib/gprpp/ref_counted.h"
115
113
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
114
+ #include "src/core/lib/gprpp/status_helper.h"
116
115
  #include "src/core/lib/gprpp/time.h"
117
116
  #include "src/core/lib/gprpp/validation_errors.h"
118
117
  #include "src/core/lib/gprpp/work_serializer.h"
@@ -135,7 +134,6 @@
135
134
  #include "src/core/lib/resolver/server_address.h"
136
135
  #include "src/core/lib/security/credentials/credentials.h"
137
136
  #include "src/core/lib/slice/slice.h"
138
- #include "src/core/lib/slice/slice_refcount.h"
139
137
  #include "src/core/lib/slice/slice_string_helpers.h"
140
138
  #include "src/core/lib/surface/call.h"
141
139
  #include "src/core/lib/surface/channel.h"
@@ -161,7 +159,6 @@ const char kGrpcLbAddressAttributeKey[] = "grpclb";
161
159
  namespace {
162
160
 
163
161
  using ::grpc_event_engine::experimental::EventEngine;
164
- using ::grpc_event_engine::experimental::GetDefaultEventEngine;
165
162
 
166
163
  constexpr absl::string_view kGrpclb = "grpclb";
167
164
 
@@ -341,8 +338,8 @@ class GrpcLb : public LoadBalancingPolicy {
341
338
  client_stats_(std::move(client_stats)) {}
342
339
 
343
340
  std::unique_ptr<AttributeInterface> Copy() const override {
344
- return absl::make_unique<TokenAndClientStatsAttribute>(lb_token_,
345
- client_stats_);
341
+ return std::make_unique<TokenAndClientStatsAttribute>(lb_token_,
342
+ client_stats_);
346
343
  }
347
344
 
348
345
  int Cmp(const AttributeInterface* other_base) const override {
@@ -470,6 +467,7 @@ class GrpcLb : public LoadBalancingPolicy {
470
467
  std::unique_ptr<SubchannelPicker> picker) override;
471
468
  void RequestReresolution() override;
472
469
  absl::string_view GetAuthority() override;
470
+ grpc_event_engine::experimental::EventEngine* GetEventEngine() override;
473
471
  void AddTraceEvent(TraceSeverity severity,
474
472
  absl::string_view message) override;
475
473
 
@@ -708,8 +706,8 @@ ServerAddressList GrpcLb::Serverlist::GetServerAddressList(
708
706
  std::map<const char*, std::unique_ptr<ServerAddress::AttributeInterface>>
709
707
  attributes;
710
708
  attributes[kGrpcLbAddressAttributeKey] =
711
- absl::make_unique<TokenAndClientStatsAttribute>(std::move(lb_token),
712
- stats);
709
+ std::make_unique<TokenAndClientStatsAttribute>(std::move(lb_token),
710
+ stats);
713
711
  // Add address.
714
712
  addresses.emplace_back(addr, ChannelArgs(), std::move(attributes));
715
713
  }
@@ -763,7 +761,7 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
763
761
  GrpcLbClientStats* client_stats = subchannel_wrapper->client_stats();
764
762
  if (client_stats != nullptr) {
765
763
  complete_pick->subchannel_call_tracker =
766
- absl::make_unique<SubchannelCallTracker>(
764
+ std::make_unique<SubchannelCallTracker>(
767
765
  client_stats->Ref(),
768
766
  std::move(complete_pick->subchannel_call_tracker));
769
767
  // The metadata value is a hack: we pretend the pointer points to
@@ -853,8 +851,8 @@ void GrpcLb::Helper::UpdateState(grpc_connectivity_state state,
853
851
  }
854
852
  parent_->channel_control_helper()->UpdateState(
855
853
  state, status,
856
- absl::make_unique<Picker>(std::move(serverlist), std::move(picker),
857
- std::move(client_stats)));
854
+ std::make_unique<Picker>(std::move(serverlist), std::move(picker),
855
+ std::move(client_stats)));
858
856
  }
859
857
 
860
858
  void GrpcLb::Helper::RequestReresolution() {
@@ -873,6 +871,10 @@ absl::string_view GrpcLb::Helper::GetAuthority() {
873
871
  return parent_->channel_control_helper()->GetAuthority();
874
872
  }
875
873
 
874
+ grpc_event_engine::experimental::EventEngine* GrpcLb::Helper::GetEventEngine() {
875
+ return parent_->channel_control_helper()->GetEventEngine();
876
+ }
877
+
876
878
  void GrpcLb::Helper::AddTraceEvent(TraceSeverity severity,
877
879
  absl::string_view message) {
878
880
  if (parent_->shutting_down_) return;
@@ -922,7 +924,7 @@ GrpcLb::BalancerCallState::BalancerCallState(
922
924
  arena.ptr());
923
925
  send_message_payload_ =
924
926
  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
925
- grpc_slice_unref_internal(request_payload_slice);
927
+ CSliceUnref(request_payload_slice);
926
928
  // Init other data associated with the LB call.
927
929
  grpc_metadata_array_init(&lb_initial_metadata_recv_);
928
930
  grpc_metadata_array_init(&lb_trailing_metadata_recv_);
@@ -935,7 +937,7 @@ GrpcLb::BalancerCallState::~BalancerCallState() {
935
937
  grpc_metadata_array_destroy(&lb_trailing_metadata_recv_);
936
938
  grpc_byte_buffer_destroy(send_message_payload_);
937
939
  grpc_byte_buffer_destroy(recv_message_payload_);
938
- grpc_slice_unref_internal(lb_call_status_details_);
940
+ CSliceUnref(lb_call_status_details_);
939
941
  }
940
942
 
941
943
  void GrpcLb::BalancerCallState::Orphan() {
@@ -946,7 +948,8 @@ void GrpcLb::BalancerCallState::Orphan() {
946
948
  // call, then the following cancellation will be a no-op.
947
949
  grpc_call_cancel_internal(lb_call_);
948
950
  if (client_load_report_handle_.has_value() &&
949
- GetDefaultEventEngine()->Cancel(client_load_report_handle_.value())) {
951
+ grpclb_policy()->channel_control_helper()->GetEventEngine()->Cancel(
952
+ client_load_report_handle_.value())) {
950
953
  Unref(DEBUG_LOCATION, "client_load_report cancelled");
951
954
  }
952
955
  // Note that the initial ref is hold by lb_on_balancer_status_received_
@@ -1032,12 +1035,13 @@ void GrpcLb::BalancerCallState::StartQuery() {
1032
1035
 
1033
1036
  void GrpcLb::BalancerCallState::ScheduleNextClientLoadReportLocked() {
1034
1037
  client_load_report_handle_ =
1035
- GetDefaultEventEngine()->RunAfter(client_stats_report_interval_, [this] {
1036
- ApplicationCallbackExecCtx callback_exec_ctx;
1037
- ExecCtx exec_ctx;
1038
- grpclb_policy()->work_serializer()->Run(
1039
- [this] { MaybeSendClientLoadReportLocked(); }, DEBUG_LOCATION);
1040
- });
1038
+ grpclb_policy()->channel_control_helper()->GetEventEngine()->RunAfter(
1039
+ client_stats_report_interval_, [this] {
1040
+ ApplicationCallbackExecCtx callback_exec_ctx;
1041
+ ExecCtx exec_ctx;
1042
+ grpclb_policy()->work_serializer()->Run(
1043
+ [this] { MaybeSendClientLoadReportLocked(); }, DEBUG_LOCATION);
1044
+ });
1041
1045
  }
1042
1046
 
1043
1047
  void GrpcLb::BalancerCallState::MaybeSendClientLoadReportLocked() {
@@ -1090,7 +1094,7 @@ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
1090
1094
  num_calls_finished_known_received, drop_token_counts.get(), arena.ptr());
1091
1095
  send_message_payload_ =
1092
1096
  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
1093
- grpc_slice_unref_internal(request_payload_slice);
1097
+ CSliceUnref(request_payload_slice);
1094
1098
  // Send the report.
1095
1099
  grpc_op op;
1096
1100
  memset(&op, 0, sizeof(op));
@@ -1109,7 +1113,6 @@ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
1109
1113
  void GrpcLb::BalancerCallState::ClientLoadReportDone(void* arg,
1110
1114
  grpc_error_handle error) {
1111
1115
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
1112
- (void)GRPC_ERROR_REF(error); // ref owned by lambda
1113
1116
  lb_calld->grpclb_policy()->work_serializer()->Run(
1114
1117
  [lb_calld, error]() { lb_calld->ClientLoadReportDoneLocked(error); },
1115
1118
  DEBUG_LOCATION);
@@ -1119,9 +1122,8 @@ void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(
1119
1122
  grpc_error_handle error) {
1120
1123
  grpc_byte_buffer_destroy(send_message_payload_);
1121
1124
  send_message_payload_ = nullptr;
1122
- if (!GRPC_ERROR_IS_NONE(error) || this != grpclb_policy()->lb_calld_.get()) {
1125
+ if (!error.ok() || this != grpclb_policy()->lb_calld_.get()) {
1123
1126
  Unref(DEBUG_LOCATION, "client_load_report");
1124
- GRPC_ERROR_UNREF(error);
1125
1127
  return;
1126
1128
  }
1127
1129
  ScheduleNextClientLoadReportLocked();
@@ -1293,7 +1295,7 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked() {
1293
1295
  }
1294
1296
  }
1295
1297
  }
1296
- grpc_slice_unref_internal(response_slice);
1298
+ CSliceUnref(response_slice);
1297
1299
  if (!grpclb_policy()->shutting_down_) {
1298
1300
  // Keep listening for serverlist updates.
1299
1301
  grpc_op op;
@@ -1314,7 +1316,6 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked() {
1314
1316
  void GrpcLb::BalancerCallState::OnBalancerStatusReceived(
1315
1317
  void* arg, grpc_error_handle error) {
1316
1318
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
1317
- (void)GRPC_ERROR_REF(error); // owned by lambda
1318
1319
  lb_calld->grpclb_policy()->work_serializer()->Run(
1319
1320
  [lb_calld, error]() { lb_calld->OnBalancerStatusReceivedLocked(error); },
1320
1321
  DEBUG_LOCATION);
@@ -1329,10 +1330,9 @@ void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked(
1329
1330
  "[grpclb %p] lb_calld=%p: Status from LB server received. "
1330
1331
  "Status = %d, details = '%s', (lb_call: %p), error '%s'",
1331
1332
  grpclb_policy(), this, lb_call_status_, status_details, lb_call_,
1332
- grpc_error_std_string(error).c_str());
1333
+ StatusToString(error).c_str());
1333
1334
  gpr_free(status_details);
1334
1335
  }
1335
- GRPC_ERROR_UNREF(error);
1336
1336
  // If this lb_calld is still in use, this call ended because of a failure so
1337
1337
  // we want to retry connecting. Otherwise, we have deliberately ended this
1338
1338
  // call and no further action is required.
@@ -1570,7 +1570,7 @@ absl::Status GrpcLb::UpdateLocked(UpdateArgs args) {
1570
1570
  for (ServerAddress& address : *fallback_backend_addresses_) {
1571
1571
  address = address.WithAttribute(
1572
1572
  kGrpcLbAddressAttributeKey,
1573
- absl::make_unique<TokenAndClientStatsAttribute>("", nullptr));
1573
+ std::make_unique<TokenAndClientStatsAttribute>("", nullptr));
1574
1574
  }
1575
1575
  }
1576
1576
  resolution_note_ = std::move(args.resolution_note);
@@ -1698,7 +1698,6 @@ void GrpcLb::StartBalancerCallRetryTimerLocked() {
1698
1698
 
1699
1699
  void GrpcLb::OnBalancerCallRetryTimer(void* arg, grpc_error_handle error) {
1700
1700
  GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1701
- (void)GRPC_ERROR_REF(error); // ref owned by lambda
1702
1701
  grpclb_policy->work_serializer()->Run(
1703
1702
  [grpclb_policy, error]() {
1704
1703
  grpclb_policy->OnBalancerCallRetryTimerLocked(error);
@@ -1708,14 +1707,13 @@ void GrpcLb::OnBalancerCallRetryTimer(void* arg, grpc_error_handle error) {
1708
1707
 
1709
1708
  void GrpcLb::OnBalancerCallRetryTimerLocked(grpc_error_handle error) {
1710
1709
  retry_timer_callback_pending_ = false;
1711
- if (!shutting_down_ && GRPC_ERROR_IS_NONE(error) && lb_calld_ == nullptr) {
1710
+ if (!shutting_down_ && error.ok() && lb_calld_ == nullptr) {
1712
1711
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1713
1712
  gpr_log(GPR_INFO, "[grpclb %p] Restarting call to LB server", this);
1714
1713
  }
1715
1714
  StartBalancerCallLocked();
1716
1715
  }
1717
1716
  Unref(DEBUG_LOCATION, "on_balancer_call_retry_timer");
1718
- GRPC_ERROR_UNREF(error);
1719
1717
  }
1720
1718
 
1721
1719
  //
@@ -1742,7 +1740,6 @@ void GrpcLb::MaybeEnterFallbackModeAfterStartup() {
1742
1740
 
1743
1741
  void GrpcLb::OnFallbackTimer(void* arg, grpc_error_handle error) {
1744
1742
  GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1745
- (void)GRPC_ERROR_REF(error); // ref owned by lambda
1746
1743
  grpclb_policy->work_serializer()->Run(
1747
1744
  [grpclb_policy, error]() { grpclb_policy->OnFallbackTimerLocked(error); },
1748
1745
  DEBUG_LOCATION);
@@ -1751,8 +1748,7 @@ void GrpcLb::OnFallbackTimer(void* arg, grpc_error_handle error) {
1751
1748
  void GrpcLb::OnFallbackTimerLocked(grpc_error_handle error) {
1752
1749
  // If we receive a serverlist after the timer fires but before this callback
1753
1750
  // actually runs, don't fall back.
1754
- if (fallback_at_startup_checks_pending_ && !shutting_down_ &&
1755
- GRPC_ERROR_IS_NONE(error)) {
1751
+ if (fallback_at_startup_checks_pending_ && !shutting_down_ && error.ok()) {
1756
1752
  gpr_log(GPR_INFO,
1757
1753
  "[grpclb %p] No response from balancer after fallback timeout; "
1758
1754
  "entering fallback mode",
@@ -1763,7 +1759,6 @@ void GrpcLb::OnFallbackTimerLocked(grpc_error_handle error) {
1763
1759
  CreateOrUpdateChildPolicyLocked();
1764
1760
  }
1765
1761
  Unref(DEBUG_LOCATION, "on_fallback_timer");
1766
- GRPC_ERROR_UNREF(error);
1767
1762
  }
1768
1763
 
1769
1764
  //
@@ -1786,7 +1781,7 @@ OrphanablePtr<LoadBalancingPolicy> GrpcLb::CreateChildPolicyLocked(
1786
1781
  LoadBalancingPolicy::Args lb_policy_args;
1787
1782
  lb_policy_args.work_serializer = work_serializer();
1788
1783
  lb_policy_args.args = args;
1789
- lb_policy_args.channel_control_helper = absl::make_unique<Helper>(Ref());
1784
+ lb_policy_args.channel_control_helper = std::make_unique<Helper>(Ref());
1790
1785
  OrphanablePtr<LoadBalancingPolicy> lb_policy =
1791
1786
  MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
1792
1787
  &grpc_lb_glb_trace);
@@ -1865,14 +1860,13 @@ void GrpcLb::StartSubchannelCacheTimerLocked() {
1865
1860
 
1866
1861
  void GrpcLb::OnSubchannelCacheTimer(void* arg, grpc_error_handle error) {
1867
1862
  auto* self = static_cast<GrpcLb*>(arg);
1868
- (void)GRPC_ERROR_REF(error);
1869
1863
  self->work_serializer()->Run(
1870
1864
  [self, error]() { self->GrpcLb::OnSubchannelCacheTimerLocked(error); },
1871
1865
  DEBUG_LOCATION);
1872
1866
  }
1873
1867
 
1874
1868
  void GrpcLb::OnSubchannelCacheTimerLocked(grpc_error_handle error) {
1875
- if (subchannel_cache_timer_pending_ && GRPC_ERROR_IS_NONE(error)) {
1869
+ if (subchannel_cache_timer_pending_ && error.ok()) {
1876
1870
  auto it = cached_subchannels_.begin();
1877
1871
  if (it != cached_subchannels_.end()) {
1878
1872
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
@@ -1889,7 +1883,6 @@ void GrpcLb::OnSubchannelCacheTimerLocked(grpc_error_handle error) {
1889
1883
  subchannel_cache_timer_pending_ = false;
1890
1884
  }
1891
1885
  Unref(DEBUG_LOCATION, "OnSubchannelCacheTimer");
1892
- GRPC_ERROR_UNREF(error);
1893
1886
  }
1894
1887
 
1895
1888
  //
@@ -1914,16 +1907,13 @@ class GrpcLbFactory : public LoadBalancingPolicyFactory {
1914
1907
 
1915
1908
  } // namespace
1916
1909
 
1917
- } // namespace grpc_core
1918
-
1919
1910
  //
1920
1911
  // Plugin registration
1921
1912
  //
1922
1913
 
1923
- namespace grpc_core {
1924
1914
  void RegisterGrpcLbPolicy(CoreConfiguration::Builder* builder) {
1925
1915
  builder->lb_policy_registry()->RegisterLoadBalancingPolicyFactory(
1926
- absl::make_unique<GrpcLbFactory>());
1916
+ std::make_unique<GrpcLbFactory>());
1927
1917
  builder->channel_init()->RegisterStage(
1928
1918
  GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
1929
1919
  [](ChannelStackBuilder* builder) {
@@ -1939,4 +1929,5 @@ void RegisterGrpcLbPolicy(CoreConfiguration::Builder* builder) {
1939
1929
  return true;
1940
1930
  });
1941
1931
  }
1932
+
1942
1933
  } // namespace grpc_core
@@ -20,7 +20,6 @@
20
20
 
21
21
  #include <stddef.h>
22
22
 
23
- #include <memory>
24
23
  #include <utility>
25
24
 
26
25
  #include "src/core/lib/channel/channel_args.h"
@@ -22,8 +22,6 @@
22
22
 
23
23
  #include <string.h>
24
24
 
25
- #include "absl/memory/memory.h"
26
-
27
25
  #include <grpc/support/atm.h>
28
26
  #include <grpc/support/string_util.h>
29
27
 
@@ -54,7 +52,7 @@ void GrpcLbClientStats::AddCallDropped(const char* token) {
54
52
  // Record the drop.
55
53
  MutexLock lock(&drop_count_mu_);
56
54
  if (drop_token_counts_ == nullptr) {
57
- drop_token_counts_ = absl::make_unique<DroppedCallCounts>();
55
+ drop_token_counts_ = std::make_unique<DroppedCallCounts>();
58
56
  }
59
57
  for (size_t i = 0; i < drop_token_counts_->size(); ++i) {
60
58
  if (strcmp((*drop_token_counts_)[i].token.get(), token) == 0) {
@@ -27,7 +27,6 @@
27
27
  #include <vector>
28
28
 
29
29
  #include "absl/base/thread_annotations.h"
30
- #include "absl/memory/memory.h"
31
30
  #include "absl/status/status.h"
32
31
  #include "absl/strings/string_view.h"
33
32
  #include "absl/types/optional.h"
@@ -263,7 +262,7 @@ class OrcaProducer::OrcaStreamEventHandler
263
262
  // BackendMetricAllocator object.
264
263
  void AsyncNotifyWatchersAndDelete() {
265
264
  GRPC_CLOSURE_INIT(&closure_, NotifyWatchersInExecCtx, this, nullptr);
266
- ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
265
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, absl::OkStatus());
267
266
  }
268
267
 
269
268
  private:
@@ -348,7 +347,7 @@ void OrcaProducer::MaybeStartStreamLocked() {
348
347
  if (connected_subchannel_ == nullptr) return;
349
348
  stream_client_ = MakeOrphanable<SubchannelStreamClient>(
350
349
  connected_subchannel_, subchannel_->pollset_set(),
351
- absl::make_unique<OrcaStreamEventHandler>(WeakRef(), report_interval_),
350
+ std::make_unique<OrcaStreamEventHandler>(WeakRef(), report_interval_),
352
351
  GRPC_TRACE_FLAG_ENABLED(grpc_orca_client_trace) ? "OrcaClient" : nullptr);
353
352
  }
354
353
 
@@ -410,7 +409,7 @@ void OrcaWatcher::SetSubchannel(Subchannel* subchannel) {
410
409
  std::unique_ptr<SubchannelInterface::DataWatcherInterface>
411
410
  MakeOobBackendMetricWatcher(Duration report_interval,
412
411
  std::unique_ptr<OobBackendMetricWatcher> watcher) {
413
- return absl::make_unique<OrcaWatcher>(report_interval, std::move(watcher));
412
+ return std::make_unique<OrcaWatcher>(report_interval, std::move(watcher));
414
413
  }
415
414
 
416
415
  } // namespace grpc_core
@@ -38,7 +38,7 @@ namespace grpc_core {
38
38
  // subchannel like this:
39
39
  // subchannel->AddDataWatcher(
40
40
  // MakeOobBackendMetricWatcher(
41
- // absl::make_unique<MyOobBackendMetricWatcherSubclass>(...)));
41
+ // std::make_unique<MyOobBackendMetricWatcherSubclass>(...)));
42
42
 
43
43
  class OobBackendMetricWatcher {
44
44
  public:
@@ -24,7 +24,6 @@
24
24
  #include <algorithm>
25
25
  #include <atomic>
26
26
  #include <cmath>
27
- #include <cstdint>
28
27
  #include <map>
29
28
  #include <memory>
30
29
  #include <set>
@@ -32,13 +31,13 @@
32
31
  #include <utility>
33
32
  #include <vector>
34
33
 
35
- #include "absl/memory/memory.h"
36
34
  #include "absl/random/random.h"
37
35
  #include "absl/status/status.h"
38
36
  #include "absl/status/statusor.h"
39
37
  #include "absl/strings/string_view.h"
40
38
  #include "absl/types/variant.h"
41
39
 
40
+ #include <grpc/event_engine/event_engine.h>
42
41
  #include <grpc/impl/codegen/connectivity_state.h>
43
42
  #include <grpc/support/log.h>
44
43
 
@@ -47,9 +46,7 @@
47
46
  #include "src/core/lib/channel/channel_args.h"
48
47
  #include "src/core/lib/config/core_configuration.h"
49
48
  #include "src/core/lib/debug/trace.h"
50
- #include "src/core/lib/gpr/string.h"
51
49
  #include "src/core/lib/gprpp/debug_location.h"
52
- #include "src/core/lib/gprpp/env.h"
53
50
  #include "src/core/lib/gprpp/orphanable.h"
54
51
  #include "src/core/lib/gprpp/ref_counted.h"
55
52
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
@@ -72,15 +69,6 @@ namespace grpc_core {
72
69
 
73
70
  TraceFlag grpc_outlier_detection_lb_trace(false, "outlier_detection_lb");
74
71
 
75
- // TODO(donnadionne): Remove once outlier detection is no longer experimental
76
- bool XdsOutlierDetectionEnabled() {
77
- auto value = GetEnv("GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
78
- if (!value.has_value()) return false;
79
- bool parsed_value;
80
- bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
81
- return parse_succeeded && parsed_value;
82
- }
83
-
84
72
  namespace {
85
73
 
86
74
  constexpr absl::string_view kOutlierDetection =
@@ -307,8 +295,8 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
307
295
  }
308
296
 
309
297
  private:
310
- std::unique_ptr<Bucket> current_bucket_ = absl::make_unique<Bucket>();
311
- std::unique_ptr<Bucket> backup_bucket_ = absl::make_unique<Bucket>();
298
+ std::unique_ptr<Bucket> current_bucket_ = std::make_unique<Bucket>();
299
+ std::unique_ptr<Bucket> backup_bucket_ = std::make_unique<Bucket>();
312
300
  // The bucket used to update call counts.
313
301
  // Points to either current_bucket or active_bucket.
314
302
  std::atomic<Bucket*> active_bucket_{current_bucket_.get()};
@@ -357,6 +345,7 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
357
345
  std::unique_ptr<SubchannelPicker> picker) override;
358
346
  void RequestReresolution() override;
359
347
  absl::string_view GetAuthority() override;
348
+ grpc_event_engine::experimental::EventEngine* GetEventEngine() override;
360
349
  void AddTraceEvent(TraceSeverity severity,
361
350
  absl::string_view message) override;
362
351
 
@@ -434,7 +423,7 @@ void OutlierDetectionLb::SubchannelWrapper::WatchConnectivityState(
434
423
  std::unique_ptr<ConnectivityStateWatcherInterface> watcher) {
435
424
  ConnectivityStateWatcherInterface* watcher_ptr = watcher.get();
436
425
  auto watcher_wrapper =
437
- absl::make_unique<WatcherWrapper>(std::move(watcher), ejected_);
426
+ std::make_unique<WatcherWrapper>(std::move(watcher), ejected_);
438
427
  watchers_.emplace(watcher_ptr, watcher_wrapper.get());
439
428
  wrapped_subchannel()->WatchConnectivityState(std::move(watcher_wrapper));
440
429
  }
@@ -530,7 +519,7 @@ LoadBalancingPolicy::PickResult OutlierDetectionLb::Picker::Pick(
530
519
  // not both success_rate_ejection and failure_percentage_ejection are unset.
531
520
  if (counting_enabled_) {
532
521
  complete_pick->subchannel_call_tracker =
533
- absl::make_unique<SubchannelCallTracker>(
522
+ std::make_unique<SubchannelCallTracker>(
534
523
  std::move(complete_pick->subchannel_call_tracker),
535
524
  subchannel_wrapper->subchannel_state());
536
525
  }
@@ -693,7 +682,7 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) {
693
682
  void OutlierDetectionLb::MaybeUpdatePickerLocked() {
694
683
  if (picker_ != nullptr) {
695
684
  auto outlier_detection_picker =
696
- absl::make_unique<Picker>(this, picker_, config_->CountingEnabled());
685
+ std::make_unique<Picker>(this, picker_, config_->CountingEnabled());
697
686
  if (GRPC_TRACE_FLAG_ENABLED(grpc_outlier_detection_lb_trace)) {
698
687
  gpr_log(GPR_INFO,
699
688
  "[outlier_detection_lb %p] updating connectivity: state=%s "
@@ -712,7 +701,7 @@ OrphanablePtr<LoadBalancingPolicy> OutlierDetectionLb::CreateChildPolicyLocked(
712
701
  lb_policy_args.work_serializer = work_serializer();
713
702
  lb_policy_args.args = args;
714
703
  lb_policy_args.channel_control_helper =
715
- absl::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
704
+ std::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
716
705
  OrphanablePtr<LoadBalancingPolicy> lb_policy =
717
706
  MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
718
707
  &grpc_outlier_detection_lb_trace);
@@ -781,6 +770,11 @@ absl::string_view OutlierDetectionLb::Helper::GetAuthority() {
781
770
  return outlier_detection_policy_->channel_control_helper()->GetAuthority();
782
771
  }
783
772
 
773
+ grpc_event_engine::experimental::EventEngine*
774
+ OutlierDetectionLb::Helper::GetEventEngine() {
775
+ return outlier_detection_policy_->channel_control_helper()->GetEventEngine();
776
+ }
777
+
784
778
  void OutlierDetectionLb::Helper::AddTraceEvent(TraceSeverity severity,
785
779
  absl::string_view message) {
786
780
  if (outlier_detection_policy_->shutting_down_) return;
@@ -816,13 +810,12 @@ void OutlierDetectionLb::EjectionTimer::Orphan() {
816
810
  void OutlierDetectionLb::EjectionTimer::OnTimer(void* arg,
817
811
  grpc_error_handle error) {
818
812
  auto* self = static_cast<EjectionTimer*>(arg);
819
- (void)GRPC_ERROR_REF(error); // ref owned by lambda
820
813
  self->parent_->work_serializer()->Run(
821
814
  [self, error]() { self->OnTimerLocked(error); }, DEBUG_LOCATION);
822
815
  }
823
816
 
824
817
  void OutlierDetectionLb::EjectionTimer::OnTimerLocked(grpc_error_handle error) {
825
- if (GRPC_ERROR_IS_NONE(error) && timer_pending_) {
818
+ if (error.ok() && timer_pending_) {
826
819
  if (GRPC_TRACE_FLAG_ENABLED(grpc_outlier_detection_lb_trace)) {
827
820
  gpr_log(GPR_INFO, "[outlier_detection_lb %p] ejection timer running",
828
821
  parent_.get());
@@ -1005,7 +998,6 @@ void OutlierDetectionLb::EjectionTimer::OnTimerLocked(grpc_error_handle error) {
1005
998
  MakeOrphanable<EjectionTimer>(parent_, Timestamp::Now());
1006
999
  }
1007
1000
  Unref(DEBUG_LOCATION, "Timer");
1008
- GRPC_ERROR_UNREF(error);
1009
1001
  }
1010
1002
 
1011
1003
  //
@@ -1035,8 +1027,6 @@ class OutlierDetectionLbFactory : public LoadBalancingPolicyFactory {
1035
1027
  OutlierDetectionConfig outlier_detection_config;
1036
1028
  RefCountedPtr<LoadBalancingPolicy::Config> child_policy;
1037
1029
  {
1038
- ValidationErrors::ScopedField field(
1039
- &errors, "[\"outlier_detection_experimental\"]");
1040
1030
  outlier_detection_config =
1041
1031
  LoadFromJson<OutlierDetectionConfig>(json, JsonArgs(), &errors);
1042
1032
  // Parse childPolicy manually.
@@ -1085,6 +1075,14 @@ OutlierDetectionConfig::SuccessRateEjection::JsonLoader(const JsonArgs&) {
1085
1075
  return loader;
1086
1076
  }
1087
1077
 
1078
+ void OutlierDetectionConfig::SuccessRateEjection::JsonPostLoad(
1079
+ const Json&, const JsonArgs&, ValidationErrors* errors) {
1080
+ if (enforcement_percentage > 100) {
1081
+ ValidationErrors::ScopedField field(errors, ".enforcement_percentage");
1082
+ errors->AddError("value must be <= 100");
1083
+ }
1084
+ }
1085
+
1088
1086
  const JsonLoaderInterface*
1089
1087
  OutlierDetectionConfig::FailurePercentageEjection::JsonLoader(const JsonArgs&) {
1090
1088
  static const auto* loader =
@@ -1100,6 +1098,18 @@ OutlierDetectionConfig::FailurePercentageEjection::JsonLoader(const JsonArgs&) {
1100
1098
  return loader;
1101
1099
  }
1102
1100
 
1101
+ void OutlierDetectionConfig::FailurePercentageEjection::JsonPostLoad(
1102
+ const Json&, const JsonArgs&, ValidationErrors* errors) {
1103
+ if (enforcement_percentage > 100) {
1104
+ ValidationErrors::ScopedField field(errors, ".enforcement_percentage");
1105
+ errors->AddError("value must be <= 100");
1106
+ }
1107
+ if (threshold > 100) {
1108
+ ValidationErrors::ScopedField field(errors, ".threshold");
1109
+ errors->AddError("value must be <= 100");
1110
+ }
1111
+ }
1112
+
1103
1113
  const JsonLoaderInterface* OutlierDetectionConfig::JsonLoader(const JsonArgs&) {
1104
1114
  static const auto* loader =
1105
1115
  JsonObjectLoader<OutlierDetectionConfig>()
@@ -1119,11 +1129,15 @@ const JsonLoaderInterface* OutlierDetectionConfig::JsonLoader(const JsonArgs&) {
1119
1129
  }
1120
1130
 
1121
1131
  void OutlierDetectionConfig::JsonPostLoad(const Json& json, const JsonArgs&,
1122
- ValidationErrors* /*errors*/) {
1132
+ ValidationErrors* errors) {
1123
1133
  if (json.object_value().find("maxEjectionTime") ==
1124
1134
  json.object_value().end()) {
1125
1135
  max_ejection_time = std::max(base_ejection_time, Duration::Seconds(300));
1126
1136
  }
1137
+ if (max_ejection_percent > 100) {
1138
+ ValidationErrors::ScopedField field(errors, ".max_ejection_percent");
1139
+ errors->AddError("value must be <= 100");
1140
+ }
1127
1141
  }
1128
1142
 
1129
1143
  //
@@ -1131,10 +1145,8 @@ void OutlierDetectionConfig::JsonPostLoad(const Json& json, const JsonArgs&,
1131
1145
  //
1132
1146
 
1133
1147
  void RegisterOutlierDetectionLbPolicy(CoreConfiguration::Builder* builder) {
1134
- if (XdsOutlierDetectionEnabled()) {
1135
- builder->lb_policy_registry()->RegisterLoadBalancingPolicyFactory(
1136
- absl::make_unique<OutlierDetectionLbFactory>());
1137
- }
1148
+ builder->lb_policy_registry()->RegisterLoadBalancingPolicyFactory(
1149
+ std::make_unique<OutlierDetectionLbFactory>());
1138
1150
  }
1139
1151
 
1140
1152
  } // namespace grpc_core
@@ -31,8 +31,6 @@
31
31
 
32
32
  namespace grpc_core {
33
33
 
34
- bool XdsOutlierDetectionEnabled();
35
-
36
34
  struct OutlierDetectionConfig {
37
35
  Duration interval = Duration::Seconds(10);
38
36
  Duration base_ejection_time = Duration::Milliseconds(30000);
@@ -54,6 +52,7 @@ struct OutlierDetectionConfig {
54
52
  }
55
53
 
56
54
  static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
55
+ void JsonPostLoad(const Json&, const JsonArgs&, ValidationErrors* errors);
57
56
  };
58
57
  struct FailurePercentageEjection {
59
58
  uint32_t threshold = 85;
@@ -71,6 +70,7 @@ struct OutlierDetectionConfig {
71
70
  }
72
71
 
73
72
  static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
73
+ void JsonPostLoad(const Json&, const JsonArgs&, ValidationErrors* errors);
74
74
  };
75
75
  absl::optional<SuccessRateEjection> success_rate_ejection;
76
76
  absl::optional<FailurePercentageEjection> failure_percentage_ejection;