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
@@ -18,17 +18,12 @@
18
18
 
19
19
  #include "src/core/ext/filters/client_channel/retry_service_config.h"
20
20
 
21
- #include <stdio.h>
22
- #include <string.h>
23
-
24
- #include <algorithm>
25
21
  #include <map>
26
22
  #include <string>
27
23
  #include <utility>
28
24
  #include <vector>
29
25
 
30
- #include "absl/memory/memory.h"
31
- #include "absl/status/status.h"
26
+ #include "absl/strings/numbers.h"
32
27
  #include "absl/strings/str_cat.h"
33
28
  #include "absl/types/optional.h"
34
29
 
@@ -39,9 +34,7 @@
39
34
  #include "src/core/lib/channel/channel_args.h"
40
35
  #include "src/core/lib/channel/status_util.h"
41
36
  #include "src/core/lib/config/core_configuration.h"
42
- #include "src/core/lib/gpr/string.h"
43
- #include "src/core/lib/iomgr/error.h"
44
- #include "src/core/lib/json/json_util.h"
37
+ #include "src/core/lib/json/json_channel_args.h"
45
38
 
46
39
  // As per the retry design, we do not allow more than 5 retry attempts.
47
40
  #define MAX_MAX_RETRY_ATTEMPTS 5
@@ -49,275 +42,240 @@
49
42
  namespace grpc_core {
50
43
  namespace internal {
51
44
 
52
- size_t RetryServiceConfigParser::ParserIndex() {
53
- return CoreConfiguration::Get().service_config_parser().GetParserIndex(
54
- parser_name());
55
- }
45
+ //
46
+ // RetryGlobalConfig
47
+ //
56
48
 
57
- void RetryServiceConfigParser::Register(CoreConfiguration::Builder* builder) {
58
- builder->service_config_parser()->RegisterParser(
59
- absl::make_unique<RetryServiceConfigParser>());
49
+ const JsonLoaderInterface* RetryGlobalConfig::JsonLoader(const JsonArgs&) {
50
+ // Note: Both fields require custom processing, so they're handled in
51
+ // JsonPostLoad() instead.
52
+ static const auto* loader = JsonObjectLoader<RetryGlobalConfig>().Finish();
53
+ return loader;
60
54
  }
61
55
 
62
- namespace {
63
-
64
- grpc_error_handle ParseRetryThrottling(const Json& json,
65
- intptr_t* max_milli_tokens,
66
- intptr_t* milli_token_ratio) {
67
- if (json.type() != Json::Type::OBJECT) {
68
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
69
- "field:retryThrottling error:Type should be object");
70
- }
71
- std::vector<grpc_error_handle> error_list;
56
+ void RetryGlobalConfig::JsonPostLoad(const Json& json, const JsonArgs& args,
57
+ ValidationErrors* errors) {
72
58
  // Parse maxTokens.
73
- auto it = json.object_value().find("maxTokens");
74
- if (it == json.object_value().end()) {
75
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
76
- "field:retryThrottling field:maxTokens error:Not found"));
77
- } else if (it->second.type() != Json::Type::NUMBER) {
78
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
79
- "field:retryThrottling field:maxTokens error:Type should be "
80
- "number"));
81
- } else {
82
- *max_milli_tokens =
83
- gpr_parse_nonnegative_int(it->second.string_value().c_str()) * 1000;
84
- if (*max_milli_tokens <= 0) {
85
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
86
- "field:retryThrottling field:maxTokens error:should be "
87
- "greater than zero"));
59
+ auto max_tokens = LoadJsonObjectField<uint32_t>(json.object_value(), args,
60
+ "maxTokens", errors);
61
+ if (max_tokens.has_value()) {
62
+ ValidationErrors::ScopedField field(errors, ".maxTokens");
63
+ if (*max_tokens == 0) {
64
+ errors->AddError("must be greater than 0");
65
+ } else {
66
+ // Multiply by 1000 to represent as milli-tokens.
67
+ max_milli_tokens_ = static_cast<uintptr_t>(*max_tokens) * 1000;
88
68
  }
89
69
  }
90
70
  // Parse tokenRatio.
91
- it = json.object_value().find("tokenRatio");
71
+ ValidationErrors::ScopedField field(errors, ".tokenRatio");
72
+ auto it = json.object_value().find("tokenRatio");
92
73
  if (it == json.object_value().end()) {
93
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
94
- "field:retryThrottling field:tokenRatio error:Not found"));
95
- } else if (it->second.type() != Json::Type::NUMBER) {
96
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
97
- "field:retryThrottling field:tokenRatio error:type should be "
98
- "number"));
99
- } else {
74
+ errors->AddError("field not present");
75
+ return;
76
+ }
77
+ if (it->second.type() != Json::Type::NUMBER &&
78
+ it->second.type() != Json::Type::STRING) {
79
+ errors->AddError("is not a number");
80
+ return;
81
+ }
82
+ absl::string_view buf = it->second.string_value();
83
+ uint32_t multiplier = 1;
84
+ uint32_t decimal_value = 0;
85
+ auto decimal_point = buf.find('.');
86
+ if (decimal_point != absl::string_view::npos) {
87
+ absl::string_view after_decimal = buf.substr(decimal_point + 1);
88
+ buf = buf.substr(0, decimal_point);
100
89
  // We support up to 3 decimal digits.
101
- size_t whole_len = it->second.string_value().size();
102
- const char* value = it->second.string_value().c_str();
103
- uint32_t multiplier = 1;
104
- uint32_t decimal_value = 0;
105
- const char* decimal_point = strchr(value, '.');
106
- if (decimal_point != nullptr) {
107
- whole_len = static_cast<size_t>(decimal_point - value);
108
- multiplier = 1000;
109
- size_t decimal_len = strlen(decimal_point + 1);
110
- if (decimal_len > 3) decimal_len = 3;
111
- if (!gpr_parse_bytes_to_uint32(decimal_point + 1, decimal_len,
112
- &decimal_value)) {
113
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
114
- "field:retryThrottling field:tokenRatio error:Failed "
115
- "parsing"));
116
- return GRPC_ERROR_CREATE_FROM_VECTOR("retryThrottling", &error_list);
117
- }
118
- uint32_t decimal_multiplier = 1;
119
- for (size_t i = 0; i < (3 - decimal_len); ++i) {
120
- decimal_multiplier *= 10;
121
- }
122
- decimal_value *= decimal_multiplier;
123
- }
124
- uint32_t whole_value;
125
- if (!gpr_parse_bytes_to_uint32(value, whole_len, &whole_value)) {
126
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
127
- "field:retryThrottling field:tokenRatio error:Failed "
128
- "parsing"));
129
- return GRPC_ERROR_CREATE_FROM_VECTOR("retryThrottling", &error_list);
90
+ multiplier = 1000;
91
+ if (after_decimal.length() > 3) after_decimal = after_decimal.substr(0, 3);
92
+ // Parse decimal value.
93
+ if (!absl::SimpleAtoi(after_decimal, &decimal_value)) {
94
+ errors->AddError("could not parse as a number");
95
+ return;
130
96
  }
