grpc 1.46.3 → 1.47.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 (481) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +49 -97
  3. data/include/grpc/event_engine/event_engine.h +42 -7
  4. data/include/grpc/event_engine/memory_allocator.h +0 -15
  5. data/include/grpc/event_engine/port.h +1 -1
  6. data/include/grpc/event_engine/slice.h +286 -0
  7. data/include/grpc/event_engine/slice_buffer.h +112 -0
  8. data/include/grpc/grpc_security.h +11 -0
  9. data/include/grpc/impl/codegen/port_platform.h +100 -36
  10. data/include/grpc/impl/codegen/slice.h +1 -1
  11. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +18 -30
  12. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +4 -1
  13. data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
  14. data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
  16. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
  18. data/src/core/ext/filters/client_channel/client_channel.cc +60 -17
  19. data/src/core/ext/filters/client_channel/client_channel.h +26 -6
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
  25. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  26. data/src/core/ext/filters/client_channel/config_selector.h +7 -5
  27. data/src/core/ext/filters/client_channel/connector.h +8 -2
  28. data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
  29. data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
  30. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  31. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
  32. data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
  33. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
  34. data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
  35. data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
  47. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
  52. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +102 -60
  53. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +157 -96
  54. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
  55. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +45 -10
  56. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
  57. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
  58. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +30 -5
  59. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +99 -23
  60. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
  61. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
  62. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +23 -3
  63. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +75 -11
  64. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
  65. data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
  66. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
  67. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  68. data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
  69. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  70. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  71. data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
  72. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
  73. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
  74. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
  75. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +134 -43
  76. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
  77. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
  78. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
  82. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  83. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  84. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +30 -7
  85. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
  86. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
  87. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
  88. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +13 -1
  89. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
  90. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
  91. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -33
  92. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
  93. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
  94. data/src/core/ext/filters/client_channel/retry_filter.cc +42 -2
  95. data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
  96. data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
  97. data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
  98. data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
  99. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
  100. data/src/core/ext/filters/client_channel/subchannel.cc +156 -160
  101. data/src/core/ext/filters/client_channel/subchannel.h +80 -20
  102. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
  103. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  104. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
  105. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
  106. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +16 -2
  107. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +12 -0
  108. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
  109. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -4
  110. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -5
  111. data/src/core/ext/filters/http/client/http_client_filter.h +7 -1
  112. data/src/core/ext/filters/http/client_authority_filter.cc +5 -10
  113. data/src/core/ext/filters/http/http_filters_plugin.cc +7 -8
  114. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
  115. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
  116. data/src/core/ext/filters/http/server/http_server_filter.cc +80 -247
  117. data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
  118. data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
  119. data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
  120. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
  121. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +101 -135
  122. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
  123. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -15
  124. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
  125. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  126. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  127. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  128. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +69 -20
  129. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
  130. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
  131. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
  132. data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
  133. data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
  134. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  135. data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
  136. data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
  137. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  138. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  139. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
  140. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  141. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
  142. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  143. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -3
  144. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  145. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
  146. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  147. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
  148. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
  149. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
  150. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
  151. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
  152. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
  153. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
  154. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
  155. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  156. data/src/core/ext/transport/chttp2/transport/internal.h +24 -3
  157. data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -6
  158. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
  159. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  160. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  161. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  162. data/src/core/ext/transport/chttp2/transport/writing.cc +38 -2
  163. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
  164. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  165. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
  166. data/src/core/ext/xds/certificate_provider_store.cc +4 -2
  167. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  168. data/src/core/ext/xds/xds_certificate_provider.cc +4 -1
  169. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  170. data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
  171. data/src/core/ext/xds/xds_client.cc +46 -22
  172. data/src/core/ext/xds/xds_cluster.cc +106 -16
  173. data/src/core/ext/xds/xds_cluster.h +3 -0
  174. data/src/core/ext/xds/xds_http_fault_filter.cc +3 -3
  175. data/src/core/ext/xds/xds_listener.cc +19 -9
  176. data/src/core/ext/xds/xds_server_config_fetcher.cc +2 -1
  177. data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
  178. data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
  179. data/src/core/lib/avl/avl.h +3 -1
  180. data/src/core/lib/channel/call_finalization.h +4 -0
  181. data/src/core/lib/channel/call_tracer.h +8 -2
  182. data/src/core/lib/channel/channel_args.cc +41 -22
  183. data/src/core/lib/channel/channel_args.h +33 -3
  184. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -3
  185. data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
  186. data/src/core/lib/channel/channel_stack.cc +41 -3
  187. data/src/core/lib/channel/channel_stack.h +49 -3
  188. data/src/core/lib/channel/channel_stack_builder.cc +9 -19
  189. data/src/core/lib/channel/channel_stack_builder.h +15 -27
  190. data/src/core/lib/channel/channel_stack_builder_impl.cc +36 -41
  191. data/src/core/lib/channel/channel_stack_builder_impl.h +3 -6
  192. data/src/core/lib/channel/channel_trace.cc +8 -13
  193. data/src/core/lib/channel/channel_trace.h +6 -3
  194. data/src/core/lib/channel/channelz.cc +8 -13
  195. data/src/core/lib/channel/channelz.h +13 -4
  196. data/src/core/lib/channel/channelz_registry.cc +7 -14
  197. data/src/core/lib/channel/channelz_registry.h +10 -9
  198. data/src/core/lib/channel/connected_channel.cc +21 -31
  199. data/src/core/lib/channel/connected_channel.h +1 -0
  200. data/src/core/lib/channel/promise_based_filter.cc +444 -189
  201. data/src/core/lib/channel/promise_based_filter.h +160 -27
  202. data/src/core/lib/channel/status_util.cc +2 -0
  203. data/src/core/lib/channel/status_util.h +0 -3
  204. data/src/core/lib/compression/compression_internal.cc +45 -10
  205. data/src/core/lib/compression/compression_internal.h +1 -1
  206. data/src/core/lib/config/core_configuration.cc +3 -0
  207. data/src/core/lib/config/core_configuration.h +2 -1
  208. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
  209. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
  210. data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
  211. data/src/core/lib/event_engine/event_engine.cc +12 -2
  212. data/src/core/lib/event_engine/event_engine_factory.h +5 -0
  213. data/src/core/lib/event_engine/handle_containers.h +67 -0
  214. data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
  215. data/src/core/lib/event_engine/iomgr_engine.h +118 -0
  216. data/src/core/lib/event_engine/memory_allocator.cc +12 -4
  217. data/src/core/lib/event_engine/resolved_address.cc +4 -2
  218. data/src/core/lib/event_engine/slice.cc +102 -0
  219. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  220. data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
  221. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  222. data/src/core/lib/gpr/log.cc +5 -0
  223. data/src/core/lib/gpr/tls.h +3 -5
  224. data/src/core/lib/gprpp/bitset.h +5 -1
  225. data/src/core/lib/gprpp/chunked_vector.h +4 -0
  226. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  227. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  228. data/src/core/lib/gprpp/examine_stack.h +0 -1
  229. data/src/core/lib/gprpp/fork.cc +3 -6
  230. data/src/core/lib/gprpp/global_config.h +2 -4
  231. data/src/core/lib/gprpp/global_config_env.cc +3 -2
  232. data/src/core/lib/gprpp/global_config_env.h +3 -1
  233. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  234. data/src/core/lib/gprpp/host_port.cc +2 -0
  235. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  236. data/src/core/lib/gprpp/match.h +2 -0
  237. data/src/core/lib/gprpp/memory.h +1 -5
  238. data/src/core/lib/gprpp/orphanable.h +1 -4
  239. data/src/core/lib/gprpp/ref_counted.h +1 -3
  240. data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
  241. data/src/core/lib/gprpp/stat.h +0 -2
  242. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  243. data/src/core/lib/gprpp/status_helper.cc +8 -4
  244. data/src/core/lib/gprpp/status_helper.h +4 -0
  245. data/src/core/lib/gprpp/sync.h +3 -1
  246. data/src/core/lib/gprpp/table.h +10 -0
  247. data/src/core/lib/gprpp/thd.h +2 -5
  248. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  249. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  250. data/src/core/lib/gprpp/time.cc +8 -0
  251. data/src/core/lib/gprpp/time.h +6 -1
  252. data/src/core/lib/gprpp/time_util.cc +4 -0
  253. data/src/core/lib/gprpp/time_util.h +1 -1
  254. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  255. data/src/core/lib/http/format_request.cc +29 -0
  256. data/src/core/lib/http/format_request.h +2 -0
  257. data/src/core/lib/http/httpcli.cc +88 -81
  258. data/src/core/lib/http/httpcli.h +39 -7
  259. data/src/core/lib/http/httpcli_security_connector.cc +3 -4
  260. data/src/core/lib/iomgr/endpoint.cc +4 -4
  261. data/src/core/lib/iomgr/endpoint.h +6 -4
  262. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
  263. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  264. data/src/core/lib/iomgr/ev_posix.cc +1 -4
  265. data/src/core/lib/iomgr/exec_ctx.h +1 -2
  266. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  267. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  268. data/src/core/lib/iomgr/iomgr.cc +0 -1
  269. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
  270. data/src/core/lib/iomgr/pollset_set.h +1 -2
  271. data/src/core/lib/iomgr/port.h +25 -6
  272. data/src/core/lib/iomgr/resolve_address.cc +8 -0
  273. data/src/core/lib/iomgr/resolve_address.h +21 -14
  274. data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
  275. data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
  276. data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
  277. data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
  278. data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
  279. data/src/core/lib/iomgr/sockaddr.h +2 -3
  280. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  281. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  282. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
  283. data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
  284. data/src/core/lib/iomgr/tcp_client_posix.cc +12 -5
  285. data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
  286. data/src/core/lib/iomgr/tcp_posix.cc +9 -27
  287. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -12
  288. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
  289. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
  290. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
  291. data/src/core/lib/iomgr/tcp_windows.cc +7 -4
  292. data/src/core/lib/json/json.h +1 -2
  293. data/src/core/lib/json/json_reader.cc +9 -1
  294. data/src/core/lib/json/json_util.cc +7 -0
  295. data/src/core/lib/json/json_util.h +10 -1
  296. data/src/core/lib/json/json_writer.cc +6 -1
  297. data/src/core/lib/promise/activity.cc +1 -1
  298. data/src/core/lib/promise/activity.h +6 -6
  299. data/src/core/lib/promise/arena_promise.h +11 -1
  300. data/src/core/lib/promise/call_push_pull.h +4 -0
  301. data/src/core/lib/promise/context.h +1 -1
  302. data/src/core/lib/promise/detail/basic_seq.h +2 -2
  303. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  304. data/src/core/lib/promise/latch.h +0 -1
  305. data/src/core/lib/promise/loop.h +1 -0
  306. data/src/core/lib/promise/race.h +0 -1
  307. data/src/core/lib/promise/seq.h +0 -2
  308. data/src/core/lib/promise/sleep.cc +2 -0
  309. data/src/core/lib/promise/sleep.h +10 -0
  310. data/src/core/lib/promise/try_seq.h +2 -2
  311. data/src/core/lib/resolver/resolver_factory.h +1 -2
  312. data/src/core/lib/resolver/server_address.cc +9 -3
  313. data/src/core/lib/resolver/server_address.h +4 -4
  314. data/src/core/lib/resource_quota/api.cc +14 -1
  315. data/src/core/lib/resource_quota/api.h +4 -1
  316. data/src/core/lib/resource_quota/arena.cc +0 -6
  317. data/src/core/lib/resource_quota/arena.h +1 -2
  318. data/src/core/lib/resource_quota/memory_quota.cc +47 -5
  319. data/src/core/lib/resource_quota/memory_quota.h +24 -5
  320. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  321. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  322. data/src/core/lib/resource_quota/thread_quota.h +4 -0
  323. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -0
  324. data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -2
  325. data/src/core/lib/security/credentials/alts/alts_credentials.h +2 -2
  326. data/src/core/lib/security/credentials/call_creds_util.cc +2 -0
  327. data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
  328. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -3
  329. data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -4
  330. data/src/core/lib/security/credentials/credentials.h +17 -10
  331. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
  333. data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
  334. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
  335. data/src/core/lib/security/credentials/fake/fake_credentials.cc +13 -3
  336. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  337. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -15
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -2
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +4 -1
  340. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  341. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +8 -2
  342. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +4 -4
  343. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -2
  344. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  345. data/src/core/lib/security/credentials/local/local_credentials.cc +8 -2
  346. data/src/core/lib/security/credentials/local/local_credentials.h +2 -2
  347. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
  348. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  349. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -1
  350. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
  351. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -2
  352. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +4 -4
  353. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
  354. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +5 -7
  355. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +26 -1
  356. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +28 -4
  357. data/src/core/lib/security/credentials/tls/tls_credentials.cc +10 -0
  358. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  359. data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -3
  360. data/src/core/lib/security/credentials/xds/xds_credentials.h +5 -5
  361. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  362. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  364. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  365. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
  366. data/src/core/lib/security/transport/client_auth_filter.cc +6 -8
  367. data/src/core/lib/security/transport/secure_endpoint.cc +23 -12
  368. data/src/core/lib/security/transport/security_handshaker.cc +5 -5
  369. data/src/core/lib/security/transport/security_handshaker.h +1 -1
  370. data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
  371. data/src/core/lib/service_config/service_config.h +4 -8
  372. data/src/core/lib/service_config/service_config_call_data.h +4 -1
  373. data/src/core/lib/service_config/service_config_impl.cc +7 -0
  374. data/src/core/lib/service_config/service_config_impl.h +9 -2
  375. data/src/core/lib/service_config/service_config_parser.cc +8 -0
  376. data/src/core/lib/service_config/service_config_parser.h +7 -0
  377. data/src/core/lib/slice/b64.cc +1 -1
  378. data/src/core/lib/slice/b64.h +2 -0
  379. data/src/core/lib/slice/percent_encoding.cc +4 -1
  380. data/src/core/lib/slice/percent_encoding.h +0 -6
  381. data/src/core/lib/slice/slice.cc +2 -1
  382. data/src/core/lib/slice/slice.h +10 -5
  383. data/src/core/lib/slice/slice_api.cc +1 -1
  384. data/src/core/lib/slice/slice_buffer.cc +50 -23
  385. data/src/core/lib/slice/slice_buffer.h +106 -0
  386. data/src/core/lib/slice/slice_buffer_api.cc +35 -0
  387. data/src/core/lib/slice/slice_internal.h +4 -3
  388. data/src/core/lib/slice/slice_refcount.h +2 -3
  389. data/src/core/lib/slice/slice_refcount_base.h +2 -3
  390. data/src/core/lib/slice/slice_split.cc +3 -0
  391. data/src/core/lib/slice/slice_split.h +0 -4
  392. data/src/core/lib/slice/slice_string_helpers.cc +4 -0
  393. data/src/core/lib/slice/slice_string_helpers.h +1 -4
  394. data/src/core/lib/surface/builtins.cc +7 -2
  395. data/src/core/lib/surface/byte_buffer.cc +7 -1
  396. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  397. data/src/core/lib/surface/call.cc +41 -26
  398. data/src/core/lib/surface/call.h +16 -2
  399. data/src/core/lib/surface/call_details.cc +4 -4
  400. data/src/core/lib/surface/call_log_batch.cc +7 -1
  401. data/src/core/lib/surface/call_test_only.h +4 -1
  402. data/src/core/lib/surface/channel.cc +179 -242
  403. data/src/core/lib/surface/channel.h +94 -57
  404. data/src/core/lib/surface/channel_init.h +2 -0
  405. data/src/core/lib/surface/channel_ping.cc +8 -2
  406. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  407. data/src/core/lib/surface/channel_stack_type.h +0 -2
  408. data/src/core/lib/surface/completion_queue.cc +14 -6
  409. data/src/core/lib/surface/completion_queue.h +5 -1
  410. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  411. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  412. data/src/core/lib/surface/event_string.cc +1 -7
  413. data/src/core/lib/surface/event_string.h +1 -1
  414. data/src/core/lib/surface/init.cc +17 -45
  415. data/src/core/lib/surface/init.h +0 -8
  416. data/src/core/lib/surface/lame_client.cc +64 -110
  417. data/src/core/lib/surface/lame_client.h +40 -2
  418. data/src/core/lib/surface/metadata_array.cc +2 -0
  419. data/src/core/lib/surface/server.cc +69 -56
  420. data/src/core/lib/surface/server.h +39 -9
  421. data/src/core/lib/surface/validate_metadata.cc +2 -5
  422. data/src/core/lib/surface/validate_metadata.h +3 -0
  423. data/src/core/lib/surface/version.cc +2 -2
  424. data/src/core/lib/transport/bdp_estimator.cc +3 -1
  425. data/src/core/lib/transport/bdp_estimator.h +2 -3
  426. data/src/core/lib/transport/byte_stream.cc +4 -3
  427. data/src/core/lib/transport/byte_stream.h +5 -1
  428. data/src/core/lib/transport/connectivity_state.cc +6 -4
  429. data/src/core/lib/transport/connectivity_state.h +2 -3
  430. data/src/core/lib/transport/error_utils.cc +4 -2
  431. data/src/core/lib/transport/error_utils.h +5 -1
  432. data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
  433. data/src/core/lib/{channel → transport}/handshaker.h +13 -6
  434. data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
  435. data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
  436. data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
  437. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
  438. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  439. data/src/core/lib/transport/metadata_batch.cc +287 -0
  440. data/src/core/lib/transport/metadata_batch.h +133 -264
  441. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  442. data/src/core/lib/transport/parsed_metadata.h +10 -3
  443. data/src/core/lib/transport/status_conversion.cc +2 -0
  444. data/src/core/lib/transport/status_conversion.h +2 -2
  445. data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
  446. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  447. data/src/core/lib/transport/timeout_encoding.cc +2 -6
  448. data/src/core/lib/transport/timeout_encoding.h +5 -1
  449. data/src/core/lib/transport/transport.cc +18 -17
  450. data/src/core/lib/transport/transport.h +28 -2
  451. data/src/core/lib/transport/transport_impl.h +10 -0
  452. data/src/core/lib/transport/transport_op_string.cc +9 -10
  453. data/src/core/lib/uri/uri_parser.cc +11 -3
  454. data/src/core/lib/uri/uri_parser.h +0 -2
  455. data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
  456. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  457. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  458. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  459. data/src/ruby/ext/grpc/extconf.rb +2 -2
  460. data/src/ruby/lib/grpc/version.rb +1 -1
  461. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  462. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  463. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
  464. metadata +36 -29
  465. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  466. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  467. data/src/core/lib/event_engine/sockaddr.h +0 -44
  468. data/src/core/lib/gprpp/capture.h +0 -76
  469. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  470. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  471. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  472. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  473. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  474. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  475. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  476. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  477. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  478. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  479. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  480. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  481. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -21,31 +21,31 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
