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
@@ -1,20 +1,18 @@
1
- /*
2
- *
3
- * Copyright 2018 gRPC authors.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
17
- */
1
+ //
2
+ // Copyright 2018 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
18
16
 
19
17
  #include <grpc/support/port_platform.h>
20
18
 
@@ -28,593 +26,138 @@
28
26
  #include <grpc/status.h>
29
27
 
30
28
  #include "src/core/lib/debug/trace.h"
31
- #include "src/core/lib/gprpp/sync.h"
32
- #include "src/core/lib/resource_quota/api.h"
33
29
  #include "src/core/lib/slice/slice_internal.h"
34
- #include "src/core/lib/transport/error_utils.h"
35
30
  #include "src/proto/grpc/health/v1/health.upb.h"
36
31
 
37
- #define HEALTH_CHECK_INITIAL_CONNECT_BACKOFF_SECONDS 1
38
- #define HEALTH_CHECK_RECONNECT_BACKOFF_MULTIPLIER 1.6
39
- #define HEALTH_CHECK_RECONNECT_MAX_BACKOFF_SECONDS 120
40
- #define HEALTH_CHECK_RECONNECT_JITTER 0.2
41
-
42
32
  namespace grpc_core {
43
33
 
44
34
  TraceFlag grpc_health_check_client_trace(false, "health_check_client");
45
35
 
46
- //
47
- // HealthCheckClient
48
- //
49
-
50
- HealthCheckClient::HealthCheckClient(
51
- std::string service_name,
52
- RefCountedPtr<ConnectedSubchannel> connected_subchannel,
53
- grpc_pollset_set* interested_parties,
54
- RefCountedPtr<channelz::SubchannelNode> channelz_node,
55
- RefCountedPtr<ConnectivityStateWatcherInterface> watcher)
56
- : InternallyRefCounted<HealthCheckClient>(
57
- GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)
58
- ? "HealthCheckClient"
59
- : nullptr),
60
- service_name_(std::move(service_name)),
61
- connected_subchannel_(std::move(connected_subchannel)),
62
- interested_parties_(interested_parties),
63
- channelz_node_(std::move(channelz_node)),
64
- call_allocator_(
65
- ResourceQuotaFromChannelArgs(connected_subchannel_->args())
66
- ->memory_quota()
67
- ->CreateMemoryAllocator(service_name_)),
68
- watcher_(std::move(watcher)),
69
- retry_backoff_(
70
- BackOff::Options()
71
- .set_initial_backoff(Duration::Seconds(
72
- HEALTH_CHECK_INITIAL_CONNECT_BACKOFF_SECONDS))
73
- .set_multiplier(HEALTH_CHECK_RECONNECT_BACKOFF_MULTIPLIER)
74
- .set_jitter(HEALTH_CHECK_RECONNECT_JITTER)
75
- .set_max_backoff(Duration::Seconds(
76
- HEALTH_CHECK_RECONNECT_MAX_BACKOFF_SECONDS))) {
77
- if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
78
- gpr_log(GPR_INFO, "created HealthCheckClient %p", this);
79
- }
80
- GRPC_CLOSURE_INIT(&retry_timer_callback_, OnRetryTimer, this,
81
- grpc_schedule_on_exec_ctx);
82
- StartCall();
83
- }
84
-
85
- HealthCheckClient::~HealthCheckClient() {
86
- if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
87
- gpr_log(GPR_INFO, "destroying HealthCheckClient %p", this);
88
- }
89
- }
90
-
91
- void HealthCheckClient::SetHealthStatus(grpc_connectivity_state state,
92
- const char* reason) {
93
- MutexLock lock(&mu_);
94
- SetHealthStatusLocked(state, reason);
95
- }
96
-
97
- void HealthCheckClient::SetHealthStatusLocked(grpc_connectivity_state state,
98
- const char* reason) {
99
- if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
100
- gpr_log(GPR_INFO, "HealthCheckClient %p: setting state=%s reason=%s", this,
101
- ConnectivityStateName(state), reason);
102
- }
103
- if (watcher_ != nullptr) {
104
- watcher_->Notify(state,
105
- state == GRPC_CHANNEL_TRANSIENT_FAILURE
106
- ? absl::Status(absl::StatusCode::kUnavailable, reason)
107
- : absl::Status());
108
- }
109
- }
36
+ namespace {
110
37
 
111
- void HealthCheckClient::Orphan() {
112
- if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
113
- gpr_log(GPR_INFO, "HealthCheckClient %p: shutting down", this);
114
- }
115
- {
116
- MutexLock lock(&mu_);
117
- shutting_down_ = true;
118
- watcher_.reset();
119
- call_state_.reset();
120
- if (retry_timer_callback_pending_) {
121
- grpc_timer_cancel(&retry_timer_);
38
+ class HealthStreamEventHandler
39
+ : public SubchannelStreamClient::CallEventHandler {
40
+ public:
41
+ HealthStreamEventHandler(
42
+ std::string service_name,
43
+ RefCountedPtr<channelz::SubchannelNode> channelz_node,
44
+ RefCountedPtr<ConnectivityStateWatcherInterface> watcher)
45
+ : service_name_(std::move(service_name)),
46
+ channelz_node_(std::move(channelz_node)),
47
+ watcher_(std::move(watcher)) {}
48
+
49
+ Slice GetPathLocked() override {
50
+ return Slice::FromStaticString("/grpc.health.v1.Health/Watch");
51
+ }
52
+
53
+ void OnCallStartLocked(SubchannelStreamClient* client) override {
54
+ SetHealthStatusLocked(client, GRPC_CHANNEL_CONNECTING,
55
+ "starting health watch");
56
+ }
57
+
58
+ void OnRetryTimerStartLocked(SubchannelStreamClient* client) override {
59
+ SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE,
60
+ "health check call failed; will retry after backoff");
61
+ }
62
+
63
+ grpc_slice EncodeSendMessageLocked() override {
64
+ upb::Arena arena;
65
+ grpc_health_v1_HealthCheckRequest* request_struct =
66
+ grpc_health_v1_HealthCheckRequest_new(arena.ptr());
67
+ grpc_health_v1_HealthCheckRequest_set_service(
68
+ request_struct, upb_StringView_FromDataAndSize(service_name_.data(),
69
+ service_name_.size()));
70
+ size_t buf_length;
71
+ char* buf = grpc_health_v1_HealthCheckRequest_serialize(
72
+ request_struct, arena.ptr(), &buf_length);
73
+ grpc_slice request_slice = GRPC_SLICE_MALLOC(buf_length);
74
+ memcpy(GRPC_SLICE_START_PTR(request_slice), buf, buf_length);
75
+ return request_slice;
76
+ }
77
+
78
+ absl::Status RecvMessageReadyLocked(
79
+ SubchannelStreamClient* client,
80
+ absl::string_view serialized_message) override {
81
+ auto healthy = DecodeResponse(serialized_message);
82
+ if (!healthy.ok()) {
83
+ SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE,
84
+ healthy.status().ToString().c_str());
85
+ return healthy.status();
122
86
  }
123
- }
124
- Unref(DEBUG_LOCATION, "orphan");
125
- }
126
-
127
- void HealthCheckClient::StartCall() {
128
- MutexLock lock(&mu_);
129
- StartCallLocked();
130
- }
131
-
132
- void HealthCheckClient::StartCallLocked() {
133
- if (shutting_down_) return;
134
- GPR_ASSERT(call_state_ == nullptr);
135
- SetHealthStatusLocked(GRPC_CHANNEL_CONNECTING, "starting health watch");
136
- call_state_ = MakeOrphanable<CallState>(Ref(), interested_parties_);
137
- if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
138
- gpr_log(GPR_INFO, "HealthCheckClient %p: created CallState %p", this,
139
- call_state_.get());
140
- }
141
- call_state_->StartCall();
142
- }
143
-
144
- void HealthCheckClient::StartRetryTimerLocked() {
145
- SetHealthStatusLocked(GRPC_CHANNEL_TRANSIENT_FAILURE,
146
- "health check call failed; will retry after backoff");
147
- Timestamp next_try = retry_backoff_.NextAttemptTime();
148
- if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
149
- gpr_log(GPR_INFO, "HealthCheckClient %p: health check call lost...", this);
150
- Duration timeout = next_try - ExecCtx::Get()->Now();
151
- if (timeout > Duration::Zero()) {
152
- gpr_log(GPR_INFO,
153
- "HealthCheckClient %p: ... will retry in %" PRId64 "ms.", this,
154
- timeout.millis());
87
+ if (!*healthy) {
88
+ SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE,
89
+ "backend unhealthy");
155
90
  } else {
156
- gpr_log(GPR_INFO, "HealthCheckClient %p: ... retrying immediately.",
157
- this);
91
+ SetHealthStatusLocked(client, GRPC_CHANNEL_READY, "OK");
158
92
  }
159
- }
160
- // Ref for callback, tracked manually.
161
- Ref(DEBUG_LOCATION, "health_retry_timer").release();
162
- retry_timer_callback_pending_ = true;
163
- grpc_timer_init(&retry_timer_, next_try, &retry_timer_callback_);
164
- }
165
-
166
- void HealthCheckClient::OnRetryTimer(void* arg, grpc_error_handle error) {
167
- HealthCheckClient* self = static_cast<HealthCheckClient*>(arg);
168
- {
169
- MutexLock lock(&self->mu_);
170
- self->retry_timer_callback_pending_ = false;
171
- if (!self->shutting_down_ && error == GRPC_ERROR_NONE &&
172
- self->call_state_ == nullptr) {
173
- if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
174
- gpr_log(GPR_INFO, "HealthCheckClient %p: restarting health check call",
175
- self);
93
+ return absl::OkStatus();
94
+ }
95
+
96
+ void RecvTrailingMetadataReadyLocked(SubchannelStreamClient* client,
97
+ grpc_status_code status) override {
98
+ if (status == GRPC_STATUS_UNIMPLEMENTED) {
99
+ static const char kErrorMessage[] =
100
+ "health checking Watch method returned UNIMPLEMENTED; "
101
+ "disabling health checks but assuming server is healthy";
102
+ gpr_log(GPR_ERROR, kErrorMessage);
103
+ if (channelz_node_ != nullptr) {
104
+ channelz_node_->AddTraceEvent(
105
+ channelz::ChannelTrace::Error,
106
+ grpc_slice_from_static_string(kErrorMessage));
176
107
  }
177
- self->StartCallLocked();
108
+ SetHealthStatusLocked(client, GRPC_CHANNEL_READY, kErrorMessage);
178
109
  }
179
110
  }
180
- self->Unref(DEBUG_LOCATION, "health_retry_timer");
181
- }
182
111
 
183
- //
184
- // protobuf helpers
185
- //
186
-
187
- namespace {
188
-
189
- void EncodeRequest(const std::string& service_name,
190
- ManualConstructor<SliceBufferByteStream>* send_message) {
191
- upb::Arena arena;
192
- grpc_health_v1_HealthCheckRequest* request_struct =
193
- grpc_health_v1_HealthCheckRequest_new(arena.ptr());
194
- grpc_health_v1_HealthCheckRequest_set_service(
195
- request_struct,
196
- upb_StringView_FromDataAndSize(service_name.data(), service_name.size()));
197
- size_t buf_length;
198
- char* buf = grpc_health_v1_HealthCheckRequest_serialize(
199
- request_struct, arena.ptr(), &buf_length);
200
- grpc_slice request_slice = GRPC_SLICE_MALLOC(buf_length);
201
- memcpy(GRPC_SLICE_START_PTR(request_slice), buf, buf_length);
202
- grpc_slice_buffer slice_buffer;
203
- grpc_slice_buffer_init(&slice_buffer);
204
- grpc_slice_buffer_add(&slice_buffer, request_slice);
205
- send_message->Init(&slice_buffer, 0);
206
- grpc_slice_buffer_destroy_internal(&slice_buffer);
207
- }
208
-
209
- // Returns true if healthy.
210
- // If there was an error parsing the response, sets *error and returns false.
211
- bool DecodeResponse(grpc_slice_buffer* slice_buffer, grpc_error_handle* error) {
212
- // If message is empty, assume unhealthy.
213
- if (slice_buffer->length == 0) {
214
- *error =
215
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("health check response was empty");
216
- return false;
217
- }
218
- // Concatenate the slices to form a single string.
219
- std::unique_ptr<uint8_t> recv_message_deleter;
220
- uint8_t* recv_message;
221
- if (slice_buffer->count == 1) {
222
- recv_message = GRPC_SLICE_START_PTR(slice_buffer->slices[0]);
223
- } else {
224
- recv_message = static_cast<uint8_t*>(gpr_malloc(slice_buffer->length));
225
- recv_message_deleter.reset(recv_message);
226
- size_t offset = 0;
227
- for (size_t i = 0; i < slice_buffer->count; ++i) {
228
- memcpy(recv_message + offset,
229
- GRPC_SLICE_START_PTR(slice_buffer->slices[i]),
230
- GRPC_SLICE_LENGTH(slice_buffer->slices[i]));
231
- offset += GRPC_SLICE_LENGTH(slice_buffer->slices[i]);
112
+ private:
113
+ // Returns true if healthy.
114
+ static absl::StatusOr<bool> DecodeResponse(
115
+ absl::string_view serialized_message) {
116
+ // Deserialize message.
117
+ upb::Arena arena;
118
+ auto* response = grpc_health_v1_HealthCheckResponse_parse(
119
+ serialized_message.data(), serialized_message.size(), arena.ptr());
120
+ if (response == nullptr) {
121
+ // Can't parse message; assume unhealthy.
122
+ return absl::InvalidArgumentError("cannot parse health check response");
232
123
  }
124
+ int32_t status = grpc_health_v1_HealthCheckResponse_status(response);
125
+ return status == grpc_health_v1_HealthCheckResponse_SERVING;
233
126
  }
234
- // Deserialize message.
235
- upb::Arena arena;
236
- grpc_health_v1_HealthCheckResponse* response_struct =
237
- grpc_health_v1_HealthCheckResponse_parse(
238
- reinterpret_cast<char*>(recv_message), slice_buffer->length,
239
- arena.ptr());
240
- if (response_struct == nullptr) {
241
- // Can't parse message; assume unhealthy.
242
- *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
243
- "cannot parse health check response");
244
- return false;
245
- }
246
- int32_t status = grpc_health_v1_HealthCheckResponse_status(response_struct);
247
- return status == grpc_health_v1_HealthCheckResponse_SERVING;
248
- }
249
127
 
250
- } // namespace
251
-
252
- //
253
- // HealthCheckClient::CallState
254
- //
255
-
256
- HealthCheckClient::CallState::CallState(
257
- RefCountedPtr<HealthCheckClient> health_check_client,
258
- grpc_pollset_set* interested_parties)
259
- : health_check_client_(std::move(health_check_client)),
260
- pollent_(grpc_polling_entity_create_from_pollset_set(interested_parties)),
261
- arena_(Arena::Create(health_check_client_->connected_subchannel_
262
- ->GetInitialCallSizeEstimate(),
263
- &health_check_client_->call_allocator_)),
264
- payload_(context_),
265
- send_initial_metadata_(arena_.get()),
266
- send_trailing_metadata_(arena_.get()),
267
- recv_initial_metadata_(arena_.get()),
268
- recv_trailing_metadata_(arena_.get()) {}
269
-
270
- HealthCheckClient::CallState::~CallState() {
271
- if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
272
- gpr_log(GPR_INFO, "HealthCheckClient %p: destroying CallState %p",
273
- health_check_client_.get(), this);
274
- }
275
- for (size_t i = 0; i < GRPC_CONTEXT_COUNT; i++) {
276
- if (context_[i].destroy != nullptr) {
277
- context_[i].destroy(context_[i].value);
128
+ void SetHealthStatusLocked(SubchannelStreamClient* client,
129
+ grpc_connectivity_state state,
130
+ const char* reason) {
131
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
132
+ gpr_log(GPR_INFO, "HealthCheckClient %p: setting state=%s reason=%s",
133
+ client, ConnectivityStateName(state), reason);
278
134
  }
135
+ watcher_->Notify(state, state == GRPC_CHANNEL_TRANSIENT_FAILURE
136
+ ? absl::UnavailableError(reason)
137
+ : absl::Status());
279
138
  }
280
- // Unset the call combiner cancellation closure. This has the
281
- // effect of scheduling the previously set cancellation closure, if
282
- // any, so that it can release any internal references it may be
283
- // holding to the call stack.
284
- call_combiner_.SetNotifyOnCancel(nullptr);
285
- }
286
-
287
- void HealthCheckClient::CallState::Orphan() {
288
- call_combiner_.Cancel(GRPC_ERROR_CANCELLED);
289
- Cancel();
290
- }
291
-
292
- void HealthCheckClient::CallState::StartCall() {
293
- SubchannelCall::Args args = {
294
- health_check_client_->connected_subchannel_,
295
- &pollent_,
296
- Slice::FromStaticString("/grpc.health.v1.Health/Watch"),
297
- gpr_get_cycle_counter(), // start_time
298
- Timestamp::InfFuture(), // deadline
299
- arena_.get(),
300
- context_,
301
- &call_combiner_,
302
- };
303
- grpc_error_handle error = GRPC_ERROR_NONE;
304
- call_ = SubchannelCall::Create(std::move(args), &error).release();
305
- // Register after-destruction callback.
306
- GRPC_CLOSURE_INIT(&after_call_stack_destruction_, AfterCallStackDestruction,
307
- this, grpc_schedule_on_exec_ctx);
308
- call_->SetAfterCallStackDestroy(&after_call_stack_destruction_);
309
- // Check if creation failed.
310
- if (error != GRPC_ERROR_NONE) {
311
- gpr_log(GPR_ERROR,
312
- "HealthCheckClient %p CallState %p: error creating health "
313
- "checking call on subchannel (%s); will retry",
314
- health_check_client_.get(), this,
315
- grpc_error_std_string(error).c_str());
316
- GRPC_ERROR_UNREF(error);
317
- CallEndedLocked(/*retry=*/true);
318
- return;
319
- }
320
- // Initialize payload and batch.
321
- payload_.context = context_;
322
- batch_.payload = &payload_;
323
- // on_complete callback takes ref, handled manually.
324
- call_->Ref(DEBUG_LOCATION, "on_complete").release();
325
- batch_.on_complete = GRPC_CLOSURE_INIT(&on_complete_, OnComplete, this,
326
- grpc_schedule_on_exec_ctx);
327
- // Add send_initial_metadata op.
328
- send_initial_metadata_.Set(
329
- HttpPathMetadata(),
330
- Slice::FromStaticString("/grpc.health.v1.Health/Watch"));
331
- GPR_ASSERT(error == GRPC_ERROR_NONE);
332
- payload_.send_initial_metadata.send_initial_metadata =
333
- &send_initial_metadata_;
334
- payload_.send_initial_metadata.send_initial_metadata_flags = 0;
335
- payload_.send_initial_metadata.peer_string = nullptr;
336
- batch_.send_initial_metadata = true;
337
- // Add send_message op.
338
- EncodeRequest(health_check_client_->service_name_, &send_message_);
339
- payload_.send_message.send_message.reset(send_message_.get());
340
- batch_.send_message = true;
341
- // Add send_trailing_metadata op.
342
- payload_.send_trailing_metadata.send_trailing_metadata =
343
- &send_trailing_metadata_;
344
- batch_.send_trailing_metadata = true;
345
- // Add recv_initial_metadata op.
346
- payload_.recv_initial_metadata.recv_initial_metadata =
347
- &recv_initial_metadata_;
348
- payload_.recv_initial_metadata.recv_flags = nullptr;
349
- payload_.recv_initial_metadata.trailing_metadata_available = nullptr;
350
- payload_.recv_initial_metadata.peer_string = nullptr;
351
- // recv_initial_metadata_ready callback takes ref, handled manually.
352
- call_->Ref(DEBUG_LOCATION, "recv_initial_metadata_ready").release();
353
- payload_.recv_initial_metadata.recv_initial_metadata_ready =
354
- GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_, RecvInitialMetadataReady,
355
- this, grpc_schedule_on_exec_ctx);
356
- batch_.recv_initial_metadata = true;
357
- // Add recv_message op.
358
- payload_.recv_message.recv_message = &recv_message_;
359
- payload_.recv_message.call_failed_before_recv_message = nullptr;
360
- // recv_message callback takes ref, handled manually.
361
- call_->Ref(DEBUG_LOCATION, "recv_message_ready").release();
362
- payload_.recv_message.recv_message_ready = GRPC_CLOSURE_INIT(
363
- &recv_message_ready_, RecvMessageReady, this, grpc_schedule_on_exec_ctx);
364
- batch_.recv_message = true;
365
- // Start batch.
366
- StartBatch(&batch_);
367
- // Initialize recv_trailing_metadata batch.
368
- recv_trailing_metadata_batch_.payload = &payload_;
369
- // Add recv_trailing_metadata op.
370
- payload_.recv_trailing_metadata.recv_trailing_metadata =
371
- &recv_trailing_metadata_;
372
- payload_.recv_trailing_metadata.collect_stats = &collect_stats_;
373
- // This callback signals the end of the call, so it relies on the
374
- // initial ref instead of taking a new ref. When it's invoked, the
375
- // initial ref is released.
376
- payload_.recv_trailing_metadata.recv_trailing_metadata_ready =
377
- GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
378
- RecvTrailingMetadataReady, this,
379
- grpc_schedule_on_exec_ctx);
380
- recv_trailing_metadata_batch_.recv_trailing_metadata = true;
381
- // Start recv_trailing_metadata batch.
382
- StartBatch(&recv_trailing_metadata_batch_);
383
- }
384
-
385
- void HealthCheckClient::CallState::StartBatchInCallCombiner(
386
- void* arg, grpc_error_handle /*error*/) {
387
- grpc_transport_stream_op_batch* batch =
388
- static_cast<grpc_transport_stream_op_batch*>(arg);
389
- SubchannelCall* call =
390
- static_cast<SubchannelCall*>(batch->handler_private.extra_arg);
391
- call->StartTransportStreamOpBatch(batch);
392
- }
393
-
394
- void HealthCheckClient::CallState::StartBatch(
395
- grpc_transport_stream_op_batch* batch) {
396
- batch->handler_private.extra_arg = call_;
397
- GRPC_CLOSURE_INIT(&batch->handler_private.closure, StartBatchInCallCombiner,
398
- batch, grpc_schedule_on_exec_ctx);
399
- GRPC_CALL_COMBINER_START(&call_combiner_, &batch->handler_private.closure,
400
- GRPC_ERROR_NONE, "start_subchannel_batch");
401
- }
402
-
403
- void HealthCheckClient::CallState::AfterCallStackDestruction(
404
- void* arg, grpc_error_handle /*error*/) {
405
- HealthCheckClient::CallState* self =
406
- static_cast<HealthCheckClient::CallState*>(arg);
407
- delete self;
408
- }
409
-
410
- void HealthCheckClient::CallState::OnCancelComplete(
411
- void* arg, grpc_error_handle /*error*/) {
412
- HealthCheckClient::CallState* self =
413
- static_cast<HealthCheckClient::CallState*>(arg);
414
- GRPC_CALL_COMBINER_STOP(&self->call_combiner_, "health_cancel");
415
- self->call_->Unref(DEBUG_LOCATION, "cancel");
416
- }
417
-
418
- void HealthCheckClient::CallState::StartCancel(void* arg,
419
- grpc_error_handle /*error*/) {
420
- HealthCheckClient::CallState* self =
421
- static_cast<HealthCheckClient::CallState*>(arg);
422
- auto* batch = grpc_make_transport_stream_op(
423
- GRPC_CLOSURE_CREATE(OnCancelComplete, self, grpc_schedule_on_exec_ctx));
424
- batch->cancel_stream = true;
425
- batch->payload->cancel_stream.cancel_error = GRPC_ERROR_CANCELLED;
426
- self->call_->StartTransportStreamOpBatch(batch);
427
- }
428
-
429
- void HealthCheckClient::CallState::Cancel() {
430
- bool expected = false;
431
- if (cancelled_.compare_exchange_strong(expected, true,
432
- std::memory_order_acq_rel,
433
- std::memory_order_acquire)) {
434
- call_->Ref(DEBUG_LOCATION, "cancel").release();
435
- GRPC_CALL_COMBINER_START(
436
- &call_combiner_,
437
- GRPC_CLOSURE_CREATE(StartCancel, this, grpc_schedule_on_exec_ctx),
438
- GRPC_ERROR_NONE, "health_cancel");
439
- }
440
- }
441
-
442
- void HealthCheckClient::CallState::OnComplete(void* arg,
443
- grpc_error_handle /*error*/) {
444
- HealthCheckClient::CallState* self =
445
- static_cast<HealthCheckClient::CallState*>(arg);
446
- GRPC_CALL_COMBINER_STOP(&self->call_combiner_, "on_complete");
447
- self->send_initial_metadata_.Clear();
448
- self->send_trailing_metadata_.Clear();
449
- self->call_->Unref(DEBUG_LOCATION, "on_complete");
450
- }
451
-
452
- void HealthCheckClient::CallState::RecvInitialMetadataReady(
453
- void* arg, grpc_error_handle /*error*/) {
454
- HealthCheckClient::CallState* self =
455
- static_cast<HealthCheckClient::CallState*>(arg);
456
- GRPC_CALL_COMBINER_STOP(&self->call_combiner_, "recv_initial_metadata_ready");
457
- self->recv_initial_metadata_.Clear();
458
- self->call_->Unref(DEBUG_LOCATION, "recv_initial_metadata_ready");
459
- }
460
-
461
- void HealthCheckClient::CallState::DoneReadingRecvMessage(
462
- grpc_error_handle error) {
463
- recv_message_.reset();
464
- if (error != GRPC_ERROR_NONE) {
465
- GRPC_ERROR_UNREF(error);
466
- Cancel();
467
- grpc_slice_buffer_destroy_internal(&recv_message_buffer_);
468
- call_->Unref(DEBUG_LOCATION, "recv_message_ready");
469
- return;
470
- }
471
- const bool healthy = DecodeResponse(&recv_message_buffer_, &error);
472
- const grpc_connectivity_state state =
473
- healthy ? GRPC_CHANNEL_READY : GRPC_CHANNEL_TRANSIENT_FAILURE;
474
- health_check_client_->SetHealthStatus(
475
- state, error == GRPC_ERROR_NONE && !healthy
476
- ? "backend unhealthy"
477
- : grpc_error_std_string(error).c_str());
478
- seen_response_.store(true, std::memory_order_release);
479
- grpc_slice_buffer_destroy_internal(&recv_message_buffer_);
480
- // Start another recv_message batch.
481
- // This re-uses the ref we're holding.
482
- // Note: Can't just reuse batch_ here, since we don't know that all
483
- // callbacks from the original batch have completed yet.
484
- recv_message_batch_.payload = &payload_;
485
- payload_.recv_message.recv_message = &recv_message_;
486
- payload_.recv_message.call_failed_before_recv_message = nullptr;
487
- payload_.recv_message.recv_message_ready = GRPC_CLOSURE_INIT(
488
- &recv_message_ready_, RecvMessageReady, this, grpc_schedule_on_exec_ctx);
489
- recv_message_batch_.recv_message = true;
490
- StartBatch(&recv_message_batch_);
491
- }
492
-
493
- grpc_error_handle HealthCheckClient::CallState::PullSliceFromRecvMessage() {
494
- grpc_slice slice;
495
- grpc_error_handle error = recv_message_->Pull(&slice);
496
- if (error == GRPC_ERROR_NONE) {
497
- grpc_slice_buffer_add(&recv_message_buffer_, slice);
498
- }
499
- return error;
500
- }
501
-
502
- void HealthCheckClient::CallState::ContinueReadingRecvMessage() {
503
- while (recv_message_->Next(SIZE_MAX, &recv_message_ready_)) {
504
- grpc_error_handle error = PullSliceFromRecvMessage();
505
- if (error != GRPC_ERROR_NONE) {
506
- DoneReadingRecvMessage(error);
507
- return;
508
- }
509
- if (recv_message_buffer_.length == recv_message_->length()) {
510
- DoneReadingRecvMessage(GRPC_ERROR_NONE);
511
- break;
512
- }
513
- }
514
- }
515
139
 