131
- *milli_token_ratio =
132
- static_cast<int>((whole_value * multiplier) + decimal_value);
133
- if (*milli_token_ratio <= 0) {
134
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
135
- "field:retryThrottling field:tokenRatio error:value should "
136
- "be greater than 0"));
97
+ uint32_t decimal_multiplier = 1;
98
+ for (size_t i = 0; i < (3 - after_decimal.length()); ++i) {
99
+ decimal_multiplier *= 10;
137
100
  }
101
+ decimal_value *= decimal_multiplier;
102
+ }
103
+ uint32_t whole_value;
104
+ if (!absl::SimpleAtoi(buf, &whole_value)) {
105
+ errors->AddError("could not parse as a number");
106
+ return;
107
+ }
108
+ milli_token_ratio_ =
109
+ static_cast<int>((whole_value * multiplier) + decimal_value);
110
+ if (milli_token_ratio_ <= 0) {
111
+ errors->AddError("must be greater than 0");
138
112
  }
139
- return GRPC_ERROR_CREATE_FROM_VECTOR("retryThrottling", &error_list);
140
113
  }
141
114
 
142
- } // namespace
115
+ //
116
+ // RetryMethodConfig
117
+ //
143
118
 
144
- absl::StatusOr<std::unique_ptr<ServiceConfigParser::ParsedConfig>>
145
- RetryServiceConfigParser::ParseGlobalParams(const ChannelArgs& /*args*/,
146
- const Json& json) {
147
- auto it = json.object_value().find("retryThrottling");
148
- if (it == json.object_value().end()) return nullptr;
149
- intptr_t max_milli_tokens = 0;
150
- intptr_t milli_token_ratio = 0;
151
- grpc_error_handle error =
152
- ParseRetryThrottling(it->second, &max_milli_tokens, &milli_token_ratio);
153
- if (!GRPC_ERROR_IS_NONE(error)) {
154
- absl::Status status = absl::InvalidArgumentError(
155
- absl::StrCat("error parsing retry global parameters: ",
156
- grpc_error_std_string(error)));
157
- GRPC_ERROR_UNREF(error);
158
- return status;
159
- }
160
- return absl::make_unique<RetryGlobalConfig>(max_milli_tokens,
161
- milli_token_ratio);
119
+ const JsonLoaderInterface* RetryMethodConfig::JsonLoader(const JsonArgs&) {
120
+ static const auto* loader =
121
+ JsonObjectLoader<RetryMethodConfig>()
122
+ // Note: The "retryableStatusCodes" field requires custom parsing,
123
+ // so it's handled in JsonPostLoad() instead.
124
+ .Field("maxAttempts", &RetryMethodConfig::max_attempts_)
125
+ .Field("initialBackoff", &RetryMethodConfig::initial_backoff_)
126
+ .Field("maxBackoff", &RetryMethodConfig::max_backoff_)
127
+ .Field("backoffMultiplier", &RetryMethodConfig::backoff_multiplier_)
128
+ .OptionalField("perAttemptRecvTimeout",
129
+ &RetryMethodConfig::per_attempt_recv_timeout_,
130
+ GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING)
131
+ .Finish();
132
+ return loader;
162
133
  }
163
134
 
164
- namespace {
165
-
166
- grpc_error_handle ParseRetryPolicy(
167
- const ChannelArgs& args, const Json& json, int* max_attempts,
168
- Duration* initial_backoff, Duration* max_backoff, float* backoff_multiplier,
169
- StatusCodeSet* retryable_status_codes,
170
- absl::optional<Duration>* per_attempt_recv_timeout) {
171
- if (json.type() != Json::Type::OBJECT) {
172
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
173
- "field:retryPolicy error:should be of type object");
174
- }
175
- std::vector<grpc_error_handle> error_list;
176
- // Parse maxAttempts.
177
- auto it = json.object_value().find("maxAttempts");
178
- if (it == json.object_value().end()) {
179
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
180
- "field:maxAttempts error:required field missing"));
181
- } else {
182
- if (it->second.type() != Json::Type::NUMBER) {
183
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
184
- "field:maxAttempts error:should be of type number"));
185
- } else {
186
- *max_attempts =
187
- gpr_parse_nonnegative_int(it->second.string_value().c_str());
188
- if (*max_attempts <= 1) {
189
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
190
- "field:maxAttempts error:should be at least 2"));
191
- } else if (*max_attempts > MAX_MAX_RETRY_ATTEMPTS) {
135
+ void RetryMethodConfig::JsonPostLoad(const Json& json, const JsonArgs& args,
136
+ ValidationErrors* errors) {
137
+ // Validate maxAttempts.
138
+ {
139
+ ValidationErrors::ScopedField field(errors, ".maxAttempts");
140
+ if (!errors->FieldHasErrors()) {
141
+ if (max_attempts_ <= 1) {
142
+ errors->AddError("must be at least 2");
143
+ } else if (max_attempts_ > MAX_MAX_RETRY_ATTEMPTS) {
192
144
  gpr_log(GPR_ERROR,
193
145
  "service config: clamped retryPolicy.maxAttempts at %d",
194
146
  MAX_MAX_RETRY_ATTEMPTS);
195
- *max_attempts = MAX_MAX_RETRY_ATTEMPTS;
147
+ max_attempts_ = MAX_MAX_RETRY_ATTEMPTS;
196
148
  }
197
149
  }
198
150
  }
199
- // Parse initialBackoff.
200
- if (ParseJsonObjectFieldAsDuration(json.object_value(), "initialBackoff",
201
- initial_backoff, &error_list) &&
202
- *initial_backoff == Duration::Zero()) {
203
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
204
- "field:initialBackoff error:must be greater than 0"));
151
+ // Validate initialBackoff.
152
+ {
153
+ ValidationErrors::ScopedField field(errors, ".initialBackoff");
154
+ if (!errors->FieldHasErrors() && initial_backoff_ == Duration::Zero()) {
155
+ errors->AddError("must be greater than 0");
156
+ }
205
157
  }
206
- // Parse maxBackoff.
207
- if (ParseJsonObjectFieldAsDuration(json.object_value(), "maxBackoff",
208
- max_backoff, &error_list) &&
209
- *max_backoff == Duration::Zero()) {
210
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
211
- "field:maxBackoff error:must be greater than 0"));
158
+ // Validate maxBackoff.
159
+ {
160
+ ValidationErrors::ScopedField field(errors, ".maxBackoff");
161
+ if (!errors->FieldHasErrors() && max_backoff_ == Duration::Zero()) {
162
+ errors->AddError("must be greater than 0");
163
+ }
212
164
  }