- #include <stdbool.h>
24
+ #include <stdlib.h>
25
25
 
26
26
  #include <cstdint>
27
- #include <limits>
28
-
29
- #include "absl/strings/escaping.h"
30
- #include "absl/strings/match.h"
31
- #include "absl/strings/str_join.h"
27
+ #include <string>
28
+ #include <type_traits>
29
+ #include <utility>
30
+
31
+ #include "absl/container/inlined_vector.h"
32
+ #include "absl/functional/function_ref.h"
33
+ #include "absl/meta/type_traits.h"
34
+ #include "absl/strings/numbers.h"
35
+ #include "absl/strings/string_view.h"
32
36
  #include "absl/types/optional.h"
33
37
 
34
- #include <grpc/grpc.h>
35
- #include <grpc/slice.h>
38
+ #include <grpc/impl/codegen/compression_types.h>
36
39
  #include <grpc/status.h>
37
- #include <grpc/support/time.h>
40
+ #include <grpc/support/log.h>
38
41
 
39
42
  #include "src/core/lib/compression/compression_internal.h"
40
43
  #include "src/core/lib/gprpp/chunked_vector.h"
41
44
  #include "src/core/lib/gprpp/table.h"
42
- #include "src/core/lib/iomgr/exec_ctx.h"
45
+ #include "src/core/lib/gprpp/time.h"
46
+ #include "src/core/lib/resource_quota/arena.h"
43
47
  #include "src/core/lib/slice/slice.h"
