grpc 1.41.1 → 1.42.0.pre1

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 (416) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +55 -43
  3. data/include/grpc/event_engine/event_engine.h +82 -42
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  5. data/include/grpc/event_engine/memory_allocator.h +210 -0
  6. data/include/grpc/grpc.h +4 -0
  7. data/include/grpc/grpc_security.h +18 -0
  8. data/include/grpc/grpc_security_constants.h +1 -0
  9. data/include/grpc/impl/codegen/port_platform.h +7 -0
  10. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  11. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  12. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  13. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  14. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  15. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  17. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  18. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  20. data/src/core/ext/filters/client_channel/connector.h +18 -18
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  24. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  42. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  43. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  44. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  49. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  50. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  52. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  53. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  54. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  55. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  58. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  59. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  60. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  62. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  63. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  64. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  66. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  67. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  68. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  69. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  74. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  75. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  76. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  77. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  78. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  79. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  80. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  81. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  82. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  84. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  85. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  87. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  88. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  89. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  90. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  91. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  92. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  93. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  94. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  96. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  98. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  99. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  103. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  107. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  109. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  110. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  112. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  114. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  120. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  121. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  123. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  125. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  127. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  128. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  130. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  131. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  138. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  139. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  140. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  142. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  146. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  147. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  148. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  153. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  155. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  161. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  163. data/src/core/ext/xds/xds_api.cc +325 -362
  164. data/src/core/ext/xds/xds_api.h +134 -82
  165. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  166. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  167. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  168. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  169. data/src/core/ext/xds/xds_client.cc +527 -314
  170. data/src/core/ext/xds/xds_client.h +42 -37
  171. data/src/core/ext/xds/xds_client_stats.h +1 -1
  172. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  173. data/src/core/lib/address_utils/parse_address.cc +2 -0
  174. data/src/core/lib/avl/avl.cc +5 -5
  175. data/src/core/lib/backoff/backoff.cc +1 -1
  176. data/src/core/lib/channel/channel_args.cc +24 -6
  177. data/src/core/lib/channel/channel_args.h +9 -0
  178. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  179. data/src/core/lib/channel/channel_trace.cc +1 -1
  180. data/src/core/lib/channel/channel_trace.h +1 -1
  181. data/src/core/lib/channel/channelz.cc +3 -3
  182. data/src/core/lib/channel/channelz.h +2 -2
  183. data/src/core/lib/channel/channelz_registry.cc +1 -1
  184. data/src/core/lib/channel/channelz_registry.h +1 -1
  185. data/src/core/lib/channel/connected_channel.cc +1 -3
  186. data/src/core/lib/channel/connected_channel.h +1 -2
  187. data/src/core/lib/compression/compression.cc +2 -2
  188. data/src/core/lib/compression/compression_args.cc +6 -4
  189. data/src/core/lib/compression/compression_internal.cc +2 -2
  190. data/src/core/lib/compression/compression_internal.h +1 -1
  191. data/src/core/lib/config/core_configuration.cc +44 -2
  192. data/src/core/lib/config/core_configuration.h +39 -1
  193. data/src/core/lib/debug/stats.cc +1 -1
  194. data/src/core/lib/debug/stats_data.cc +13 -13
  195. data/src/core/lib/gpr/atm.cc +1 -1
  196. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  197. data/src/core/lib/gpr/string.cc +2 -2
  198. data/src/core/lib/gpr/tls.h +1 -1
  199. data/src/core/lib/gpr/useful.h +79 -32
  200. data/src/core/lib/gprpp/arena.h +10 -0
  201. data/src/core/lib/gprpp/bitset.h +38 -16
  202. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  203. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  204. data/src/core/lib/gprpp/match.h +1 -1
  205. data/src/core/lib/gprpp/memory.h +6 -0
  206. data/src/core/lib/gprpp/overload.h +1 -1
  207. data/src/core/lib/gprpp/status_helper.cc +23 -3
  208. data/src/core/lib/gprpp/status_helper.h +12 -1
  209. data/src/core/lib/gprpp/table.h +411 -0
  210. data/src/core/lib/http/httpcli.cc +200 -182
  211. data/src/core/lib/http/parser.cc +2 -2
  212. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  213. data/src/core/lib/iomgr/combiner.cc +6 -21
  214. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  215. data/src/core/lib/iomgr/error.cc +113 -52
  216. data/src/core/lib/iomgr/error.h +50 -9
  217. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  218. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  219. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  220. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  221. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  222. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  223. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  224. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  225. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  226. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  227. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  228. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  229. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  230. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  231. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  232. data/src/core/lib/iomgr/executor.cc +6 -20
  233. data/src/core/lib/iomgr/iomgr.cc +3 -1
  234. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  235. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  236. data/src/core/lib/iomgr/load_file.cc +2 -2
  237. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  238. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  239. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  240. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  241. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  242. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  243. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  244. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  246. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  247. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  249. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  250. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  251. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  252. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  253. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  254. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  255. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  256. data/src/core/lib/json/json_util.cc +68 -0
  257. data/src/core/lib/json/json_util.h +57 -99
  258. data/src/core/lib/json/json_writer.cc +0 -3
  259. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  260. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  261. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  262. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  263. data/src/core/lib/security/context/security_context.cc +4 -2
  264. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  265. data/src/core/lib/security/credentials/credentials.cc +4 -2
  266. data/src/core/lib/security/credentials/credentials.h +6 -1
  267. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  268. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  269. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  270. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  271. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  272. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  273. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  274. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  275. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  276. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  278. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  279. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  280. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  281. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  282. data/src/core/lib/slice/slice.cc +0 -16
  283. data/src/core/lib/slice/slice_api.cc +39 -0
  284. data/src/core/lib/slice/slice_buffer.cc +5 -5
  285. data/src/core/lib/slice/slice_intern.cc +8 -13
  286. data/src/core/lib/slice/slice_internal.h +1 -244
  287. data/src/core/lib/slice/slice_refcount.cc +17 -0
  288. data/src/core/lib/slice/slice_refcount.h +121 -0
  289. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  290. data/src/core/lib/slice/slice_split.cc +100 -0
  291. data/src/core/lib/slice/slice_split.h +40 -0
  292. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  293. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  294. data/src/core/lib/slice/static_slice.cc +529 -0
  295. data/src/core/lib/slice/static_slice.h +331 -0
  296. data/src/core/lib/surface/builtins.cc +49 -0
  297. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  298. data/src/core/lib/surface/call.cc +103 -120
  299. data/src/core/lib/surface/call.h +0 -6
  300. data/src/core/lib/surface/channel.cc +19 -32
  301. data/src/core/lib/surface/channel.h +0 -9
  302. data/src/core/lib/surface/channel_init.cc +23 -76
  303. data/src/core/lib/surface/channel_init.h +52 -44
  304. data/src/core/lib/surface/completion_queue.cc +6 -5
  305. data/src/core/lib/surface/init.cc +0 -39
  306. data/src/core/lib/surface/init_secure.cc +17 -14
  307. data/src/core/lib/surface/lame_client.cc +18 -11
  308. data/src/core/lib/surface/lame_client.h +1 -1
  309. data/src/core/lib/surface/server.cc +25 -17
  310. data/src/core/lib/surface/server.h +17 -10
  311. data/src/core/lib/surface/validate_metadata.cc +5 -2
  312. data/src/core/lib/surface/version.cc +2 -2
  313. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  314. data/src/core/lib/transport/error_utils.cc +42 -17
  315. data/src/core/lib/transport/error_utils.h +1 -1
  316. data/src/core/lib/transport/metadata.cc +31 -10
  317. data/src/core/lib/transport/metadata.h +2 -1
  318. data/src/core/lib/transport/metadata_batch.cc +35 -371
  319. data/src/core/lib/transport/metadata_batch.h +905 -71
  320. data/src/core/lib/transport/parsed_metadata.h +263 -0
  321. data/src/core/lib/transport/pid_controller.cc +4 -4
  322. data/src/core/lib/transport/static_metadata.cc +714 -846
  323. data/src/core/lib/transport/static_metadata.h +115 -379
  324. data/src/core/lib/transport/status_metadata.cc +1 -0
  325. data/src/core/lib/transport/transport.cc +4 -5
  326. data/src/core/lib/transport/transport_op_string.cc +40 -20
  327. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  328. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  329. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  330. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  331. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  332. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  335. data/src/core/tsi/fake_transport_security.cc +15 -7
  336. data/src/core/tsi/local_transport_security.cc +36 -73
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  339. data/src/core/tsi/ssl_transport_security.cc +10 -2
  340. data/src/core/tsi/transport_security.cc +12 -0
  341. data/src/core/tsi/transport_security.h +16 -1
  342. data/src/core/tsi/transport_security_interface.h +26 -0
  343. data/src/ruby/ext/grpc/extconf.rb +12 -9
  344. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  346. data/src/ruby/lib/grpc/version.rb +1 -1
  347. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  348. data/src/ruby/spec/client_server_spec.rb +1 -1
  349. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  351. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  352. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +20 -21
  353. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +104 -114
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +13 -0
  355. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  356. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  357. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  358. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  359. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  360. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  361. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +3 -6
  362. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  363. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  364. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  365. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  366. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  368. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +0 -1
  369. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +72 -45
  370. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
  371. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +2 -2
  372. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +479 -15
  373. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -564
  374. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +0 -1
  375. data/third_party/re2/re2/compile.cc +91 -109
  376. data/third_party/re2/re2/dfa.cc +27 -39
  377. data/third_party/re2/re2/filtered_re2.cc +18 -2
  378. data/third_party/re2/re2/filtered_re2.h +10 -5
  379. data/third_party/re2/re2/nfa.cc +1 -1
  380. data/third_party/re2/re2/parse.cc +42 -23
  381. data/third_party/re2/re2/perl_groups.cc +34 -34
  382. data/third_party/re2/re2/prefilter.cc +3 -2
  383. data/third_party/re2/re2/prog.cc +182 -4
  384. data/third_party/re2/re2/prog.h +28 -9
  385. data/third_party/re2/re2/re2.cc +87 -118
  386. data/third_party/re2/re2/re2.h +156 -141
  387. data/third_party/re2/re2/regexp.cc +12 -5
  388. data/third_party/re2/re2/regexp.h +8 -2
  389. data/third_party/re2/re2/set.cc +31 -9
  390. data/third_party/re2/re2/set.h +9 -4
  391. data/third_party/re2/re2/simplify.cc +11 -3
  392. data/third_party/re2/re2/tostring.cc +1 -1
  393. data/third_party/re2/re2/walker-inl.h +1 -1
  394. data/third_party/re2/util/mutex.h +2 -2
  395. data/third_party/re2/util/pcre.h +3 -3
  396. metadata +78 -66
  397. data/include/grpc/event_engine/slice_allocator.h +0 -71
  398. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  399. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  400. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  401. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  402. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  403. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  404. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  405. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  406. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  407. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  408. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  409. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  410. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  411. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  412. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  413. data/src/core/lib/iomgr/udp_server.cc +0 -747
  414. data/src/core/lib/iomgr/udp_server.h +0 -103
  415. data/src/core/lib/transport/authority_override.cc +0 -40
  416. data/src/core/lib/transport/authority_override.h +0 -37