213
- // Parse backoffMultiplier.
214
- it = json.object_value().find("backoffMultiplier");
215
- if (it == json.object_value().end()) {
216
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
217
- "field:backoffMultiplier error:required field missing"));
218
- } else {
219
- if (it->second.type() != Json::Type::NUMBER) {
220
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
221
- "field:backoffMultiplier error:should be of type number"));
222
- } else {
223
- if (sscanf(it->second.string_value().c_str(), "%f", backoff_multiplier) !=
224
- 1) {
225
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
226
- "field:backoffMultiplier error:failed to parse"));
227
- } else if (*backoff_multiplier <= 0) {
228
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
229
- "field:backoffMultiplier error:must be greater than 0"));
230
- }
165
+ // Validate backoffMultiplier.
166
+ {
167
+ ValidationErrors::ScopedField field(errors, ".backoffMultiplier");
168
+ if (!errors->FieldHasErrors() && backoff_multiplier_ <= 0) {
169
+ errors->AddError("must be greater than 0");
231
170
  }
232
171
  }
233
172
  // Parse retryableStatusCodes.
234
- it = json.object_value().find("retryableStatusCodes");
235
- if (it != json.object_value().end()) {
236
- if (it->second.type() != Json::Type::ARRAY) {
237
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
238
- "field:retryableStatusCodes error:must be of type array"));
239
- } else {
240
- for (const Json& element : it->second.array_value()) {
241
- if (element.type() != Json::Type::STRING) {
242
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
243
- "field:retryableStatusCodes error:status codes should be of type "
244
- "string"));
245
- continue;
246
- }
247
- grpc_status_code status;
248
- if (!grpc_status_code_from_string(element.string_value().c_str(),
249
- &status)) {
250
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
251
- "field:retryableStatusCodes error:failed to parse status code"));
252
- continue;
253
- }
254
- retryable_status_codes->Add(status);
173
+ auto status_code_list = LoadJsonObjectField<std::vector<std::string>>(
174
+ json.object_value(), args, "retryableStatusCodes", errors,
175
+ /*required=*/false);
176
+ if (status_code_list.has_value()) {
177
+ for (size_t i = 0; i < status_code_list->size(); ++i) {
178
+ ValidationErrors::ScopedField field(
179
+ errors, absl::StrCat(".retryableStatusCodes[", i, "]"));
180
+ grpc_status_code status;
181
+ if (!grpc_status_code_from_string((*status_code_list)[i].c_str(),
182
+ &status)) {
183
+ errors->AddError("failed to parse status code");
184
+ } else {
185
+ retryable_status_codes_.Add(status);
255
186
  }
256
187
  }
257
188
  }
