grpc 1.42.0 → 1.43.1

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 (739) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +85 -34
  3. data/include/grpc/event_engine/event_engine.h +37 -13
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  5. data/include/grpc/event_engine/memory_allocator.h +27 -11
  6. data/include/grpc/event_engine/memory_request.h +57 -0
  7. data/include/grpc/grpc_security.h +276 -145
  8. data/include/grpc/grpc_security_constants.h +1 -14
  9. data/include/grpc/impl/codegen/port_platform.h +7 -3
  10. data/src/core/ext/filters/client_channel/backend_metric.cc +6 -7
  11. data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
  12. data/src/core/ext/filters/client_channel/client_channel.cc +81 -40
  13. data/src/core/ext/filters/client_channel/client_channel.h +5 -4
  14. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -2
  15. data/src/core/ext/filters/client_channel/dynamic_filters.cc +4 -4
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +12 -14
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +27 -80
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +82 -34
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +47 -91
  25. data/src/core/ext/filters/client_channel/lb_policy.h +75 -59
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -2
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +8 -12
  29. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -3
  30. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +6 -12
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +222 -294
  32. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -7
  33. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
  34. data/src/core/ext/filters/client_channel/subchannel.cc +4 -4
  35. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  36. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -30
  37. data/src/core/ext/filters/http/http_filters_plugin.cc +3 -5
  38. data/src/core/ext/filters/http/server/http_server_filter.cc +11 -28
  39. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
  40. data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
  41. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
  42. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +32 -0
  43. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -20
  44. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  45. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +8 -5
  46. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
  47. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -3
  48. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +54 -79
  49. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
  50. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
  51. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +53 -62
  53. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
  54. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  55. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  56. data/src/core/ext/transport/chttp2/transport/flow_control.cc +8 -8
  57. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
  58. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +83 -19
  59. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +33 -1
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +66 -92
  61. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  62. data/src/core/ext/transport/inproc/inproc_transport.cc +16 -7
  63. data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
  64. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
  65. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
  66. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
  67. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
  68. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
  69. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  70. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
  71. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
  72. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
  73. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
  76. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +253 -218
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +2 -0
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +162 -128
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +2 -0
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +89 -71
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +2 -0
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +117 -93
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +2 -0
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -43
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
  126. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
  127. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
  128. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
  129. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
  130. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
  131. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
  132. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +93 -75
  133. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +2 -0
  134. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
  135. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
  136. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +503 -440
  137. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2 -0
  138. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
  139. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
  140. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
  141. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
  142. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
  143. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
  144. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
  145. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
  146. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
  147. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
  148. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
  149. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
  151. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
  154. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
  155. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
  156. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
  157. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
  158. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
  159. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
  160. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
  161. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
  163. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
  164. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
  165. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
  166. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
  167. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
  168. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
  169. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
  170. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
  171. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
  172. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
  173. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
  174. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
  175. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
  176. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
  177. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
  178. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
  179. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
  180. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
  181. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
  182. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
  183. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
  184. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
  185. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
  186. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
  187. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
  188. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
  189. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
  190. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
  191. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
  192. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
  193. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
  194. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
  195. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
  196. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
  197. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
  198. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
  199. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
  200. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
  201. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
  202. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
  203. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
  204. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
  205. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
  206. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
  207. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
  208. data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
  209. data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
  210. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
  211. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
  212. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
  213. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
  214. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
  215. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
  216. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
  217. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
  218. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
  219. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
  220. data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
  221. data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
  222. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
  223. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
  224. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
  225. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
  226. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
  227. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
  228. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
  229. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
  230. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
  231. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
  232. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
  233. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
  234. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
  235. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
  236. data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
  237. data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
  238. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
  239. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
  240. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
  244. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
  245. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
  246. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
  247. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
  248. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +26 -13
  249. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +2 -0
  250. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
  251. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
  252. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -3
  253. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  254. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
  255. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
  256. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
  257. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
  258. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
  259. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  260. data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
  261. data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
  262. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +54 -9
  263. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +17 -0
  264. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +13 -2
  265. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
  266. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +24 -12
  267. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
  268. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +19 -7
  269. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
  270. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +18 -7
  271. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
  272. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +27 -15
  273. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
  274. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +18 -7
  275. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
  276. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +28 -15
  277. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +2 -0
  278. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +16 -5
  279. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +2 -0
  280. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
  281. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
  282. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
  283. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
  284. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
  285. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
  286. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +2 -55
  287. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
  288. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
  289. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
  290. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
  291. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +2 -53
  292. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
  293. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
  294. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
  295. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
  296. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +2 -21
  297. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
  298. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +2 -33
  299. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
  300. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
  301. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
  302. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
  303. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
  304. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
  305. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +2 -17
  306. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
  307. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
  308. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
  309. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
  310. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
  311. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
  312. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
  313. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
  314. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
  315. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +2 -111
  316. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
  317. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
  318. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
  319. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
  320. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
  321. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
  322. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
  323. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
  324. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
  325. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
  326. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
  327. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
  328. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
  329. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
  330. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
  331. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
  332. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
  333. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
  334. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
  335. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
  336. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
  337. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
  338. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
  339. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
  340. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
  341. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
  342. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
  343. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
  344. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
  345. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
  346. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
  347. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
  348. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
  349. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
  350. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
  351. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
  352. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
  353. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
  354. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
  355. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
  356. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
  357. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
  358. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
  359. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
  360. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
  361. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +2 -11
  362. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +2 -7
  363. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +2 -2
  364. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +2 -7
  365. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +2 -7
  366. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
  367. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +2 -13
  368. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +2 -7
  369. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +2 -9
  370. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +2 -9
  371. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +2 -7
  372. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +2 -9
  373. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +2 -7
  374. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +2 -7
  375. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  376. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  377. data/src/core/ext/xds/xds_api.cc +409 -304
  378. data/src/core/ext/xds/xds_api.h +3 -1
  379. data/src/core/ext/xds/xds_bootstrap.cc +6 -3
  380. data/src/core/ext/xds/xds_certificate_provider.h +1 -2
  381. data/src/core/ext/xds/xds_channel_stack_modifier.cc +3 -4
  382. data/src/core/ext/xds/xds_client.cc +395 -291
  383. data/src/core/ext/xds/xds_client.h +47 -38
  384. data/src/core/ext/xds/xds_routing.cc +247 -0
  385. data/src/core/ext/xds/xds_routing.h +98 -0
  386. data/src/core/ext/xds/xds_server_config_fetcher.cc +975 -261
  387. data/src/core/lib/avl/avl.h +389 -88
  388. data/src/core/lib/backoff/backoff.cc +2 -2
  389. data/src/core/lib/channel/channel_args.cc +17 -17
  390. data/src/core/lib/channel/channel_args.h +11 -10
  391. data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
  392. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  393. data/src/core/lib/channel/channel_stack_builder.cc +0 -2
  394. data/src/core/lib/channel/channel_trace.cc +6 -6
  395. data/src/core/lib/channel/channelz.cc +1 -1
  396. data/src/core/lib/compression/compression_args.cc +7 -5
  397. data/src/core/lib/compression/compression_args.h +6 -4
  398. data/src/core/lib/config/core_configuration.cc +3 -1
  399. data/src/core/lib/config/core_configuration.h +11 -0
  400. data/src/core/lib/debug/trace.h +2 -2
  401. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  402. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  403. data/src/core/lib/event_engine/event_engine.cc +0 -13
  404. data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
  405. data/src/core/lib/event_engine/event_engine_factory.h +33 -0
  406. data/src/core/lib/event_engine/memory_allocator.cc +70 -0
  407. data/src/core/lib/gpr/tls.h +6 -0
  408. data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
  409. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  410. data/src/core/lib/gprpp/global_config_env.h +2 -2
  411. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  412. data/src/core/lib/gprpp/orphanable.h +1 -1
  413. data/src/core/lib/gprpp/ref_counted.h +1 -1
  414. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  415. data/src/core/lib/gprpp/status_helper.h +1 -1
  416. data/src/core/lib/gprpp/table.h +13 -1
  417. data/src/core/lib/http/httpcli.cc +30 -26
  418. data/src/core/lib/http/httpcli.h +14 -12
  419. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  420. data/src/core/lib/iomgr/buffer_list.h +13 -13
  421. data/src/core/lib/iomgr/call_combiner.cc +2 -3
  422. data/src/core/lib/iomgr/endpoint.h +0 -1
  423. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
  424. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  425. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  426. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  427. data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
  428. data/src/core/lib/iomgr/event_engine/iomgr.cc +5 -25
  429. data/src/core/lib/iomgr/event_engine/resolver.cc +3 -2
  430. data/src/core/lib/iomgr/event_engine/tcp.cc +7 -5
  431. data/src/core/lib/iomgr/event_engine/timer.cc +4 -3
  432. data/src/core/lib/iomgr/exec_ctx.h +11 -11
  433. data/src/core/lib/iomgr/executor.cc +12 -15
  434. data/src/core/lib/iomgr/executor.h +1 -1
  435. data/src/core/lib/iomgr/tcp_client.cc +2 -4
  436. data/src/core/lib/iomgr/tcp_client.h +1 -3
  437. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -9
  438. data/src/core/lib/iomgr/tcp_client_custom.cc +4 -10
  439. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -23
  440. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  441. data/src/core/lib/iomgr/tcp_client_windows.cc +1 -10
  442. data/src/core/lib/iomgr/tcp_custom.cc +9 -36
  443. data/src/core/lib/iomgr/tcp_custom.h +0 -1
  444. data/src/core/lib/iomgr/tcp_posix.cc +28 -33
  445. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  446. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  447. data/src/core/lib/iomgr/tcp_server.h +6 -8
  448. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -15
  449. data/src/core/lib/iomgr/tcp_server_posix.cc +18 -22
  450. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  451. data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
  452. data/src/core/lib/iomgr/tcp_windows.cc +2 -7
  453. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  454. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  455. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  456. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
  457. data/src/core/lib/iomgr/work_serializer.cc +115 -44
  458. data/src/core/lib/iomgr/work_serializer.h +16 -4
  459. data/src/core/lib/json/json_reader.cc +83 -35
  460. data/src/core/lib/json/json_util.cc +1 -1
  461. data/src/core/lib/promise/activity.cc +115 -0
  462. data/src/core/lib/promise/activity.h +499 -0
  463. data/src/core/lib/promise/context.h +86 -0
  464. data/src/core/lib/promise/detail/basic_seq.h +407 -0
  465. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  466. data/src/core/lib/promise/detail/promise_like.h +85 -0
  467. data/src/core/lib/promise/detail/status.h +44 -0
  468. data/src/core/lib/promise/detail/switch.h +1455 -0
  469. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  470. data/src/core/lib/promise/loop.h +108 -0
  471. data/src/core/lib/promise/map.h +88 -0
  472. data/src/core/lib/promise/poll.h +60 -0
  473. data/src/core/lib/promise/race.h +84 -0
  474. data/src/core/lib/promise/seq.h +71 -0
  475. data/src/core/lib/resource_quota/api.cc +108 -0
  476. data/src/core/lib/resource_quota/api.h +41 -0
  477. data/src/core/lib/resource_quota/memory_quota.cc +454 -0
  478. data/src/core/lib/resource_quota/memory_quota.h +421 -0
  479. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  480. data/src/core/lib/resource_quota/resource_quota.h +58 -0
  481. data/src/core/lib/resource_quota/thread_quota.cc +43 -0
  482. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  483. data/src/core/lib/resource_quota/trace.cc +19 -0
  484. data/src/core/lib/resource_quota/trace.h +24 -0
  485. data/src/core/lib/security/authorization/evaluate_args.cc +13 -19
  486. data/src/core/lib/security/authorization/evaluate_args.h +2 -1
  487. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +3 -1
  488. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +11 -12
  489. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -10
  490. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +3 -4
  491. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -6
  492. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  493. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +4 -6
  494. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +18 -22
  495. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  496. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
  497. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
  498. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
  499. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
  500. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +19 -82
  501. data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
  502. data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
  503. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
  504. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
  505. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +3 -4
  506. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  507. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
  508. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  509. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
  510. data/src/core/lib/security/security_connector/ssl_utils.cc +10 -2
  511. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  512. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +344 -195
  513. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -41
  514. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  515. data/src/core/lib/slice/percent_encoding.cc +30 -86
  516. data/src/core/lib/slice/percent_encoding.h +5 -11
  517. data/src/core/lib/slice/slice.cc +7 -7
  518. data/src/core/lib/slice/slice.h +341 -0
  519. data/src/core/lib/slice/slice_buffer.cc +4 -0
  520. data/src/core/lib/slice/slice_intern.cc +1 -1
  521. data/src/core/lib/slice/slice_refcount.h +5 -1
  522. data/src/core/lib/slice/slice_refcount_base.h +19 -11
  523. data/src/core/lib/slice/static_slice.cc +331 -483
  524. data/src/core/lib/slice/static_slice.h +101 -132
  525. data/src/core/lib/surface/builtins.cc +1 -1
  526. data/src/core/lib/surface/call.cc +85 -59
  527. data/src/core/lib/surface/channel.cc +4 -29
  528. data/src/core/lib/surface/channel.h +2 -12
  529. data/src/core/lib/surface/completion_queue.cc +2 -2
  530. data/src/core/lib/surface/init.cc +0 -1
  531. data/src/core/lib/surface/lame_client.cc +24 -17
  532. data/src/core/lib/surface/server.cc +22 -22
  533. data/src/core/lib/surface/server.h +8 -9
  534. data/src/core/lib/surface/validate_metadata.cc +2 -2
  535. data/src/core/lib/surface/version.cc +2 -2
  536. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  537. data/src/core/lib/transport/byte_stream.cc +4 -0
  538. data/src/core/lib/transport/metadata.h +4 -4
  539. data/src/core/lib/transport/metadata_batch.cc +5 -0
  540. data/src/core/lib/transport/metadata_batch.h +174 -99
  541. data/src/core/lib/transport/parsed_metadata.cc +35 -0
  542. data/src/core/lib/transport/parsed_metadata.h +180 -61
  543. data/src/core/lib/transport/pid_controller.cc +4 -4
  544. data/src/core/lib/transport/static_metadata.cc +529 -614
  545. data/src/core/lib/transport/static_metadata.h +0 -18
  546. data/src/core/lib/transport/transport.cc +4 -26
  547. data/src/core/lib/transport/transport.h +0 -1
  548. data/src/core/lib/transport/transport_op_string.cc +1 -1
  549. data/src/core/lib/uri/uri_parser.cc +19 -19
  550. data/src/core/lib/uri/uri_parser.h +2 -0
  551. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -2
  552. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  553. data/src/core/tsi/local_transport_security.cc +15 -15
  554. data/src/core/tsi/ssl_transport_security.cc +30 -1
  555. data/src/core/tsi/ssl_transport_security.h +1 -0
  556. data/src/ruby/ext/grpc/extconf.rb +1 -1
  557. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -10
  558. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +9 -15
  559. data/src/ruby/lib/grpc/version.rb +1 -1
  560. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  561. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  562. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  563. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  564. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  565. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  566. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  567. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  568. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  569. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  570. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  571. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  572. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  573. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  574. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  575. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  576. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  577. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  578. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  579. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  580. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  581. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  582. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  583. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  584. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  585. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  586. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  587. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  588. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  589. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  590. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  591. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  592. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  593. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  594. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  595. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  596. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  597. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  598. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  599. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  600. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  601. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  602. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  603. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  604. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  605. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  606. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  607. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  608. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  609. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  610. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  611. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  612. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  613. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  614. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  615. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  616. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  617. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  618. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  619. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  620. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  621. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  622. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  623. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  624. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  625. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  626. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  627. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  628. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  629. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  630. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  631. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  632. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  633. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  634. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  635. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  636. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  637. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  638. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  639. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  640. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  641. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  642. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  643. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  644. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  645. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  646. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  647. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  648. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  649. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  650. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  651. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  652. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  653. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  654. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  655. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  656. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  657. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  658. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  659. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  660. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  661. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  662. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  663. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  664. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  665. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  666. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  667. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  668. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  669. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  670. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  671. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  672. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  673. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  674. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  675. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  676. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  677. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  678. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  679. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  680. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  681. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  682. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  683. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  684. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  685. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  686. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  687. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  688. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  689. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  690. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  691. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  692. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  693. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  694. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  696. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  697. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  698. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  699. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  701. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  702. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  703. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  704. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  705. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  706. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
  707. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  708. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  709. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  710. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +3 -9
  711. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  712. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  713. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +6 -9
  714. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  715. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  716. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  717. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  718. data/third_party/upb/upb/decode.c +309 -178
  719. data/third_party/upb/upb/decode_fast.c +1 -1
  720. data/third_party/upb/upb/decode_internal.h +1 -0
  721. data/third_party/upb/upb/def.c +330 -85
  722. data/third_party/upb/upb/def.h +45 -14
  723. data/third_party/upb/upb/def.hpp +17 -4
  724. data/third_party/upb/upb/encode.c +100 -40
  725. data/third_party/upb/upb/msg.c +22 -9
  726. data/third_party/upb/upb/msg_internal.h +90 -8
  727. data/third_party/upb/upb/reflection.c +98 -58
  728. data/third_party/upb/upb/reflection.h +6 -2
  729. data/third_party/upb/upb/text_encode.c +3 -3
  730. data/third_party/upb/upb/upb.c +8 -0
  731. metadata +116 -56
  732. data/src/core/lib/avl/avl.cc +0 -306
  733. data/src/core/lib/gprpp/match.h +0 -73
  734. data/src/core/lib/gprpp/overload.h +0 -59
  735. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  736. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  737. data/src/core/lib/iomgr/resource_quota.h +0 -226
  738. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  739. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
