grpc 1.45.0 → 1.46.2

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 (513) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +36 -29
  3. data/include/grpc/impl/codegen/grpc_types.h +7 -13
  4. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +309 -0
  5. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +122 -0
  6. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  7. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +3 -3
  8. data/src/core/ext/filters/client_channel/client_channel.cc +163 -96
  9. data/src/core/ext/filters/client_channel/client_channel.h +2 -0
  10. data/src/core/ext/filters/client_channel/health/health_check_client.cc +124 -581
  11. data/src/core/ext/filters/client_channel/health/health_check_client.h +24 -160
  12. data/src/core/ext/filters/client_channel/http_proxy.cc +88 -110
  13. data/src/core/ext/filters/client_channel/http_proxy.h +17 -0
  14. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +182 -142
  15. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -6
  16. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -10
  17. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +87 -58
  18. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +51 -48
  19. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +229 -284
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +92 -257
  22. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +51 -221
  23. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +201 -0
  24. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +106 -0
  25. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +102 -55
  26. data/src/core/ext/filters/client_channel/retry_filter.cc +18 -3
  27. data/src/core/ext/filters/client_channel/subchannel.cc +5 -5
  28. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +544 -0
  29. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +214 -0
  30. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +127 -367
  31. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +24 -1
  32. data/src/core/ext/filters/http/client/http_client_filter.cc +78 -458
  33. data/src/core/ext/filters/http/client/http_client_filter.h +21 -4
  34. data/src/core/ext/filters/http/client_authority_filter.cc +17 -22
  35. data/src/core/ext/filters/http/client_authority_filter.h +6 -5
  36. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -6
  37. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -116
  38. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +2 -8
  39. data/src/core/ext/filters/server_config_selector/server_config_selector.h +2 -2
  40. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +73 -201
  41. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -1
  42. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +5 -4
  43. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +139 -28
  44. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -0
  45. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -6
  46. data/src/core/ext/transport/chttp2/transport/internal.h +4 -2
  47. data/src/core/ext/transport/chttp2/transport/parsing.cc +8 -0
  48. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -13
  49. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +27 -24
  50. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +143 -63
  51. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +37 -35
  52. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +177 -77
  53. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +115 -111
  54. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +547 -207
  55. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +5 -5
  56. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +26 -13
  57. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +5 -5
  58. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +23 -9
  59. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +7 -7
  60. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +18 -0
  61. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +4 -4
  62. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +13 -4
  63. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +4 -4
  64. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +9 -0
  65. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +49 -46
  66. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +217 -78
  67. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +3 -3
  68. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +10 -2
  69. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +12 -12
  70. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +40 -8
  71. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +5 -5
  72. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +20 -2
  73. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +55 -55
  74. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +289 -110
  75. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +133 -125
  76. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +656 -267
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +24 -18
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +96 -23
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +185 -173
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +860 -309
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  82. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +10 -2
  83. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +44 -24
  84. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +165 -40
  85. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +72 -63
  86. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +433 -174
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +33 -31
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +154 -52
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +5 -4
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +14 -4
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +89 -89
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +460 -166
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +76 -33
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +379 -69
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +2 -2
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +14 -6
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +5 -25
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +10 -91
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +5 -5
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +26 -13
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +70 -68
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +369 -131
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +94 -65
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +447 -161
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +27 -11
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +104 -85
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +378 -113
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +2 -2
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +3 -0
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +6 -6
  112. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +30 -13
  113. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +7 -7
  114. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +43 -16
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +58 -24
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +14 -4
  119. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +18 -18
  120. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +100 -43
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +31 -30
  122. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +171 -71
  123. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  124. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +196 -95
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  126. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +7 -2
  127. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +53 -46
  128. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +284 -129
  129. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +56 -50
  130. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +337 -146
  131. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +13 -11
  132. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +49 -14
  133. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +4 -4
  134. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +14 -4
  135. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +5 -5
  136. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +20 -4
  137. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +33 -32
  138. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +205 -86
  139. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +34 -34
  140. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +175 -74
  141. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +56 -52
  142. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +370 -146
  143. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +27 -23
  144. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +173 -74
  145. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +362 -341
  146. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2056 -845
  147. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +11 -11
  148. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +49 -16
  149. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +56 -50
  150. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +293 -111
  151. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +3 -3
  152. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -0
  153. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +3 -3
  154. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +10 -2
  155. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +5 -5
  156. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +26 -10
  157. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +5 -5
  158. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +27 -12
  159. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +17 -16
  160. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +83 -36
  161. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +2 -2
  162. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +7 -2
  163. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +8 -8
  164. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +46 -17
  165. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +9 -9
  166. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +38 -12
  167. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +7 -7
  168. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +30 -10
  169. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +2 -2
  170. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +10 -6
  171. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +15 -15
  172. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +71 -28
  173. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +25 -25
  174. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +149 -65
  175. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +8 -7
  176. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +30 -12
  177. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +9 -9
  178. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +42 -15
  179. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +173 -144
  180. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +898 -323
  181. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +51 -45
  182. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +261 -116
  183. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +13 -13
  184. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +70 -25
  185. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +80 -55
  186. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +410 -124
  187. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +5 -5
  188. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +23 -9
  189. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  190. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +44 -44
  191. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +261 -122
  192. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +8 -8
  193. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +47 -21
  194. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +32 -32
  195. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +175 -66
  196. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +4 -4
  197. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +17 -6
  198. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
  199. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +38 -17
  200. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +8 -8
  201. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +12 -0
  202. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +7 -7
  203. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +43 -18
  204. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +3 -3
  205. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +20 -9
  206. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +3 -3
  207. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +24 -9
  208. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +2 -2
  209. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +14 -6
  210. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +8 -8
  211. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +40 -16
  212. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +9 -9
  213. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +70 -25
  214. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +5 -5
  215. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +37 -18
  216. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +12 -12
  217. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +81 -30
  218. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +16 -16
  219. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +76 -30
  220. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +20 -20
  221. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +90 -30
  222. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +7 -7
  223. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +28 -10
  224. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +2 -2
  225. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +3 -0
  226. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +5 -5
  227. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +13 -4
  228. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +9 -9
  229. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -0
  230. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +4 -4
  231. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +9 -0
  232. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +5 -5
  233. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +17 -4
  234. data/src/core/ext/upb-generated/google/api/annotations.upb.c +3 -3
  235. data/src/core/ext/upb-generated/google/api/annotations.upb.h +17 -2
  236. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +70 -66
  237. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +410 -162
  238. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +80 -74
  239. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +440 -158
  240. data/src/core/ext/upb-generated/google/api/http.upb.c +17 -17
  241. data/src/core/ext/upb-generated/google/api/http.upb.h +116 -43
  242. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +4 -4
  243. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +19 -7
  244. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +3 -3
  245. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -0
  246. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +163 -162
  247. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1157 -435
  248. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +3 -3
  249. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +10 -4
  250. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  251. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  252. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +108 -40
  253. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +3 -3
  254. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +10 -4
  255. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +18 -18
  256. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -0
  257. data/src/core/ext/upb-generated/google/rpc/status.upb.c +4 -4
  258. data/src/core/ext/upb-generated/google/rpc/status.upb.h +19 -7
  259. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +15 -15
  260. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +65 -22
  261. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  262. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +49 -12
  263. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +69 -65
  264. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +364 -149
  265. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +8 -7
  266. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +20 -4
  267. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +4 -4
  268. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -0
  269. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  270. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +150 -58
  271. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +11 -11
  272. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +51 -18
  273. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  274. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +764 -0
  275. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +22 -22
  276. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +97 -10
  277. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +6 -6
  278. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +23 -2
  279. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +3 -3
  280. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +10 -2
  281. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +6 -6
  282. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +27 -6
  283. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +5 -5
  284. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +20 -2
  285. data/src/core/ext/upb-generated/validate/validate.upb.c +261 -250
  286. data/src/core/ext/upb-generated/validate/validate.upb.h +1836 -663
  287. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +22 -22
  288. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +97 -10
  289. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +6 -6
  290. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +23 -2
  291. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +3 -3
  292. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +10 -2
  293. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +18 -18
  294. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +70 -10
  295. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +5 -5
  296. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +20 -2
  297. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +2 -2
  298. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +3 -0
  299. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  300. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +38 -12
  301. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +5 -5
  302. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +27 -10
  303. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +3 -3
  304. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +10 -2
  305. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  306. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +21 -8
  307. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +10 -10
  308. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +71 -30
  309. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +5 -5
  310. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +16 -2
  311. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +12 -12
  312. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +69 -26
  313. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +43 -39
  314. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +255 -103
  315. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +4 -4
  316. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +19 -8
  317. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +9 -9
  318. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +70 -25
  319. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +3 -3
  320. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +10 -2
  321. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +50 -46
  322. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +195 -185
  323. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -12
  324. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +129 -94
  325. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +10 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +18 -33
  327. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +0 -5
  328. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +163 -155
  329. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +5 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +141 -138
  331. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +26 -20
  332. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +738 -730
  333. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +271 -251
  334. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  335. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +207 -193
  336. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -0
  337. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  338. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  339. data/src/core/ext/xds/certificate_provider_store.cc +8 -0
  340. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  341. data/src/core/ext/xds/xds_api.cc +20 -0
  342. data/src/core/ext/xds/xds_certificate_provider.cc +2 -0
  343. data/src/core/ext/xds/xds_certificate_provider.h +8 -0
  344. data/src/core/ext/xds/xds_client.cc +83 -93
  345. data/src/core/ext/xds/xds_client.h +11 -4
  346. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +142 -0
  347. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +79 -0
  348. data/src/core/ext/xds/xds_common_types.cc +9 -9
  349. data/src/core/ext/xds/xds_common_types.h +3 -3
  350. data/src/core/ext/xds/xds_endpoint.cc +12 -5
  351. data/src/core/ext/xds/xds_http_fault_filter.cc +1 -1
  352. data/src/core/ext/xds/xds_listener.cc +1 -1
  353. data/src/core/ext/xds/xds_route_config.cc +162 -25
  354. data/src/core/ext/xds/xds_route_config.h +13 -10
  355. data/src/core/ext/xds/xds_server_config_fetcher.cc +17 -22
  356. data/src/core/lib/avl/avl.h +68 -5
  357. data/src/core/lib/channel/call_tracer.h +4 -1
  358. data/src/core/lib/channel/channel_args.cc +138 -59
  359. data/src/core/lib/channel/channel_args.h +210 -9
  360. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -9
  361. data/src/core/lib/channel/channel_args_preconditioning.h +1 -2
  362. data/src/core/lib/channel/channel_stack.h +2 -5
  363. data/src/core/lib/channel/channel_stack_builder.cc +0 -65
  364. data/src/core/lib/channel/channel_stack_builder.h +27 -6
  365. data/src/core/lib/channel/channel_stack_builder_impl.cc +102 -0
  366. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  367. data/src/core/lib/channel/connected_channel.h +1 -0
  368. data/src/core/lib/channel/promise_based_filter.cc +495 -162
  369. data/src/core/lib/channel/promise_based_filter.h +55 -41
  370. data/src/core/lib/compression/compression_internal.cc +1 -7
  371. data/src/core/lib/debug/stats_data.cc +2 -6
  372. data/src/core/lib/debug/stats_data.h +18 -21
  373. data/src/core/lib/gpr/tls.h +1 -0
  374. data/src/core/lib/gprpp/bitset.h +12 -0
  375. data/src/core/lib/gprpp/cpp_impl_of.h +4 -0
  376. data/src/core/lib/gprpp/match.h +73 -0
  377. data/src/core/lib/gprpp/overload.h +59 -0
  378. data/src/core/lib/gprpp/ref_counted.h +2 -0
  379. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  380. data/src/core/lib/gprpp/status_helper.cc +18 -2
  381. data/src/core/lib/gprpp/time.cc +12 -0
  382. data/src/core/lib/gprpp/time.h +1 -1
  383. data/src/core/lib/http/format_request.cc +1 -2
  384. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  385. data/src/core/lib/http/parser.cc +80 -9
  386. data/src/core/lib/http/parser.h +14 -1
  387. data/src/core/lib/iomgr/ev_posix.cc +6 -7
  388. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  389. data/src/core/lib/iomgr/port.h +0 -2
  390. data/src/core/lib/iomgr/tcp_client_posix.cc +2 -2
  391. data/src/core/lib/iomgr/tcp_posix.cc +93 -35
  392. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -17
  393. data/src/core/lib/json/json_util.h +3 -3
  394. data/src/core/lib/promise/call_push_pull.h +144 -0
  395. data/src/core/lib/promise/detail/status.h +2 -1
  396. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  397. data/src/core/lib/promise/latch.h +104 -0
  398. data/src/core/lib/resource_quota/api.cc +5 -30
  399. data/src/core/lib/resource_quota/api.h +1 -1
  400. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  401. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  402. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +9 -12
  403. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +5 -6
  404. data/src/core/lib/security/context/security_context.h +8 -1
  405. data/src/core/lib/security/credentials/alts/alts_credentials.cc +6 -5
  406. data/src/core/lib/security/credentials/alts/alts_credentials.h +4 -0
  407. data/src/core/lib/security/credentials/call_creds_util.cc +3 -3
  408. data/src/core/lib/security/credentials/call_creds_util.h +2 -2
  409. data/src/core/lib/security/credentials/composite/composite_credentials.cc +15 -10
  410. data/src/core/lib/security/credentials/composite/composite_credentials.h +9 -8
  411. data/src/core/lib/security/credentials/credentials.h +16 -33
  412. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -12
  413. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -5
  414. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -0
  415. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +3 -3
  416. data/src/core/lib/security/credentials/iam/iam_credentials.cc +5 -4
  417. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -2
  418. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +22 -29
  419. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +57 -0
  420. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -3
  421. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +6 -2
  422. data/src/core/lib/security/credentials/local/local_credentials.cc +6 -6
  423. data/src/core/lib/security/credentials/local/local_credentials.h +4 -0
  424. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -9
  425. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +14 -6
  426. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -6
  427. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +8 -6
  428. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +6 -4
  429. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +8 -0
  430. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +49 -0
  431. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +8 -0
  432. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +42 -3
  433. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +66 -95
  434. data/src/core/lib/security/credentials/tls/tls_credentials.cc +9 -6
  435. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -5
  436. data/src/core/lib/security/credentials/xds/xds_credentials.cc +48 -50
  437. data/src/core/lib/security/credentials/xds/xds_credentials.h +31 -5
  438. data/src/core/lib/security/security_connector/local/local_security_connector.cc +2 -2
  439. data/src/core/lib/security/security_connector/security_connector.h +9 -0
  440. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -2
  441. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -2
  442. data/src/core/lib/security/transport/auth_filters.h +7 -7
  443. data/src/core/lib/security/transport/client_auth_filter.cc +28 -20
  444. data/src/core/lib/security/transport/secure_endpoint.cc +198 -129
  445. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  446. data/src/core/lib/security/transport/security_handshaker.cc +6 -4
  447. data/src/core/lib/surface/call.cc +1023 -903
  448. data/src/core/lib/surface/call.h +0 -14
  449. data/src/core/lib/surface/channel.cc +4 -3
  450. data/src/core/lib/surface/channel_init.cc +2 -3
  451. data/src/core/lib/surface/channel_init.h +2 -6
  452. data/src/core/lib/surface/init.cc +1 -1
  453. data/src/core/lib/surface/server.cc +3 -14
  454. data/src/core/lib/surface/server.h +1 -2
  455. data/src/core/lib/surface/version.cc +2 -2
  456. data/src/core/lib/transport/byte_stream.cc +2 -0
  457. data/src/core/lib/transport/metadata_batch.h +12 -8
  458. data/src/core/lib/transport/transport.h +20 -5
  459. data/src/core/lib/transport/transport_impl.h +4 -3
  460. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -4
  461. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  462. data/src/core/tsi/ssl_transport_security.cc +75 -38
  463. data/src/core/tsi/ssl_transport_security.h +8 -2
  464. data/src/core/tsi/transport_security_interface.h +2 -0
  465. data/src/ruby/ext/grpc/extconf.rb +1 -1
  466. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  467. data/src/ruby/lib/grpc/grpc.rb +1 -1
  468. data/src/ruby/lib/grpc/version.rb +1 -1
  469. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  470. data/src/ruby/pb/test/client.rb +769 -0
  471. data/src/ruby/pb/test/server.rb +252 -0
  472. data/src/ruby/pb/test/xds_client.rb +415 -0
  473. data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
  474. data/third_party/upb/upb/decode.c +32 -16
  475. data/third_party/upb/upb/def.c +118 -55
  476. data/third_party/upb/upb/def.h +12 -3
  477. data/third_party/upb/upb/encode.c +14 -8
  478. data/third_party/upb/upb/json_encode.c +776 -0
  479. data/third_party/upb/upb/json_encode.h +62 -0
  480. data/third_party/upb/upb/msg.c +5 -7
  481. data/third_party/upb/upb/msg.h +1 -2
  482. data/third_party/upb/upb/msg_internal.h +49 -36
  483. data/third_party/upb/upb/port_def.inc +8 -0
  484. data/third_party/upb/upb/port_undef.inc +1 -0
  485. data/third_party/upb/upb/table.c +10 -6
  486. data/third_party/upb/upb/table_internal.h +2 -0
  487. data/third_party/upb/upb/upb.h +41 -11
  488. data/third_party/zlib/crc32.c +966 -292
  489. data/third_party/zlib/crc32.h +9441 -436
  490. data/third_party/zlib/deflate.c +78 -30
  491. data/third_party/zlib/deflate.h +12 -15
  492. data/third_party/zlib/gzguts.h +3 -2
  493. data/third_party/zlib/gzlib.c +5 -3
  494. data/third_party/zlib/gzread.c +5 -7
  495. data/third_party/zlib/gzwrite.c +25 -13
  496. data/third_party/zlib/infback.c +2 -1
  497. data/third_party/zlib/inffast.c +14 -14
  498. data/third_party/zlib/inflate.c +39 -8
  499. data/third_party/zlib/inflate.h +3 -2
  500. data/third_party/zlib/inftrees.c +3 -3
  501. data/third_party/zlib/trees.c +27 -48
  502. data/third_party/zlib/zlib.h +123 -100
  503. data/third_party/zlib/zutil.c +2 -2
  504. data/third_party/zlib/zutil.h +12 -9
  505. metadata +66 -45
  506. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
  507. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
  508. data/src/core/ext/filters/max_age/max_age_filter.h +0 -26
  509. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
  510. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  511. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  512. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  513. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