44
- #include "src/core/lib/surface/validate_metadata.h"
45
48
  #include "src/core/lib/transport/parsed_metadata.h"
46
- #include "src/core/lib/transport/timeout_encoding.h"
47
-
48
- struct grpc_call_final_info;
49
49
 
50
50
  namespace grpc_core {
51
51
 
@@ -61,23 +61,9 @@ struct GrpcTimeoutMetadata {
61
61
  using ValueType = Timestamp;
62
62
  using MementoType = Duration;
63
63
  static absl::string_view key() { return "grpc-timeout"; }
64
- static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error) {
65
- auto timeout = ParseTimeout(value);
66
- if (!timeout.has_value()) {
67
- on_error("invalid value", value);
68
- return Duration::Infinity();
69
- }
70
- return *timeout;
71
- }
72
- static ValueType MementoToValue(MementoType timeout) {
73
- if (timeout == Duration::Infinity()) {
74
- return Timestamp::InfFuture();
75
- }
76
- return ExecCtx::Get()->Now() + timeout;
77
- }
78
- static Slice Encode(ValueType x) {
79
- return Timeout::FromDuration(x - ExecCtx::Get()->Now()).Encode();
80
- }
64
+ static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error);
65
+ static ValueType MementoToValue(MementoType timeout);
66
+ static Slice Encode(ValueType x);
81
67
  static std::string DisplayValue(MementoType x) { return x.ToString(); }