258
- // Parse perAttemptRecvTimeout.
259
- if (args.GetBool(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING).value_or(false)) {
260
- it = json.object_value().find("perAttemptRecvTimeout");
261
- if (it != json.object_value().end()) {
262
- Duration per_attempt_recv_timeout_value;
263
- if (!ParseDurationFromJson(it->second, &per_attempt_recv_timeout_value)) {
264
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
265
- "field:perAttemptRecvTimeout error:type must be STRING of the "
266
- "form given by google.proto.Duration."));
267
- } else {
268
- *per_attempt_recv_timeout = per_attempt_recv_timeout_value;
269
- // TODO(roth): As part of implementing hedging, relax this check such
270
- // that we allow a value of 0 if a hedging policy is specified.
271
- if (per_attempt_recv_timeout_value == Duration::Zero()) {
272
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
273
- "field:perAttemptRecvTimeout error:must be greater than 0"));
274
- }
189
+ // Validate perAttemptRecvTimeout.
190
+ if (args.IsEnabled(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING)) {
191
+ if (per_attempt_recv_timeout_.has_value()) {
192
+ ValidationErrors::ScopedField field(errors, ".perAttemptRecvTimeout");
193
+ // TODO(roth): As part of implementing hedging, relax this check such
194
+ // that we allow a value of 0 if a hedging policy is specified.
195
+ if (!errors->FieldHasErrors() &&
196
+ *per_attempt_recv_timeout_ == Duration::Zero()) {
197
+ errors->AddError("must be greater than 0");
275
198
  }
276
- } else if (retryable_status_codes->Empty()) {
199
+ } else if (retryable_status_codes_.Empty()) {
277
200
  // If perAttemptRecvTimeout not present, retryableStatusCodes must be
278
201
  // non-empty.
279
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
280
- "field:retryableStatusCodes error:must be non-empty if "
281
- "perAttemptRecvTimeout not present"));
202
+ ValidationErrors::ScopedField field(errors, ".retryableStatusCodes");
203
+ if (!errors->FieldHasErrors()) {
204
+ errors->AddError(
205
+ "must be non-empty if perAttemptRecvTimeout not present");
206
+ }
282
207
  }
