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
@@ -0,0 +1,939 @@
1
+ // Copyright 2021 The Abseil Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_H_
16
+ #define ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_H_
17
+
18
+ #include <cassert>
19
+ #include <cstdint>
20
+ #include <iosfwd>
21
+
22
+ #include "absl/base/config.h"
23
+ #include "absl/base/internal/raw_logging.h"
24
+ #include "absl/base/optimization.h"
25
+ #include "absl/strings/internal/cord_internal.h"
26
+ #include "absl/strings/internal/cord_rep_flat.h"
27
+ #include "absl/strings/string_view.h"
28
+ #include "absl/types/span.h"
29
+
30
+ namespace absl {
31
+ ABSL_NAMESPACE_BEGIN
32
+ namespace cord_internal {
33
+
34
+ class CordRepBtreeNavigator;
35
+
36
+ // CordRepBtree is as the name implies a btree implementation of a Cordrep tree.
37
+ // Data is stored at the leaf level only, non leaf nodes contain down pointers
38
+ // only. Allowed types of data edges are FLAT, EXTERNAL and SUBSTRINGs of FLAT
39
+ // or EXTERNAL nodes. The implementation allows for data to be added to either
40
+ // end of the tree only, it does not provide any 'insert' logic. This has the
41
+ // benefit that we can expect good fill ratios: all nodes except the outer
42
+ // 'legs' will have 100% fill ratios for trees built using Append/Prepend
43
+ // methods. Merged trees will typically have a fill ratio well above 50% as in a
44
+ // similar fashion, one side of the merged tree will typically have a 100% fill
45
+ // ratio, and the 'open' end will average 50%. All operations are O(log(n)) or
46
+ // better, and the tree never needs balancing.
47
+ //
48
+ // All methods accepting a CordRep* or CordRepBtree* adopt a reference on that
49
+ // input unless explicitly stated otherwise. All functions returning a CordRep*
50
+ // or CordRepBtree* instance transfer a reference back to the caller.
51
+ // Simplified, callers both 'donate' and 'consume' a reference count on each
52
+ // call, simplifying the API. An example of building a tree:
53
+ //
54
+ // CordRepBtree* tree = CordRepBtree::Create(MakeFlat("Hello"));
55
+ // tree = CordRepBtree::Append(tree, MakeFlat("world"));
56
+ //
57
+ // In the above example, all inputs are consumed, making each call affecting
58
+ // `tree` reference count neutral. The returned `tree` value can be different
59
+ // from the input if the input is shared with other threads, or if the tree
60
+ // grows in height, but callers typically never have to concern themselves with
61
+ // that and trust that all methods DTRT at all times.
62
+ class CordRepBtree : public CordRep {
63
+ public:
64
+ // EdgeType identifies `front` and `back` enum values.
65
+ // Various implementations in CordRepBtree such as `Add` and `Edge` are
66
+ // generic and templated on operating on either of the boundary edges.
67
+ // For more information on the possible edges contained in a CordRepBtree
68
+ // instance see the documentation for `edges_`.
69
+ enum class EdgeType { kFront, kBack };
70
+
71
+ // Convenience constants into `EdgeType`
72
+ static constexpr EdgeType kFront = EdgeType::kFront;
73
+ static constexpr EdgeType kBack = EdgeType::kBack;
74
+
75
+ // Maximum number of edges: based on experiments and performance data, we can
76
+ // pick suitable values resulting in optimum cacheline aligned values. The
77
+ // preferred values are based on 64-bit systems where we aim to align this
78
+ // class onto 64 bytes, i.e.: 6 = 64 bytes, 14 = 128 bytes, etc.
79
+ // TODO(b/192061034): experiment with alternative sizes.
80
+ static constexpr size_t kMaxCapacity = 6;
81
+
82
+ // Reasonable maximum height of the btree. We can expect a fill ratio of at
83
+ // least 50%: trees are always expanded at the front or back. Concatenating
84
+ // trees will then typically fold at the top most node, where the lower nodes
85
+ // are at least at capacity on one side of joined inputs. At a lower fill
86
+ // rate of 4 edges per node, we have capacity for ~16 million leaf nodes.
87
+ // We will fail / abort if an application ever exceeds this height, which
88
+ // should be extremely rare (near impossible) and be an indication of an
89
+ // application error: we do not assume it reasonable for any application to
90
+ // operate correctly with such monster trees.
91
+ // Another compelling reason for the number `12` is that any contextual stack
92
+ // required for navigation or insertion requires 12 words and 12 bytes, which
93
+ // fits inside 2 cache lines with some room to spare, and is reasonable as a
94
+ // local stack variable compared to Cord's current near 400 bytes stack use.
95
+ // The maximum `height` value of a node is then `kMaxDepth - 1` as node height
96
+ // values start with a value of 0 for leaf nodes.
97
+ static constexpr int kMaxDepth = 12;
98
+ static constexpr int kMaxHeight = kMaxDepth - 1;
99
+
100
+ // `Action` defines the action for unwinding changes done at the btree's leaf
101
+ // level that need to be propagated up to the parent node(s). Each operation
102
+ // on a node has an effect / action defined as follows:
103
+ // - kSelf
104
+ // The operation (add / update, etc) was performed directly on the node as
105
+ // the node is private to the current thread (i.e.: not shared directly or
106
+ // indirectly through a refcount > 1). Changes can be propagated directly to
107
+ // all parent nodes as all parent nodes are also then private to the current
108
+ // thread.
109
+ // - kCopied
110
+ // The operation (add / update, etc) was performed on a copy of the original
111
+ // node, as the node is (potentially) directly or indirectly shared with
112
+ // other threads. Changes need to be propagated into the parent nodes where
113
+ // the old down pointer must be unreffed and replaced with this new copy.
114
+ // Such changes to parent nodes may themselves require a copy if the parent
115
+ // node is also shared. A kCopied action can propagate all the way to the
116
+ // top node where we then must unref the `tree` input provided by the
117
+ // caller, and return the new copy.
118
+ // - kPopped
119
+ // The operation (typically add) could not be satisfied due to insufficient
120
+ // capacity in the targeted node, and a new 'leg' was created that needs to
121
+ // be added into the parent node. For example, adding a FLAT inside a leaf
122
+ // node that is at capacity will create a new leaf node containing that
123
+ // FLAT, that needs to be 'popped' up the btree. Such 'pop' actions can
124
+ // cascade up the tree if parent nodes are also at capacity. A 'Popped'
125
+ // action propagating all the way to the top of the tree will result in
126
+ // the tree becoming one level higher than the current tree through a final
127
+ // `CordRepBtree::New(tree, popped)` call, resulting in a new top node
128
+ // referencing the old tree and the new (fully popped upwards) 'leg'.
129
+ enum Action { kSelf, kCopied, kPopped };
130
+
131
+ // Result of an operation on a node. See the `Action` enum for details.
132
+ struct OpResult {
133
+ CordRepBtree* tree;
134
+ Action action;
135
+ };
136
+
137
+ // Return value of the CopyPrefix and CopySuffix methods which can
138
+ // return a node or data edge at any height inside the tree.
139
+ // A height of 0 defines the lowest (leaf) node, a height of -1 identifies
140
+ // `edge` as being a plain data node: EXTERNAL / FLAT or SUBSTRING thereof.
141
+ struct CopyResult {
142
+ CordRep* edge;
143
+ int height;
144
+ };
145
+
146
+ // Logical position inside a node:
147
+ // - index: index of the edge.
148
+ // - n: size or offset value depending on context.
149
+ struct Position {
150
+ size_t index;
151
+ size_t n;
152
+ };
153
+
154
+ // Creates a btree from the given input. Adopts a ref of `rep`.
155
+ // If the input `rep` is itself a btree, i.e., `IsBtree()`, then this
156
+ // function immediately returns `rep->btree()`. If the input is a valid data
157
+ // edge (see IsDataEdge()), then a new leaf node is returned containing `rep`
158
+ // as the sole data edge. Else, the input is assumed to be a (legacy) concat
159
+ // tree, and the input is consumed and transformed into a btree().
160
+ static CordRepBtree* Create(CordRep* rep);
161
+
162
+ // Destroys the provided tree. Should only be called by cord internal API's,
163
+ // typically after a ref_count.Decrement() on the last reference count.
164
+ static void Destroy(CordRepBtree* tree);
165
+
166
+ // Use CordRep::Unref() as we overload for absl::Span<CordRep* const>.
167
+ using CordRep::Unref;
168
+
169
+ // Unrefs all edges in `edges` which are assumed to be 'likely one'.
170
+ static void Unref(absl::Span<CordRep* const> edges);
171
+
172
+ // Appends / Prepends an existing CordRep instance to this tree.
173
+ // The below methods accept three types of input:
174
+ // 1) `rep` is a data node (See `IsDataNode` for valid data edges).
175
+ // `rep` is appended or prepended to this tree 'as is'.
176
+ // 2) `rep` is a BTREE.
177
+ // `rep` is merged into `tree` respecting the Append/Prepend order.
178
+ // 3) `rep` is some other (legacy) type.
179
+ // `rep` is converted in place and added to `tree`
180
+ // Requires `tree` and `rep` to be not null.
181
+ static CordRepBtree* Append(CordRepBtree* tree, CordRep* rep);
182
+ static CordRepBtree* Prepend(CordRepBtree* tree, CordRep* rep);
183
+
184
+ // Append/Prepend the data in `data` to this tree.
185
+ // The `extra` parameter defines how much extra capacity should be allocated
186
+ // for any additional FLAT being allocated. This is an optimization hint from
187
+ // the caller. For example, a caller may need to add 2 string_views of data
188
+ // "abc" and "defghi" which are not consecutive. The caller can in this case
189
+ // invoke `AddData(tree, "abc", 6)`, and any newly added flat is allocated
190
+ // where possible with at least 6 bytes of extra capacity beyond `length`.
191
+ // This helps avoiding data getting fragmented over multiple flats.
192
+ // There is no limit on the size of `data`. If `data` can not be stored inside
193
+ // a single flat, then the function will iteratively add flats until all data
194
+ // has been consumed and appended or prepended to the tree.
195
+ static CordRepBtree* Append(CordRepBtree* tree, string_view data,
196
+ size_t extra = 0);
197
+ static CordRepBtree* Prepend(CordRepBtree* tree, string_view data,
198
+ size_t extra = 0);
199
+
200
+ // Returns a new tree, containing `n` bytes of data from this instance
201
+ // starting at offset `offset`. Where possible, the returned tree shares
202
+ // (re-uses) data edges and nodes with this instance to minimize the
203
+ // combined memory footprint of both trees.
204
+ // Requires `offset + n <= length`. Returns `nullptr` if `n` is zero.
205
+ CordRep* SubTree(size_t offset, size_t n);
206
+
207
+ // Removes `n` trailing bytes from `tree`, and returns the resulting tree
208
+ // or data edge. Returns `tree` if n is zero, and nullptr if n == length.
209
+ // This function is logically identical to:
210
+ // result = tree->SubTree(0, tree->length - n);
211
+ // Unref(tree);
212
+ // return result;
213
+ // However, the actual implementation will as much as possible perform 'in
214
+ // place' modifications on the tree on all nodes and edges that are mutable.
215
+ // For example, in a fully privately owned tree with the last edge being a
216
+ // flat of length 12, RemoveSuffix(1) will simply set the length of that data
217
+ // edge to 11, and reduce the length of all nodes on the edge path by 1.
218
+ static CordRep* RemoveSuffix(CordRepBtree* tree, size_t n);
219
+
220
+ // Returns the character at the given offset.
221
+ char GetCharacter(size_t offset) const;
222
+
223
+ // Returns true if this node holds a single data edge, and if so, sets
224
+ // `fragment` to reference the contained data. `fragment` is an optional
225
+ // output parameter and allowed to be null.
226
+ bool IsFlat(absl::string_view* fragment) const;
227
+
228
+ // Returns true if the data of `n` bytes starting at offset `offset`
229
+ // is contained in a single data edge, and if so, sets fragment to reference
230
+ // the contained data. `fragment` is an optional output parameter and allowed
231
+ // to be null.
232
+ bool IsFlat(size_t offset, size_t n, absl::string_view* fragment) const;
233
+
234
+ // Returns a span (mutable range of bytes) of up to `size` bytes into the
235
+ // last FLAT data edge inside this tree under the following conditions:
236
+ // - none of the nodes down into the FLAT node are shared.
237
+ // - the last data edge in this tree is a non-shared FLAT.
238
+ // - the referenced FLAT has additional capacity available.
239
+ // If all these conditions are met, a non-empty span is returned, and the
240
+ // length of the flat node and involved tree nodes have been increased by
241
+ // `span.length()`. The caller is responsible for immediately assigning values
242
+ // to all uninitialized data reference by the returned span.
243
+ // Requires `this->refcount.IsMutable()`: this function forces the
244
+ // caller to do this fast path check on the top level node, as this is the
245
+ // most commonly shared node of a cord tree.
246
+ Span<char> GetAppendBuffer(size_t size);
247
+
248
+ // Returns the `height` of the tree. The height of a tree is limited to
249
+ // kMaxHeight. `height` is implemented as an `int` as in some places we
250
+ // use negative (-1) values for 'data edges'.
251
+ int height() const { return static_cast<int>(storage[0]); }
252
+
253
+ // Properties: begin, back, end, front/back boundary indexes.
254
+ size_t begin() const { return static_cast<size_t>(storage[1]); }
255
+ size_t back() const { return static_cast<size_t>(storage[2]) - 1; }
256
+ size_t end() const { return static_cast<size_t>(storage[2]); }
257
+ size_t index(EdgeType edge) const {
258
+ return edge == kFront ? begin() : back();
259
+ }
260
+
261
+ // Properties: size and capacity.
262
+ // `capacity` contains the current capacity of this instance, where
263
+ // `kMaxCapacity` contains the maximum capacity of a btree node.
264
+ // For now, `capacity` and `kMaxCapacity` return the same value, but this may
265
+ // change in the future if we see benefit in dynamically sizing 'small' nodes
266
+ // to 'large' nodes for large data trees.
267
+ size_t size() const { return end() - begin(); }
268
+ size_t capacity() const { return kMaxCapacity; }
269
+
270
+ // Edge access
271
+ inline CordRep* Edge(size_t index) const;
272
+ inline CordRep* Edge(EdgeType edge_type) const;
273
+ inline absl::Span<CordRep* const> Edges() const;
274
+ inline absl::Span<CordRep* const> Edges(size_t begin, size_t end) const;
275
+
276
+ // Returns reference to the data edge at `index`.
277
+ // Requires this instance to be a leaf node, and `index` to be valid index.
278
+ inline absl::string_view Data(size_t index) const;
279
+
280
+ static const char* EdgeDataPtr(const CordRep* r);
281
+ static absl::string_view EdgeData(const CordRep* r);
282
+
283
+ // Returns true if the provided rep is a FLAT, EXTERNAL or a SUBSTRING node
284
+ // holding a FLAT or EXTERNAL child rep.
285
+ static bool IsDataEdge(const CordRep* rep);
286
+
287
+ // Diagnostics: returns true if `tree` is valid and internally consistent.
288
+ // If `shallow` is false, then the provided top level node and all child nodes
289
+ // below it are recursively checked. If `shallow` is true, only the provided
290
+ // node in `tree` and the cumulative length, type and height of the direct
291
+ // child nodes of `tree` are checked. The value of `shallow` is ignored if the
292
+ // internal `cord_btree_exhaustive_validation` diagnostics variable is true,
293
+ // in which case the performed validations works as if `shallow` were false.
294
+ // This function is intended for debugging and testing purposes only.
295
+ static bool IsValid(const CordRepBtree* tree, bool shallow = false);
296
+
297
+ // Diagnostics: asserts that the provided tree is valid.
298
+ // `AssertValid()` performs a shallow validation by default. `shallow` can be
299
+ // set to false in which case an exhaustive validation is performed. This
300
+ // function is implemented in terms of calling `IsValid()` and asserting the
301
+ // return value to be true. See `IsValid()` for more information.
302
+ // This function is intended for debugging and testing purposes only.
303
+ static CordRepBtree* AssertValid(CordRepBtree* tree, bool shallow = true);
304
+ static const CordRepBtree* AssertValid(const CordRepBtree* tree,
305
+ bool shallow = true);
306
+
307
+ // Diagnostics: dump the contents of this tree to `stream`.
308
+ // This function is intended for debugging and testing purposes only.
309
+ static void Dump(const CordRep* rep, std::ostream& stream);
310
+ static void Dump(const CordRep* rep, absl::string_view label,
311
+ std::ostream& stream);
312
+ static void Dump(const CordRep* rep, absl::string_view label,
313
+ bool include_contents, std::ostream& stream);
314
+
315
+ // Adds the edge `edge` to this node if possible. `owned` indicates if the
316
+ // current node is potentially shared or not with other threads. Returns:
317
+ // - {kSelf, <this>}
318
+ // The edge was directly added to this node.
319
+ // - {kCopied, <node>}
320
+ // The edge was added to a copy of this node.
321
+ // - {kPopped, New(edge, height())}
322
+ // A new leg with the edge was created as this node has no extra capacity.
323
+ template <EdgeType edge_type>
324
+ inline OpResult AddEdge(bool owned, CordRep* edge, size_t delta);
325
+
326
+ // Replaces the front or back edge with the provided new edge. Returns:
327
+ // - {kSelf, <this>}
328
+ // The edge was directly set in this node. The old edge is unreffed.
329
+ // - {kCopied, <node>}
330
+ // A copy of this node was created with the new edge value.
331
+ // In both cases, the function adopts a reference on `edge`.
332
+ template <EdgeType edge_type>
333
+ OpResult SetEdge(bool owned, CordRep* edge, size_t delta);
334
+
335
+ // Creates a new empty node at the specified height.
336
+ static CordRepBtree* New(int height = 0);
337
+
338
+ // Creates a new node containing `rep`, with the height being computed
339
+ // automatically based on the type of `rep`.
340
+ static CordRepBtree* New(CordRep* rep);
341
+
342
+ // Creates a new node containing both `front` and `back` at height
343
+ // `front.height() + 1`. Requires `back.height() == front.height()`.
344
+ static CordRepBtree* New(CordRepBtree* front, CordRepBtree* back);
345
+
346
+ // Creates a fully balanced tree from the provided tree by rebuilding a new
347
+ // tree from all data edges in the input. This function is automatically
348
+ // invoked internally when the tree exceeds the maximum height.
349
+ static CordRepBtree* Rebuild(CordRepBtree* tree);
350
+
351
+ private:
352
+ CordRepBtree() = default;
353
+ ~CordRepBtree() = default;
354
+
355
+ // Initializes the main properties `tag`, `begin`, `end`, `height`.
356
+ inline void InitInstance(int height, size_t begin = 0, size_t end = 0);
357
+
358
+ // Direct property access begin / end
359
+ void set_begin(size_t begin) { storage[1] = static_cast<uint8_t>(begin); }
360
+ void set_end(size_t end) { storage[2] = static_cast<uint8_t>(end); }
361
+
362
+ // Decreases the value of `begin` by `n`, and returns the new value. Notice
363
+ // how this returns the new value unlike atomic::fetch_add which returns the
364
+ // old value. This is because this is used to prepend edges at 'begin - 1'.
365
+ size_t sub_fetch_begin(size_t n) {
366
+ storage[1] -= static_cast<uint8_t>(n);
367
+ return storage[1];
368
+ }
369
+
370
+ // Increases the value of `end` by `n`, and returns the previous value. This
371
+ // function is typically used to append edges at 'end'.
372
+ size_t fetch_add_end(size_t n) {
373
+ const uint8_t current = storage[2];
374
+ storage[2] = static_cast<uint8_t>(current + n);
375
+ return current;
376
+ }
377
+
378
+ // Returns the index of the last edge starting on, or before `offset`, with
379
+ // `n` containing the relative offset of `offset` inside that edge.
380
+ // Requires `offset` < length.
381
+ Position IndexOf(size_t offset) const;
382
+
383
+ // Returns the index of the last edge starting before `offset`, with `n`
384
+ // containing the relative offset of `offset` inside that edge.
385
+ // This function is useful to find the edges for some span of bytes ending at
386
+ // `offset` (i.e., `n` bytes). For example:
387
+ //
388
+ // Position pos = IndexBefore(n)
389
+ // edges = Edges(begin(), pos.index) // All full edges (may be empty)
390
+ // last = Sub(Edge(pos.index), 0, pos.n) // Last partial edge (may be empty)
391
+ //
392
+ // Requires 0 < `offset` <= length.
393
+ Position IndexBefore(size_t offset) const;
394
+
395
+ // Returns the index of the edge ending at (or on) length `length`, and the
396
+ // number of bytes inside that edge up to `length`. For example, if we have a
397
+ // Node with 2 edges, one of 10 and one of 20 long, then IndexOfLength(27)
398
+ // will return {1, 17}, and IndexOfLength(10) will return {0, 10}.
399
+ Position IndexOfLength(size_t n) const;
400
+
401
+ // Identical to the above function except starting from the position `front`.
402
+ // This function is equivalent to `IndexBefore(front.n + offset)`, with
403
+ // the difference that this function is optimized to start at `front.index`.
404
+ Position IndexBefore(Position front, size_t offset) const;
405
+
406
+ // Returns the index of the edge directly beyond the edge containing offset
407
+ // `offset`, with `n` containing the distance of that edge from `offset`.
408
+ // This function is useful for iteratively finding suffix nodes and remaining
409
+ // partial bytes in left-most suffix nodes as for example in CopySuffix.
410
+ // Requires `offset` < length.
411
+ Position IndexBeyond(size_t offset) const;
412
+
413
+ // Destruction
414
+ static void DestroyLeaf(CordRepBtree* tree, size_t begin, size_t end);
415
+ static void DestroyNonLeaf(CordRepBtree* tree, size_t begin, size_t end);
416
+ static void DestroyTree(CordRepBtree* tree, size_t begin, size_t end);
417
+ static void Delete(CordRepBtree* tree) { delete tree; }
418
+
419
+ // Creates a new leaf node containing as much data as possible from `data`.
420
+ // The data is added either forwards or reversed depending on `edge_type`.
421
+ // Callers must check the length of the returned node to determine if all data
422
+ // was copied or not.
423
+ // See the `Append/Prepend` function for the meaning and purpose of `extra`.
424
+ template <EdgeType edge_type>
425
+ static CordRepBtree* NewLeaf(absl::string_view data, size_t extra);
426
+
427
+ // Creates a raw copy of this Btree node, copying all properties, but
428
+ // without adding any references to existing edges.
429
+ CordRepBtree* CopyRaw() const;
430
+
431
+ // Creates a full copy of this Btree node, adding a reference on all edges.
432
+ CordRepBtree* Copy() const;
433
+
434
+ // Creates a partial copy of this Btree node, copying all edges up to `end`,
435
+ // adding a reference on each copied edge, and sets the length of the newly
436
+ // created copy to `new_length`.
437
+ CordRepBtree* CopyBeginTo(size_t end, size_t new_length) const;
438
+
439
+ // Returns a tree containing the edges [tree->begin(), end) and length
440
+ // of `new_length`. This method consumes a reference on the provided
441
+ // tree, and logically performs the following operation:
442
+ // result = tree->CopyBeginTo(end, new_length);
443
+ // CordRep::Unref(tree);
444
+ // return result;
445
+ static CordRepBtree* ConsumeBeginTo(CordRepBtree* tree, size_t end,
446
+ size_t new_length);
447
+
448
+ // Creates a partial copy of this Btree node, copying all edges starting at
449
+ // `begin`, adding a reference on each copied edge, and sets the length of
450
+ // the newly created copy to `new_length`.
451
+ CordRepBtree* CopyToEndFrom(size_t begin, size_t new_length) const;
452
+
453
+ // Extracts and returns the front edge from the provided tree.
454
+ // This method consumes a reference on the provided tree, and logically
455
+ // performs the following operation:
456
+ // edge = CordRep::Ref(tree->Edge(kFront));
457
+ // CordRep::Unref(tree);
458
+ // return edge;
459
+ static CordRep* ExtractFront(CordRepBtree* tree);
460
+
461
+ // Returns a tree containing the result of appending `right` to `left`.
462
+ static CordRepBtree* MergeTrees(CordRepBtree* left, CordRepBtree* right);
463
+
464
+ // Fallback functions for `Create()`, `Append()` and `Prepend()` which
465
+ // deal with legacy / non conforming input, i.e.: CONCAT trees.
466
+ static CordRepBtree* CreateSlow(CordRep* rep);
467
+ static CordRepBtree* AppendSlow(CordRepBtree*, CordRep* rep);
468
+ static CordRepBtree* PrependSlow(CordRepBtree*, CordRep* rep);
469
+
470
+ // Recursively rebuilds `tree` into `stack`. If 'consume` is set to true, the
471
+ // function will consume a reference on `tree`. `stack` is a null terminated
472
+ // array containing the new tree's state, with the current leaf node at
473
+ // stack[0], and parent nodes above that, or null for 'top of tree'.
474
+ static void Rebuild(CordRepBtree** stack, CordRepBtree* tree, bool consume);
475
+
476
+ // Aligns existing edges to start at index 0, to allow for a new edge to be
477
+ // added to the back of the current edges.
478
+ inline void AlignBegin();
479
+
480
+ // Aligns existing edges to end at `capacity`, to allow for a new edge to be
481
+ // added in front of the current edges.
482
+ inline void AlignEnd();
483
+
484
+ // Adds the provided edge to this node.
485
+ // Requires this node to have capacity for the edge. Realigns / moves
486
+ // existing edges as needed to prepend or append the new edge.
487
+ template <EdgeType edge_type>
488
+ inline void Add(CordRep* rep);
489
+
490
+ // Adds the provided edges to this node.
491
+ // Requires this node to have capacity for the edges. Realigns / moves
492
+ // existing edges as needed to prepend or append the new edges.
493
+ template <EdgeType edge_type>
494
+ inline void Add(absl::Span<CordRep* const>);
495
+
496
+ // Adds data from `data` to this node until either all data has been consumed,
497
+ // or there is no more capacity for additional flat nodes inside this node.
498
+ // Requires the current node to be a leaf node, data to be non empty, and the
499
+ // current node to have capacity for at least one more data edge.
500
+ // Returns any remaining data from `data` that was not added, which is
501
+ // depending on the edge type (front / back) either the remaining prefix of
502
+ // suffix of the input.
503
+ // See the `Append/Prepend` function for the meaning and purpose of `extra`.
504
+ template <EdgeType edge_type>
505
+ absl::string_view AddData(absl::string_view data, size_t extra);
506
+
507
+ // Replace the front or back edge with the provided value.
508
+ // Adopts a reference on `edge` and unrefs the old edge.
509
+ template <EdgeType edge_type>
510
+ inline void SetEdge(CordRep* edge);
511
+
512
+ // Returns a partial copy of the current tree containing the first `n` bytes
513
+ // of data. `CopyResult` contains both the resulting edge and its height. The
514
+ // resulting tree may be less high than the current tree, or even be a single
515
+ // matching data edge if `allow_folding` is set to true.
516
+ // For example, if `n == 1`, then the result will be the single data edge, and
517
+ // height will be set to -1 (one below the owning leaf node). If n == 0, this
518
+ // function returns null. Requires `n <= length`
519
+ CopyResult CopyPrefix(size_t n, bool allow_folding = true);
520
+
521
+ // Returns a partial copy of the current tree containing all data starting
522
+ // after `offset`. `CopyResult` contains both the resulting edge and its
523
+ // height. The resulting tree may be less high than the current tree, or even
524
+ // be a single matching data edge. For example, if `n == length - 1`, then the
525
+ // result will be a single data edge, and height will be set to -1 (one below
526
+ // the owning leaf node).
527
+ // Requires `offset < length`
528
+ CopyResult CopySuffix(size_t offset);
529
+
530
+ // Returns a OpResult value of {this, kSelf} or {Copy(), kCopied}
531
+ // depending on the value of `owned`.
532
+ inline OpResult ToOpResult(bool owned);
533
+
534
+ // Adds `rep` to the specified tree, returning the modified tree.
535
+ template <EdgeType edge_type>
536
+ static CordRepBtree* AddCordRep(CordRepBtree* tree, CordRep* rep);
537
+
538
+ // Adds `data` to the specified tree, returning the modified tree.
539
+ // See the `Append/Prepend` function for the meaning and purpose of `extra`.
540
+ template <EdgeType edge_type>
541
+ static CordRepBtree* AddData(CordRepBtree* tree, absl::string_view data,
542
+ size_t extra = 0);
543
+
544
+ // Merges `src` into `dst` with `src` being added either before (kFront) or
545
+ // after (kBack) `dst`. Requires the height of `dst` to be greater than or
546
+ // equal to the height of `src`.
547
+ template <EdgeType edge_type>
548
+ static CordRepBtree* Merge(CordRepBtree* dst, CordRepBtree* src);
549
+
550
+ // Fallback version of GetAppendBuffer for large trees: GetAppendBuffer()
551
+ // implements an inlined version for trees of limited height (3 levels),
552
+ // GetAppendBufferSlow implements the logic for large trees.
553
+ Span<char> GetAppendBufferSlow(size_t size);
554
+
555
+ // `edges_` contains all edges starting from this instance.
556
+ // These are explicitly `child` edges only, a cord btree (or any cord tree in
557
+ // that respect) does not store `parent` pointers anywhere: multiple trees /
558
+ // parents can reference the same shared child edge. The type of these edges
559
+ // depends on the height of the node. `Leaf nodes` (height == 0) contain `data
560
+ // edges` (external or flat nodes, or sub-strings thereof). All other nodes
561
+ // (height > 0) contain pointers to BTREE nodes with a height of `height - 1`.
562
+ CordRep* edges_[kMaxCapacity];
563
+
564
+ friend class CordRepBtreeTestPeer;
565
+ friend class CordRepBtreeNavigator;
566
+ };
567
+
568
+ inline CordRepBtree* CordRep::btree() {
569
+ assert(IsBtree());
570
+ return static_cast<CordRepBtree*>(this);
571
+ }
572
+
573
+ inline const CordRepBtree* CordRep::btree() const {
574
+ assert(IsBtree());
575
+ return static_cast<const CordRepBtree*>(this);
576
+ }
577
+
578
+ inline void CordRepBtree::InitInstance(int height, size_t begin, size_t end) {
579
+ tag = BTREE;
580
+ storage[0] = static_cast<uint8_t>(height);
581
+ storage[1] = static_cast<uint8_t>(begin);
582
+ storage[2] = static_cast<uint8_t>(end);
583
+ }
584
+
585
+ inline CordRep* CordRepBtree::Edge(size_t index) const {
586
+ assert(index >= begin());
587
+ assert(index < end());
588
+ return edges_[index];
589
+ }
590
+
591
+ inline CordRep* CordRepBtree::Edge(EdgeType edge_type) const {
592
+ return edges_[edge_type == kFront ? begin() : back()];
593
+ }
594
+
595
+ inline absl::Span<CordRep* const> CordRepBtree::Edges() const {
596
+ return {edges_ + begin(), size()};
597
+ }
598
+
599
+ inline absl::Span<CordRep* const> CordRepBtree::Edges(size_t begin,
600
+ size_t end) const {
601
+ assert(begin <= end);
602
+ assert(begin >= this->begin());
603
+ assert(end <= this->end());
604
+ return {edges_ + begin, static_cast<size_t>(end - begin)};
605
+ }
606
+
607
+ inline const char* CordRepBtree::EdgeDataPtr(const CordRep* r) {
608
+ assert(IsDataEdge(r));
609
+ size_t offset = 0;
610
+ if (r->tag == SUBSTRING) {
611
+ offset = r->substring()->start;
612
+ r = r->substring()->child;
613
+ }
614
+ return (r->tag >= FLAT ? r->flat()->Data() : r->external()->base) + offset;
615
+ }
616
+
617
+ inline absl::string_view CordRepBtree::EdgeData(const CordRep* r) {
618
+ return absl::string_view(EdgeDataPtr(r), r->length);
619
+ }
620
+
621
+ inline absl::string_view CordRepBtree::Data(size_t index) const {
622
+ assert(height() == 0);
623
+ return EdgeData(Edge(index));
624
+ }
625
+
626
+ inline bool CordRepBtree::IsDataEdge(const CordRep* rep) {
627
+ // The fast path is that `rep` is an EXTERNAL or FLAT node, making the below
628
+ // if a single, well predicted branch. We then repeat the FLAT or EXTERNAL
629
+ // check in the slow path the SUBSTRING check to optimize for the hot path.
630
+ if (rep->tag == EXTERNAL || rep->tag >= FLAT) return true;
631
+ if (rep->tag == SUBSTRING) rep = rep->substring()->child;
632
+ return rep->tag == EXTERNAL || rep->tag >= FLAT;
633
+ }
634
+
635
+ inline CordRepBtree* CordRepBtree::New(int height) {
636
+ CordRepBtree* tree = new CordRepBtree;
637
+ tree->length = 0;
638
+ tree->InitInstance(height);
639
+ return tree;
640
+ }
641
+
642
+ inline CordRepBtree* CordRepBtree::New(CordRep* rep) {
643
+ CordRepBtree* tree = new CordRepBtree;
644
+ int height = rep->IsBtree() ? rep->btree()->height() + 1 : 0;
645
+ tree->length = rep->length;
646
+ tree->InitInstance(height, /*begin=*/0, /*end=*/1);
647
+ tree->edges_[0] = rep;
648
+ return tree;
649
+ }
650
+
651
+ inline CordRepBtree* CordRepBtree::New(CordRepBtree* front,
652
+ CordRepBtree* back) {
653
+ assert(front->height() == back->height());
654
+ CordRepBtree* tree = new CordRepBtree;
655
+ tree->length = front->length + back->length;
656
+ tree->InitInstance(front->height() + 1, /*begin=*/0, /*end=*/2);
657
+ tree->edges_[0] = front;
658
+ tree->edges_[1] = back;
659
+ return tree;
660
+ }
661
+
662
+ inline void CordRepBtree::DestroyTree(CordRepBtree* tree, size_t begin,
663
+ size_t end) {
664
+ if (tree->height() == 0) {
665
+ DestroyLeaf(tree, begin, end);
666
+ } else {
667
+ DestroyNonLeaf(tree, begin, end);
668
+ }
669
+ }
670
+
671
+ inline void CordRepBtree::Destroy(CordRepBtree* tree) {
672
+ DestroyTree(tree, tree->begin(), tree->end());
673
+ }
674
+
675
+ inline void CordRepBtree::Unref(absl::Span<CordRep* const> edges) {
676
+ for (CordRep* edge : edges) {
677
+ if (ABSL_PREDICT_FALSE(!edge->refcount.Decrement())) {
678
+ CordRep::Destroy(edge);
679
+ }
680
+ }
681
+ }
682
+
683
+ inline CordRepBtree* CordRepBtree::CopyRaw() const {
684
+ auto* tree = static_cast<CordRepBtree*>(::operator new(sizeof(CordRepBtree)));
685
+ memcpy(static_cast<void*>(tree), this, sizeof(CordRepBtree));
686
+ new (&tree->refcount) RefcountAndFlags;
687
+ return tree;
688
+ }
689
+
690
+ inline CordRepBtree* CordRepBtree::Copy() const {
691
+ CordRepBtree* tree = CopyRaw();
692
+ for (CordRep* rep : Edges()) CordRep::Ref(rep);
693
+ return tree;
694
+ }
695
+
696
+ inline CordRepBtree* CordRepBtree::CopyToEndFrom(size_t begin,
697
+ size_t new_length) const {
698
+ assert(begin >= this->begin());
699
+ assert(begin <= this->end());
700
+ CordRepBtree* tree = CopyRaw();
701
+ tree->length = new_length;
702
+ tree->set_begin(begin);
703
+ for (CordRep* edge : tree->Edges()) CordRep::Ref(edge);
704
+ return tree;
705
+ }
706
+
707
+ inline CordRepBtree* CordRepBtree::CopyBeginTo(size_t end,
708
+ size_t new_length) const {
709
+ assert(end <= capacity());
710
+ assert(end >= this->begin());
711
+ CordRepBtree* tree = CopyRaw();
712
+ tree->length = new_length;
713
+ tree->set_end(end);
714
+ for (CordRep* edge : tree->Edges()) CordRep::Ref(edge);
715
+ return tree;
716
+ }
717
+
718
+ inline void CordRepBtree::AlignBegin() {
719
+ // The below code itself does not need to be fast as typically we have
720
+ // mono-directional append/prepend calls, and `begin` / `end` are typically
721
+ // adjusted no more than once. But we want to avoid potential register clobber
722
+ // effects, making the compiler emit register save/store/spills, and minimize
723
+ // the size of code.
724
+ const size_t delta = begin();
725
+ if (ABSL_PREDICT_FALSE(delta != 0)) {
726
+ const size_t new_end = end() - delta;
727
+ set_begin(0);
728
+ set_end(new_end);
729
+ // TODO(mvels): we can write this using 2 loads / 2 stores depending on
730
+ // total size for the kMaxCapacity = 6 case. I.e., we can branch (switch) on
731
+ // size, and then do overlapping load/store of up to 4 pointers (inlined as
732
+ // XMM, YMM or ZMM load/store) and up to 2 pointers (XMM / YMM), which is a)
733
+ // compact and b) not clobbering any registers.
734
+ ABSL_INTERNAL_ASSUME(new_end <= kMaxCapacity);
735
+ #ifdef __clang__
736
+ #pragma unroll 1
737
+ #endif
738
+ for (size_t i = 0; i < new_end; ++i) {
739
+ edges_[i] = edges_[i + delta];
740
+ }
741
+ }
742
+ }
743
+
744
+ inline void CordRepBtree::AlignEnd() {
745
+ // See comments in `AlignBegin` for motivation on the hand-rolled for loops.
746
+ const size_t delta = capacity() - end();
747
+ if (delta != 0) {
748
+ const size_t new_begin = begin() + delta;
749
+ const size_t new_end = end() + delta;
750
+ set_begin(new_begin);
751
+ set_end(new_end);
752
+ ABSL_INTERNAL_ASSUME(new_end <= kMaxCapacity);
753
+ #ifdef __clang__
754
+ #pragma unroll 1
755
+ #endif
756
+ for (size_t i = new_end - 1; i >= new_begin; --i) {
757
+ edges_[i] = edges_[i - delta];
758
+ }
759
+ }
760
+ }
761
+
762
+ template <>
763
+ inline void CordRepBtree::Add<CordRepBtree::kBack>(CordRep* rep) {
764
+ AlignBegin();
765
+ edges_[fetch_add_end(1)] = rep;
766
+ }
767
+
768
+ template <>
769
+ inline void CordRepBtree::Add<CordRepBtree::kBack>(
770
+ absl::Span<CordRep* const> edges) {
771
+ AlignBegin();
772
+ size_t new_end = end();
773
+ for (CordRep* edge : edges) edges_[new_end++] = edge;
774
+ set_end(new_end);
775
+ }
776
+
777
+ template <>
778
+ inline void CordRepBtree::Add<CordRepBtree::kFront>(CordRep* rep) {
779
+ AlignEnd();
780
+ edges_[sub_fetch_begin(1)] = rep;
781
+ }
782
+
783
+ template <>
784
+ inline void CordRepBtree::Add<CordRepBtree::kFront>(
785
+ absl::Span<CordRep* const> edges) {
786
+ AlignEnd();
787
+ size_t new_begin = begin() - edges.size();
788
+ set_begin(new_begin);
789
+ for (CordRep* edge : edges) edges_[new_begin++] = edge;
790
+ }
791
+
792
+ template <CordRepBtree::EdgeType edge_type>
793
+ inline void CordRepBtree::SetEdge(CordRep* edge) {
794
+ const int idx = edge_type == kFront ? begin() : back();
795
+ CordRep::Unref(edges_[idx]);
796
+ edges_[idx] = edge;
797
+ }
798
+
799
+ inline CordRepBtree::OpResult CordRepBtree::ToOpResult(bool owned) {
800
+ return owned ? OpResult{this, kSelf} : OpResult{Copy(), kCopied};
801
+ }
802
+
803
+ inline CordRepBtree::Position CordRepBtree::IndexOf(size_t offset) const {
804
+ assert(offset < length);
805
+ size_t index = begin();
806
+ while (offset >= edges_[index]->length) offset -= edges_[index++]->length;
807
+ return {index, offset};
808
+ }
809
+
810
+ inline CordRepBtree::Position CordRepBtree::IndexBefore(size_t offset) const {
811
+ assert(offset > 0);
812
+ assert(offset <= length);
813
+ size_t index = begin();
814
+ while (offset > edges_[index]->length) offset -= edges_[index++]->length;
815
+ return {index, offset};
816
+ }
817
+
818
+ inline CordRepBtree::Position CordRepBtree::IndexBefore(Position front,
819
+ size_t offset) const {
820
+ size_t index = front.index;
821
+ offset = offset + front.n;
822
+ while (offset > edges_[index]->length) offset -= edges_[index++]->length;
823
+ return {index, offset};
824
+ }
825
+
826
+ inline CordRepBtree::Position CordRepBtree::IndexOfLength(size_t n) const {
827
+ assert(n <= length);
828
+ size_t index = back();
829
+ size_t strip = length - n;
830
+ while (strip >= edges_[index]->length) strip -= edges_[index--]->length;
831
+ return {index, edges_[index]->length - strip};
832
+ }
833
+
834
+ inline CordRepBtree::Position CordRepBtree::IndexBeyond(
835
+ const size_t offset) const {
836
+ // We need to find the edge which `starting offset` is beyond (>=)`offset`.
837
+ // For this we can't use the `offset -= length` logic of IndexOf. Instead, we
838
+ // track the offset of the `current edge` in `off`, which we increase as we
839
+ // iterate over the edges until we find the matching edge.
840
+ size_t off = 0;
841
+ size_t index = begin();
842
+ while (offset > off) off += edges_[index++]->length;
843
+ return {index, off - offset};
844
+ }
845
+
846
+ inline CordRepBtree* CordRepBtree::Create(CordRep* rep) {
847
+ if (IsDataEdge(rep)) return New(rep);
848
+ return CreateSlow(rep);
849
+ }
850
+
851
+ inline Span<char> CordRepBtree::GetAppendBuffer(size_t size) {
852
+ assert(refcount.IsMutable());
853
+ CordRepBtree* tree = this;
854
+ const int height = this->height();
855
+ CordRepBtree* n1 = tree;
856
+ CordRepBtree* n2 = tree;
857
+ CordRepBtree* n3 = tree;
858
+ switch (height) {
859
+ case 3:
860
+ tree = tree->Edge(kBack)->btree();
861
+ if (!tree->refcount.IsMutable()) return {};
862
+ n2 = tree;
863
+ ABSL_FALLTHROUGH_INTENDED;
864
+ case 2:
865
+ tree = tree->Edge(kBack)->btree();
866
+ if (!tree->refcount.IsMutable()) return {};
867
+ n1 = tree;
868
+ ABSL_FALLTHROUGH_INTENDED;
869
+ case 1:
870
+ tree = tree->Edge(kBack)->btree();
871
+ if (!tree->refcount.IsMutable()) return {};
872
+ ABSL_FALLTHROUGH_INTENDED;
873
+ case 0:
874
+ CordRep* edge = tree->Edge(kBack);
875
+ if (!edge->refcount.IsMutable()) return {};
876
+ if (edge->tag < FLAT) return {};
877
+ size_t avail = edge->flat()->Capacity() - edge->length;
878
+ if (avail == 0) return {};
879
+ size_t delta = (std::min)(size, avail);
880
+ Span<char> span = {edge->flat()->Data() + edge->length, delta};
881
+ edge->length += delta;
882
+ switch (height) {
883
+ case 3:
884
+ n3->length += delta;
885
+ ABSL_FALLTHROUGH_INTENDED;
886
+ case 2:
887
+ n2->length += delta;
888
+ ABSL_FALLTHROUGH_INTENDED;
889
+ case 1:
890
+ n1->length += delta;
891
+ ABSL_FALLTHROUGH_INTENDED;
892
+ case 0:
893
+ tree->length += delta;
894
+ return span;
895
+ }
896
+ break;
897
+ }
898
+ return GetAppendBufferSlow(size);
899
+ }
900
+
901
+ extern template CordRepBtree* CordRepBtree::AddCordRep<CordRepBtree::kBack>(
902
+ CordRepBtree* tree, CordRep* rep);
903
+
904
+ extern template CordRepBtree* CordRepBtree::AddCordRep<CordRepBtree::kFront>(
905
+ CordRepBtree* tree, CordRep* rep);
906
+
907
+ inline CordRepBtree* CordRepBtree::Append(CordRepBtree* tree, CordRep* rep) {
908
+ if (ABSL_PREDICT_TRUE(IsDataEdge(rep))) {
909
+ return CordRepBtree::AddCordRep<kBack>(tree, rep);
910
+ }
911
+ return AppendSlow(tree, rep);
912
+ }
913
+
914
+ inline CordRepBtree* CordRepBtree::Prepend(CordRepBtree* tree, CordRep* rep) {
915
+ if (ABSL_PREDICT_TRUE(IsDataEdge(rep))) {
916
+ return CordRepBtree::AddCordRep<kFront>(tree, rep);
917
+ }
918
+ return PrependSlow(tree, rep);
919
+ }
920
+
921
+ #ifdef NDEBUG
922
+
923
+ inline CordRepBtree* CordRepBtree::AssertValid(CordRepBtree* tree,
924
+ bool /* shallow */) {
925
+ return tree;
926
+ }
927
+
928
+ inline const CordRepBtree* CordRepBtree::AssertValid(const CordRepBtree* tree,
929
+ bool /* shallow */) {
930
+ return tree;
931
+ }
932
+
933
+ #endif
934
+
935
+ } // namespace cord_internal
936
+ ABSL_NAMESPACE_END
937
+ } // namespace absl
938
+
939
+ #endif // ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_H_