@@ -24,6 +24,7 @@
24
24
  #include <vector>
25
25
 
26
26
  #include "absl/status/statusor.h"
27
+ #include "absl/synchronization/notification.h"
27
28
  #include "absl/types/optional.h"
28
29
 
29
30
  #include <grpc/grpc.h>
@@ -364,7 +365,7 @@ class Server : public InternallyRefCounted<Server> {
364
365
  std::vector<grpc_channel*> GetChannelsLocked() const;
365
366
 
366
367
  // Take a shutdown ref for a request (increment by 2) and return if shutdown
367
- // has already been called.
368
+ // has not been called.
368
369
  bool ShutdownRefOnRequest() {
369
370
  int old_value = shutdown_refs_.fetch_add(2, std::memory_order_acq_rel);
370
371
  return (old_value & 1) != 0;
@@ -377,12 +378,24 @@ class Server : public InternallyRefCounted<Server> {
377
378
  if (shutdown_refs_.fetch_sub(2, std::memory_order_acq_rel) == 2) {
378
379
  MutexLock lock(&mu_global_);
379
380
  MaybeFinishShutdown();
381
+ // The last request in-flight during shutdown is now complete.
382
+ if (requests_complete_ != nullptr) {
383
+ GPR_ASSERT(!requests_complete_->HasBeenNotified());
384
+ requests_complete_->Notify();
385
+ }
380
386
  }
381
387
  }
382
- void ShutdownUnrefOnShutdownCall() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_global_) {
388
+ // Returns a notification pointer to wait on if there are requests in-flight,
389
+ // or null.
390
+ absl::Notification* ShutdownUnrefOnShutdownCall()
391
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_global_) GRPC_MUST_USE_RESULT {
383
392
  if (shutdown_refs_.fetch_sub(1, std::memory_order_acq_rel) == 1) {
393
+ // There is no request in-flight.
384
394
  MaybeFinishShutdown();
395
+ return nullptr;
385
396
  }
397
+ requests_complete_ = absl::make_unique<absl::Notification>();
398
+ return requests_complete_.get();
386
399
  }
387
400
 
388
401
  bool ShutdownCalled() const {
@@ -433,6 +446,8 @@ class Server : public InternallyRefCounted<Server> {
433
446
  std::atomic<int> shutdown_refs_{1};
434
447
  bool shutdown_published_ ABSL_GUARDED_BY(mu_global_) = false;
435
448
  std::vector<ShutdownTag> shutdown_tags_ ABSL_GUARDED_BY(mu_global_);
449
+ std::unique_ptr<absl::Notification> requests_complete_
450
+ ABSL_GUARDED_BY(mu_global_);
436
451
 
437
452
  std::list<ChannelData*> channels_;
438
453
 
@@ -449,12 +464,6 @@ struct grpc_server {
449
464
  grpc_core::OrphanablePtr<grpc_core::Server> core_server;
450
465
  };
451
466
 
452
- // TODO(roth): Eventually, will need a way to modify configuration even after
453
- // a connection is established (e.g., to change things like L7 rate
454
- // limiting, RBAC, and fault injection configs). One possible option
455
- // would be to do something like ServiceConfig and ConfigSelector, but
456
- // that might add unnecessary per-call overhead. Need to consider other
457
- // approaches here.
458
467
  struct grpc_server_config_fetcher {
459
468
  public:
460
469
  class ConnectionManager : public grpc_core::RefCounted<ConnectionManager> {
@@ -479,9 +488,7 @@ struct grpc_server_config_fetcher {
479
488
 
480
489
  virtual ~grpc_server_config_fetcher() = default;
481
490
 
482
- // Ownership of \a args is transferred.
483
491
  virtual void StartWatch(std::string listening_address,
484
- grpc_channel_args* args,
485
492
  std::unique_ptr<WatcherInterface> watcher) = 0;
486
493
  virtual void CancelWatch(WatcherInterface* watcher) = 0;
487
494
  virtual grpc_pollset_set* interested_parties() = 0;
@@ -47,12 +47,15 @@ static grpc_error_handle conforms_to(const grpc_slice& slice,
47
47
  const uint8_t* e = GRPC_SLICE_END_PTR(slice);
48
48
  for (; p != e; p++) {
49
49
  if (!legal_bits.is_set(*p)) {
50
+ size_t len;
51
+ grpc_core::UniquePtr<char> ptr(gpr_dump_return_len(
52
+ reinterpret_cast<const char*> GRPC_SLICE_START_PTR(slice),
53
+ GRPC_SLICE_LENGTH(slice), GPR_DUMP_HEX | GPR_DUMP_ASCII, &len));
50
54
  grpc_error_handle error = grpc_error_set_str(
51
55
  grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(err_desc),
52
56
  GRPC_ERROR_INT_OFFSET,
53
57
  p - GRPC_SLICE_START_PTR(slice)),
54
- GRPC_ERROR_STR_RAW_BYTES,
55
- grpc_dump_slice_to_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII));
58
+ GRPC_ERROR_STR_RAW_BYTES, absl::string_view(ptr.get(), len));
56
59
  return error;
57
60
  }
58
61
  }
@@ -23,6 +23,6 @@
23
23
 
24
24
  #include <grpc/grpc.h>
25
25
 
26
- const char* grpc_version_string(void) { return "19.0.0"; }
26
+ const char* grpc_version_string(void) { return "20.0.0"; }
27
27
 
28
- const char* grpc_g_stands_for(void) { return "goat"; }
28
+ const char* grpc_g_stands_for(void) { return "granola"; }
@@ -55,7 +55,7 @@ grpc_millis BdpEstimator::CompletePing() {
55
55
  }
56
56
  GPR_ASSERT(ping_state_ == PingState::STARTED);
57
57
  if (accumulator_ > 2 * estimate_ / 3 && bw > bw_est_) {
58
- estimate_ = GPR_MAX(accumulator_, estimate_ * 2);
58
+ estimate_ = std::max(accumulator_, estimate_ * 2);
59
59
  bw_est_ = bw;
60
60
  if (GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
61
61
  gpr_log(GPR_INFO, "bdp[%s]: estimate increased to %" PRId64, name_,
@@ -22,6 +22,7 @@
22
22
 
23
23
  #include <grpc/support/string_util.h>
24
24
 
25
+ #include "src/core/lib/gprpp/status_helper.h"
25
26
  #include "src/core/lib/iomgr/error_internal.h"
26
27
  #include "src/core/lib/slice/slice_internal.h"
27
28
  #include "src/core/lib/transport/status_conversion.h"
@@ -33,7 +34,14 @@ static grpc_error_handle recursively_find_error_with_field(
33
34
  if (grpc_error_get_int(error, which, &unused)) {
34
35
  return error;
35
36
  }
36
- if (grpc_error_is_special(error)) return nullptr;
37
+ #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
38
+ std::vector<absl::Status> children = grpc_core::StatusGetChildren(error);
39
+ for (const absl::Status& child : children) {
40
+ grpc_error_handle result = recursively_find_error_with_field(child, which);
41
+ if (result != GRPC_ERROR_NONE) return result;
42
+ }
43
+ #else
44
+ if (grpc_error_is_special(error)) return GRPC_ERROR_NONE;
37
45
  // Otherwise, search through its children.
38
46
  uint8_t slot = error->first_err;
39
47
  while (slot != UINT8_MAX) {
@@ -44,26 +52,27 @@ static grpc_error_handle recursively_find_error_with_field(
44
52
  if (result) return result;
45
53
  slot = lerr->next;
46
54
  }
47
- return nullptr;
55
+ #endif
56
+ return GRPC_ERROR_NONE;
48
57
  }
49
58
 
50
59
  void grpc_error_get_status(grpc_error_handle error, grpc_millis deadline,
51
- grpc_status_code* code, grpc_slice* slice,
60
+ grpc_status_code* code, std::string* message,
52
61
  grpc_http2_error_code* http_error,
53
62
  const char** error_string) {
54
63
  // Fast path: We expect no error.
55
64
  if (GPR_LIKELY(error == GRPC_ERROR_NONE)) {
56
65
  if (code != nullptr) *code = GRPC_STATUS_OK;
57
- if (slice != nullptr) {
66
+ if (message != nullptr) {
58
67
  // Normally, we call grpc_error_get_str(
59
- // error, GRPC_ERROR_STR_GRPC_MESSAGE, slice).
68
+ // error, GRPC_ERROR_STR_GRPC_MESSAGE, message).
60
69
  // We can fastpath since we know that:
61
70
  // 1) Error is null
62
71
  // 2) which == GRPC_ERROR_STR_GRPC_MESSAGE
63
- // 3) The resulting slice is statically known.
64
- // 4) Said resulting slice is of length 0 ("").
72
+ // 3) The resulting message is statically known.
73
+ // 4) Said resulting message is "".
65
74
  // This means 3 movs, instead of 10s of instructions and a strlen.
66
- *slice = grpc_core::ExternallyManagedSlice("");
75
+ *message = "";
67
76
  }
68
77
  if (http_error != nullptr) {
69
78
  *http_error = GRPC_HTTP2_NO_ERROR;
@@ -94,6 +103,10 @@ void grpc_error_get_status(grpc_error_handle error, grpc_millis deadline,
94
103
  &integer)) {
95
104
  status = grpc_http2_error_to_grpc_status(
96
105
  static_cast<grpc_http2_error_code>(integer), deadline);
106
+ } else {
107
+ #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
108
+ status = static_cast<grpc_status_code>(found_error.code());
109
+ #endif
97
110
  }
98
111
  if (code != nullptr) *code = status;
99
112
 
@@ -116,10 +129,16 @@ void grpc_error_get_status(grpc_error_handle error, grpc_millis deadline,
116
129
 
117
130
  // If the error has a status message, use it. Otherwise, fall back to
118
131
  // the error description.
119
- if (slice != nullptr) {
120
- if (!grpc_error_get_str(found_error, GRPC_ERROR_STR_GRPC_MESSAGE, slice)) {
121
- if (!grpc_error_get_str(found_error, GRPC_ERROR_STR_DESCRIPTION, slice)) {
122
- *slice = grpc_slice_from_static_string("unknown error");
132
+ if (message != nullptr) {
133
+ if (!grpc_error_get_str(found_error, GRPC_ERROR_STR_GRPC_MESSAGE,
134
+ message)) {
135
+ if (!grpc_error_get_str(found_error, GRPC_ERROR_STR_DESCRIPTION,
136
+ message)) {
137
+ #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
138
+ *message = grpc_error_std_string(error);
139
+ #else
140
+ *message = "unknown error";
141
+ #endif
123
142
  }
124
143
  }
125
144
  }
@@ -129,13 +148,10 @@ absl::Status grpc_error_to_absl_status(grpc_error_handle error) {
129
148
  grpc_status_code status;
130
149
  // TODO(yashykt): This should be updated once we decide on how to use the
131
150
  // absl::Status payload to capture all the contents of grpc_error.
132
- grpc_slice message;
151
+ std::string message;
133
152
  grpc_error_get_status(error, GRPC_MILLIS_INF_FUTURE, &status, &message,
134
153
  nullptr /* http_error */, nullptr /* error_string */);
135
- return absl::Status(static_cast<absl::StatusCode>(status),
136
- absl::string_view(reinterpret_cast<const char*>(
137
- GRPC_SLICE_START_PTR(message)),
138
- GRPC_SLICE_LENGTH(message)));
154
+ return absl::Status(static_cast<absl::StatusCode>(status), message);
139
155
  }
140
156
 
141
157
  grpc_error_handle absl_status_to_grpc_error(absl::Status status) {
@@ -153,6 +169,14 @@ bool grpc_error_has_clear_grpc_status(grpc_error_handle error) {
153
169
  if (grpc_error_get_int(error, GRPC_ERROR_INT_GRPC_STATUS, &unused)) {
154
170
  return true;
155
171
  }
172
+ #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
173
+ std::vector<absl::Status> children = grpc_core::StatusGetChildren(error);
174
+ for (const absl::Status& child : children) {
175
+ if (grpc_error_has_clear_grpc_status(child)) {
176
+ return true;
177
+ }
178
+ }
179
+ #else
156
180
  uint8_t slot = error->first_err;
157
181
  while (slot != UINT8_MAX) {
158
182
  grpc_linked_error* lerr =
@@ -162,5 +186,6 @@ bool grpc_error_has_clear_grpc_status(grpc_error_handle error) {
162
186
  }
163
187
  slot = lerr->next;
164
188
  }
189
+ #endif
165
190
  return false;
166
191
  }
@@ -35,7 +35,7 @@
35
35
  /// msg, http_status, error_string) are unneeded, they can be passed as
36
36
  /// NULL.
37
37
  void grpc_error_get_status(grpc_error_handle error, grpc_millis deadline,
38
- grpc_status_code* code, grpc_slice* slice,
38
+ grpc_status_code* code, std::string* message,
39
39
  grpc_http2_error_code* http_error,
40
40
  const char** error_string);
41
41
 
@@ -279,9 +279,9 @@ void grpc_mdctx_global_shutdown() {
279
279
  #ifndef NDEBUG
280
280
  static int is_mdelem_static(grpc_mdelem e) {
281
281
  return reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) >=
282
- &grpc_static_mdelem_table()[0] &&
282
+ &grpc_core::g_static_mdelem_table[0] &&
283
283
  reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) <
284
- &grpc_static_mdelem_table()[GRPC_STATIC_MDELEM_COUNT];
284
+ &grpc_core::g_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT];
285
285
  }
286
286
  #endif
287
287
 
@@ -549,14 +549,35 @@ grpc_mdelem grpc_mdelem_from_slices(
549
549
  }
550
550
 
551
551
  grpc_mdelem grpc_mdelem_from_grpc_metadata(grpc_metadata* metadata) {
552
- bool changed = false;
552
+ bool key_changed = false;
553
553
  grpc_slice key_slice =
554
- grpc_slice_maybe_static_intern(metadata->key, &changed);
554
+ grpc_slice_maybe_static_intern(metadata->key, &key_changed);
555
+ bool value_changed = false;
556
+ grpc_slice* unref_slice = nullptr;
555
557
  grpc_slice value_slice =
556
- grpc_slice_maybe_static_intern(metadata->value, &changed);
557
- return grpc_mdelem_create(
558
- key_slice, value_slice,
559
- changed ? nullptr : reinterpret_cast<grpc_mdelem_data*>(metadata));
558
+ grpc_slice_maybe_static_intern(metadata->value, &value_changed);
559
+ // If key or value changed, but the other didn't.... AND the other is a NOP
560
+ // refcount, then we need to convert it to a slice with a refcount else we run
561
+ // the risk of leaving a dangling reference to that metadata on the heap via
562
+ // this mdelem.
563
+ if (key_changed && !value_changed && value_slice.refcount != nullptr &&
564
+ value_slice.refcount->GetType() == grpc_slice_refcount::Type::NOP) {
565
+ value_slice = grpc_slice_copy(value_slice);
566
+ unref_slice = &value_slice;
567
+ value_changed = true;
568
+ } else if (!key_changed && value_changed && key_slice.refcount != nullptr &&
569
+ key_slice.refcount->GetType() == grpc_slice_refcount::Type::NOP) {
570
+ key_slice = grpc_slice_copy(key_slice);
571
+ unref_slice = &key_slice;
572
+ key_changed = true;
573
+ }
574
+ auto mdelem =
575
+ grpc_mdelem_create(key_slice, value_slice,
576
+ key_changed || value_changed
577
+ ? nullptr
578
+ : reinterpret_cast<grpc_mdelem_data*>(metadata));
579
+ if (unref_slice != nullptr) grpc_slice_unref_internal(*unref_slice);
580
+ return mdelem;
560
581
  }
561
582
 
562
583
  static void* get_user_data(UserData* user_data, void (*destroy_func)(void*)) {
@@ -577,7 +598,7 @@ void* grpc_mdelem_get_user_data(grpc_mdelem md, void (*destroy_func)(void*)) {
577
598
  grpc_static_mdelem_user_data
578
599
  [reinterpret_cast<grpc_core::StaticMetadata*>(
579
600
  GRPC_MDELEM_DATA(md)) -
580
- grpc_static_mdelem_table()]);
601
+ grpc_core::g_static_mdelem_table]);
581
602
  case GRPC_MDELEM_STORAGE_ALLOCATED: {
582
603
  auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
583
604
  return get_user_data(am->user_data(), destroy_func);
@@ -619,7 +640,7 @@ void* grpc_mdelem_set_user_data(grpc_mdelem md, void (*destroy_func)(void*),
619
640
  grpc_static_mdelem_user_data
620
641
  [reinterpret_cast<grpc_core::StaticMetadata*>(
621
642
  GRPC_MDELEM_DATA(md)) -
622
- grpc_static_mdelem_table()]);
643
+ grpc_core::g_static_mdelem_table]);
623
644
  case GRPC_MDELEM_STORAGE_ALLOCATED: {
624
645
  auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
625
646
  return set_user_data(am->user_data(), destroy_func, data);
@@ -409,7 +409,8 @@ inline void grpc_mdelem_unref(grpc_mdelem gmd) {
409
409
  (GRPC_SLICE_LENGTH(GRPC_MDKEY((e))) + GRPC_SLICE_LENGTH(GRPC_MDVALUE((e))) + \
410
410
  32)
411
411
 
412
- #define GRPC_MDSTR_KV_HASH(k_hash, v_hash) (GPR_ROTL((k_hash), 2) ^ (v_hash))
412
+ #define GRPC_MDSTR_KV_HASH(k_hash, v_hash) \
413
+ (::grpc_core::RotateLeft(size_t(k_hash), size_t(2)) ^ (v_hash))
413
414
 
414
415
  void grpc_mdctx_global_init(void);
415
416
  void grpc_mdctx_global_shutdown();