@@ -61,6 +61,7 @@
61
61
  #include "src/core/lib/profiling/timers.h"
62
62
  #include "src/core/lib/resource_quota/api.h"
63
63
  #include "src/core/lib/resource_quota/memory_quota.h"
64
+ #include "src/core/lib/resource_quota/trace.h"
64
65
  #include "src/core/lib/slice/slice_internal.h"
65
66
  #include "src/core/lib/slice/slice_string_helpers.h"
66
67
 
@@ -365,6 +366,7 @@ struct grpc_tcp {
365
366
  /* Used by the endpoint read function to distinguish the very first read call
366
367
  * from the rest */
367
368
  bool is_first_read;
369
+ bool has_posted_reclaimer;
368
370
  double target_length;
369
371
  double bytes_read_this_round;
370
372
  grpc_core::RefCount refcount;
@@ -376,7 +378,8 @@ struct grpc_tcp {
376
378
  /* garbage after the last read */
377
379
  grpc_slice_buffer last_read_buffer;
378
380
 
379
- grpc_slice_buffer* incoming_buffer;
381
+ absl::Mutex read_mu;
382
+ grpc_slice_buffer* incoming_buffer ABSL_GUARDED_BY(read_mu) = nullptr;
380
383
  int inq; /* bytes pending on the socket from the last read. */
381
384
  bool inq_capable; /* cache whether kernel supports inq */
382
385
 
@@ -423,6 +426,9 @@ struct grpc_tcp {
423
426
  on errors anymore */
424
427
  TcpZerocopySendCtx tcp_zerocopy_send_ctx;
425
428
  TcpZerocopySendRecord* current_zerocopy_send = nullptr;
429
+
430
+ bool curr_read_completed;
431
+ int curr_min_read_chunk_size;
426
432
  };
427
433
 
428
434
  struct backup_poller {
@@ -661,9 +667,35 @@ static void tcp_destroy(grpc_endpoint* ep) {
661
667
  TCP_UNREF(tcp, "destroy");
662
668
  }
663
669
 
664
- static void call_read_cb(grpc_tcp* tcp, grpc_error_handle error) {
665
- grpc_closure* cb = tcp->read_cb;
670
+ static void perform_reclamation(grpc_tcp* tcp)
671
+ ABSL_LOCKS_EXCLUDED(tcp->read_mu) {
672
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_resource_quota_trace)) {
673
+ gpr_log(GPR_INFO, "TCP: benign reclamation to free memory");
674
+ }
675
+ tcp->read_mu.Lock();
676
+ if (tcp->incoming_buffer != nullptr) {
677
+ grpc_slice_buffer_reset_and_unref_internal(tcp->incoming_buffer);
678
+ }
679
+ tcp->read_mu.Unlock();
680
+ tcp->has_posted_reclaimer = false;
681
+ }
666
682
 
683
+ static void maybe_post_reclaimer(grpc_tcp* tcp)
684
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) {
685
+ if (!tcp->has_posted_reclaimer) {
686
+ tcp->has_posted_reclaimer = true;
687
+ tcp->memory_owner.PostReclaimer(
688
+ grpc_core::ReclamationPass::kBenign,
689
+ [tcp](absl::optional<grpc_core::ReclamationSweep> sweep) {
690
+ if (!sweep.has_value()) return;
691
+ perform_reclamation(tcp);
692
+ });
693
+ }
694
+ }
695
+
696
+ static void tcp_trace_read(grpc_tcp* tcp, grpc_error_handle error)
697
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) {
698
+ grpc_closure* cb = tcp->read_cb;
667
699
  if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
668
700
  gpr_log(GPR_INFO, "TCP:%p call_cb %p %p:%p", tcp, cb, cb->cb, cb->cb_arg);
669
701
  size_t i;
@@ -678,15 +710,16 @@ static void call_read_cb(grpc_tcp* tcp, grpc_error_handle error) {
678
710
  }
679
711
  }