@@ -87,6 +87,17 @@
87
87
  //
88
88
  // This probing function guarantees that after N probes, all the groups of the
89
89
  // table will be probed exactly once.
90
+ //
91
+ // The control state and slot array are stored contiguously in a shared heap
92
+ // allocation. The layout of this allocation is: `capacity()` control bytes,
93
+ // one sentinel control byte, `Group::kWidth - 1` cloned control bytes,
94
+ // <possible padding>, `capacity()` slots. The sentinel control byte is used in
95
+ // iteration so we know when we reach the end of the table. The cloned control
96
+ // bytes at the end of the table are cloned from the beginning of the table so
97
+ // groups that begin near the end of the table can see a full group. In cases in
98
+ // which there are more than `capacity()` cloned control bytes, the extra bytes
99
+ // are `kEmpty`, and these ensure that we always see at least one empty slot and
100
+ // can stop an unsuccessful search.
90
101
 
91
102
  #ifndef ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_
92
103
  #define ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_
@@ -112,7 +123,6 @@
112
123
  #include "absl/container/internal/hashtable_debug_hooks.h"
113
124
  #include "absl/container/internal/hashtablez_sampler.h"
114
125
  #include "absl/container/internal/have_sse.h"
115
- #include "absl/container/internal/layout.h"
116
126
  #include "absl/memory/memory.h"