82
68
  };
83
69
 
@@ -93,28 +79,13 @@ struct TeMetadata {
93
79
  };
94
80
  using MementoType = ValueType;
95
81
  static absl::string_view key() { return "te"; }
96
- static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error) {
97
- auto out = kInvalid;
98
- if (value == "trailers") {
99
- out = kTrailers;
100
- } else {
101
- on_error("invalid value", value);
102
- }
103
- return out;
104
- }
82
+ static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error);
105
83
  static ValueType MementoToValue(MementoType te) { return te; }
106
84
  static StaticSlice Encode(ValueType x) {
107
85
  GPR_ASSERT(x == kTrailers);
108
86
  return StaticSlice::FromStaticString("trailers");
109
87
  }
110
- static const char* DisplayValue(MementoType te) {
111
- switch (te) {
112
- case ValueType::kTrailers:
113
- return "trailers";
114
- default:
115
- return "<discarded-invalid-value>";
116
- }
117
- }
88
+ static const char* DisplayValue(MementoType te);
118
89
  };
119
90
 
120
91
  // content-type metadata trait.
@@ -130,47 +101,13 @@ struct ContentTypeMetadata {
130
101
  };
131
102
  using MementoType = ValueType;
132
103
  static absl::string_view key() { return "content-type"; }
133
- static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error) {
134
- auto out = kInvalid;
135
- auto value_string = value.as_string_view();
136
- if (value_string == "application/grpc") {
137
- out = kApplicationGrpc;
138
- } else if (absl::StartsWith(value_string, "application/grpc;")) {
139
- out = kApplicationGrpc;
140
- } else if (absl::StartsWith(value_string, "application/grpc+")) {
141
- out = kApplicationGrpc;
142
- } else if (value_string.empty()) {
143
- out = kEmpty;
144
- } else {
145
- on_error("invalid value", value);
146
- }
147
- return out;
148
- }
104
+ static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error);
149
105
  static ValueType MementoToValue(MementoType content_type) {
150
106
  return content_type;
151
107
  }
152
- static StaticSlice Encode(ValueType x) {
153
- switch (x) {
154
- case kEmpty:
155
- return StaticSlice::FromStaticString("");
156
- case kApplicationGrpc:
157
- return StaticSlice::FromStaticString("application/grpc");
158
- case kInvalid:
159
- return StaticSlice::FromStaticString("application/grpc+unknown");
160
- }
161
- GPR_UNREACHABLE_CODE(
162
- return StaticSlice::FromStaticString("unrepresentable value"));
163
- }
164
- static const char* DisplayValue(MementoType content_type) {
165
- switch (content_type) {
166
- case ValueType::kApplicationGrpc:
167
- return "application/grpc";
168
- case ValueType::kEmpty:
169
- return "";
170
- default:
171
- return "<discarded-invalid-value>";
172
- }
173
- }
108
+
109
+ static StaticSlice Encode(ValueType x);
110
+ static const char* DisplayValue(MementoType content_type);
174
111
  };