680
712
  }
681
-
682
- tcp->read_cb = nullptr;
683
- tcp->incoming_buffer = nullptr;
684
- grpc_core::Closure::Run(DEBUG_LOCATION, cb, error);
685
713
  }
686
714
 
715
+ /* Returns true if data available to read or error other than EAGAIN. */
687
716
  #define MAX_READ_IOVEC 4
688
- static void tcp_do_read(grpc_tcp* tcp) {
717
+ static bool tcp_do_read(grpc_tcp* tcp, grpc_error_handle* error)
718
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) {
689
719
  GPR_TIMER_SCOPE("tcp_do_read", 0);
720
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
721
+ gpr_log(GPR_INFO, "TCP:%p do_read", tcp);
722
+ }
690
723
  struct msghdr msg;
691
724
  struct iovec iov[MAX_READ_IOVEC];
692
725
  ssize_t read_bytes;
@@ -746,17 +779,16 @@ static void tcp_do_read(grpc_tcp* tcp) {
746
779
  /* NB: After calling call_read_cb a parallel call of the read handler may
747
780
  * be running. */
748
781
  if (errno == EAGAIN) {
782
+ tcp->curr_read_completed = true;
749
783
  finish_estimate(tcp);
750
784
  tcp->inq = 0;
751
- /* We've consumed the edge, request a new one */
752
- notify_on_read(tcp);
785
+ return false;
753
786
  } else {
787
+ tcp->curr_read_completed = false;
754
788
  grpc_slice_buffer_reset_and_unref_internal(tcp->incoming_buffer);
755
- call_read_cb(tcp,
756
- tcp_annotate_error(GRPC_OS_ERROR(errno, "recvmsg"), tcp));
757
- TCP_UNREF(tcp, "read");
789
+ *error = tcp_annotate_error(GRPC_OS_ERROR(errno, "recvmsg"), tcp);
790
+ return true;
758
791
  }
759
- return;
760
792
  }