117
127
  #include "absl/meta/type_traits.h"
118
128
  #include "absl/numeric/bits.h"
@@ -252,48 +262,53 @@ class BitMask {
252
262
  T mask_;
253
263
  };
254
264
 
255
- using ctrl_t = signed char;
256
265
  using h2_t = uint8_t;
257
266
 
258
267
  // The values here are selected for maximum performance. See the static asserts
259
- // below for details.
260
- enum Ctrl : ctrl_t {
268
+ // below for details. We use an enum class so that when strict aliasing is
269
+ // enabled, the compiler knows ctrl_t doesn't alias other types.
270
+ enum class ctrl_t : int8_t {
261
271
  kEmpty = -128, // 0b10000000
262
272
  kDeleted = -2, // 0b11111110
263
273
  kSentinel = -1, // 0b11111111
264
274
  };
265
275
  static_assert(
266
- kEmpty & kDeleted & kSentinel & 0x80,
276
+ (static_cast<int8_t>(ctrl_t::kEmpty) &
277
+ static_cast<int8_t>(ctrl_t::kDeleted) &
278
+ static_cast<int8_t>(ctrl_t::kSentinel) & 0x80) != 0,
267
279
  "Special markers need to have the MSB to make checking for them efficient");
268
- static_assert(kEmpty < kSentinel && kDeleted < kSentinel,
269
- "kEmpty and kDeleted must be smaller than kSentinel to make the "
270
- "SIMD test of IsEmptyOrDeleted() efficient");
271
- static_assert(kSentinel == -1,
272
- "kSentinel must be -1 to elide loading it from memory into SIMD "
273
- "registers (pcmpeqd xmm, xmm)");
274
- static_assert(kEmpty == -128,
275
- "kEmpty must be -128 to make the SIMD check for its "
280
+ static_assert(
281
+ ctrl_t::kEmpty < ctrl_t::kSentinel && ctrl_t::kDeleted < ctrl_t::kSentinel,
282
+ "ctrl_t::kEmpty and ctrl_t::kDeleted must be smaller than "
283
+ "ctrl_t::kSentinel to make the SIMD test of IsEmptyOrDeleted() efficient");
284
+ static_assert(
285
+ ctrl_t::kSentinel == static_cast<ctrl_t>(-1),
286
+ "ctrl_t::kSentinel must be -1 to elide loading it from memory into SIMD "
287
+ "registers (pcmpeqd xmm, xmm)");
288
+ static_assert(ctrl_t::kEmpty == static_cast<ctrl_t>(-128),
289
+ "ctrl_t::kEmpty must be -128 to make the SIMD check for its "
276
290
  "existence efficient (psignb xmm, xmm)");
277
- static_assert(~kEmpty & ~kDeleted & kSentinel & 0x7F,
278
- "kEmpty and kDeleted must share an unset bit that is not shared "
279
- "by kSentinel to make the scalar test for MatchEmptyOrDeleted() "
280
- "efficient");
281
- static_assert(kDeleted == -2,
282
- "kDeleted must be -2 to make the implementation of "
291
+ static_assert(
292
+ (~static_cast<int8_t>(ctrl_t::kEmpty) &
293
+ ~static_cast<int8_t>(ctrl_t::kDeleted) &
294
+ static_cast<int8_t>(ctrl_t::kSentinel) & 0x7F) != 0,
295
+ "ctrl_t::kEmpty and ctrl_t::kDeleted must share an unset bit that is not "
296
+ "shared by ctrl_t::kSentinel to make the scalar test for "
297
+ "MatchEmptyOrDeleted() efficient");
298
+ static_assert(ctrl_t::kDeleted == static_cast<ctrl_t>(-2),
299
+ "ctrl_t::kDeleted must be -2 to make the implementation of "
283
300
  "ConvertSpecialToEmptyAndFullToDeleted efficient");
284
301
 
285
302
  // A single block of empty control bytes for tables without any slots allocated.
286
303
  // This enables removing a branch in the hot path of find().
304
+ ABSL_DLL extern const ctrl_t kEmptyGroup[16];
287
305
  inline ctrl_t* EmptyGroup() {
288
- alignas(16) static constexpr ctrl_t empty_group[] = {
289
- kSentinel, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty,
290
- kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty};
291
- return const_cast<ctrl_t*>(empty_group);
306
+ return const_cast<ctrl_t*>(kEmptyGroup);
292
307
  }
293
308
 
294
309
  // Mixes a randomly generated per-process seed with `hash` and `ctrl` to
295
310
  // randomize insertion order within groups.
296
- bool ShouldInsertBackwards(size_t hash, ctrl_t* ctrl);
311
+ bool ShouldInsertBackwards(size_t hash, const ctrl_t* ctrl);
297
312
 
298
313
  // Returns a hash seed.
299
314
  //
@@ -309,12 +324,12 @@ inline size_t HashSeed(const ctrl_t* ctrl) {
309
324
  inline size_t H1(size_t hash, const ctrl_t* ctrl) {
310
325
  return (hash >> 7) ^ HashSeed(ctrl);
311
326
  }
312
- inline ctrl_t H2(size_t hash) { return hash & 0x7F; }
327
+ inline h2_t H2(size_t hash) { return hash & 0x7F; }
313
328
 
314
- inline bool IsEmpty(ctrl_t c) { return c == kEmpty; }
315
- inline bool IsFull(ctrl_t c) { return c >= 0; }
316
- inline bool IsDeleted(ctrl_t c) { return c == kDeleted; }
317
- inline bool IsEmptyOrDeleted(ctrl_t c) { return c < kSentinel; }
329
+ inline bool IsEmpty(ctrl_t c) { return c == ctrl_t::kEmpty; }
330
+ inline bool IsFull(ctrl_t c) { return c >= static_cast<ctrl_t>(0); }
331
+ inline bool IsDeleted(ctrl_t c) { return c == ctrl_t::kDeleted; }
332
+ inline bool IsEmptyOrDeleted(ctrl_t c) { return c < ctrl_t::kSentinel; }
318
333
 
319
334
  #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSE2
320
335
 
@@ -351,24 +366,24 @@ struct GroupSse2Impl {
351
366
  // Returns a bitmask representing the positions of empty slots.
352
367
  BitMask<uint32_t, kWidth> MatchEmpty() const {
353
368
  #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSSE3
354
- // This only works because kEmpty is -128.
369
+ // This only works because ctrl_t::kEmpty is -128.
355
370
  return BitMask<uint32_t, kWidth>(
356
371
  _mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl)));
357
372
  #else
358
- return Match(static_cast<h2_t>(kEmpty));
373
+ return Match(static_cast<h2_t>(ctrl_t::kEmpty));
359
374
  #endif
360
375
  }
361
376
 
362
377
  // Returns a bitmask representing the positions of empty or deleted slots.
363
378
  BitMask<uint32_t, kWidth> MatchEmptyOrDeleted() const {
364
- auto special = _mm_set1_epi8(kSentinel);
379
+ auto special = _mm_set1_epi8(static_cast<int8_t>(ctrl_t::kSentinel));
365
380
  return BitMask<uint32_t, kWidth>(
366
381
  _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)));
367
382
  }
368
383
 
369
384
  // Returns the number of trailing empty or deleted elements in the group.
370
385
  uint32_t CountLeadingEmptyOrDeleted() const {
371
- auto special = _mm_set1_epi8(kSentinel);
386
+ auto special = _mm_set1_epi8(static_cast<int8_t>(ctrl_t::kSentinel));
372
387
  return TrailingZeros(static_cast<uint32_t>(
373
388
  _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)) + 1));