283
- } else {
208
+ } else if (retryable_status_codes_.Empty()) {
284
209
  // Hedging not enabled, so the error message for
285
210
  // retryableStatusCodes unset should be different.
286
- if (retryable_status_codes->Empty()) {
287
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
288
- "field:retryableStatusCodes error:must be non-empty"));
211
+ ValidationErrors::ScopedField field(errors, ".retryableStatusCodes");
212
+ if (!errors->FieldHasErrors()) {
213
+ errors->AddError("must be non-empty");
289
214
  }
290
215
  }
291
- return GRPC_ERROR_CREATE_FROM_VECTOR("retryPolicy", &error_list);
292
216
  }
293
217
 
218
+ //
219
+ // RetryServiceConfigParser
220
+ //
221
+
222
+ size_t RetryServiceConfigParser::ParserIndex() {
223
+ return CoreConfiguration::Get().service_config_parser().GetParserIndex(
224
+ parser_name());
225
+ }
226
+
227
+ void RetryServiceConfigParser::Register(CoreConfiguration::Builder* builder) {
228
+ builder->service_config_parser()->RegisterParser(
229
+ std::make_unique<RetryServiceConfigParser>());
230
+ }
231
+
232
+ namespace {
233
+
234
+ struct GlobalConfig {
235
+ std::unique_ptr<RetryGlobalConfig> retry_throttling;
236
+
237
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
238
+ static const auto* loader =
239
+ JsonObjectLoader<GlobalConfig>()
240
+ .OptionalField("retryThrottling", &GlobalConfig::retry_throttling)
241
+ .Finish();
242
+ return loader;
243
+ }
244
+ };
245
+
246
+ } // namespace
247
+
248
+ std::unique_ptr<ServiceConfigParser::ParsedConfig>
249
+ RetryServiceConfigParser::ParseGlobalParams(const ChannelArgs& /*args*/,
250
+ const Json& json,
251
+ ValidationErrors* errors) {
252
+ auto global_params = LoadFromJson<GlobalConfig>(json, JsonArgs(), errors);
253
+ return std::move(global_params.retry_throttling);
254
+ }
255
+
256
+ namespace {
257
+
258
+ struct MethodConfig {
259
+ std::unique_ptr<RetryMethodConfig> retry_policy;
260
+
261
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
262
+ static const auto* loader =
263
+ JsonObjectLoader<MethodConfig>()
264
+ .OptionalField("retryPolicy", &MethodConfig::retry_policy)
265
+ .Finish();
266
+ return loader;
267
+ }
268
+ };
269
+
294
270
  } // namespace
295
271
 