175
112
 
176
113
  // scheme metadata trait.
@@ -187,38 +124,12 @@ struct HttpSchemeMetadata {
187
124
  return Parse(value.as_string_view(), on_error);
188
125
  }
189
126
  static ValueType Parse(absl::string_view value,
190
- MetadataParseErrorFn on_error) {
191
- if (value == "http") {
192
- return kHttp;
193
- } else if (value == "https") {
194
- return kHttps;
195
- }
196
- on_error("invalid value", Slice::FromCopiedBuffer(value));
197
- return kInvalid;
198
- }
127
+ MetadataParseErrorFn on_error);
199
128
  static ValueType MementoToValue(MementoType content_type) {
200
129
  return content_type;
201
130
  }
202
- static StaticSlice Encode(ValueType x) {
203
- switch (x) {
204
- case kHttp:
205
- return StaticSlice::FromStaticString("http");
206
- case kHttps:
207
- return StaticSlice::FromStaticString("https");
208
- default:
209
- abort();
210
- }
211
- }
212
- static const char* DisplayValue(MementoType content_type) {
213
- switch (content_type) {
214
- case kHttp:
215
- return "http";
216
- case kHttps:
217
- return "https";
218
- default:
219
- return "<discarded-invalid-value>";
220
- }
221
- }
131
+ static StaticSlice Encode(ValueType x);
132
+ static const char* DisplayValue(MementoType content_type);
222
133
  };
223
134
 
224
135
  // method metadata trait.
@@ -227,45 +138,17 @@ struct HttpMethodMetadata {
227
138
  enum ValueType {
228
139
  kPost,
229
140
  kGet,
141
+ kPut,
230
142
  kInvalid,
231
143
  };
232
144
  using MementoType = ValueType;
233
145
  static absl::string_view key() { return ":method"; }
234
- static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error) {
235
- auto out = kInvalid;
236
- auto value_string = value.as_string_view();
237
- if (value_string == "POST") {
238
- out = kPost;
239
- } else if (value_string == "GET") {
240
- out = kGet;
241
- } else {
242
- on_error("invalid value", value);
243
- }
244
- return out;
245
- }
146
+ static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error);
246
147
  static ValueType MementoToValue(MementoType content_type) {
247
148
  return content_type;
248
149
  }
249
- static StaticSlice Encode(ValueType x) {
250
- switch (x) {
251
- case kPost:
252
- return StaticSlice::FromStaticString("POST");
253
- case kGet:
254
- return StaticSlice::FromStaticString("GET");
255
- default:
256
- abort();
257
- }
258
- }
259
- static const char* DisplayValue(MementoType content_type) {
260
- switch (content_type) {
261
- case kPost:
262
- return "POST";
263
- case kGet:
264
- return "GET";
265
- default:
266
- return "<discarded-invalid-value>";
267
- }
268
- }
150
+ static StaticSlice Encode(ValueType x);
151
+ static const char* DisplayValue(MementoType content_type);
269
152
  };
270
153
 
271
154
  // Base type for metadata pertaining to a single compression algorithm
@@ -273,14 +156,7 @@ struct HttpMethodMetadata {
273
156
  struct CompressionAlgorithmBasedMetadata {
274
157
  using ValueType = grpc_compression_algorithm;
275
158
  using MementoType = ValueType;
276
- static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error) {
277
- auto algorithm = ParseCompressionAlgorithm(value.as_string_view());
278
- if (!algorithm.has_value()) {
279
- on_error("invalid value", value);
280
- return GRPC_COMPRESS_NONE;
281
- }
282
- return *algorithm;
283
- }
159
+ static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error);
284
160
  static ValueType MementoToValue(MementoType x) { return x; }
285
161
  static Slice Encode(ValueType x) {
286
162
  GPR_ASSERT(x != GRPC_COMPRESS_ALGORITHMS_COUNT);
@@ -318,7 +194,7 @@ struct GrpcAcceptEncodingMetadata {
318
194
  }
319
195
  static ValueType MementoToValue(MementoType x) { return x; }
320
196
  static Slice Encode(ValueType x) { return x.ToSlice(); }
321
- static std::string DisplayValue(MementoType x) { return x.ToString(); }
197
+ static absl::string_view DisplayValue(MementoType x) { return x.ToString(); }
322
198
  };
323
199
 