516
- void HealthCheckClient::CallState::OnByteStreamNext(void* arg,
517
- grpc_error_handle error) {
518
- HealthCheckClient::CallState* self =
519
- static_cast<HealthCheckClient::CallState*>(arg);
520
- if (error != GRPC_ERROR_NONE) {
521
- self->DoneReadingRecvMessage(GRPC_ERROR_REF(error));
522
- return;
523
- }
524
- error = self->PullSliceFromRecvMessage();
525
- if (error != GRPC_ERROR_NONE) {
526
- self->DoneReadingRecvMessage(error);
527
- return;
528
- }
529
- if (self->recv_message_buffer_.length == self->recv_message_->length()) {
530
- self->DoneReadingRecvMessage(GRPC_ERROR_NONE);
531
- } else {
532
- self->ContinueReadingRecvMessage();
533
- }
534
- }
535
-
536
- void HealthCheckClient::CallState::RecvMessageReady(
537
- void* arg, grpc_error_handle /*error*/) {
538
- HealthCheckClient::CallState* self =
539
- static_cast<HealthCheckClient::CallState*>(arg);
540
- GRPC_CALL_COMBINER_STOP(&self->call_combiner_, "recv_message_ready");
541
- if (self->recv_message_ == nullptr) {
542
- self->call_->Unref(DEBUG_LOCATION, "recv_message_ready");
543
- return;
544
- }
545
- grpc_slice_buffer_init(&self->recv_message_buffer_);
546
- GRPC_CLOSURE_INIT(&self->recv_message_ready_, OnByteStreamNext, self,
547
- grpc_schedule_on_exec_ctx);
548
- self->ContinueReadingRecvMessage();
549
- // Ref will continue to be held until we finish draining the byte stream.
550
- }
140
+ std::string service_name_;
141
+ RefCountedPtr<channelz::SubchannelNode> channelz_node_;
142
+ RefCountedPtr<ConnectivityStateWatcherInterface> watcher_;
143
+ };
551
144
 