296
- absl::StatusOr<std::unique_ptr<ServiceConfigParser::ParsedConfig>>
272
+ std::unique_ptr<ServiceConfigParser::ParsedConfig>
297
273
  RetryServiceConfigParser::ParsePerMethodParams(const ChannelArgs& args,
298
- const Json& json) {
299
- // Parse retry policy.
300
- auto it = json.object_value().find("retryPolicy");
301
- if (it == json.object_value().end()) return nullptr;
302
- int max_attempts = 0;
303
- Duration initial_backoff;
304
- Duration max_backoff;
305
- float backoff_multiplier = 0;
306
- StatusCodeSet retryable_status_codes;
307
- absl::optional<Duration> per_attempt_recv_timeout;
308
- grpc_error_handle error = ParseRetryPolicy(
309
- args, it->second, &max_attempts, &initial_backoff, &max_backoff,
310
- &backoff_multiplier, &retryable_status_codes, &per_attempt_recv_timeout);
311
- if (!GRPC_ERROR_IS_NONE(error)) {
312
- absl::Status status = absl::InvalidArgumentError(
313
- absl::StrCat("error parsing retry method parameters: ",
314
- grpc_error_std_string(error)));
315
- GRPC_ERROR_UNREF(error);
316
- return status;
317
- }
318
- return absl::make_unique<RetryMethodConfig>(
319
- max_attempts, initial_backoff, max_backoff, backoff_multiplier,
320
- retryable_status_codes, per_attempt_recv_timeout);
274
+ const Json& json,
275
+ ValidationErrors* errors) {
276
+ auto method_params =
277
+ LoadFromJson<MethodConfig>(json, JsonChannelArgs(args), errors);
278
+ return std::move(method_params.retry_policy);
321
279
  }
322
280
 
323
281
  } // namespace internal
@@ -24,7 +24,6 @@
24
24
 
25
25
  #include <memory>
26
26
 
27
- #include "absl/status/statusor.h"
28
27
  #include "absl/strings/string_view.h"
29
28
  #include "absl/types/optional.h"
30
29
 
@@ -32,7 +31,10 @@
32
31
  #include "src/core/lib/channel/status_util.h"
33
32
  #include "src/core/lib/config/core_configuration.h"
34
33
  #include "src/core/lib/gprpp/time.h"
34
+ #include "src/core/lib/gprpp/validation_errors.h"
35
35
  #include "src/core/lib/json/json.h"
36
+ #include "src/core/lib/json/json_args.h"
37
+ #include "src/core/lib/json/json_object_loader.h"
36
38
  #include "src/core/lib/service_config/service_config_parser.h"
37
39
 