324
200
  struct SimpleSliceBasedMetadata {
@@ -352,10 +228,10 @@ struct HostMetadata : public SimpleSliceBasedMetadata {
352
228
  static absl::string_view key() { return "host"; }
353
229
  };
354
230
 
355
- // x-endpoint-load-metrics-bin metadata trait.
356
- struct XEndpointLoadMetricsBinMetadata : public SimpleSliceBasedMetadata {
231
+ // endpoint-load-metrics-bin metadata trait.
232
+ struct EndpointLoadMetricsBinMetadata : public SimpleSliceBasedMetadata {
357
233
  static constexpr bool kRepeatable = false;
358
- static absl::string_view key() { return "x-endpoint-load-metrics-bin"; }
234
+ static absl::string_view key() { return "endpoint-load-metrics-bin"; }
359
235
  };
360
236
 
361
237
  // grpc-server-stats-bin metadata trait.
@@ -388,9 +264,9 @@ struct HttpPathMetadata : public SimpleSliceBasedMetadata {
388
264
  static absl::string_view key() { return ":path"; }
389
265
  };
390
266
 
391
- // We separate SimpleIntBasedMetadata into two pieces: one that does not depend
392
- // on the invalid value, and one that does. This allows the compiler to easily
393
- // see the functions that are shared, and helps reduce code bloat here.
267
+ // We separate SimpleIntBasedMetadata into two pieces: one that does not
268
+ // depend on the invalid value, and one that does. This allows the compiler to
269
+ // easily see the functions that are shared, and helps reduce code bloat here.
394
270
  template <typename Int>
395
271
  struct SimpleIntBasedMetadataBase {
396
272
  using ValueType = Int;
@@ -436,14 +312,7 @@ struct GrpcRetryPushbackMsMetadata {
436
312
  static ValueType MementoToValue(MementoType x) { return x; }
437
313
  static Slice Encode(Duration x) { return Slice::FromInt64(x.millis()); }
438
314
  static int64_t DisplayValue(Duration x) { return x.millis(); }
439
- static Duration ParseMemento(Slice value, MetadataParseErrorFn on_error) {
440
- int64_t out;
441
- if (!absl::SimpleAtoi(value.as_string_view(), &out)) {
442
- on_error("not an integer", value);
443
- return Duration::NegativeInfinity();
444
- }
445
- return Duration::Milliseconds(out);
446
- }
315
+ static Duration ParseMemento(Slice value, MetadataParseErrorFn on_error);
447
316
  };
448
317
 
449
318
  // :status metadata trait.
@@ -456,6 +325,7 @@ struct HttpStatusMetadata : public SimpleIntBasedMetadata<uint32_t, 0> {
456
325
  // "secret" metadata trait used to pass load balancing token between filters.
457
326
  // This should not be exposed outside of gRPC core.
458
327
  class GrpcLbClientStats;
328
+
459
329
  struct GrpcLbClientStatsMetadata {
460
330
  static constexpr bool kRepeatable = false;
461
331
  static absl::string_view key() { return "grpclb_client_stats"; }
@@ -485,28 +355,9 @@ struct LbCostBinMetadata {
485
355
  };
486
356
  using MementoType = ValueType;
487
357
  static ValueType MementoToValue(MementoType value) { return value; }
488
- static Slice Encode(const ValueType& x) {
489
- auto slice =
490
- MutableSlice::CreateUninitialized(sizeof(double) + x.name.length());
491
- memcpy(slice.data(), &x.cost, sizeof(double));
492
- memcpy(slice.data() + sizeof(double), x.name.data(), x.name.length());
493
- return Slice(std::move(slice));
494
- }
495
- static std::string DisplayValue(MementoType x) {
496
- return absl::StrCat(x.name, ":", x.cost);
497
- }
498
- static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error) {
499
- if (value.length() < sizeof(double)) {
500
- on_error("too short", value);
501
- return {0, ""};
502
- }
503
- MementoType out;
504
- memcpy(&out.cost, value.data(), sizeof(double));
505
- out.name = std::string(
506
- reinterpret_cast<const char*>(value.data()) + sizeof(double),
507
- value.length() - sizeof(double));
508
- return out;
509
- }
358
+ static Slice Encode(const ValueType& x);
359
+ static std::string DisplayValue(MementoType x);
360
+ static MementoType ParseMemento(Slice value, MetadataParseErrorFn on_error);
510
361
  };
511
362
 
512
363
  // Annotation added by a transport to note whether a failed request was never
@@ -518,14 +369,7 @@ struct GrpcStreamNetworkState {
518
369
  kNotSentOnWire,
519
370
  kNotSeenByServer,
520
371
  };
521
- static std::string DisplayValue(ValueType x) {
522
- switch (x) {
523
- case kNotSentOnWire:
524
- return "not sent on wire";
525
- case kNotSeenByServer:
526
- return "not seen by server";
527
- }
528
- }
372
+ static std::string DisplayValue(ValueType x);
529
373
  };
530
374
 
531
375
  // Annotation added by a server transport to note the peer making a request.
@@ -533,7 +377,7 @@ struct PeerString {
533
377
  static absl::string_view DebugKey() { return "PeerString"; }
534
378
  static constexpr bool kRepeatable = false;
535
379
  using ValueType = absl::string_view;
536
- static std::string DisplayValue(ValueType x) { return std::string(x); }
380
+ static std::string DisplayValue(ValueType x);
537
381
  };
538
382
 
539
383
  // Annotation added by various systems to describe the reason for a failure.
@@ -541,16 +385,31 @@ struct GrpcStatusContext {
541
385
  static absl::string_view DebugKey() { return "GrpcStatusContext"; }
542
386
  static constexpr bool kRepeatable = true;
543
387
  using ValueType = std::string;
544
- static const std::string& DisplayValue(const std::string& x) { return x; }
388
+ static const std::string& DisplayValue(const std::string& x);
545
389
  };
546
390
 
547
391
  namespace metadata_detail {
548
392
 
549
- // IsEncodable: Given a trait, determine if that trait is encodable, or is just
550
- // a value attached to a MetadataMap.
551
- // We use the presence of the key() static method to determine if a trait is
552
- // encodable or not - encodable traits have string names, and non-encodable
553
- // traits do not.
393
+ // Build a key/value formatted debug string.
394
+ // Output looks like 'key1: value1, key2: value2'
395
+ // The string is expected to be readable, but not necessarily parsable.
396
+ class DebugStringBuilder {
397
+ public:
398
+ // Add one key/value pair to the output.
399
+ void Add(absl::string_view key, absl::string_view value);
400
+
401
+ // Finalize the output and return the string.
402
+ // Subsequent Add calls are UB.
403
+ std::string TakeOutput() { return std::move(out_); }
404
+
405
+ private:
406
+ std::string out_;
407
+ };
408
+
409
+ // IsEncodable: Given a trait, determine if that trait is encodable, or is
410
+ // just a value attached to a MetadataMap. We use the presence of the key()
411
+ // static method to determine if a trait is encodable or not - encodable
412
+ // traits have string names, and non-encodable traits do not.
554
413
  template <typename Trait, typename Ignored = void>
555
414
  struct IsEncodableTrait {
556
415
  static const bool value = false;
@@ -600,8 +459,8 @@ struct NameLookup<void> {
600
459
  };
601
460
 
602
461
  // Helper to take a slice to a memento to a value.
603
- // By splitting this part out we can scale code size as the number of (memento,
604
- // value) types, rather than as the number of traits.
462
+ // By splitting this part out we can scale code size as the number of
463
+ // (memento, value) types, rather than as the number of traits.
605
464
  template <typename ParseMementoFn, typename MementoToValueFn>
606
465
  struct ParseValue {
607
466
  template <ParseMementoFn parse_memento, MementoToValueFn memento_to_value>
@@ -650,8 +509,8 @@ class ParseHelper {
650
509
  };
651
510
 
652
511
  // This is an "Op" type for NameLookup.
653
- // Used for MetadataMap::Append, its Found/NotFound methods turn a slice into a
654
- // value and add it to a container.
512
+ // Used for MetadataMap::Append, its Found/NotFound methods turn a slice into
513
+ // a value and add it to a container.
655
514
  template <typename Container>
656
515
  class AppendHelper {
657
516
  public:
@@ -668,7 +527,7 @@ class AppendHelper {
668
527
  }
669
528
 
670
529
  GPR_ATTRIBUTE_NOINLINE void NotFound(absl::string_view key) {
671
- container_->AppendUnknown(key, std::move(value_));
530
+ container_->unknown_.Append(key, std::move(value_));
672
531
  }
673
532
 
674
533
  private:
@@ -691,7 +550,7 @@ class RemoveHelper {
691
550
  }
692
551
 
693
552
  GPR_ATTRIBUTE_NOINLINE void NotFound(absl::string_view key) {
694
- container_->RemoveUnknown(key);
553
+ container_->unknown_.Remove(key);
695
554
  }
696
555
 
697
556
  private:
@@ -699,8 +558,8 @@ class RemoveHelper {
699
558
  };
700
559
 
701
560
  // This is an "Op" type for NameLookup.
702
- // Used for MetadataMap::GetStringValue, its Found/NotFound methods generated a
703
- // string value from the container.
561
+ // Used for MetadataMap::GetStringValue, its Found/NotFound methods generated
562
+ // a string value from the container.
704
563
  template <typename Container>
705
564
  class GetStringValueHelper {
706
565
  public:
@@ -750,7 +609,7 @@ class GetStringValueHelper {
750
609
 
751
610
  GPR_ATTRIBUTE_NOINLINE absl::optional<absl::string_view> NotFound(
752
611
  absl::string_view key) {
753
- return container_->GetStringValueUnknown(key, backing_);
612
+ return container_->unknown_.GetStringValue(key, backing_);
754
613
  }
755
614
 
756
615
  private:
@@ -763,7 +622,17 @@ using LogFn = absl::FunctionRef<void(absl::string_view, absl::string_view)>;
763
622
 
764
623
  template <typename T>
765
624
  struct AdaptDisplayValueToLog {
766
- static std::string ToString(const T& value) { return absl::StrCat(value); }
625
+ static std::string ToString(const T& value) { return std::to_string(value); }
626
+ };
627
+
628
+ template <>
629
+ struct AdaptDisplayValueToLog<std::string> {
630
+ static std::string ToString(const std::string& value) { return value; }
631
+ };
632
+
633
+ template <>
634
+ struct AdaptDisplayValueToLog<const std::string&> {
635
+ static std::string ToString(const std::string& value) { return value; }
767
636
  };
768
637
 
769
638
  template <>
@@ -919,7 +788,7 @@ class CopySink {
919
788
  }
920
789
 
921
790
  void Encode(const Slice& key, const Slice& value) {
922
- dst_->AppendUnknown(key.as_string_view(), value.Ref());
791
+ dst_->unknown_.Append(key.as_string_view(), value.Ref());
923
792
  }
924
793
 
925
794
  private:
@@ -975,6 +844,31 @@ class TransportSizeEncoder {
975
844
  uint32_t size_ = 0;
976
845
  };
977
846
 
847
+ // Handle unknown (non-trait-based) fields in the metadata map.
848
+ class UnknownMap {
849
+ public:
850
+ explicit UnknownMap(Arena* arena) : unknown_(arena) {}
851
+
852
+ using BackingType = ChunkedVector<std::pair<Slice, Slice>, 10>;
853
+
854
+ void Append(absl::string_view key, Slice value);
855
+ void Remove(absl::string_view key);
856
+ absl::optional<absl::string_view> GetStringValue(absl::string_view key,
857
+ std::string* backing) const;
858
+
859
+ BackingType::ConstForwardIterator begin() const { return unknown_.cbegin(); }
860
+ BackingType::ConstForwardIterator end() const { return unknown_.cend(); }
861
+
862
+ bool empty() const { return unknown_.empty(); }
863
+ size_t size() const { return unknown_.size(); }
864
+ void Clear() { unknown_.Clear(); }
865
+ Arena* arena() const { return unknown_.arena(); }
866
+
867
+ private:
868
+ // Backing store for added metadata.
869
+ ChunkedVector<std::pair<Slice, Slice>, 10> unknown_;
870
+ };
871
+
978
872
  } // namespace metadata_detail
979
873
 
980
874
  // Helper function for encoders
@@ -1035,21 +929,23 @@ MetadataValueAsSlice(typename Which::ValueType value) {
1035
929
  // // Parse a memento from a slice
1036
930
  // // Takes ownership of value
1037
931
  // // Calls fn in the case of an error that should be reported to the user
1038
- // static MementoType ParseMemento(Slice value, MementoParseErrorFn fn) { ...
932
+ // static MementoType ParseMemento(Slice value, MementoParseErrorFn fn) {
933
+ // ...
1039
934
  // }
1040
935
  // // Convert a memento to a value
1041
936
  // static ValueType MementoToValue(MementoType memento) { ... }
1042
937
  // // Convert a value to its canonical text wire format (the format that
1043
938
  // // ParseMemento will accept!)
1044
939
  // static Slice Encode(const ValueType& value);
1045
- // // Convert a value to something that can be passed to StrCat and displayed
940
+ // // Convert a value to something that can be passed to StrCat and
941
+ // displayed
1046
942
  // // for debugging
1047
943
  // static SomeStrCatableType DisplayValue(MementoType value) { ... }
1048
944
  // };
1049
945
  //
1050
- // Non-encodable traits are determined by missing the key() method, and have the
1051
- // following signature (and by convention omit the Metadata part of the type
1052
- // name):
946
+ // Non-encodable traits are determined by missing the key() method, and have
947
+ // the following signature (and by convention omit the Metadata part of the
948
+ // type name):
1053
949
  // // Traits for the GrpcXyz field:
1054
950
  // struct GrpcXyz {
1055
951
  // // The string key that should be used for debug dumps - should not be a
@@ -1059,7 +955,8 @@ MetadataValueAsSlice(typename Which::ValueType value) {
1059
955
  // static constexpr bool kRepeatable = ...;
1060
956
  // // The type that's stored on MetadataBatch
1061
957
  // using ValueType = ...;
1062
- // // Convert a value to something that can be passed to StrCat and displayed
958
+ // // Convert a value to something that can be passed to StrCat and
959
+ // displayed
1063
960
  // // for debugging
1064
961
  // static SomeStrCatableType DisplayValue(ValueType value) { ... }
1065
962
  // };
@@ -1072,10 +969,10 @@ MetadataValueAsSlice(typename Which::ValueType value) {
1072
969
  // in the compression table. This is what mementos are used for.
1073
970
  //
1074
971
  // A trait offers the capability to turn a slice into a memento via
1075
- // ParseMemento. This is exposed to users of MetadataMap via the Parse() method,
1076
- // that returns a ParsedMetadata object. That ParsedMetadata object can in turn
1077
- // be used to set the same value on many different MetadataMaps without having
1078
- // to reparse.
972
+ // ParseMemento. This is exposed to users of MetadataMap via the Parse()
973
+ // method, that returns a ParsedMetadata object. That ParsedMetadata object
974
+ // can in turn be used to set the same value on many different MetadataMaps
975
+ // without having to reparse.
1079
976
  //
1080
977
  // Implementation wise, ParsedMetadata is a type erased wrapper around
1081
978
  // MementoType. When we set a value on MetadataMap, we first turn that memento
@@ -1128,12 +1025,11 @@ class MetadataMap {
1128
1025
  }
1129
1026
 
1130
1027
  std::string DebugString() const {
1131
- std::string out;
1132
- Log([&out](absl::string_view key, absl::string_view value) {
1133
- if (!out.empty()) out.append(", ");
1134
- absl::StrAppend(&out, absl::CEscape(key), ": ", absl::CEscape(value));
1028
+ metadata_detail::DebugStringBuilder builder;
1029
+ Log([&builder](absl::string_view key, absl::string_view value) {
1030
+ builder.Add(key, value);
1135
1031
  });
1136
- return out;
1032
+ return builder.TakeOutput();
1137
1033
  }
1138
1034
 
1139
1035
  // Get the pointer to the value of some known metadata.
@@ -1280,36 +1176,9 @@ class MetadataMap {
1280
1176
  template <typename Which>
1281
1177
  using Value = metadata_detail::Value<Which>;
1282
1178
 
1283
- void AppendUnknown(absl::string_view key, Slice value) {
1284
- unknown_.EmplaceBack(Slice::FromCopiedString(key), value.Ref());
1285
- }
1286
-
1287
- void RemoveUnknown(absl::string_view key) {
1288
- unknown_.SetEnd(std::remove_if(unknown_.begin(), unknown_.end(),
1289
- [key](const std::pair<Slice, Slice>& p) {
1290
- return p.first.as_string_view() == key;
1291
- }));
1292
- }
1293
-
1294
- absl::optional<absl::string_view> GetStringValueUnknown(
1295
- absl::string_view key, std::string* backing) const {
1296
- absl::optional<absl::string_view> out;
1297
- for (const auto& p : unknown_) {
1298
- if (p.first.as_string_view() == key) {
1299
- if (!out.has_value()) {
1300
- out = p.second.as_string_view();
1301
- } else {
1302
- out = *backing = absl::StrCat(*out, ",", p.second.as_string_view());
1303
- }
1304
- }
1305
- }
1306
- return out;
1307
- }
1308
-
1309
1179
  // Table of known metadata types.
1310
1180
  Table<Value<Traits>...> table_;
1311
- // Backing store for added metadata.
1312
- ChunkedVector<std::pair<Slice, Slice>, 10> unknown_;
1181
+ metadata_detail::UnknownMap unknown_;
1313
1182
  };
1314
1183
 
1315
1184
  // Ok/not-ok check for metadata maps that contain GrpcStatusMetadata, so that
@@ -1327,8 +1196,8 @@ template <typename Derived, typename... Traits>
1327
1196
  MetadataMap<Derived, Traits...>::MetadataMap(MetadataMap&& other) noexcept
1328
1197
  : table_(std::move(other.table_)), unknown_(std::move(other.unknown_)) {}
1329
1198
 
1330
- // We never create MetadataMap directly, instead we create Derived, but we want
1331
- // to be able to move it without redeclaring this.
1199
+ // We never create MetadataMap directly, instead we create Derived, but we
1200
+ // want to be able to move it without redeclaring this.
1332
1201
  // NOLINTNEXTLINE(misc-unconventional-assign-operator)
1333
1202
  template <typename Derived, typename... Traits>
1334
1203
  Derived& MetadataMap<Derived, Traits...>::operator=(
@@ -1379,7 +1248,7 @@ using grpc_metadata_batch_base = grpc_core::MetadataMap<
1379
1248
  grpc_core::GrpcTimeoutMetadata, grpc_core::GrpcPreviousRpcAttemptsMetadata,
1380
1249
  grpc_core::GrpcRetryPushbackMsMetadata, grpc_core::UserAgentMetadata,
1381
1250
  grpc_core::GrpcMessageMetadata, grpc_core::HostMetadata,
1382
- grpc_core::XEndpointLoadMetricsBinMetadata,
1251
+ grpc_core::EndpointLoadMetricsBinMetadata,
1383
1252
  grpc_core::GrpcServerStatsBinMetadata, grpc_core::GrpcTraceBinMetadata,
1384
1253
  grpc_core::GrpcTagsBinMetadata, grpc_core::GrpcLbClientStatsMetadata,
1385
1254
  grpc_core::LbCostBinMetadata, grpc_core::LbTokenMetadata,
@@ -16,6 +16,8 @@
16
16
 
17
17
  #include "src/core/lib/transport/parsed_metadata.h"
18
18
 
19
+ #include "src/core/lib/slice/slice_refcount.h"
20
+
19
21
  namespace grpc_core {
20
22
  namespace metadata_detail {
21
23