grpc 1.43.1 → 1.44.0.pre2

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 (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -1,714 +0,0 @@
1
- /*
2
- *
3
- * Copyright 2015 gRPC authors.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
17
- */
18
-
19
- #include <grpc/support/port_platform.h>
20
-
21
- #include "src/core/lib/transport/metadata.h"
22
-
23
- #include <assert.h>
24
- #include <inttypes.h>
25
- #include <stddef.h>
26
- #include <string.h>
27
-
28
- #include <grpc/compression.h>
29
- #include <grpc/grpc.h>
30
- #include <grpc/support/alloc.h>
31
- #include <grpc/support/atm.h>
32
- #include <grpc/support/log.h>
33
- #include <grpc/support/string_util.h>
34
- #include <grpc/support/time.h>
35
-
36
- #include "src/core/lib/gpr/murmur_hash.h"
37
- #include "src/core/lib/gpr/string.h"
38
- #include "src/core/lib/iomgr/iomgr_internal.h"
39
- #include "src/core/lib/profiling/timers.h"
40
- #include "src/core/lib/slice/slice_internal.h"
41
- #include "src/core/lib/slice/slice_string_helpers.h"
42
- #include "src/core/lib/transport/static_metadata.h"
43
-
44
- using grpc_core::AllocatedMetadata;
45
- using grpc_core::InternedMetadata;
46
- using grpc_core::StaticMetadata;
47
- using grpc_core::UserData;
48
-
49
- /* There are two kinds of mdelem and mdstr instances.
50
- * Static instances are declared in static_metadata.{h,c} and
51
- * are initialized by grpc_mdctx_global_init().
52
- * Dynamic instances are stored in hash tables on grpc_mdctx, and are backed
53
- * by internal_string and internal_element structures.
54
- * Internal helper functions here-in (is_mdstr_static, is_mdelem_static) are
55
- * used to determine which kind of element a pointer refers to.
56
- */
57
-
58
- grpc_core::DebugOnlyTraceFlag grpc_trace_metadata(false, "metadata");
59
-
60
- #ifndef NDEBUG
61
- #define DEBUG_ARGS , const char *file, int line
62
- #define FWD_DEBUG_ARGS file, line
63
-
64
- void grpc_mdelem_trace_ref(void* md, const grpc_slice& key,
65
- const grpc_slice& value, intptr_t refcnt,
66
- const char* file, int line) {
67
- if (grpc_trace_metadata.enabled()) {
68
- char* key_str = grpc_slice_to_c_string(key);
69
- char* value_str = grpc_slice_to_c_string(value);
70
- gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
71
- "mdelem REF:%p:%" PRIdPTR "->%" PRIdPTR ": '%s' = '%s'", md,
72
- refcnt, refcnt + 1, key_str, value_str);
73
- gpr_free(key_str);
74
- gpr_free(value_str);
75
- }
76
- }
77
-
78
- void grpc_mdelem_trace_unref(void* md, const grpc_slice& key,
79
- const grpc_slice& value, intptr_t refcnt,
80
- const char* file, int line) {
81
- if (grpc_trace_metadata.enabled()) {
82
- char* key_str = grpc_slice_to_c_string(key);
83
- char* value_str = grpc_slice_to_c_string(value);
84
- gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
85
- "mdelem UNREF:%p:%" PRIdPTR "->%" PRIdPTR ": '%s' = '%s'", md,
86
- refcnt, refcnt - 1, key_str, value_str);
87
- gpr_free(key_str);
88
- gpr_free(value_str);
89
- }
90
- }
91
-
92
- #else // ifndef NDEBUG
93
- #define DEBUG_ARGS
94
- #define FWD_DEBUG_ARGS
95
- #endif // ifndef NDEBUG
96
-
97
- #define INITIAL_SHARD_CAPACITY 8
98
- #define LOG2_SHARD_COUNT 4
99
- #define SHARD_COUNT ((size_t)(1 << LOG2_SHARD_COUNT))
100
-
101
- #define TABLE_IDX(hash, capacity) (((hash) >> (LOG2_SHARD_COUNT)) % (capacity))
102
- #define SHARD_IDX(hash) ((hash) & ((1 << (LOG2_SHARD_COUNT)) - 1))
103
-
104
- void StaticMetadata::HashInit() {
105
- uint32_t k_hash = grpc_slice_hash_internal(kv_.key);
106
- uint32_t v_hash = grpc_slice_hash_internal(kv_.value);
107
- hash_ = GRPC_MDSTR_KV_HASH(k_hash, v_hash);
108
- }
109
-
110
- AllocatedMetadata::AllocatedMetadata(const grpc_slice& key,
111
- const grpc_slice& value)
112
- : RefcountedMdBase(grpc_slice_ref_internal(key),
113
- grpc_slice_ref_internal(value)) {
114
- #ifndef NDEBUG
115
- TraceAtStart("ALLOC_MD");
116
- #endif
117
- }
118
-
119
- AllocatedMetadata::AllocatedMetadata(const grpc_slice& key,
120
- const grpc_slice& value, const NoRefKey*)
121
- : RefcountedMdBase(key, grpc_slice_ref_internal(value)) {
122
- #ifndef NDEBUG
123
- TraceAtStart("ALLOC_MD_NOREF_KEY");
124
- #endif
125
- }
126
-
127
- AllocatedMetadata::AllocatedMetadata(
128
- const grpc_core::ManagedMemorySlice& key,
129
- const grpc_core::UnmanagedMemorySlice& value)
130
- : RefcountedMdBase(key, value) {
131
- #ifndef NDEBUG
132
- TraceAtStart("ALLOC_MD_NOREF_KEY_VAL");
133
- #endif
134
- }
135
-
136
- AllocatedMetadata::AllocatedMetadata(
137
- const grpc_core::ExternallyManagedSlice& key,
138
- const grpc_core::UnmanagedMemorySlice& value)
139
- : RefcountedMdBase(key, value) {
140
- #ifndef NDEBUG
141
- TraceAtStart("ALLOC_MD_NOREF_KEY_VAL");
142
- #endif
143
- }
144
-
145
- AllocatedMetadata::~AllocatedMetadata() {
146
- grpc_slice_unref_internal(key());
147
- grpc_slice_unref_internal(value());
148
- void* user_data = user_data_.data.load(std::memory_order_relaxed);
149
- if (user_data) {
150
- destroy_user_data_func destroy_user_data =
151
- user_data_.destroy_user_data.load(std::memory_order_relaxed);
152
- destroy_user_data(user_data);
153
- }
154
- }
155
-
156
- #ifndef NDEBUG
157
- void grpc_core::RefcountedMdBase::TraceAtStart(const char* tag) {
158
- if (grpc_trace_metadata.enabled()) {
159
- char* key_str = grpc_slice_to_c_string(key());
160
- char* value_str = grpc_slice_to_c_string(value());
161
- gpr_log(GPR_DEBUG, "mdelem %s:%p:%" PRIdPTR ": '%s' = '%s'", tag, this,
162
- RefValue(), key_str, value_str);
163
- gpr_free(key_str);
164
- gpr_free(value_str);
165
- }
166
- }
167
- #endif
168
-
169
- InternedMetadata::InternedMetadata(const grpc_slice& key,
170
- const grpc_slice& value, uint32_t hash,
171
- InternedMetadata* next)
172
- : RefcountedMdBase(grpc_slice_ref_internal(key),
173
- grpc_slice_ref_internal(value), hash),
174
- link_(next) {
175
- #ifndef NDEBUG
176
- TraceAtStart("INTERNED_MD");
177
- #endif
178
- }
179
-
180
- InternedMetadata::InternedMetadata(const grpc_slice& key,
181
- const grpc_slice& value, uint32_t hash,
182
- InternedMetadata* next, const NoRefKey*)
183
- : RefcountedMdBase(key, grpc_slice_ref_internal(value), hash), link_(next) {
184
- #ifndef NDEBUG
185
- TraceAtStart("INTERNED_MD_NOREF_KEY");
186
- #endif
187
- }
188
-
189
- InternedMetadata::~InternedMetadata() {
190
- grpc_slice_unref_internal(key());
191
- grpc_slice_unref_internal(value());
192
- void* user_data = user_data_.data.load(std::memory_order_relaxed);
193
- if (user_data) {
194
- destroy_user_data_func destroy_user_data =
195
- user_data_.destroy_user_data.load(std::memory_order_relaxed);
196
- destroy_user_data(user_data);
197
- }
198
- }
199
-
200
- size_t InternedMetadata::CleanupLinkedMetadata(
201
- InternedMetadata::BucketLink* head) {
202
- size_t num_freed = 0;
203
- InternedMetadata::BucketLink* prev_next = head;
204
- InternedMetadata *md, *next;
205
-
206
- for (md = head->next; md; md = next) {
207
- next = md->link_.next;
208
- if (md->AllRefsDropped()) {
209
- prev_next->next = next;
210
- delete md;
211
- num_freed++;
212
- } else {
213
- prev_next = &md->link_;
214
- }
215
- }
216
- return num_freed;
217
- }
218
-
219
- typedef struct mdtab_shard {
220
- gpr_mu mu;
221
- InternedMetadata::BucketLink* elems;
222
- size_t count;
223
- size_t capacity;
224
- /** Estimate of the number of unreferenced mdelems in the hash table.
225
- This will eventually converge to the exact number, but it's instantaneous
226
- accuracy is not guaranteed */
227
- gpr_atm free_estimate;
228
- } mdtab_shard;
229
-
230
- static mdtab_shard g_shards[SHARD_COUNT];
231
-
232
- static void gc_mdtab(mdtab_shard* shard);
233
-
234
- void grpc_mdctx_global_init(void) {
235
- /* initialize shards */
236
- for (size_t i = 0; i < SHARD_COUNT; i++) {
237
- mdtab_shard* shard = &g_shards[i];
238
- gpr_mu_init(&shard->mu);
239
- shard->count = 0;
240
- gpr_atm_no_barrier_store(&shard->free_estimate, 0);
241
- shard->capacity = INITIAL_SHARD_CAPACITY;
242
- shard->elems = static_cast<InternedMetadata::BucketLink*>(
243
- gpr_zalloc(sizeof(*shard->elems) * shard->capacity));
244
- }
245
- }
246
-
247
- void grpc_mdctx_global_shutdown() {
248
- for (size_t i = 0; i < SHARD_COUNT; i++) {
249
- mdtab_shard* shard = &g_shards[i];
250
- gpr_mu_destroy(&shard->mu);
251
- gc_mdtab(shard);
252
- if (shard->count != 0) {
253
- gpr_log(GPR_ERROR, "WARNING: %" PRIuPTR " metadata elements were leaked",
254
- shard->count);
255
- for (size_t i = 0; i < shard->capacity; i++) {
256
- for (InternedMetadata* md = shard->elems[i].next; md;
257
- md = md->bucket_next()) {
258
- char* key_str = grpc_slice_to_c_string(md->key());
259
- char* value_str = grpc_slice_to_c_string(md->value());
260
- gpr_log(GPR_ERROR, "mdelem '%s' = '%s'", key_str, value_str);
261
- gpr_free(key_str);
262
- gpr_free(value_str);
263
- }
264
- }
265
- if (grpc_iomgr_abort_on_leaks()) {
266
- abort();
267
- }
268
- }
269
- // For ASAN builds, we don't want to crash here, because that will
270
- // prevent ASAN from providing leak detection information, which is
271
- // far more useful than this simple assertion.
272
- #ifndef GRPC_ASAN_ENABLED
273
- GPR_DEBUG_ASSERT(shard->count == 0);
274
- #endif
275
- gpr_free(shard->elems);
276
- }
277
- }
278
-
279
- #ifndef NDEBUG
280
- static int is_mdelem_static(grpc_mdelem e) {
281
- return reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) >=
282
- &grpc_core::g_static_mdelem_table[0] &&
283
- reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) <
284
- &grpc_core::g_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT];
285
- }
286
- #endif
287
-
288
- void InternedMetadata::RefWithShardLocked(mdtab_shard* shard) {
289
- #ifndef NDEBUG
290
- if (grpc_trace_metadata.enabled()) {
291
- char* key_str = grpc_slice_to_c_string(key());
292
- char* value_str = grpc_slice_to_c_string(value());
293
- intptr_t value = RefValue();
294
- gpr_log(__FILE__, __LINE__, GPR_LOG_SEVERITY_DEBUG,
295
- "mdelem REF:%p:%" PRIdPTR "->%" PRIdPTR ": '%s' = '%s'", this,
296
- value, value + 1, key_str, value_str);
297
- gpr_free(key_str);
298
- gpr_free(value_str);
299
- }
300
- #endif
301
- if (FirstRef()) {
302
- gpr_atm_no_barrier_fetch_add(&shard->free_estimate, -1);
303
- }
304
- }
305
-
306
- static void gc_mdtab(mdtab_shard* shard) {
307
- GPR_TIMER_SCOPE("gc_mdtab", 0);
308
- size_t num_freed = 0;
309
- for (size_t i = 0; i < shard->capacity; ++i) {
310
- intptr_t freed = InternedMetadata::CleanupLinkedMetadata(&shard->elems[i]);
311
- num_freed += freed;
312
- shard->count -= freed;
313
- }
314
- gpr_atm_no_barrier_fetch_add(&shard->free_estimate,
315
- -static_cast<intptr_t>(num_freed));
316
- }
317
-
318
- static void grow_mdtab(mdtab_shard* shard) {
319
- GPR_TIMER_SCOPE("grow_mdtab", 0);
320
-
321
- size_t capacity = shard->capacity * 2;
322
- size_t i;
323
- InternedMetadata::BucketLink* mdtab;
324
- InternedMetadata *md, *next;
325
- uint32_t hash;
326
-
327
- mdtab = static_cast<InternedMetadata::BucketLink*>(
328
- gpr_zalloc(sizeof(InternedMetadata::BucketLink) * capacity));
329
-
330
- for (i = 0; i < shard->capacity; i++) {
331
- for (md = shard->elems[i].next; md; md = next) {
332
- size_t idx;
333
- hash = md->hash();
334
- next = md->bucket_next();
335
- idx = TABLE_IDX(hash, capacity);
336
- md->set_bucket_next(mdtab[idx].next);
337
- mdtab[idx].next = md;
338
- }
339
- }
340
- gpr_free(shard->elems);
341
- shard->elems = mdtab;
342
- shard->capacity = capacity;
343
- }
344
-
345
- static void rehash_mdtab(mdtab_shard* shard) {
346
- if (gpr_atm_no_barrier_load(&shard->free_estimate) >
347
- static_cast<gpr_atm>(shard->capacity / 4)) {
348
- gc_mdtab(shard);
349
- } else {
350
- grow_mdtab(shard);
351
- }
352
- }
353
-
354
- template <bool key_definitely_static, bool value_definitely_static = false>
355
- static grpc_mdelem md_create_maybe_static(const grpc_slice& key,
356
- const grpc_slice& value);
357
- template <bool key_definitely_static>
358
- static grpc_mdelem md_create_must_intern(const grpc_slice& key,
359
- const grpc_slice& value,
360
- uint32_t hash);
361
-
362
- template <bool key_definitely_static, bool value_definitely_static = false>
363
- static grpc_mdelem md_create(
364
- const grpc_slice& key, const grpc_slice& value,
365
- grpc_mdelem_data* compatible_external_backing_store) {
366
- // Ensure slices are, in fact, static if we claimed they were.
367
- GPR_DEBUG_ASSERT(!key_definitely_static ||
368
- GRPC_IS_STATIC_METADATA_STRING(key));
369
- GPR_DEBUG_ASSERT(!value_definitely_static ||
370
- GRPC_IS_STATIC_METADATA_STRING(value));
371
- const bool key_is_interned =
372
- key_definitely_static || grpc_slice_is_interned(key);
373
- const bool value_is_interned =
374
- value_definitely_static || grpc_slice_is_interned(value);
375
- // External storage if either slice is not interned and the caller already
376
- // created a backing store. If no backing store, we allocate one.
377
- if (!key_is_interned || !value_is_interned) {
378
- if (compatible_external_backing_store != nullptr) {
379
- // Caller provided backing store.
380
- return GRPC_MAKE_MDELEM(compatible_external_backing_store,
381
- GRPC_MDELEM_STORAGE_EXTERNAL);
382
- } else {
383
- // We allocate backing store.
384
- return key_definitely_static
385
- ? GRPC_MAKE_MDELEM(
386
- new AllocatedMetadata(
387
- key, value,
388
- static_cast<const AllocatedMetadata::NoRefKey*>(
389
- nullptr)),
390
- GRPC_MDELEM_STORAGE_ALLOCATED)
391
- : GRPC_MAKE_MDELEM(new AllocatedMetadata(key, value),
392
- GRPC_MDELEM_STORAGE_ALLOCATED);
393
- }
394
- }
395
- return md_create_maybe_static<key_definitely_static, value_definitely_static>(
396
- key, value);
397
- }
398
-
399
- template <bool key_definitely_static, bool value_definitely_static>
400
- static grpc_mdelem md_create_maybe_static(const grpc_slice& key,
401
- const grpc_slice& value) {
402
- // Ensure slices are, in fact, static if we claimed they were.
403
- GPR_DEBUG_ASSERT(!key_definitely_static ||
404
- GRPC_IS_STATIC_METADATA_STRING(key));
405
- GPR_DEBUG_ASSERT(!value_definitely_static ||
406
- GRPC_IS_STATIC_METADATA_STRING(value));
407
- GPR_DEBUG_ASSERT(key.refcount != nullptr);
408
- GPR_DEBUG_ASSERT(value.refcount != nullptr);
409
-
410
- const bool key_is_static_mdstr =
411
- key_definitely_static ||
412
- key.refcount->GetType() == grpc_slice_refcount::Type::STATIC;
413
- const bool value_is_static_mdstr =
414
- value_definitely_static ||
415
- value.refcount->GetType() == grpc_slice_refcount::Type::STATIC;
416
-
417
- const intptr_t kidx = GRPC_STATIC_METADATA_INDEX(key);
418
-
419
- // Not all static slice input yields a statically stored metadata element.
420
- if (key_is_static_mdstr && value_is_static_mdstr) {
421
- grpc_mdelem static_elem = grpc_static_mdelem_for_static_strings(
422
- kidx, GRPC_STATIC_METADATA_INDEX(value));
423
- if (!GRPC_MDISNULL(static_elem)) {
424
- return static_elem;
425
- }
426
- }
427
-
428
- uint32_t khash = key_definitely_static
429
- ? grpc_static_metadata_hash_values[kidx]
430
- : grpc_slice_hash_refcounted(key);
431
-
432
- uint32_t hash = GRPC_MDSTR_KV_HASH(khash, grpc_slice_hash_refcounted(value));
433
- return md_create_must_intern<key_definitely_static>(key, value, hash);
434
- }
435
-
436
- template <bool key_definitely_static>
437
- static grpc_mdelem md_create_must_intern(const grpc_slice& key,
438
- const grpc_slice& value,
439
- uint32_t hash) {
440
- // Here, we know both key and value are both at least interned, and both
441
- // possibly static. We know that anything inside the shared interned table is
442
- // also at least interned (and maybe static). Note that equality for a static
443
- // and interned slice implies that they are both the same exact slice.
444
- // The same applies to a pair of interned slices, or a pair of static slices.
445
- // Rather than run the full equality check, we can therefore just do a pointer
446
- // comparison of the refcounts.
447
- InternedMetadata* md;
448
- mdtab_shard* shard = &g_shards[SHARD_IDX(hash)];
449
- size_t idx;
450
-
451
- GPR_TIMER_SCOPE("grpc_mdelem_from_metadata_strings", 0);
452
-
453
- gpr_mu_lock(&shard->mu);
454
-
455
- idx = TABLE_IDX(hash, shard->capacity);
456
- /* search for an existing pair */
457
- for (md = shard->elems[idx].next; md; md = md->bucket_next()) {
458
- if (grpc_slice_static_interned_equal(key, md->key()) &&
459
- grpc_slice_static_interned_equal(value, md->value())) {
460
- md->RefWithShardLocked(shard);
461
- gpr_mu_unlock(&shard->mu);
462
- return GRPC_MAKE_MDELEM(md, GRPC_MDELEM_STORAGE_INTERNED);
463
- }
464
- }
465
-
466
- /* not found: create a new pair */
467
- md = key_definitely_static
468
- ? new InternedMetadata(
469
- key, value, hash, shard->elems[idx].next,
470
- static_cast<const InternedMetadata::NoRefKey*>(nullptr))
471
- : new InternedMetadata(key, value, hash, shard->elems[idx].next);
472
- shard->elems[idx].next = md;
473
- shard->count++;
474
-
475
- if (shard->count > shard->capacity * 2) {
476
- rehash_mdtab(shard);
477
- }
478
-
479
- gpr_mu_unlock(&shard->mu);
480
-
481
- return GRPC_MAKE_MDELEM(md, GRPC_MDELEM_STORAGE_INTERNED);
482
- }
483
-
484
- grpc_mdelem grpc_mdelem_create(
485
- const grpc_slice& key, const grpc_slice& value,
486
- grpc_mdelem_data* compatible_external_backing_store) {
487
- return md_create<false>(key, value, compatible_external_backing_store);
488
- }
489
-
490
- grpc_mdelem grpc_mdelem_create(
491
- const grpc_core::StaticMetadataSlice& key, const grpc_slice& value,
492
- grpc_mdelem_data* compatible_external_backing_store) {
493
- return md_create<true>(key, value, compatible_external_backing_store);
494
- }
495
-
496
- /* Create grpc_mdelem from provided slices. We specify via template parameter
497
- whether we know that the input key is static or not. If it is, we short
498
- circuit various comparisons and a no-op unref. */
499
- template <bool key_definitely_static>
500
- static grpc_mdelem md_from_slices(const grpc_slice& key,
501
- const grpc_slice& value) {
502
- // Ensure key is, in fact, static if we claimed it was.
503
- GPR_DEBUG_ASSERT(!key_definitely_static ||
504
- GRPC_IS_STATIC_METADATA_STRING(key));
505
- grpc_mdelem out = md_create<key_definitely_static>(key, value, nullptr);
506
- if (!key_definitely_static) {
507
- grpc_slice_unref_internal(key);
508
- }
509
- grpc_slice_unref_internal(value);
510
- return out;
511
- }
512
-
513
- grpc_mdelem grpc_mdelem_from_slices(const grpc_slice& key,
514
- const grpc_slice& value) {
515
- return md_from_slices</*key_definitely_static=*/false>(key, value);
516
- }
517
-
518
- grpc_mdelem grpc_mdelem_from_slices(const grpc_core::StaticMetadataSlice& key,
519
- const grpc_slice& value) {
520
- return md_from_slices</*key_definitely_static=*/true>(key, value);
521
- }
522
-
523
- grpc_mdelem grpc_mdelem_from_slices(
524
- const grpc_core::StaticMetadataSlice& key,
525
- const grpc_core::StaticMetadataSlice& value) {
526
- grpc_mdelem out = md_create_maybe_static<true, true>(key, value);
527
- return out;
528
- }
529
-
530
- grpc_mdelem grpc_mdelem_from_slices(
531
- const grpc_core::StaticMetadataSlice& key,
532
- const grpc_core::ManagedMemorySlice& value) {
533
- // TODO(arjunroy): We can save the unref if md_create_maybe_static ended up
534
- // creating a new interned metadata. But otherwise - we need this here.
535
- grpc_mdelem out = md_create_maybe_static<true>(key, value);
536
- grpc_slice_unref_internal(value);
537
- return out;
538
- }
539
-
540
- grpc_mdelem grpc_mdelem_from_slices(
541
- const grpc_core::ManagedMemorySlice& key,
542
- const grpc_core::ManagedMemorySlice& value) {
543
- grpc_mdelem out = md_create_maybe_static<false>(key, value);
544
- // TODO(arjunroy): We can save the unref if md_create_maybe_static ended up
545
- // creating a new interned metadata. But otherwise - we need this here.
546
- grpc_slice_unref_internal(key);
547
- grpc_slice_unref_internal(value);
548
- return out;
549
- }
550
-
551
- grpc_mdelem grpc_mdelem_from_grpc_metadata(grpc_metadata* metadata) {
552
- bool key_changed = false;
553
- grpc_slice key_slice =
554
- grpc_slice_maybe_static_intern(metadata->key, &key_changed);
555
- bool value_changed = false;
556
- grpc_slice* unref_slice = nullptr;
557
- grpc_slice value_slice =
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;
581
- }
582
-
583
- static void* get_user_data(UserData* user_data, void (*destroy_func)(void*)) {
584
- if (user_data->destroy_user_data.load(std::memory_order_acquire) ==
585
- destroy_func) {
586
- return user_data->data.load(std::memory_order_relaxed);
587
- } else {
588
- return nullptr;
589
- }
590
- }
591
-
592
- void* grpc_mdelem_get_user_data(grpc_mdelem md, void (*destroy_func)(void*)) {
593
- switch (GRPC_MDELEM_STORAGE(md)) {
594
- case GRPC_MDELEM_STORAGE_EXTERNAL:
595
- return nullptr;
596
- case GRPC_MDELEM_STORAGE_STATIC:
597
- return reinterpret_cast<void*>(
598
- grpc_static_mdelem_user_data
599
- [reinterpret_cast<grpc_core::StaticMetadata*>(
600
- GRPC_MDELEM_DATA(md)) -
601
- grpc_core::g_static_mdelem_table]);
602
- case GRPC_MDELEM_STORAGE_ALLOCATED: {
603
- auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
604
- return get_user_data(am->user_data(), destroy_func);
605
- }
606
- case GRPC_MDELEM_STORAGE_INTERNED: {
607
- auto* im = reinterpret_cast<InternedMetadata*> GRPC_MDELEM_DATA(md);
608
- return get_user_data(im->user_data(), destroy_func);
609
- }
610
- }
611
- GPR_UNREACHABLE_CODE(return nullptr);
612
- }
613
-
614
- static void* set_user_data(UserData* ud, void (*destroy_func)(void*),
615
- void* data) {
616
- GPR_ASSERT((data == nullptr) == (destroy_func == nullptr));
617
- grpc_core::ReleasableMutexLock lock(&ud->mu_user_data);
618
- if (ud->destroy_user_data.load(std::memory_order_relaxed)) {
619
- /* user data can only be set once */
620
- lock.Release();
621
- if (destroy_func != nullptr) {
622
- destroy_func(data);
623
- }
624
- return ud->data.load(std::memory_order_relaxed);
625
- }
626
- ud->data.store(data, std::memory_order_relaxed);
627
- ud->destroy_user_data.store(destroy_func, std::memory_order_release);
628
- return data;
629
- }
630
-
631
- void* grpc_mdelem_set_user_data(grpc_mdelem md, void (*destroy_func)(void*),
632
- void* data) {
633
- switch (GRPC_MDELEM_STORAGE(md)) {
634
- case GRPC_MDELEM_STORAGE_EXTERNAL:
635
- destroy_func(data);
636
- return nullptr;
637
- case GRPC_MDELEM_STORAGE_STATIC:
638
- destroy_func(data);
639
- return reinterpret_cast<void*>(
640
- grpc_static_mdelem_user_data
641
- [reinterpret_cast<grpc_core::StaticMetadata*>(
642
- GRPC_MDELEM_DATA(md)) -
643
- grpc_core::g_static_mdelem_table]);
644
- case GRPC_MDELEM_STORAGE_ALLOCATED: {
645
- auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
646
- return set_user_data(am->user_data(), destroy_func, data);
647
- }
648
- case GRPC_MDELEM_STORAGE_INTERNED: {
649
- auto* im = reinterpret_cast<InternedMetadata*> GRPC_MDELEM_DATA(md);
650
- GPR_DEBUG_ASSERT(!is_mdelem_static(md));
651
- return set_user_data(im->user_data(), destroy_func, data);
652
- }
653
- }
654
- GPR_UNREACHABLE_CODE(return nullptr);
655
- }
656
-
657
- bool grpc_mdelem_eq(grpc_mdelem a, grpc_mdelem b) {
658
- if (a.payload == b.payload) return true;
659
- if (GRPC_MDELEM_IS_INTERNED(a) && GRPC_MDELEM_IS_INTERNED(b)) return false;
660
- if (GRPC_MDISNULL(a) || GRPC_MDISNULL(b)) return false;
661
- return grpc_slice_eq(GRPC_MDKEY(a), GRPC_MDKEY(b)) &&
662
- grpc_slice_eq(GRPC_MDVALUE(a), GRPC_MDVALUE(b));
663
- }
664
-
665
- static void note_disposed_interned_metadata(uint32_t hash) {
666
- mdtab_shard* shard = &g_shards[SHARD_IDX(hash)];
667
- gpr_atm_no_barrier_fetch_add(&shard->free_estimate, 1);
668
- }
669
-
670
- void grpc_mdelem_do_unref(grpc_mdelem gmd DEBUG_ARGS) {
671
- switch (GRPC_MDELEM_STORAGE(gmd)) {
672
- case GRPC_MDELEM_STORAGE_EXTERNAL:
673
- case GRPC_MDELEM_STORAGE_STATIC:
674
- return;
675
- case GRPC_MDELEM_STORAGE_INTERNED: {
676
- auto* md = reinterpret_cast<InternedMetadata*> GRPC_MDELEM_DATA(gmd);
677
- uint32_t hash = md->hash();
678
- if (GPR_UNLIKELY(md->Unref(FWD_DEBUG_ARGS))) {
679
- /* once the refcount hits zero, some other thread can come along and
680
- free md at any time: it's unsafe from this point on to access it */
681
- note_disposed_interned_metadata(hash);
682
- }
683
- break;
684
- }
685
- case GRPC_MDELEM_STORAGE_ALLOCATED: {
686
- auto* md = reinterpret_cast<AllocatedMetadata*> GRPC_MDELEM_DATA(gmd);
687
- if (GPR_UNLIKELY(md->Unref(FWD_DEBUG_ARGS))) {
688
- delete md;
689
- }
690
- break;
691
- }
692
- }
693
- }
694
-
695
- void grpc_mdelem_on_final_unref(grpc_mdelem_data_storage storage, void* ptr,
696
- uint32_t hash DEBUG_ARGS) {
697
- #ifndef NDEBUG
698
- (void)file;
699
- (void)line;
700
- #endif
701
- switch (storage) {
702
- case GRPC_MDELEM_STORAGE_EXTERNAL:
703
- case GRPC_MDELEM_STORAGE_STATIC:
704
- return;
705
- case GRPC_MDELEM_STORAGE_INTERNED: {
706
- note_disposed_interned_metadata(hash);
707
- break;
708
- }
709
- case GRPC_MDELEM_STORAGE_ALLOCATED: {
710
- delete reinterpret_cast<AllocatedMetadata*>(ptr);
711
- break;
712
- }
713
- }
714
- }