552
- void HealthCheckClient::CallState::RecvTrailingMetadataReady(
553
- void* arg, grpc_error_handle error) {
554
- HealthCheckClient::CallState* self =
555
- static_cast<HealthCheckClient::CallState*>(arg);
556
- GRPC_CALL_COMBINER_STOP(&self->call_combiner_,
557
- "recv_trailing_metadata_ready");
558
- // Get call status.
559
- grpc_status_code status =
560
- self->recv_trailing_metadata_.get(GrpcStatusMetadata())
561
- .value_or(GRPC_STATUS_UNKNOWN);
562
- if (error != GRPC_ERROR_NONE) {
563
- grpc_error_get_status(error, Timestamp::InfFuture(), &status,
564
- nullptr /* slice */, nullptr /* http_error */,
565
- nullptr /* error_string */);
566
- }
567
- if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
568
- gpr_log(GPR_INFO,
569
- "HealthCheckClient %p CallState %p: health watch failed with "
570
- "status %d",
571
- self->health_check_client_.get(), self, status);
572
- }
573
- // Clean up.
574
- self->recv_trailing_metadata_.Clear();
575
- // For status UNIMPLEMENTED, give up and assume always healthy.
576
- bool retry = true;
577
- if (status == GRPC_STATUS_UNIMPLEMENTED) {
578
- static const char kErrorMessage[] =
579
- "health checking Watch method returned UNIMPLEMENTED; "
580
- "disabling health checks but assuming server is healthy";
581
- gpr_log(GPR_ERROR, kErrorMessage);
582
- if (self->health_check_client_->channelz_node_ != nullptr) {
583
- self->health_check_client_->channelz_node_->AddTraceEvent(
584
- channelz::ChannelTrace::Error,
585
- grpc_slice_from_static_string(kErrorMessage));
586
- }
587
- self->health_check_client_->SetHealthStatus(GRPC_CHANNEL_READY,
588
- kErrorMessage);
589
- retry = false;
590
- }
591
- MutexLock lock(&self->health_check_client_->mu_);
592
- self->CallEndedLocked(retry);
593
- }
145
+ } // namespace
594
146
 