761
793
  if (read_bytes == 0) {
762
794
  /* 0 read size ==> end of stream
@@ -764,12 +796,11 @@ static void tcp_do_read(grpc_tcp* tcp) {
764
796
  * We may have read something, i.e., total_read_bytes > 0, but
765
797
  * since the connection is closed we will drop the data here, because we
766
798
  * can't call the callback multiple times. */
799
+ tcp->curr_read_completed = true;
767
800
  grpc_slice_buffer_reset_and_unref_internal(tcp->incoming_buffer);
768
- call_read_cb(
769
- tcp, tcp_annotate_error(
770
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Socket closed"), tcp));
771
- TCP_UNREF(tcp, "read");
772
- return;
801
+ *error = tcp_annotate_error(
802
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Socket closed"), tcp);
803
+ return true;
773
804
  }
774
805
 
775
806
  GRPC_STATS_INC_TCP_READ_SIZE(read_bytes);
@@ -822,17 +853,20 @@ static void tcp_do_read(grpc_tcp* tcp) {
822
853
  finish_estimate(tcp);
823
854
  }
824
855
 
856
+ // There may be more data to be read because recvmsg did not return EAGAIN.
857
+ tcp->curr_read_completed = false;
825
858
  GPR_DEBUG_ASSERT(total_read_bytes > 0);
826
859
  if (total_read_bytes < tcp->incoming_buffer->length) {
827
860
  grpc_slice_buffer_trim_end(tcp->incoming_buffer,
828
861
  tcp->incoming_buffer->length - total_read_bytes,
829
862
  &tcp->last_read_buffer);
830
863
  }
831
- call_read_cb(tcp, GRPC_ERROR_NONE);
832
- TCP_UNREF(tcp, "read");
864
+ *error = GRPC_ERROR_NONE;
865
+ return true;
833
866
  }
834
867
 
835
- static void tcp_continue_read(grpc_tcp* tcp) {
868
+ static void maybe_make_read_slices(grpc_tcp* tcp)
869
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) {
836
870
  if (tcp->incoming_buffer->length == 0 &&
837
871
  tcp->incoming_buffer->count < MAX_READ_IOVEC) {
838
872
  if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
@@ -845,17 +879,24 @@ static void tcp_continue_read(grpc_tcp* tcp) {
845
879
  int target_length = static_cast<int>(tcp->target_length);
846
880
  int extra_wanted =
847
881
  target_length - static_cast<int>(tcp->incoming_buffer->length);
882
+ if (tcp->curr_read_completed) {
883
+ // Set it to false again to start the next block of reads
884
+ tcp->curr_read_completed = false;
885
+ // Reset curr_min_read_chunk_size for the next block of reads
886
+ tcp->curr_min_read_chunk_size = tcp->min_read_chunk_size;
887
+ } else {
888
+ // Last read is not completed yet. Double the last min read chunk size.
889
+ tcp->curr_min_read_chunk_size =
890
+ std::min(2 * tcp->curr_min_read_chunk_size, tcp->max_read_chunk_size);
891
+ }
848
892
  grpc_slice_buffer_add_indexed(
849
893
  tcp->incoming_buffer,
850
894
  tcp->memory_owner.MakeSlice(grpc_core::MemoryRequest(
851
- tcp->min_read_chunk_size,
852
- grpc_core::Clamp(extra_wanted, tcp->min_read_chunk_size,
895
+ tcp->curr_min_read_chunk_size,
896
+ grpc_core::Clamp(extra_wanted, tcp->curr_min_read_chunk_size,
853
897
  tcp->max_read_chunk_size))));
898
+ maybe_post_reclaimer(tcp);
854
899
  }
855
- if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
856
- gpr_log(GPR_INFO, "TCP:%p do_read", tcp);
857
- }
858
- tcp_do_read(tcp);
859
900
  }
860
901
 
861
902
  static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error_handle error) {
@@ -864,15 +905,28 @@ static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error_handle error) {
864
905
  gpr_log(GPR_INFO, "TCP:%p got_read: %s", tcp,
865
906
  grpc_error_std_string(error).c_str());
866
907
  }
867
-
868
- if (GPR_UNLIKELY(error != GRPC_ERROR_NONE)) {
908
+ tcp->read_mu.Lock();
909
+ grpc_error_handle tcp_read_error;
910
+ if (GPR_LIKELY(error == GRPC_ERROR_NONE)) {
911
+ maybe_make_read_slices(tcp);
912
+ if (!tcp_do_read(tcp, &tcp_read_error)) {
913
+ /* We've consumed the edge, request a new one */
914
+ tcp->read_mu.Unlock();
915
+ notify_on_read(tcp);
916
+ return;
917
+ }
918
+ tcp_trace_read(tcp, tcp_read_error);
919
+ } else {
920
+ tcp_read_error = GRPC_ERROR_REF(error);
869
921
  grpc_slice_buffer_reset_and_unref_internal(tcp->incoming_buffer);
870
922
  grpc_slice_buffer_reset_and_unref_internal(&tcp->last_read_buffer);
871
- call_read_cb(tcp, GRPC_ERROR_REF(error));
872
- TCP_UNREF(tcp, "read");
873
- } else {
874
- tcp_continue_read(tcp);
875
923
  }
924
+ grpc_closure* cb = tcp->read_cb;
925
+ tcp->read_cb = nullptr;
926
+ tcp->incoming_buffer = nullptr;
927
+ tcp->read_mu.Unlock();
928
+ grpc_core::Closure::Run(DEBUG_LOCATION, cb, tcp_read_error);
929
+ TCP_UNREF(tcp, "read");
876
930
  }
877
931
 
878
932
  static void tcp_read(grpc_endpoint* ep, grpc_slice_buffer* incoming_buffer,
@@ -880,9 +934,11 @@ static void tcp_read(grpc_endpoint* ep, grpc_slice_buffer* incoming_buffer,
880
934
  grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
881
935
  GPR_ASSERT(tcp->read_cb == nullptr);
882
936
  tcp->read_cb = cb;
937
+ tcp->read_mu.Lock();
883
938
  tcp->incoming_buffer = incoming_buffer;
884
939
  grpc_slice_buffer_reset_and_unref_internal(incoming_buffer);
885
940
  grpc_slice_buffer_swap(incoming_buffer, &tcp->last_read_buffer);
941
+ tcp->read_mu.Unlock();
886
942
  TCP_REF(tcp, "read");
887
943
  if (tcp->is_first_read) {
888
944
  /* Endpoint read called for the very first time. Register read callback with
@@ -1741,17 +1797,19 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
1741
1797
  tcp->current_zerocopy_send = nullptr;
1742
1798
  tcp->release_fd_cb = nullptr;
1743
1799
  tcp->release_fd = nullptr;
1744
- tcp->incoming_buffer = nullptr;
1745
1800
  tcp->target_length = static_cast<double>(tcp_read_chunk_size);
1746
1801
  tcp->min_read_chunk_size = tcp_min_read_chunk_size;
1747
1802
  tcp->max_read_chunk_size = tcp_max_read_chunk_size;
1748
1803
  tcp->bytes_read_this_round = 0;
1749
1804
  /* Will be set to false by the very first endpoint read function */
1750
1805
  tcp->is_first_read = true;
1806
+ tcp->has_posted_reclaimer = false;
1751
1807
  tcp->bytes_counter = -1;
1752
1808
  tcp->socket_ts_enabled = false;
1753
1809
  tcp->ts_capable = true;
1754
1810
  tcp->outgoing_buffer_arg = nullptr;
1811
+ tcp->curr_read_completed = true;
1812
+ tcp->curr_min_read_chunk_size = tcp->min_read_chunk_size;
1755
1813
  if (tcp_tx_zerocopy_enabled && !tcp->tcp_zerocopy_send_ctx.memory_limited()) {
1756
1814
  #ifdef GRPC_LINUX_ERRQUEUE
1757
1815
  const int enable = 1;
@@ -29,6 +29,7 @@
29
29
 
30
30
  #include <errno.h>
31
31
  #include <fcntl.h>
32
+ #include <inttypes.h>
32
33
  #include <netinet/in.h>
33
34
  #include <netinet/tcp.h>
34
35
  #include <string.h>
@@ -61,6 +62,8 @@
61
62
  #include "src/core/lib/iomgr/unix_sockets_posix.h"
62
63
  #include "src/core/lib/resource_quota/api.h"
63
64
 
65
+ static std::atomic<int64_t> num_dropped_connections{0};
66
+
64
67
  static grpc_error_handle tcp_server_create(grpc_closure* shutdown_complete,
65
68
  const grpc_channel_args* args,
66
69
  grpc_tcp_server** server) {
@@ -201,27 +204,33 @@ static void on_read(void* arg, grpc_error_handle err) {
201
204
  strip off the ::ffff:0.0.0.0/96 prefix first. */
202
205
  int fd = grpc_accept4(sp->fd, &addr, 1, 1);
203
206
  if (fd < 0) {
204
- switch (errno) {
205
- case EINTR:
206
- continue;
207
- case EAGAIN:
208
- grpc_fd_notify_on_read(sp->emfd, &sp->read_closure);
209
- return;
210
- default:
211
- gpr_mu_lock(&sp->server->mu);
212
- if (!sp->server->shutdown_listeners) {
213
- gpr_log(GPR_ERROR, "Failed accept4: %s", strerror(errno));
214
- } else {
215
- /* if we have shutdown listeners, accept4 could fail, and we
216
- needn't notify users */
217
- }
218
- gpr_mu_unlock(&sp->server->mu);
219
- goto error;
207
+ if (errno == EINTR) {
208
+ continue;
209
+ } else if (errno == EAGAIN || errno == ECONNABORTED ||
210
+ errno == EWOULDBLOCK) {
211
+ grpc_fd_notify_on_read(sp->emfd, &sp->read_closure);
212
+ return;
213
+ } else {
214
+ gpr_mu_lock(&sp->server->mu);
215
+ if (!sp->server->shutdown_listeners) {
216
+ gpr_log(GPR_ERROR, "Failed accept4: %s", strerror(errno));
217
+ } else {
218
+ /* if we have shutdown listeners, accept4 could fail, and we
219
+ needn't notify users */
220
+ }
221
+ gpr_mu_unlock(&sp->server->mu);
222
+ goto error;
220
223
  }
221
224
  }
222
225
 
223
226
  if (sp->server->memory_quota->IsMemoryPressureHigh()) {
224
- gpr_log(GPR_INFO, "Drop incoming connection: high memory pressure");
227
+ int64_t dropped_connections_count = ++num_dropped_connections;
228
+ if (dropped_connections_count % 1000 == 0) {
229
+ gpr_log(GPR_INFO,
230
+ "Dropped >= %" PRId64
231
+ " new connection attempts due to high memory pressure",
232
+ dropped_connections_count);
233
+ }
225
234
  close(fd);
226
235
  continue;
227
236
  }
@@ -45,9 +45,9 @@ bool ExtractJsonNumber(const Json& json, absl::string_view field_name,
45
45
  NumericType* output,
46
46
  std::vector<grpc_error_handle>* error_list) {
47
47
  static_assert(std::is_integral<NumericType>::value, "Integral required");
48
- if (json.type() != Json::Type::NUMBER) {
49
- error_list->push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
50
- absl::StrCat("field:", field_name, " error:type should be NUMBER")));
48
+ if (json.type() != Json::Type::NUMBER && json.type() != Json::Type::STRING) {
49
+ error_list->push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
50
+ "field:", field_name, " error:type should be NUMBER or STRING")));
51
51
  return false;
52
52
  }
53
53
  if (!absl::SimpleAtoi(json.string_value(), output)) {
@@ -0,0 +1,144 @@
1
+ // Copyright 2022 gRPC 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
+ // http://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 GRPC_CORE_LIB_PROMISE_CALL_PUSH_PULL_H
16
+ #define GRPC_CORE_LIB_PROMISE_CALL_PUSH_PULL_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <assert.h>
21
+
22
+ #include "src/core/lib/gprpp/bitset.h"
23
+ #include "src/core/lib/gprpp/construct_destruct.h"
24
+ #include "src/core/lib/promise/detail/promise_like.h"
25
+ #include "src/core/lib/promise/detail/status.h"
26
+ #include "src/core/lib/promise/poll.h"
27
+
28
+ namespace grpc_core {
29
+
30
+ namespace promise_detail {
31
+
32
+ template <typename FMain, typename FPush, typename FPull>
33
+ class CallPushPull {
34
+ public:
35
+ CallPushPull(FMain f_main, FPush f_push, FPull f_pull)
36
+ : push_(std::move(f_push)), pull_(std::move(f_pull)) {
37
+ Construct(&main_, std::move(f_main));
38
+ }
39
+
40
+ CallPushPull(const CallPushPull&) = delete;
41
+ CallPushPull& operator=(const CallPushPull&) = delete;
42
+ CallPushPull(CallPushPull&& other) noexcept
43
+ : done_(other.done_),
44
+ push_(std::move(other.push_)),
45
+ pull_(std::move(other.pull_)) {
46
+ assert(!done_.is_set(kDoneMain));
47
+ Construct(&main_, std::move(other.main_));
48
+ }
49
+
50
+ CallPushPull& operator=(CallPushPull&& other) noexcept {
51
+ assert(!done_.is_set(kDoneMain));
52
+ done_ = other.done_;
53
+ assert(!done_.is_set(kDoneMain));
54
+ push_ = std::move(other.push_);
55
+ main_ = std::move(other.main_);
56
+ pull_ = std::move(other.pull_);
57
+ return *this;
58
+ }
59
+
60
+ ~CallPushPull() {
61
+ if (done_.is_set(kDoneMain)) {
62
+ Destruct(&result_);
63
+ } else {
64
+ Destruct(&main_);
65
+ }
66
+ }
67
+
68
+ using Result =
69
+ typename PollTraits<decltype(std::declval<PromiseLike<FMain>>()())>::Type;
70
+
71
+ Poll<Result> operator()() {
72
+ if (!done_.is_set(kDonePush)) {
73
+ auto p = push_();
74
+ if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
75
+ if (IsStatusOk(*status)) {
76
+ done_.set(kDonePush);
77
+ } else {
78
+ return Result(std::move(*status));
79
+ }
80
+ }
81
+ }
82
+ if (!done_.is_set(kDoneMain)) {
83
+ auto p = main_();
84
+ if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
85
+ if (IsStatusOk(*status)) {
86
+ done_.set(kDoneMain);
87
+ Destruct(&main_);
88
+ Construct(&result_, std::move(*status));
89
+ } else {
90
+ return std::move(*status);
91
+ }
92
+ }
93
+ }
94
+ if (!done_.is_set(kDonePull)) {
95
+ auto p = pull_();
96
+ if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
97
+ if (IsStatusOk(*status)) {
98
+ done_.set(kDonePull);
99
+ } else {
100
+ return Result(std::move(*status));
101
+ }
102
+ }
103
+ }
104
+ if (done_.all()) return std::move(result_);
105
+ return Pending{};
106
+ }
107
+
108
+ private:
109
+ enum { kDonePull = 0, kDoneMain = 1, kDonePush = 2 };
110
+ BitSet<3> done_;
111
+ GPR_NO_UNIQUE_ADDRESS PromiseLike<FPush> push_;
112
+ union {
113
+ PromiseLike<FMain> main_;
114
+ Result result_;
115
+ };
116
+ GPR_NO_UNIQUE_ADDRESS PromiseLike<FPull> pull_;
117
+ };
118
+
119
+ } // namespace promise_detail
120
+
121
+ // For promises representing calls a common pattern emerges:
122
+ // There's a process pushing data down the stack, a process handling the main
123
+ // call part, and a process pulling data back up the stack.
124
+ //
125
+ // This can reasonably be represented by the right combinations of TryJoins and
126
+ // Maps, but since the structure is fundamental to the domain we introduce
127
+ // this simple helper to make it easier to write the common case.
128
+ //
129
+ // It takes three promises: the main call, the push and the pull.
130
+ // When polling, the push is polled first, then the main call (descending the
131
+ // stack), then the pull (as we ascend once more).
132
+ //
133
+ // This strategy minimizes repolls.
134
+ template <typename FMain, typename FPush, typename FPull>
135
+ promise_detail::CallPushPull<FMain, FPush, FPull> CallPushPull(FMain f_main,
136
+ FPush f_push,
137
+ FPull f_pull) {
138
+ return promise_detail::CallPushPull<FMain, FPush, FPull>(
139
+ std::move(f_main), std::move(f_push), std::move(f_pull));
140
+ }
141
+
142
+ } // namespace grpc_core
143
+
144
+ #endif // GRPC_CORE_LIB_PROMISE_CALL_PUSH_PULL_H
@@ -39,11 +39,12 @@ inline absl::Status IntoStatus(absl::Status* status) {
39
39
  }
40
40
 
41
41
  } // namespace promise_detail
42
- } // namespace grpc_core
43
42
 
44
43
  // Return true if the status represented by the argument is ok, false if not.
45
44
  // By implementing this function for other, non-absl::Status types, those types
46
45
  // can participate in TrySeq as result types that affect control flow.
47
46
  inline bool IsStatusOk(const absl::Status& status) { return status.ok(); }
48
47
 
48
+ } // namespace grpc_core
49
+
49
50
  #endif // GRPC_CORE_LIB_PROMISE_DETAIL_STATUS_H
@@ -0,0 +1,49 @@
1
+ // Copyright 2021 gRPC 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
+ // http://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 GRPC_CORE_LIB_PROMISE_INTRA_ACTIVITY_WAITER_H
16
+ #define GRPC_CORE_LIB_PROMISE_INTRA_ACTIVITY_WAITER_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include "src/core/lib/promise/activity.h"
21
+ #include "src/core/lib/promise/poll.h"
22
+
23
+ namespace grpc_core {
24
+
25
+ // Helper type to track wakeups between objects in the same activity.
26
+ // Can be fairly fast as no ref counting or locking needs to occur.
27
+ class IntraActivityWaiter {
28
+ public:
29
+ // Register for wakeup, return Pending(). If state is not ready to proceed,
30
+ // Promises should bottom out here.
31
+ Pending pending() {
32
+ waiting_ = true;
33
+ return Pending();
34
+ }
35
+ // Wake the activity
36
+ void Wake() {
37
+ if (waiting_) {
38
+ waiting_ = false;
39
+ Activity::current()->ForceImmediateRepoll();
40
+ }
41
+ }
42
+
43
+ private:
44
+ bool waiting_ = false;
45
+ };
46
+
47
+ } // namespace grpc_core
48
+
49
+ #endif // GRPC_CORE_LIB_PROMISE_INTRA_ACTIVITY_WAITER_H
@@ -0,0 +1,104 @@
1
+ // Copyright 2021 gRPC 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
+ // http://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 GRPC_CORE_LIB_PROMISE_LATCH_H
16
+ #define GRPC_CORE_LIB_PROMISE_LATCH_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <grpc/support/log.h>
21
+
22
+ #include "src/core/lib/promise/activity.h"
23
+ #include "src/core/lib/promise/intra_activity_waiter.h"
24
+ #include "src/core/lib/promise/poll.h"
25
+
26
+ namespace grpc_core {
27
+
28
+ // Latch provides a single set waitable object.
29
+ // Initially the Latch is unset.
30
+ // It can be waited upon by the Wait method, which produces a Promise that
31
+ // resolves when the Latch is Set to a value of type T.
32
+ template <typename T>
33
+ class Latch {
34
+ public:
35
+ // This is the type of the promise returned by Wait.
36
+ class WaitPromise {
37
+ public:
38
+ Poll<T*> operator()() const {
39
+ if (latch_->has_value_) {
40
+ return &latch_->value_;
41
+ } else {
42
+ return latch_->waiter_.pending();
43
+ }
44
+ }
45
+
46
+ private:
47
+ friend class Latch;
48
+ explicit WaitPromise(Latch* latch) : latch_(latch) {}
49
+ Latch* latch_;
50
+ };
51
+
52
+ Latch() = default;
53
+ Latch(const Latch&) = delete;
54
+ Latch& operator=(const Latch&) = delete;
55
+ Latch(Latch&& other) noexcept
56
+ : value_(std::move(other.value_)), has_value_(other.has_value_) {
57
+ #ifndef NDEBUG
58
+ GPR_DEBUG_ASSERT(!other.has_had_waiters_);
59
+ #endif
60
+ }
61
+ Latch& operator=(Latch&& other) noexcept {
62
+ #ifndef NDEBUG
63
+ GPR_DEBUG_ASSERT(!other.has_had_waiters_);
64
+ #endif
65
+ value_ = std::move(other.value_);
66
+ has_value_ = other.has_value_;
67
+ return *this;
68
+ }
69
+
70
+ // Produce a promise to wait for a value from this latch.
71
+ WaitPromise Wait() {
72
+ #ifndef NDEBUG
73
+ has_had_waiters_ = true;
74
+ #endif
75
+ return WaitPromise(this);
76
+ }
77
+
78
+ // Set the value of the latch. Can only be called once.
79
+ void Set(T value) {
80
+ GPR_DEBUG_ASSERT(!has_value_);
81
+ value_ = std::move(value);
82
+ has_value_ = true;
83
+ waiter_.Wake();
84
+ }
85
+
86
+ private:
87
+ // The value stored (if has_value_ is true), otherwise some random value, we
88
+ // don't care.
89
+ // Why not absl::optional<>? Writing things this way lets us compress
90
+ // has_value_ with waiter_ and leads to some significant memory savings for
91
+ // some scenarios.
92
+ GPR_NO_UNIQUE_ADDRESS T value_;
93
+ // True if we have a value set, false otherwise.
94
+ bool has_value_ = false;
95
+ #ifndef NDEBUG
96
+ // Has this latch ever had waiters.
97
+ bool has_had_waiters_ = false;
98
+ #endif
99
+ IntraActivityWaiter waiter_;
100
+ };
101
+
102
+ } // namespace grpc_core
103
+
104
+ #endif // GRPC_CORE_LIB_PROMISE_LATCH_H