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
@@ -35,22 +35,21 @@ const char* grpc_json_get_string_property(const grpc_core::Json& json,
35
35
  grpc_error_handle* error) {
36
36
  if (json.type() != grpc_core::Json::Type::OBJECT) {
37
37
  if (error != nullptr) {
38
- *error =
39
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("JSON value is not an object");
38
+ *error = GRPC_ERROR_CREATE("JSON value is not an object");
40
39
  }
41
40
  return nullptr;
42
41
  }
43
42
  auto it = json.object_value().find(prop_name);
44
43
  if (it == json.object_value().end()) {
45
44
  if (error != nullptr) {
46
- *error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
45
+ *error = GRPC_ERROR_CREATE(
47
46
  absl::StrCat("Property ", prop_name, " not found in JSON object."));
48
47
  }
49
48
  return nullptr;
50
49
  }
51
50
  if (it->second.type() != grpc_core::Json::Type::STRING) {
52
51
  if (error != nullptr) {
53
- *error = GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
52
+ *error = GRPC_ERROR_CREATE(absl::StrCat(
54
53
  "Property ", prop_name, " n JSON object is not a string."));
55
54
  }
56
55
  return nullptr;
@@ -61,7 +60,7 @@ const char* grpc_json_get_string_property(const grpc_core::Json& json,
61
60
  bool grpc_copy_json_string_property(const grpc_core::Json& json,
62
61
  const char* prop_name,
63
62
  char** copied_value) {
64
- grpc_error_handle error = GRPC_ERROR_NONE;
63
+ grpc_error_handle error;
65
64
  const char* prop_value =
66
65
  grpc_json_get_string_property(json, prop_name, &error);
67
66
  GRPC_LOG_IF_ERROR("Could not copy JSON property", error);
@@ -58,7 +58,7 @@
58
58
  namespace grpc_core {
59
59
 
60
60
  // TODO(roth): Consider stripping this down further to the completely minimal
61
- // interface requied to be exposed as part of the resolver API.
61
+ // interface required to be exposed as part of the resolver API.
62
62
  class ServiceConfig : public RefCounted<ServiceConfig> {
63
63
  public:
64
64
  static absl::string_view ChannelArgName() {
@@ -20,198 +20,151 @@
20
20
 
21
21
  #include <string.h>
22
22
 
23
- #include <map>
24
23
  #include <string>
25
24
  #include <utility>
26
25
 
27
- #include "absl/memory/memory.h"
28
- #include "absl/status/status.h"
29
26
  #include "absl/status/statusor.h"
30
27
  #include "absl/strings/str_cat.h"
31
- #include "absl/strings/str_join.h"
32
-
33
- #include <grpc/support/log.h>
28
+ #include "absl/types/optional.h"
34
29
 
35
30
  #include "src/core/lib/config/core_configuration.h"
36
31
  #include "src/core/lib/gprpp/memory.h"
32
+ #include "src/core/lib/gprpp/validation_errors.h"
37
33
  #include "src/core/lib/json/json.h"
34
+ #include "src/core/lib/json/json_args.h"
35
+ #include "src/core/lib/json/json_object_loader.h"
38
36
  #include "src/core/lib/service_config/service_config_parser.h"
37
+ #include "src/core/lib/slice/slice.h"
39
38
  #include "src/core/lib/slice/slice_internal.h"
40
- #include "src/core/lib/slice/slice_refcount.h"
41
39
 
42
40
  namespace grpc_core {
43
41
 
42
+ namespace {
43
+
44
+ struct MethodConfig {
45
+ struct Name {
46
+ absl::optional<std::string> service;
47
+ absl::optional<std::string> method;
48
+
49
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
50
+ static const auto* loader = JsonObjectLoader<Name>()
51
+ .OptionalField("service", &Name::service)
52
+ .OptionalField("method", &Name::method)
53
+ .Finish();
54
+ return loader;
55
+ }
56
+
57
+ void JsonPostLoad(const Json&, const JsonArgs&, ValidationErrors* errors) {
58
+ if (!service.has_value() && method.has_value()) {
59
+ errors->AddError("method name populated without service name");
60
+ }
61
+ }
62
+
63
+ std::string Path() const {
64
+ if (!service.has_value() || service->empty()) return "";
65
+ return absl::StrCat("/", *service, "/",
66
+ method.has_value() ? *method : "");
67
+ }
68
+ };
69
+
70
+ std::vector<Name> names;
71
+
72
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
73
+ static const auto* loader = JsonObjectLoader<MethodConfig>()
74
+ .OptionalField("name", &MethodConfig::names)
75
+ .Finish();
76
+ return loader;
77
+ }
78
+ };
79
+
80
+ } // namespace
81
+
44
82
  absl::StatusOr<RefCountedPtr<ServiceConfig>> ServiceConfigImpl::Create(
45
83
  const ChannelArgs& args, absl::string_view json_string) {
46
84
  auto json = Json::Parse(json_string);
47
85
  if (!json.ok()) return json.status();
48
- absl::Status status;
49
- auto service_config = MakeRefCounted<ServiceConfigImpl>(
50
- args, std::string(json_string), std::move(*json), &status);
51
- if (!status.ok()) return status;
86
+ ValidationErrors errors;
87
+ auto service_config = Create(args, *json, json_string, &errors);
88
+ if (!errors.ok()) return errors.status("errors validating service config");
52
89
  return service_config;
53
90
  }
54
91
 
55
- ServiceConfigImpl::ServiceConfigImpl(const ChannelArgs& args,
56
- std::string json_string, Json json,
57
- absl::Status* status)
58
- : json_string_(std::move(json_string)), json_(std::move(json)) {
59
- GPR_DEBUG_ASSERT(status != nullptr);
60
- if (json_.type() != Json::Type::OBJECT) {
61
- *status = absl::InvalidArgumentError("JSON value is not an object");
62
- return;
63
- }
64
- std::vector<std::string> errors;
65
- auto parsed_global_configs =
66
- CoreConfiguration::Get().service_config_parser().ParseGlobalParameters(
67
- args, json_);
68
- if (!parsed_global_configs.ok()) {
69
- errors.emplace_back(parsed_global_configs.status().message());
70
- } else {
71
- parsed_global_configs_ = std::move(*parsed_global_configs);
72
- }
73
- absl::Status local_status = ParsePerMethodParams(args);
74
- if (!local_status.ok()) errors.emplace_back(local_status.message());
75
- if (!errors.empty()) {
76
- *status = absl::InvalidArgumentError(absl::StrCat(
77
- "Service config parsing errors: [", absl::StrJoin(errors, "; "), "]"));
78
- }
79
- }
80
-
81
- ServiceConfigImpl::~ServiceConfigImpl() {
82
- for (auto& p : parsed_method_configs_map_) {
83
- grpc_slice_unref_internal(p.first);
84
- }
92
+ RefCountedPtr<ServiceConfig> ServiceConfigImpl::Create(
93
+ const ChannelArgs& args, const Json& json, ValidationErrors* errors) {
94
+ return Create(args, json, json.Dump(), errors);
85
95
  }
86
96
 
87
- absl::Status ServiceConfigImpl::ParseJsonMethodConfig(const ChannelArgs& args,
88
- const Json& json,
89
- size_t index) {
90
- std::vector<std::string> errors;
91
- const ServiceConfigParser::ParsedConfigVector* vector_ptr = nullptr;
92
- // Parse method config with each registered parser.
93
- auto parsed_configs_or =
94
- CoreConfiguration::Get().service_config_parser().ParsePerMethodParameters(
95
- args, json);
96
- if (!parsed_configs_or.ok()) {
97
- errors.emplace_back(parsed_configs_or.status().message());
98
- } else {
99
- auto parsed_configs =
100
- absl::make_unique<ServiceConfigParser::ParsedConfigVector>(
101
- std::move(*parsed_configs_or));
102
- parsed_method_config_vectors_storage_.push_back(std::move(parsed_configs));
103
- vector_ptr = parsed_method_config_vectors_storage_.back().get();
97
+ RefCountedPtr<ServiceConfig> ServiceConfigImpl::Create(
98
+ const ChannelArgs& args, const Json& json, absl::string_view json_string,
99
+ ValidationErrors* errors) {
100
+ if (json.type() != Json::Type::OBJECT) {
101
+ errors->AddError("is not an object");
102
+ return nullptr;
104
103
  }
105
- // Add an entry for each path.
106
- auto it = json.object_value().find("name");
107
- if (it != json.object_value().end()) {
108
- if (it->second.type() != Json::Type::ARRAY) {
109
- errors.emplace_back("field:name error:not of type Array");
110
- } else {
111
- const Json::Array& name_array = it->second.array_value();
112
- for (const Json& name : name_array) {
113
- absl::StatusOr<std::string> path = ParseJsonMethodName(name);
114
- if (!path.ok()) {
115
- errors.emplace_back(path.status().message());
104
+ auto service_config = MakeRefCounted<ServiceConfigImpl>();
105
+ service_config->json_string_ = std::string(json_string);
106
+ // Parse global parameters.
107
+ service_config->parsed_global_configs_ =
108
+ CoreConfiguration::Get().service_config_parser().ParseGlobalParameters(
109
+ args, json, errors);
110
+ // Parse per-method parameters.
111
+ auto method_configs = LoadJsonObjectField<std::vector<Json::Object>>(
112
+ json.object_value(), JsonArgs(), "methodConfig", errors,
113
+ /*required=*/false);
114
+ if (method_configs.has_value()) {
115
+ service_config->parsed_method_config_vectors_storage_.reserve(
116
+ method_configs->size());
117
+ for (size_t i = 0; i < method_configs->size(); ++i) {
118
+ const Json::Object& method_config_json = (*method_configs)[i];
119
+ ValidationErrors::ScopedField field(
120
+ errors, absl::StrCat(".methodConfig[", i, "]"));
121
+ // Have each parser read this method config.
122
+ auto parsed_configs =
123
+ CoreConfiguration::Get()
124
+ .service_config_parser()
125
+ .ParsePerMethodParameters(args, method_config_json, errors);
126
+ // Store the parsed configs.
127
+ service_config->parsed_method_config_vectors_storage_.push_back(
128
+ std::move(parsed_configs));
129
+ const ServiceConfigParser::ParsedConfigVector* vector_ptr =
130
+ &service_config->parsed_method_config_vectors_storage_.back();
131
+ // Parse the names.
132
+ auto method_config =
133
+ LoadFromJson<MethodConfig>(method_config_json, JsonArgs(), errors);
134
+ for (size_t j = 0; j < method_config.names.size(); ++j) {
135
+ ValidationErrors::ScopedField field(errors,
136
+ absl::StrCat(".name[", j, "]"));
137
+ std::string path = method_config.names[j].Path();
138
+ if (path.empty()) {
139
+ if (service_config->default_method_config_vector_ != nullptr) {
140
+ errors->AddError("duplicate default method config");
141
+ }
142
+ service_config->default_method_config_vector_ = vector_ptr;
116
143
  } else {
117
- if (path->empty()) {
118
- if (default_method_config_vector_ != nullptr) {
119
- errors.emplace_back(
120
- "field:name error:multiple default method configs");
121
- }
122
- default_method_config_vector_ = vector_ptr;
144
+ grpc_slice key = grpc_slice_from_cpp_string(std::move(path));
145
+ // If the key is not already present in the map, this will
146
+ // store a ref to the key in the map.
147
+ auto& value = service_config->parsed_method_configs_map_[key];
148
+ if (value != nullptr) {
149
+ errors->AddError(absl::StrCat("multiple method configs for path ",
150
+ StringViewFromSlice(key)));
151
+ // The map entry already existed, so we need to unref the
152
+ // key we just created.
153
+ CSliceUnref(key);
123
154
  } else {
124
- grpc_slice key = grpc_slice_from_cpp_string(std::move(*path));
125
- // If the key is not already present in the map, this will
126
- // store a ref to the key in the map.
127
- auto& value = parsed_method_configs_map_[key];
128
- if (value != nullptr) {
129
- errors.emplace_back(
130
- "field:name error:multiple method configs with same name");
131
- // The map entry already existed, so we need to unref the
132
- // key we just created.
133
- grpc_slice_unref_internal(key);
134
- } else {
135
- value = vector_ptr;
136
- }
155
+ value = vector_ptr;
137
156
  }
138
157
  }
139
158
  }
140
159
  }
141
160
  }
142
- if (!errors.empty()) {
143
- return absl::InvalidArgumentError(
144
- absl::StrCat("index ", index, ": [", absl::StrJoin(errors, "; "), "]"));
145
- }
146
- return absl::OkStatus();
147
- }
148
-
149
- absl::Status ServiceConfigImpl::ParsePerMethodParams(const ChannelArgs& args) {
150
- auto it = json_.object_value().find("methodConfig");
151
- if (it == json_.object_value().end()) return absl::OkStatus();
152
- if (it->second.type() != Json::Type::ARRAY) {
153
- return absl::InvalidArgumentError("field must be of type array");
154
- }
155
- std::vector<std::string> errors;
156
- for (size_t i = 0; i < it->second.array_value().size(); ++i) {
157
- const Json& method_config = it->second.array_value()[i];
158
- if (method_config.type() != Json::Type::OBJECT) {
159
- errors.emplace_back(absl::StrCat("index ", i, ": not of type Object"));
160
- } else {
161
- absl::Status status = ParseJsonMethodConfig(args, method_config, i);
162
- if (!status.ok()) errors.emplace_back(status.message());
163
- }
164
- }
165
- if (!errors.empty()) {
166
- return absl::InvalidArgumentError(absl::StrCat(
167
- "errors parsing methodConfig: [", absl::StrJoin(errors, "; "), "]"));
168
- }
169
- return absl::OkStatus();
161
+ return service_config;
170
162
  }
171
163
 
172
- absl::StatusOr<std::string> ServiceConfigImpl::ParseJsonMethodName(
173
- const Json& json) {
174
- if (json.type() != Json::Type::OBJECT) {
175
- return absl::InvalidArgumentError("field:name error:type is not object");
176
- }
177
- // Find service name.
178
- const std::string* service_name = nullptr;
179
- auto it = json.object_value().find("service");
180
- if (it != json.object_value().end() &&
181
- it->second.type() != Json::Type::JSON_NULL) {
182
- if (it->second.type() != Json::Type::STRING) {
183
- return absl::InvalidArgumentError(
184
- "field:name error: field:service error:not of type string");
185
- }
186
- if (!it->second.string_value().empty()) {
187
- service_name = &it->second.string_value();
188
- }
189
- }
190
- const std::string* method_name = nullptr;
191
- // Find method name.
192
- it = json.object_value().find("method");
193
- if (it != json.object_value().end() &&
194
- it->second.type() != Json::Type::JSON_NULL) {
195
- if (it->second.type() != Json::Type::STRING) {
196
- return absl::InvalidArgumentError(
197
- "field:name error: field:method error:not of type string");
198
- }
199
- if (!it->second.string_value().empty()) {
200
- method_name = &it->second.string_value();
201
- }
202
- }
203
- // If neither service nor method are specified, it's the default.
204
- // Method name may not be specified without service name.
205
- if (service_name == nullptr) {
206
- if (method_name != nullptr) {
207
- return absl::InvalidArgumentError(
208
- "field:name error:method name populated without service name");
209
- }
210
- return "";
164
+ ServiceConfigImpl::~ServiceConfigImpl() {
165
+ for (auto& p : parsed_method_configs_map_) {
166
+ CSliceUnref(p.first);
211
167
  }
212
- // Construct path.
213
- return absl::StrCat("/", *service_name, "/",
214
- method_name == nullptr ? "" : *method_name);
215
168
  }
216
169
 
217
170
  const ServiceConfigParser::ParsedConfigVector*
@@ -26,7 +26,6 @@
26
26
  #include <unordered_map>
27
27
  #include <vector>
28
28
 
29
- #include "absl/status/status.h"
30
29
  #include "absl/status/statusor.h"
31
30
  #include "absl/strings/string_view.h"
32
31
 
@@ -35,6 +34,7 @@
35
34
 
36
35
  #include "src/core/lib/channel/channel_args.h"
37
36
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
37
+ #include "src/core/lib/gprpp/validation_errors.h"
38
38
  #include "src/core/lib/json/json.h"
39
39
  #include "src/core/lib/service_config/service_config.h"
40
40
  #include "src/core/lib/service_config/service_config_parser.h"
@@ -72,8 +72,15 @@ class ServiceConfigImpl final : public ServiceConfig {
72
72
  static absl::StatusOr<RefCountedPtr<ServiceConfig>> Create(
73
73
  const ChannelArgs& args, absl::string_view json_string);
74
74
 
75
- ServiceConfigImpl(const ChannelArgs& args, std::string json_string, Json json,
76
- absl::Status* status);
75
+ // Alternate forms that are useful in edge cases.
76
+ static RefCountedPtr<ServiceConfig> Create(const ChannelArgs& args,
77
+ const Json& json,
78
+ absl::string_view json_string,
79
+ ValidationErrors* errors);
80
+ static RefCountedPtr<ServiceConfig> Create(const ChannelArgs& args,
81
+ const Json& json,
82
+ ValidationErrors* errors);
83
+
77
84
  ~ServiceConfigImpl() override;
78
85
 
79
86
  absl::string_view json_string() const override { return json_string_; }
@@ -94,20 +101,10 @@ class ServiceConfigImpl final : public ServiceConfig {
94
101
  const grpc_slice& path) const override;
95
102
 
96
103
  private:
97
- // Helper functions for parsing the method configs.
98
- absl::Status ParsePerMethodParams(const ChannelArgs& args);
99
- absl::Status ParseJsonMethodConfig(const ChannelArgs& args, const Json& json,
100
- size_t index);
101
-
102
- // Returns a path string for the JSON name object specified by json.
103
- // Sets *error on error.
104
- static absl::StatusOr<std::string> ParseJsonMethodName(const Json& json);
105
-
106
104
  std::string json_string_;
107
105
  Json json_;
108
106
 
109
- std::vector<std::unique_ptr<ServiceConfigParser::ParsedConfig>>
110
- parsed_global_configs_;
107
+ ServiceConfigParser::ParsedConfigVector parsed_global_configs_;
111
108
  // A map from the method name to the parsed config vector. Note that we are
112
109
  // using a raw pointer and not a unique pointer so that we can use the same
113
110
  // vector for multiple names.
@@ -118,11 +115,11 @@ class ServiceConfigImpl final : public ServiceConfig {
118
115
  const ServiceConfigParser::ParsedConfigVector* default_method_config_vector_ =
119
116
  nullptr;
120
117
  // Storage for all the vectors that are being used in
121
- // parsed_method_configs_table_.
122
- std::vector<std::unique_ptr<ServiceConfigParser::ParsedConfigVector>>
118
+ // parsed_method_configs_map_ and default_method_config_vector_.
119
+ std::vector<ServiceConfigParser::ParsedConfigVector>
123
120
  parsed_method_config_vectors_storage_;
124
121
  };
125
122
 
126
123
  } // namespace grpc_core
127
124
 
128
- #endif /* GRPC_CORE_LIB_SERVICE_CONFIG_SERVICE_CONFIG_IMPL_H */
125
+ #endif // GRPC_CORE_LIB_SERVICE_CONFIG_SERVICE_CONFIG_IMPL_H
@@ -22,9 +22,7 @@
22
22
 
23
23
  #include <string>
24
24
 
25
- #include "absl/status/status.h"
26
25
  #include "absl/strings/str_cat.h"
27
- #include "absl/strings/str_join.h"
28
26
 
29
27
  #include <grpc/support/log.h>
30
28
 
@@ -49,43 +47,28 @@ void ServiceConfigParser::Builder::RegisterParser(
49
47
  registered_parsers_.emplace_back(std::move(parser));
50
48
  }
51
49
 
52
- absl::StatusOr<ServiceConfigParser::ParsedConfigVector>
50
+ ServiceConfigParser::ParsedConfigVector
53
51
  ServiceConfigParser::ParseGlobalParameters(const ChannelArgs& args,
54
- const Json& json) const {
52
+ const Json& json,
53
+ ValidationErrors* errors) const {
55
54
  ParsedConfigVector parsed_global_configs;
56
- std::vector<std::string> errors;
57
- for (size_t i = 0; i < registered_parsers_.size(); i++) {
58
- auto parsed_config = registered_parsers_[i]->ParseGlobalParams(args, json);
59
- if (!parsed_config.ok()) {
60
- errors.emplace_back(parsed_config.status().message());
61
- } else {
62
- parsed_global_configs.push_back(std::move(*parsed_config));
63
- }
64
- }
65
- if (!errors.empty()) {
66
- return absl::InvalidArgumentError(absl::StrJoin(errors, "; "));
55
+ for (auto& parser : registered_parsers_) {
56
+ parsed_global_configs.push_back(
57
+ parser->ParseGlobalParams(args, json, errors));
67
58
  }
68
- return std::move(parsed_global_configs);
59
+ return parsed_global_configs;
69
60
  }
70
61
 
71
- absl::StatusOr<ServiceConfigParser::ParsedConfigVector>
62
+ ServiceConfigParser::ParsedConfigVector
72
63
  ServiceConfigParser::ParsePerMethodParameters(const ChannelArgs& args,
73
- const Json& json) const {
64
+ const Json& json,
65
+ ValidationErrors* errors) const {
74
66
  ParsedConfigVector parsed_method_configs;
75
- std::vector<std::string> errors;
76
- for (size_t i = 0; i < registered_parsers_.size(); ++i) {
77
- auto parsed_config =
78
- registered_parsers_[i]->ParsePerMethodParams(args, json);
79
- if (!parsed_config.ok()) {
80
- errors.emplace_back(parsed_config.status().message());
81
- } else {
82
- parsed_method_configs.push_back(std::move(*parsed_config));
83
- }
84
- }
85
- if (!errors.empty()) {
86
- return absl::InvalidArgumentError(absl::StrJoin(errors, "; "));
67
+ for (auto& parser : registered_parsers_) {
68
+ parsed_method_configs.push_back(
69
+ parser->ParsePerMethodParams(args, json, errors));
87
70
  }
88
- return std::move(parsed_method_configs);
71
+ return parsed_method_configs;
89
72
  }
90
73
 
91
74
  size_t ServiceConfigParser::GetParserIndex(absl::string_view name) const {
@@ -26,10 +26,10 @@
26
26
  #include <utility>
27
27
  #include <vector>
28
28
 
29
- #include "absl/status/statusor.h"
30
29
  #include "absl/strings/string_view.h"
31
30
 
32
31
  #include "src/core/lib/channel/channel_args.h"
32
+ #include "src/core/lib/gprpp/validation_errors.h"
33
33
  #include "src/core/lib/json/json.h"
34
34
 
35
35
  namespace grpc_core {
@@ -52,13 +52,15 @@ class ServiceConfigParser {
52
52
 
53
53
  virtual absl::string_view name() const = 0;
54
54
 
55
- virtual absl::StatusOr<std::unique_ptr<ParsedConfig>> ParseGlobalParams(
56
- const ChannelArgs& /*args*/, const Json& /*json*/) {
55
+ virtual std::unique_ptr<ParsedConfig> ParseGlobalParams(
56
+ const ChannelArgs& /*args*/, const Json& /*json*/,
57
+ ValidationErrors* /*errors*/) {
57
58
  return nullptr;
58
59
  }
59
60
 
60
- virtual absl::StatusOr<std::unique_ptr<ParsedConfig>> ParsePerMethodParams(
61
- const ChannelArgs& /*args*/, const Json& /*json*/) {
61
+ virtual std::unique_ptr<ParsedConfig> ParsePerMethodParams(
62
+ const ChannelArgs& /*args*/, const Json& /*json*/,
63
+ ValidationErrors* /*errors*/) {
62
64
  return nullptr;
63
65
  }
64
66
  };
@@ -80,11 +82,13 @@ class ServiceConfigParser {
80
82
  ServiceConfigParserList registered_parsers_;
81
83
  };
82
84
 
83
- absl::StatusOr<ParsedConfigVector> ParseGlobalParameters(
84
- const ChannelArgs& args, const Json& json) const;
85
+ ParsedConfigVector ParseGlobalParameters(const ChannelArgs& args,
86
+ const Json& json,
87
+ ValidationErrors* errors) const;
85
88
 
86
- absl::StatusOr<ParsedConfigVector> ParsePerMethodParameters(
87
- const ChannelArgs& args, const Json& json) const;
89
+ ParsedConfigVector ParsePerMethodParameters(const ChannelArgs& args,
90
+ const Json& json,
91
+ ValidationErrors* errors) const;
88
92
 
89
93
  // Return the index for a given registered parser.
90
94
  // If there is an error, return -1.
@@ -98,4 +102,4 @@ class ServiceConfigParser {
98
102
 
99
103
  } // namespace grpc_core
100
104
 
101
- #endif /* GRPC_CORE_LIB_SERVICE_CONFIG_SERVICE_CONFIG_PARSER_H */
105
+ #endif // GRPC_CORE_LIB_SERVICE_CONFIG_SERVICE_CONFIG_PARSER_H
@@ -27,7 +27,7 @@
27
27
  #include <grpc/support/log.h>
28
28
 
29
29
  #include "src/core/lib/gpr/useful.h"
30
- #include "src/core/lib/slice/slice_refcount.h"
30
+ #include "src/core/lib/slice/slice.h"
31
31
 
32
32
  /* --- Constants. --- */
33
33
 
@@ -234,6 +234,6 @@ grpc_slice grpc_base64_decode_with_len(const char* b64, size_t b64_len,
234
234
  return result;
235
235
 
236
236
  fail:
237
- grpc_slice_unref_internal(result);
237
+ grpc_core::CSliceUnref(result);
238
238
  return grpc_empty_slice();
239
239
  }
@@ -30,7 +30,7 @@
30
30
 
31
31
  #include "src/core/lib/gprpp/memory.h"
32
32
  #include "src/core/lib/slice/slice_internal.h"
33
- #include "src/core/lib/slice/slice_refcount_base.h"
33
+ #include "src/core/lib/slice/slice_refcount.h"
34
34
 
35
35
  char* grpc_slice_to_c_string(grpc_slice slice) {
36
36
  char* out = static_cast<char*>(gpr_malloc(GRPC_SLICE_LENGTH(slice) + 1));
@@ -494,3 +494,9 @@ grpc_slice grpc_slice_dup(grpc_slice a) {
494
494
  GRPC_SLICE_LENGTH(a));
495
495
  return copy;
496
496
  }
497
+
498
+ grpc_slice grpc_slice_ref(grpc_slice slice) {
499
+ return grpc_core::CSliceRef(slice);
500
+ }
501
+
502
+ void grpc_slice_unref(grpc_slice slice) { grpc_core::CSliceUnref(slice); }
@@ -31,7 +31,6 @@
31
31
  #include "src/core/lib/gpr/string.h"
32
32
  #include "src/core/lib/slice/slice_internal.h"
33
33
  #include "src/core/lib/slice/slice_refcount.h"
34
- #include "src/core/lib/slice/slice_refcount_base.h"
35
34
 
36
35
  // Herein lies grpc_core::Slice and its team of thin wrappers around grpc_slice.
37
36
  // They aim to keep you safe by providing strong guarantees around lifetime and
@@ -53,6 +52,19 @@
53
52
 
54
53
  namespace grpc_core {
55
54
 
55
+ inline const grpc_slice& CSliceRef(const grpc_slice& slice) {
56
+ if (reinterpret_cast<uintptr_t>(slice.refcount) > 1) {
57
+ slice.refcount->Ref();
58
+ }
59
+ return slice;
60
+ }
61
+
62
+ inline void CSliceUnref(const grpc_slice& slice) {
63
+ if (reinterpret_cast<uintptr_t>(slice.refcount) > 1) {
64
+ slice.refcount->Unref();
65
+ }
66
+ }
67
+
56
68
  namespace slice_detail {
57
69
 
58
70
  // Returns an empty slice.
@@ -110,7 +122,7 @@ class BaseSlice {
110
122
  return grpc_slice_is_equivalent(slice_, other.slice_);
111
123
  }
112
124
 
113
- uint32_t Hash() const { return grpc_slice_hash_internal(slice_); }
125
+ uint32_t Hash() const { return grpc_slice_hash(slice_); }
114
126
 
115
127
  protected:
116
128
  BaseSlice() : slice_(EmptySlice()) {}
@@ -249,7 +261,7 @@ class MutableSlice : public slice_detail::BaseSlice,
249
261
  : slice_detail::BaseSlice(slice) {
250
262
  GPR_DEBUG_ASSERT(slice.refcount == nullptr || slice.refcount->IsUnique());
251
263
  }
252
- ~MutableSlice() { grpc_slice_unref_internal(c_slice()); }
264
+ ~MutableSlice() { CSliceUnref(c_slice()); }
253
265
 
254
266
  MutableSlice(const MutableSlice&) = delete;
255
267
  MutableSlice& operator=(const MutableSlice&) = delete;
@@ -284,7 +296,8 @@ class Slice : public slice_detail::BaseSlice,
284
296
  public slice_detail::StaticConstructors<Slice> {
285
297
  public:
286
298
  Slice() = default;
287
- ~Slice() { grpc_slice_unref_internal(c_slice()); }
299
+ ~Slice() { CSliceUnref(c_slice()); }
300
+
288
301
  explicit Slice(const grpc_slice& slice) : slice_detail::BaseSlice(slice) {}
289
302
  explicit Slice(slice_detail::BaseSlice&& other)
290
303
  : slice_detail::BaseSlice(other.TakeCSlice()) {}
@@ -326,7 +339,7 @@ class Slice : public slice_detail::BaseSlice,
326
339
  if (c_slice().refcount == grpc_slice_refcount::NoopRefcount()) {
327
340
  return Slice(grpc_slice_copy(c_slice()));
328
341
  }
329
- return Slice(grpc_slice_ref_internal(c_slice()));
342
+ return Ref();
330
343
  }
331
344
 
332
345
  // TakeMutable returns a MutableSlice, and leaves the current slice in an
@@ -365,7 +378,7 @@ class Slice : public slice_detail::BaseSlice,
365
378
  return Slice(grpc_slice_split_tail(c_slice_ptr(), split));
366
379
  }
367
380
 
368
- Slice Ref() const { return Slice(grpc_slice_ref_internal(c_slice())); }
381
+ Slice Ref() const { return Slice(CSliceRef(c_slice())); }
369
382
 
370
383
  Slice Copy() const { return Slice(grpc_slice_copy(c_slice())); }
371
384