595
- void HealthCheckClient::CallState::CallEndedLocked(bool retry) {
596
- // If this CallState is still in use, this call ended because of a failure,
597
- // so we need to stop using it and optionally create a new one.
598
- // Otherwise, we have deliberately ended this call, and no further action
599
- // is required.
600
- if (this == health_check_client_->call_state_.get()) {
601
- health_check_client_->call_state_.reset();
602
- if (retry) {
603
- GPR_ASSERT(!health_check_client_->shutting_down_);
604
- if (seen_response_.load(std::memory_order_acquire)) {
605
- // If the call fails after we've gotten a successful response, reset
606
- // the backoff and restart the call immediately.
607
- health_check_client_->retry_backoff_.Reset();
608
- health_check_client_->StartCallLocked();
609
- } else {
610
- // If the call failed without receiving any messages, retry later.
611
- health_check_client_->StartRetryTimerLocked();
612
- }
613
- }
614
- }
615
- // When the last ref to the call stack goes away, the CallState object
616
- // will be automatically destroyed.
617
- call_->Unref(DEBUG_LOCATION, "call_ended");
147
+ OrphanablePtr<SubchannelStreamClient> MakeHealthCheckClient(
148
+ std::string service_name,
149
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel,
150
+ grpc_pollset_set* interested_parties,
151
+ RefCountedPtr<channelz::SubchannelNode> channelz_node,
152
+ RefCountedPtr<ConnectivityStateWatcherInterface> watcher) {
153
+ return MakeOrphanable<SubchannelStreamClient>(
154
+ std::move(connected_subchannel), interested_parties,
155
+ absl::make_unique<HealthStreamEventHandler>(std::move(service_name),
156
+ std::move(channelz_node),
157
+ std::move(watcher)),
158
+ GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)
159
+ ? "HealthCheckClient"
160
+ : nullptr);
618
161
  }
619
162
 
620
163
  } // namespace grpc_core