38
40
  namespace grpc_core {
@@ -40,31 +42,20 @@ namespace internal {
40
42
 
41
43
  class RetryGlobalConfig : public ServiceConfigParser::ParsedConfig {
42
44
  public:
43
- RetryGlobalConfig(intptr_t max_milli_tokens, intptr_t milli_token_ratio)
44
- : max_milli_tokens_(max_milli_tokens),
45
- milli_token_ratio_(milli_token_ratio) {}
45
+ uintptr_t max_milli_tokens() const { return max_milli_tokens_; }
46
+ uintptr_t milli_token_ratio() const { return milli_token_ratio_; }
46
47
 
47
- intptr_t max_milli_tokens() const { return max_milli_tokens_; }
48
- intptr_t milli_token_ratio() const { return milli_token_ratio_; }
48
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
49
+ void JsonPostLoad(const Json& json, const JsonArgs& args,
50
+ ValidationErrors* errors);
49
51
 
50
52
  private:
51
- intptr_t max_milli_tokens_ = 0;
52
- intptr_t milli_token_ratio_ = 0;
53
+ uintptr_t max_milli_tokens_ = 0;
54
+ uintptr_t milli_token_ratio_ = 0;
53
55
  };
54
56
 
55
57
  class RetryMethodConfig : public ServiceConfigParser::ParsedConfig {
56
58
  public:
57
- RetryMethodConfig(int max_attempts, Duration initial_backoff,
58
- Duration max_backoff, float backoff_multiplier,
59
- StatusCodeSet retryable_status_codes,
60
- absl::optional<Duration> per_attempt_recv_timeout)
61
- : max_attempts_(max_attempts),
62
- initial_backoff_(initial_backoff),
63
- max_backoff_(max_backoff),
64
- backoff_multiplier_(backoff_multiplier),
65
- retryable_status_codes_(retryable_status_codes),
66
- per_attempt_recv_timeout_(per_attempt_recv_timeout) {}
67
-
68
59
  int max_attempts() const { return max_attempts_; }
69
60
  Duration initial_backoff() const { return initial_backoff_; }
70
61
  Duration max_backoff() const { return max_backoff_; }
@@ -76,6 +67,10 @@ class RetryMethodConfig : public ServiceConfigParser::ParsedConfig {
76
67
  return per_attempt_recv_timeout_;
77
68
  }
78
69
 
70
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
71
+ void JsonPostLoad(const Json& json, const JsonArgs& args,
72
+ ValidationErrors* errors);
73
+
79
74
  private:
80
75
  int max_attempts_ = 0;
81
76
  Duration initial_backoff_;
@@ -89,11 +84,13 @@ class RetryServiceConfigParser : public ServiceConfigParser::Parser {
89
84
  public:
90
85
  absl::string_view name() const override { return parser_name(); }
91
86
 
92
- absl::StatusOr<std::unique_ptr<ServiceConfigParser::ParsedConfig>>
93
- ParseGlobalParams(const ChannelArgs& /*args*/, const Json& json) override;
87
+ std::unique_ptr<ServiceConfigParser::ParsedConfig> ParseGlobalParams(
88
+ const ChannelArgs& /*args*/, const Json& json,
89
+ ValidationErrors* errors) override;
94
90
 
95
- absl::StatusOr<std::unique_ptr<ServiceConfigParser::ParsedConfig>>
96
- ParsePerMethodParams(const ChannelArgs& args, const Json& json) override;
91
+ std::unique_ptr<ServiceConfigParser::ParsedConfig> ParsePerMethodParams(
92
+ const ChannelArgs& args, const Json& json,
93
+ ValidationErrors* errors) override;
97
94
 
98
95
  static size_t ParserIndex();
99
96
  static void Register(CoreConfiguration::Builder* builder);
@@ -34,22 +34,22 @@ namespace internal {
34
34
  //
35
35
 
36
36
  ServerRetryThrottleData::ServerRetryThrottleData(
37
- intptr_t max_milli_tokens, intptr_t milli_token_ratio,
37
+ uintptr_t max_milli_tokens, uintptr_t milli_token_ratio,
38
38
  ServerRetryThrottleData* old_throttle_data)
39
39
  : max_milli_tokens_(max_milli_tokens),
40
40
  milli_token_ratio_(milli_token_ratio) {
41
- intptr_t initial_milli_tokens = max_milli_tokens;
41
+ uintptr_t initial_milli_tokens = max_milli_tokens;
42
42
  // If there was a pre-existing entry for this server name, initialize
43
43
  // the token count by scaling proportionately to the old data. This
44
44
  // ensures that if we're already throttling retries on the old scale,
45
45
  // we will start out doing the same thing on the new one.
46
46
  if (old_throttle_data != nullptr) {
47
47
  double token_fraction =
48
- static_cast<intptr_t>(
48
+ static_cast<uintptr_t>(
49
49
  gpr_atm_acq_load(&old_throttle_data->milli_tokens_)) /
50
50
  static_cast<double>(old_throttle_data->max_milli_tokens_);
51
51
  initial_milli_tokens =
52
- static_cast<intptr_t>(token_fraction * max_milli_tokens);
52
+ static_cast<uintptr_t>(token_fraction * max_milli_tokens);
53
53
  }
54
54
  gpr_atm_rel_store(&milli_tokens_, static_cast<gpr_atm>(initial_milli_tokens));
55
55
  // If there was a pre-existing entry, mark it as stale and give it a
@@ -86,8 +86,8 @@ bool ServerRetryThrottleData::RecordFailure() {
86
86
  ServerRetryThrottleData* throttle_data = this;
87
87
  GetReplacementThrottleDataIfNeeded(&throttle_data);
88
88
  // We decrement milli_tokens by 1000 (1 token) for each failure.
89
- const intptr_t new_value =
90
- static_cast<intptr_t>(gpr_atm_no_barrier_clamped_add(
89
+ const uintptr_t new_value =
90
+ static_cast<uintptr_t>(gpr_atm_no_barrier_clamped_add(
91
91
  &throttle_data->milli_tokens_, static_cast<gpr_atm>(-1000),
92
92
  static_cast<gpr_atm>(0),
93
93
  static_cast<gpr_atm>(throttle_data->max_milli_tokens_)));
@@ -118,8 +118,8 @@ ServerRetryThrottleMap* ServerRetryThrottleMap::Get() {
118
118
  }
119
119
 
120
120
  RefCountedPtr<ServerRetryThrottleData> ServerRetryThrottleMap::GetDataForServer(
121
- const std::string& server_name, intptr_t max_milli_tokens,
122
- intptr_t milli_token_ratio) {
121
+ const std::string& server_name, uintptr_t max_milli_tokens,
122
+ uintptr_t milli_token_ratio) {
123
123
  MutexLock lock(&mu_);
124
124
  auto it = map_.find(server_name);
125
125
  ServerRetryThrottleData* throttle_data =