374
389
  }
@@ -403,7 +418,7 @@ struct GroupPortableImpl {
403
418
  //
404
419
  // Caveat: there are false positives but:
405
420
  // - they only occur if there is a real match
406
- // - they never occur on kEmpty, kDeleted, kSentinel
421
+ // - they never occur on ctrl_t::kEmpty, ctrl_t::kDeleted, ctrl_t::kSentinel
407
422
  // - they will be handled gracefully by subsequent checks in code
408
423
  //
409
424
  // Example:
@@ -448,6 +463,10 @@ using Group = GroupSse2Impl;
448
463
  using Group = GroupPortableImpl;
449
464
  #endif
450
465
 
466
+ // The number of cloned control bytes that we copy from the beginning to the
467
+ // end of the control bytes array.
468
+ constexpr size_t NumClonedBytes() { return Group::kWidth - 1; }
469
+
451
470
  template <class Policy, class Hash, class Eq, class Alloc>
452
471
  class raw_hash_set;
453
472
 
@@ -455,8 +474,8 @@ inline bool IsValidCapacity(size_t n) { return ((n + 1) & n) == 0 && n > 0; }
455
474
 
456
475
  // PRECONDITION:
457
476
  // IsValidCapacity(capacity)
458
- // ctrl[capacity] == kSentinel
459
- // ctrl[i] != kSentinel for all i < capacity
477
+ // ctrl[capacity] == ctrl_t::kSentinel
478
+ // ctrl[i] != ctrl_t::kSentinel for all i < capacity
460
479
  // Applies mapping for every byte in ctrl:
461
480
  // DELETED -> EMPTY
462
481
  // EMPTY -> EMPTY
@@ -498,6 +517,22 @@ inline size_t GrowthToLowerboundCapacity(size_t growth) {
498
517
  return growth + static_cast<size_t>((static_cast<int64_t>(growth) - 1) / 7);
499
518
  }
500
519
 
520
+ template <class InputIter>
521
+ size_t SelectBucketCountForIterRange(InputIter first, InputIter last,
522
+ size_t bucket_count) {
523
+ if (bucket_count != 0) {
524
+ return bucket_count;
525
+ }
526
+ using InputIterCategory =
527
+ typename std::iterator_traits<InputIter>::iterator_category;
528
+ if (std::is_base_of<std::random_access_iterator_tag,
529
+ InputIterCategory>::value) {
530
+ return GrowthToLowerboundCapacity(
531
+ static_cast<size_t>(std::distance(first, last)));
532
+ }
533
+ return 0;
534
+ }
535
+
501
536
  inline void AssertIsFull(ctrl_t* ctrl) {
502
537
  ABSL_HARDENING_ASSERT((ctrl != nullptr && IsFull(*ctrl)) &&
503
538
  "Invalid operation on iterator. The element might have "
@@ -525,27 +560,29 @@ struct FindInfo {
525
560
  // This is important to make 1 a valid capacity.
526
561
  //
527
562
  // - In small mode only the first `capacity()` control bytes after the
528
- // sentinel are valid. The rest contain dummy kEmpty values that do not
563
+ // sentinel are valid. The rest contain dummy ctrl_t::kEmpty values that do not
529
564
  // represent a real slot. This is important to take into account on
530
565
  // find_first_non_full(), where we never try ShouldInsertBackwards() for
531
566
  // small tables.
532
567
  inline bool is_small(size_t capacity) { return capacity < Group::kWidth - 1; }
533
568
 
534
- inline probe_seq<Group::kWidth> probe(ctrl_t* ctrl, size_t hash,
569
+ inline probe_seq<Group::kWidth> probe(const ctrl_t* ctrl, size_t hash,
535
570
  size_t capacity) {
536
571
  return probe_seq<Group::kWidth>(H1(hash, ctrl), capacity);
537
572
  }
538
573
 
539
574
  // Probes the raw_hash_set with the probe sequence for hash and returns the
540
575
  // pointer to the first empty or deleted slot.
541
- // NOTE: this function must work with tables having both kEmpty and kDelete
542
- // in one group. Such tables appears during drop_deletes_without_resize.
576
+ // NOTE: this function must work with tables having both ctrl_t::kEmpty and
577
+ // ctrl_t::kDeleted in one group. Such tables appears during
578
+ // drop_deletes_without_resize.
543
579
  //
544
580
  // This function is very useful when insertions happen and:
545
581
  // - the input is already a set
546
582
  // - there are enough slots
547
583
  // - the element with the hash is not in the table
548
- inline FindInfo find_first_non_full(ctrl_t* ctrl, size_t hash,
584
+ template <typename = void>
585
+ inline FindInfo find_first_non_full(const ctrl_t* ctrl, size_t hash,
549
586
  size_t capacity) {
550
587
  auto seq = probe(ctrl, hash, capacity);
551
588
  while (true) {
@@ -564,8 +601,58 @@ inline FindInfo find_first_non_full(ctrl_t* ctrl, size_t hash,
564
601
  return {seq.offset(mask.LowestBitSet()), seq.index()};
565
602
  }
566
603
  seq.next();
567
- assert(seq.index() < capacity && "full table!");
604
+ assert(seq.index() <= capacity && "full table!");
605
+ }
606
+ }
607
+
608
+ // Extern template for inline function keep possibility of inlining.
609
+ // When compiler decided to not inline, no symbols will be added to the
610
+ // corresponding translation unit.
611
+ extern template FindInfo find_first_non_full(const ctrl_t*, size_t, size_t);
612
+
613
+ // Reset all ctrl bytes back to ctrl_t::kEmpty, except the sentinel.
614
+ inline void ResetCtrl(size_t capacity, ctrl_t* ctrl, const void* slot,
615
+ size_t slot_size) {
616
+ std::memset(ctrl, static_cast<int8_t>(ctrl_t::kEmpty),
617
+ capacity + 1 + NumClonedBytes());
618
+ ctrl[capacity] = ctrl_t::kSentinel;
619
+ SanitizerPoisonMemoryRegion(slot, slot_size * capacity);
620
+ }
621
+
622
+ // Sets the control byte, and if `i < NumClonedBytes()`, set the cloned byte
623
+ // at the end too.
624
+ inline void SetCtrl(size_t i, ctrl_t h, size_t capacity, ctrl_t* ctrl,
625
+ const void* slot, size_t slot_size) {
626
+ assert(i < capacity);
627
+
628
+ auto* slot_i = static_cast<const char*>(slot) + i * slot_size;
629
+ if (IsFull(h)) {
630
+ SanitizerUnpoisonMemoryRegion(slot_i, slot_size);
631
+ } else {
632
+ SanitizerPoisonMemoryRegion(slot_i, slot_size);
568
633
  }
634
+
635
+ ctrl[i] = h;
636
+ ctrl[((i - NumClonedBytes()) & capacity) + (NumClonedBytes() & capacity)] = h;
637
+ }
638
+
639
+ inline void SetCtrl(size_t i, h2_t h, size_t capacity, ctrl_t* ctrl,
640
+ const void* slot, size_t slot_size) {
641
+ SetCtrl(i, static_cast<ctrl_t>(h), capacity, ctrl, slot, slot_size);
642
+ }
643
+
644
+ // The allocated block consists of `capacity + 1 + NumClonedBytes()` control
645
+ // bytes followed by `capacity` slots, which must be aligned to `slot_align`.
646
+ // SlotOffset returns the offset of the slots into the allocated block.
647
+ inline size_t SlotOffset(size_t capacity, size_t slot_align) {
648
+ assert(IsValidCapacity(capacity));
649
+ const size_t num_control_bytes = capacity + 1 + NumClonedBytes();
650
+ return (num_control_bytes + slot_align - 1) & (~slot_align + 1);
651
+ }
652
+
653
+ // Returns the size of the allocated block. See also above comment.
654
+ inline size_t AllocSize(size_t capacity, size_t slot_size, size_t slot_align) {
655
+ return SlotOffset(capacity, slot_align) + capacity * slot_size;
569
656
  }
570
657
 
571
658
  // Policy: a policy defines how to perform different operations on
@@ -624,13 +711,6 @@ class raw_hash_set {
624
711
  auto KeyTypeCanBeHashed(const Hash& h, const key_type& k) -> decltype(h(k));
625
712
  auto KeyTypeCanBeEq(const Eq& eq, const key_type& k) -> decltype(eq(k, k));
626
713
 
627
- using Layout = absl::container_internal::Layout<ctrl_t, slot_type>;
628
-
629
- static Layout MakeLayout(size_t capacity) {
630
- assert(IsValidCapacity(capacity));
631
- return Layout(capacity + Group::kWidth + 1, capacity);
632
- }
633
-
634
714
  using AllocTraits = absl::allocator_traits<allocator_type>;
635
715
  using SlotAlloc = typename absl::allocator_traits<
636
716
  allocator_type>::template rebind_alloc<slot_type>;
@@ -733,7 +813,7 @@ class raw_hash_set {
733
813
  ctrl_ += shift;
734
814
  slot_ += shift;
735
815
  }
736
- if (ABSL_PREDICT_FALSE(*ctrl_ == kSentinel)) ctrl_ = nullptr;
816
+ if (ABSL_PREDICT_FALSE(*ctrl_ == ctrl_t::kSentinel)) ctrl_ = nullptr;
737
817
  }
738
818
 
739
819
  ctrl_t* ctrl_ = nullptr;
@@ -814,7 +894,8 @@ class raw_hash_set {
814
894
  raw_hash_set(InputIter first, InputIter last, size_t bucket_count = 0,
815
895
  const hasher& hash = hasher(), const key_equal& eq = key_equal(),
816
896
  const allocator_type& alloc = allocator_type())
817
- : raw_hash_set(bucket_count, hash, eq, alloc) {
897
+ : raw_hash_set(SelectBucketCountForIterRange(first, last, bucket_count),
898
+ hash, eq, alloc) {
818
899
  insert(first, last);
819
900
  }
820
901
 
@@ -902,7 +983,8 @@ class raw_hash_set {
902
983
  for (const auto& v : that) {
903
984
  const size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, v);
904
985
  auto target = find_first_non_full(ctrl_, hash, capacity_);
905
- set_ctrl(target.offset, H2(hash));
986
+ SetCtrl(target.offset, H2(hash), capacity_, ctrl_, slots_,
987
+ sizeof(slot_type));
906
988
  emplace_at(target.offset, v);
907
989
  infoz().RecordInsert(hash, target.probe_length);
908
990
  }
@@ -998,6 +1080,8 @@ class raw_hash_set {
998
1080
  // past that we simply deallocate the array.
999
1081
  if (capacity_ > 127) {
1000
1082
  destroy_slots();
1083
+
1084
+ infoz().RecordClearedReservation();
1001
1085
  } else if (capacity_) {
1002
1086
  for (size_t i = 0; i != capacity_; ++i) {
1003
1087
  if (IsFull(ctrl_[i])) {
@@ -1005,7 +1089,7 @@ class raw_hash_set {
1005
1089
  }
1006
1090
  }
1007
1091
  size_ = 0;
1008
- reset_ctrl();
1092
+ ResetCtrl(capacity_, ctrl_, slots_, sizeof(slot_type));
1009
1093
  reset_growth_left();
1010
1094
  }
1011
1095
  assert(empty());
@@ -1311,21 +1395,31 @@ class raw_hash_set {
1311
1395
  if (n == 0 && size_ == 0) {
1312
1396
  destroy_slots();
1313
1397
  infoz().RecordStorageChanged(0, 0);
1398
+ infoz().RecordClearedReservation();
1314
1399
  return;
1315
1400
  }
1401
+
1316
1402
  // bitor is a faster way of doing `max` here. We will round up to the next
1317
1403
  // power-of-2-minus-1, so bitor is good enough.
1318
1404
  auto m = NormalizeCapacity(n | GrowthToLowerboundCapacity(size()));
1319
1405
  // n == 0 unconditionally rehashes as per the standard.
1320
1406
  if (n == 0 || m > capacity_) {
1321
1407
  resize(m);
1408
+
1409
+ // This is after resize, to ensure that we have completed the allocation
1410
+ // and have potentially sampled the hashtable.
1411
+ infoz().RecordReservation(n);
1322
1412
  }
1323
1413
  }
1324
1414
 
1325
1415
  void reserve(size_t n) {
1326
- size_t m = GrowthToLowerboundCapacity(n);
1327
- if (m > capacity_) {
1416
+ if (n > size() + growth_left()) {
1417
+ size_t m = GrowthToLowerboundCapacity(n);
1328
1418
  resize(NormalizeCapacity(m));
1419
+
1420
+ // This is after resize, to ensure that we have completed the allocation
1421
+ // and have potentially sampled the hashtable.
1422
+ infoz().RecordReservation(n);
1329
1423
  }
1330
1424
  }
1331
1425
 
@@ -1352,6 +1446,7 @@ class raw_hash_set {
1352
1446
  void prefetch(const key_arg<K>& key) const {
1353
1447
  (void)key;
1354
1448
  #if defined(__GNUC__)
1449
+ prefetch_heap_block();
1355
1450
  auto seq = probe(ctrl_, hash_ref()(key), capacity_);
1356
1451
  __builtin_prefetch(static_cast<const void*>(ctrl_ + seq.offset()));
1357
1452
  __builtin_prefetch(static_cast<const void*>(slots_ + seq.offset()));
@@ -1378,11 +1473,12 @@ class raw_hash_set {
1378
1473
  }
1379
1474
  if (ABSL_PREDICT_TRUE(g.MatchEmpty())) return end();
1380
1475
  seq.next();
1381
- assert(seq.index() < capacity_ && "full table!");
1476
+ assert(seq.index() <= capacity_ && "full table!");
1382
1477
  }
1383
1478
  }
1384
1479
  template <class K = key_type>
1385
1480
  iterator find(const key_arg<K>& key) {
1481
+ prefetch_heap_block();
1386
1482
  return find(key, hash_ref()(key));
1387
1483
  }
1388
1484
 
@@ -1392,6 +1488,7 @@ class raw_hash_set {
1392
1488
  }
1393
1489
  template <class K = key_type>
1394
1490
  const_iterator find(const key_arg<K>& key) const {
1491
+ prefetch_heap_block();
1395
1492
  return find(key, hash_ref()(key));
1396
1493
  }
1397
1494
 
@@ -1526,7 +1623,8 @@ class raw_hash_set {
1526
1623
  static_cast<size_t>(empty_after.TrailingZeros() +
1527
1624
  empty_before.LeadingZeros()) < Group::kWidth;
1528
1625
 
1529
- set_ctrl(index, was_never_full ? kEmpty : kDeleted);
1626
+ SetCtrl(index, was_never_full ? ctrl_t::kEmpty : ctrl_t::kDeleted,
1627
+ capacity_, ctrl_, slots_, sizeof(slot_type));
1530
1628
  growth_left() += was_never_full;
1531
1629
  infoz().RecordErase();
1532
1630
  }
@@ -1545,15 +1643,16 @@ class raw_hash_set {
1545
1643
  // bound more carefully.
1546
1644
  if (std::is_same<SlotAlloc, std::allocator<slot_type>>::value &&
1547
1645
  slots_ == nullptr) {
1548
- infoz() = Sample();
1646
+ infoz() = Sample(sizeof(slot_type));
1549
1647
  }
1550
1648
 
1551
- auto layout = MakeLayout(capacity_);
1552
- char* mem = static_cast<char*>(
1553
- Allocate<Layout::Alignment()>(&alloc_ref(), layout.AllocSize()));
1554
- ctrl_ = reinterpret_cast<ctrl_t*>(layout.template Pointer<0>(mem));
1555
- slots_ = layout.template Pointer<1>(mem);
1556
- reset_ctrl();
1649
+ char* mem = static_cast<char*>(Allocate<alignof(slot_type)>(
1650
+ &alloc_ref(),
1651
+ AllocSize(capacity_, sizeof(slot_type), alignof(slot_type))));
1652
+ ctrl_ = reinterpret_cast<ctrl_t*>(mem);
1653
+ slots_ = reinterpret_cast<slot_type*>(
1654
+ mem + SlotOffset(capacity_, alignof(slot_type)));
1655
+ ResetCtrl(capacity_, ctrl_, slots_, sizeof(slot_type));
1557
1656
  reset_growth_left();
1558
1657
  infoz().RecordStorageChanged(size_, capacity_);
1559
1658
  }
@@ -1565,10 +1664,12 @@ class raw_hash_set {
1565
1664
  PolicyTraits::destroy(&alloc_ref(), slots_ + i);
1566
1665
  }
1567
1666
  }
1568
- auto layout = MakeLayout(capacity_);
1667
+
1569
1668
  // Unpoison before returning the memory to the allocator.
1570
1669
  SanitizerUnpoisonMemoryRegion(slots_, sizeof(slot_type) * capacity_);
1571
- Deallocate<Layout::Alignment()>(&alloc_ref(), ctrl_, layout.AllocSize());
1670
+ Deallocate<alignof(slot_type)>(
1671
+ &alloc_ref(), ctrl_,
1672
+ AllocSize(capacity_, sizeof(slot_type), alignof(slot_type)));
1572
1673
  ctrl_ = EmptyGroup();
1573
1674
  slots_ = nullptr;
1574
1675
  size_ = 0;
@@ -1592,16 +1693,16 @@ class raw_hash_set {
1592
1693
  auto target = find_first_non_full(ctrl_, hash, capacity_);
1593
1694
  size_t new_i = target.offset;
1594
1695
  total_probe_length += target.probe_length;
1595
- set_ctrl(new_i, H2(hash));
1696
+ SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
1596
1697
  PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, old_slots + i);
1597
1698
  }
1598
1699
  }
1599
1700
  if (old_capacity) {
1600
1701
  SanitizerUnpoisonMemoryRegion(old_slots,
1601
1702
  sizeof(slot_type) * old_capacity);
1602
- auto layout = MakeLayout(old_capacity);
1603
- Deallocate<Layout::Alignment()>(&alloc_ref(), old_ctrl,
1604
- layout.AllocSize());
1703
+ Deallocate<alignof(slot_type)>(
1704
+ &alloc_ref(), old_ctrl,
1705
+ AllocSize(old_capacity, sizeof(slot_type), alignof(slot_type)));
1605
1706
  }
1606
1707
  infoz().RecordRehash(total_probe_length);
1607
1708
  }
@@ -1631,35 +1732,35 @@ class raw_hash_set {
1631
1732
  slot_type* slot = reinterpret_cast<slot_type*>(&raw);
1632
1733
  for (size_t i = 0; i != capacity_; ++i) {
1633
1734
  if (!IsDeleted(ctrl_[i])) continue;
1634
- size_t hash = PolicyTraits::apply(HashElement{hash_ref()},
1635
- PolicyTraits::element(slots_ + i));
1636
- auto target = find_first_non_full(ctrl_, hash, capacity_);
1637
- size_t new_i = target.offset;
1735
+ const size_t hash = PolicyTraits::apply(
1736
+ HashElement{hash_ref()}, PolicyTraits::element(slots_ + i));
1737
+ const FindInfo target = find_first_non_full(ctrl_, hash, capacity_);
1738
+ const size_t new_i = target.offset;
1638
1739
  total_probe_length += target.probe_length;
1639
1740
 
1640
1741
  // Verify if the old and new i fall within the same group wrt the hash.
1641
1742
  // If they do, we don't need to move the object as it falls already in the
1642
1743
  // best probe we can.
1643
- const auto probe_index = [&](size_t pos) {
1644
- return ((pos - probe(ctrl_, hash, capacity_).offset()) & capacity_) /
1645
- Group::kWidth;
1744
+ const size_t probe_offset = probe(ctrl_, hash, capacity_).offset();
1745
+ const auto probe_index = [probe_offset, this](size_t pos) {
1746
+ return ((pos - probe_offset) & capacity_) / Group::kWidth;
1646
1747
  };
1647
1748
 
1648
1749
  // Element doesn't move.
1649
1750
  if (ABSL_PREDICT_TRUE(probe_index(new_i) == probe_index(i))) {
1650
- set_ctrl(i, H2(hash));
1751
+ SetCtrl(i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
1651
1752
  continue;
1652
1753
  }
1653
1754
  if (IsEmpty(ctrl_[new_i])) {
1654
1755
  // Transfer element to the empty spot.
1655
- // set_ctrl poisons/unpoisons the slots so we have to call it at the
1756
+ // SetCtrl poisons/unpoisons the slots so we have to call it at the
1656
1757
  // right time.
1657
- set_ctrl(new_i, H2(hash));
1758
+ SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
1658
1759
  PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, slots_ + i);
1659
- set_ctrl(i, kEmpty);
1760
+ SetCtrl(i, ctrl_t::kEmpty, capacity_, ctrl_, slots_, sizeof(slot_type));
1660
1761
  } else {
1661
1762
  assert(IsDeleted(ctrl_[new_i]));
1662
- set_ctrl(new_i, H2(hash));
1763
+ SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
1663
1764
  // Until we are done rehashing, DELETED marks previously FULL slots.
1664
1765
  // Swap i and new_i elements.
1665
1766
  PolicyTraits::transfer(&alloc_ref(), slot, slots_ + i);
@@ -1675,8 +1776,50 @@ class raw_hash_set {
1675
1776
  void rehash_and_grow_if_necessary() {
1676
1777
  if (capacity_ == 0) {
1677
1778
  resize(1);
1678
- } else if (size() <= CapacityToGrowth(capacity()) / 2) {
1779
+ } else if (capacity_ > Group::kWidth &&
1780
+ // Do these calcuations in 64-bit to avoid overflow.
1781
+ size() * uint64_t{32} <= capacity_ * uint64_t{25}) {
1679
1782
  // Squash DELETED without growing if there is enough capacity.
1783
+ //
1784
+ // Rehash in place if the current size is <= 25/32 of capacity_.
1785
+ // Rationale for such a high factor: 1) drop_deletes_without_resize() is
1786
+ // faster than resize, and 2) it takes quite a bit of work to add
1787
+ // tombstones. In the worst case, seems to take approximately 4
1788
+ // insert/erase pairs to create a single tombstone and so if we are
1789
+ // rehashing because of tombstones, we can afford to rehash-in-place as
1790
+ // long as we are reclaiming at least 1/8 the capacity without doing more
1791
+ // than 2X the work. (Where "work" is defined to be size() for rehashing
1792
+ // or rehashing in place, and 1 for an insert or erase.) But rehashing in
1793
+ // place is faster per operation than inserting or even doubling the size
1794
+ // of the table, so we actually afford to reclaim even less space from a
1795
+ // resize-in-place. The decision is to rehash in place if we can reclaim
1796
+ // at about 1/8th of the usable capacity (specifically 3/28 of the
1797
+ // capacity) which means that the total cost of rehashing will be a small
1798
+ // fraction of the total work.
1799
+ //
1800
+ // Here is output of an experiment using the BM_CacheInSteadyState
1801
+ // benchmark running the old case (where we rehash-in-place only if we can
1802
+ // reclaim at least 7/16*capacity_) vs. this code (which rehashes in place
1803
+ // if we can recover 3/32*capacity_).
1804
+ //
1805
+ // Note that although in the worst-case number of rehashes jumped up from
1806
+ // 15 to 190, but the number of operations per second is almost the same.
1807
+ //
1808
+ // Abridged output of running BM_CacheInSteadyState benchmark from
1809
+ // raw_hash_set_benchmark. N is the number of insert/erase operations.
1810
+ //
1811
+ // | OLD (recover >= 7/16 | NEW (recover >= 3/32)
1812
+ // size | N/s LoadFactor NRehashes | N/s LoadFactor NRehashes
1813
+ // 448 | 145284 0.44 18 | 140118 0.44 19
1814
+ // 493 | 152546 0.24 11 | 151417 0.48 28
1815
+ // 538 | 151439 0.26 11 | 151152 0.53 38
1816
+ // 583 | 151765 0.28 11 | 150572 0.57 50
1817
+ // 628 | 150241 0.31 11 | 150853 0.61 66
1818
+ // 672 | 149602 0.33 12 | 150110 0.66 90
1819
+ // 717 | 149998 0.35 12 | 149531 0.70 129
1820
+ // 762 | 149836 0.37 13 | 148559 0.74 190
1821
+ // 807 | 149736 0.39 14 | 151107 0.39 14
1822
+ // 852 | 150204 0.42 15 | 151019 0.42 15
1680
1823
  drop_deletes_without_resize();
1681
1824
  } else {
1682
1825
  // Otherwise grow the container.
@@ -1696,7 +1839,7 @@ class raw_hash_set {
1696
1839
  }
1697
1840
  if (ABSL_PREDICT_TRUE(g.MatchEmpty())) return false;
1698
1841
  seq.next();
1699
- assert(seq.index() < capacity_ && "full table!");
1842
+ assert(seq.index() <= capacity_ && "full table!");
1700
1843
  }
1701
1844
  return false;
1702
1845
  }
@@ -1716,6 +1859,7 @@ class raw_hash_set {
1716
1859
  protected:
1717
1860
  template <class K>
1718
1861
  std::pair<size_t, bool> find_or_prepare_insert(const K& key) {
1862
+ prefetch_heap_block();
1719
1863
  auto hash = hash_ref()(key);
1720
1864
  auto seq = probe(ctrl_, hash, capacity_);
1721
1865
  while (true) {
@@ -1728,7 +1872,7 @@ class raw_hash_set {
1728
1872
  }
1729
1873
  if (ABSL_PREDICT_TRUE(g.MatchEmpty())) break;
1730
1874
  seq.next();
1731
- assert(seq.index() < capacity_ && "full table!");
1875
+ assert(seq.index() <= capacity_ && "full table!");
1732
1876
  }
1733
1877
  return {prepare_insert(hash), true};
1734
1878
  }
@@ -1742,7 +1886,8 @@ class raw_hash_set {
1742
1886
  }
1743
1887
  ++size_;
1744
1888
  growth_left() -= IsEmpty(ctrl_[target.offset]);
1745
- set_ctrl(target.offset, H2(hash));
1889
+ SetCtrl(target.offset, H2(hash), capacity_, ctrl_, slots_,
1890
+ sizeof(slot_type));
1746
1891
  infoz().RecordInsert(hash, target.probe_length);
1747
1892
  return target.offset;
1748
1893
  }
@@ -1771,35 +1916,21 @@ class raw_hash_set {
1771
1916
  private:
1772
1917
  friend struct RawHashSetTestOnlyAccess;
1773
1918
 
1774
- // Reset all ctrl bytes back to kEmpty, except the sentinel.
1775
- void reset_ctrl() {
1776
- std::memset(ctrl_, kEmpty, capacity_ + Group::kWidth);
1777
- ctrl_[capacity_] = kSentinel;
1778
- SanitizerPoisonMemoryRegion(slots_, sizeof(slot_type) * capacity_);
1779
- }
1780
-
1781
1919
  void reset_growth_left() {
1782
1920
  growth_left() = CapacityToGrowth(capacity()) - size_;
1783
1921
  }
1784
1922
 
1785
- // Sets the control byte, and if `i < Group::kWidth`, set the cloned byte at
1786
- // the end too.
1787
- void set_ctrl(size_t i, ctrl_t h) {
1788
- assert(i < capacity_);
1789
-
1790
- if (IsFull(h)) {
1791
- SanitizerUnpoisonObject(slots_ + i);
1792
- } else {
1793
- SanitizerPoisonObject(slots_ + i);
1794
- }
1923
+ size_t& growth_left() { return settings_.template get<0>(); }
1795
1924
 
1796
- ctrl_[i] = h;
1797
- ctrl_[((i - Group::kWidth) & capacity_) + 1 +
1798
- ((Group::kWidth - 1) & capacity_)] = h;
1925
+ void prefetch_heap_block() const {
1926
+ // Prefetch the heap-allocated memory region to resolve potential TLB
1927
+ // misses. This is intended to overlap with execution of calculating the
1928
+ // hash for a key.
1929
+ #if defined(__GNUC__)
1930
+ __builtin_prefetch(static_cast<const void*>(ctrl_), 0, 1);
1931
+ #endif // __GNUC__
1799
1932
  }
1800
1933
 
1801
- size_t& growth_left() { return settings_.template get<0>(); }
1802
-
1803
1934
  HashtablezInfoHandle& infoz() { return settings_.template get<1>(); }
1804
1935
 
1805
1936
  hasher& hash_ref() { return settings_.template get<2>(); }
@@ -1814,10 +1945,10 @@ class raw_hash_set {
1814
1945
  // TODO(alkis): Investigate removing some of these fields:
1815
1946
  // - ctrl/slots can be derived from each other
1816
1947
  // - size can be moved into the slot array
1817
- ctrl_t* ctrl_ = EmptyGroup(); // [(capacity + 1) * ctrl_t]
1818
- slot_type* slots_ = nullptr; // [capacity * slot_type]
1819
- size_t size_ = 0; // number of full slots
1820
- size_t capacity_ = 0; // total number of slots
1948
+ ctrl_t* ctrl_ = EmptyGroup(); // [(capacity + 1 + NumClonedBytes()) * ctrl_t]
1949
+ slot_type* slots_ = nullptr; // [capacity * slot_type]
1950
+ size_t size_ = 0; // number of full slots
1951
+ size_t capacity_ = 0; // total number of slots
1821
1952
  absl::container_internal::CompressedTuple<size_t /* growth_left */,
1822
1953
  HashtablezInfoHandle, hasher,
1823
1954
  key_equal, allocator_type>
@@ -1827,11 +1958,12 @@ class raw_hash_set {
1827
1958
 
1828
1959
  // Erases all elements that satisfy the predicate `pred` from the container `c`.
1829
1960
  template <typename P, typename H, typename E, typename A, typename Predicate>
1830
- void EraseIf(Predicate pred, raw_hash_set<P, H, E, A>* c) {
1961
+ void EraseIf(Predicate& pred, raw_hash_set<P, H, E, A>* c) {
1831
1962
  for (auto it = c->begin(), last = c->end(); it != last;) {
1832
- auto copy_it = it++;
1833
- if (pred(*copy_it)) {
1834
- c->erase(copy_it);
1963
+ if (pred(*it)) {
1964
+ c->erase(it++);
1965
+ } else {
1966
+ ++it;
1835
1967
  }
1836
1968
  }
1837
1969
  }
@@ -1866,8 +1998,7 @@ struct HashtableDebugAccess<Set, absl::void_t<typename Set::raw_hash_set>> {
1866
1998
  static size_t AllocatedByteSize(const Set& c) {
1867
1999
  size_t capacity = c.capacity_;
1868
2000
  if (capacity == 0) return 0;
1869
- auto layout = Set::MakeLayout(capacity);
1870
- size_t m = layout.AllocSize();
2001
+ size_t m = AllocSize(capacity, sizeof(Slot), alignof(Slot));
1871
2002
 
1872
2003
  size_t per_slot = Traits::space_used(static_cast<const Slot*>(nullptr));
1873
2004
  if (per_slot != ~size_t{}) {
@@ -1885,8 +2016,8 @@ struct HashtableDebugAccess<Set, absl::void_t<typename Set::raw_hash_set>> {
1885
2016
  static size_t LowerBoundAllocatedByteSize(size_t size) {
1886
2017
  size_t capacity = GrowthToLowerboundCapacity(size);
1887
2018
  if (capacity == 0) return 0;
1888
- auto layout = Set::MakeLayout(NormalizeCapacity(capacity));
1889
- size_t m = layout.AllocSize();
2019
+ size_t m =
2020
+ AllocSize(NormalizeCapacity(capacity), sizeof(Slot), alignof(Slot));
1890
2021
  size_t per_slot = Traits::space_used(static_cast<const Slot*>(nullptr));
1891
2022
  if (per_slot != ~size_t{}) {
1892
2023
  m += per_slot * size;