grpc 1.43.1 → 1.44.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -28,6 +28,7 @@
28
28
  #include "src/core/ext/xds/xds_api.h"
29
29
  #include "src/core/ext/xds/xds_bootstrap.h"
30
30
  #include "src/core/ext/xds/xds_client_stats.h"
31
+ #include "src/core/ext/xds/xds_resource_type.h"
31
32
  #include "src/core/lib/channel/channelz.h"
32
33
  #include "src/core/lib/gprpp/dual_ref_counted.h"
33
34
  #include "src/core/lib/gprpp/memory.h"
@@ -35,6 +36,8 @@
35
36
  #include "src/core/lib/gprpp/ref_counted.h"
36
37
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
37
38
  #include "src/core/lib/gprpp/sync.h"
39
+ #include "src/core/lib/iomgr/work_serializer.h"
40
+ #include "src/core/lib/uri/uri_parser.h"
38
41
 
39
42
  namespace grpc_core {
40
43
 
@@ -43,44 +46,14 @@ extern TraceFlag grpc_xds_client_refcount_trace;
43
46
 
44
47
  class XdsClient : public DualRefCounted<XdsClient> {
45
48
  public:
46
- // Listener data watcher interface. Implemented by callers.
47
- class ListenerWatcherInterface : public RefCounted<ListenerWatcherInterface> {
49
+ // Resource watcher interface. Implemented by callers.
50
+ // Note: Most callers will not use this API directly but rather via a
51
+ // resource-type-specific wrapper API provided by the relevant
52
+ // XdsResourceType implementation.
53
+ class ResourceWatcherInterface : public RefCounted<ResourceWatcherInterface> {
48
54
  public:
49
- virtual void OnListenerChanged(XdsApi::LdsUpdate listener)
50
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
51
- virtual void OnError(grpc_error_handle error)
52
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
53
- virtual void OnResourceDoesNotExist()
54
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
55
- };
56
-
57
- // RouteConfiguration data watcher interface. Implemented by callers.
58
- class RouteConfigWatcherInterface
59
- : public RefCounted<RouteConfigWatcherInterface> {
60
- public:
61
- virtual void OnRouteConfigChanged(XdsApi::RdsUpdate route_config)
62
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
63
- virtual void OnError(grpc_error_handle error)
64
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
65
- virtual void OnResourceDoesNotExist()
66
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
67
- };
68
-
69
- // Cluster data watcher interface. Implemented by callers.
70
- class ClusterWatcherInterface : public RefCounted<ClusterWatcherInterface> {
71
- public:
72
- virtual void OnClusterChanged(XdsApi::CdsUpdate cluster_data)
73
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
74
- virtual void OnError(grpc_error_handle error)
75
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
76
- virtual void OnResourceDoesNotExist()
77
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
78
- };
79
-
80
- // Endpoint data watcher interface. Implemented by callers.
81
- class EndpointWatcherInterface : public RefCounted<EndpointWatcherInterface> {
82
- public:
83
- virtual void OnEndpointChanged(XdsApi::EdsUpdate update)
55
+ virtual void OnGenericResourceChanged(
56
+ const XdsResourceType::ResourceData* resource)
84
57
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
85
58
  virtual void OnError(grpc_error_handle error)
86
59
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
@@ -113,57 +86,31 @@ class XdsClient : public DualRefCounted<XdsClient> {
113
86
 
114
87
  void Orphan() override;
115
88
 
116
- // Start and cancel listener data watch for a listener.
117
- // The XdsClient takes ownership of the watcher, but the caller may
118
- // keep a raw pointer to the watcher, which may be used only for
119
- // cancellation. (Because the caller does not own the watcher, the
120
- // pointer must not be used for any other purpose.)
121
- // If the caller is going to start a new watch after cancelling the
122
- // old one, it should set delay_unsubscription to true.
123
- void WatchListenerData(absl::string_view listener_name,
124
- RefCountedPtr<ListenerWatcherInterface> watcher);
125
- void CancelListenerDataWatch(absl::string_view listener_name,
126
- ListenerWatcherInterface* watcher,
127
- bool delay_unsubscription = false);
128
-
129
- // Start and cancel route config data watch for a listener.
130
- // The XdsClient takes ownership of the watcher, but the caller may
131
- // keep a raw pointer to the watcher, which may be used only for
132
- // cancellation. (Because the caller does not own the watcher, the
133
- // pointer must not be used for any other purpose.)
134
- // If the caller is going to start a new watch after cancelling the
135
- // old one, it should set delay_unsubscription to true.
136
- void WatchRouteConfigData(absl::string_view route_config_name,
137
- RefCountedPtr<RouteConfigWatcherInterface> watcher);
138
- void CancelRouteConfigDataWatch(absl::string_view route_config_name,
139
- RouteConfigWatcherInterface* watcher,
140
- bool delay_unsubscription = false);
141
-
142
- // Start and cancel cluster data watch for a cluster.
143
- // The XdsClient takes ownership of the watcher, but the caller may
144
- // keep a raw pointer to the watcher, which may be used only for
145
- // cancellation. (Because the caller does not own the watcher, the
146
- // pointer must not be used for any other purpose.)
147
- // If the caller is going to start a new watch after cancelling the
148
- // old one, it should set delay_unsubscription to true.
149
- void WatchClusterData(absl::string_view cluster_name,
150
- RefCountedPtr<ClusterWatcherInterface> watcher);
151
- void CancelClusterDataWatch(absl::string_view cluster_name,
152
- ClusterWatcherInterface* watcher,
153
- bool delay_unsubscription = false);
154
-
155
- // Start and cancel endpoint data watch for a cluster.
89
+ // Start and cancel watch for a resource.
90
+ //
156
91
  // The XdsClient takes ownership of the watcher, but the caller may
157
92
  // keep a raw pointer to the watcher, which may be used only for
158
93
  // cancellation. (Because the caller does not own the watcher, the
159
94
  // pointer must not be used for any other purpose.)
160
95
  // If the caller is going to start a new watch after cancelling the
161
96
  // old one, it should set delay_unsubscription to true.
162
- void WatchEndpointData(absl::string_view eds_service_name,
163
- RefCountedPtr<EndpointWatcherInterface> watcher);
164
- void CancelEndpointDataWatch(absl::string_view eds_service_name,
165
- EndpointWatcherInterface* watcher,
166
- bool delay_unsubscription = false);
97
+ //
98
+ // The resource type object must be a global singleton, since the first
99
+ // time the XdsClient sees a particular resource type object, it will
100
+ // store the pointer to that object as the authoritative implementation for
101
+ // its type URLs. The resource type object must outlive the XdsClient object,
102
+ // and it is illegal to start a subsequent watch for the same type URLs using
103
+ // a different resource type object.
104
+ //
105
+ // Note: Most callers will not use this API directly but rather via a
106
+ // resource-type-specific wrapper API provided by the relevant
107
+ // XdsResourceType implementation.
108
+ void WatchResource(const XdsResourceType* type, absl::string_view name,
109
+ RefCountedPtr<ResourceWatcherInterface> watcher);
110
+ void CancelResourceWatch(const XdsResourceType* type,
111
+ absl::string_view listener_name,
112
+ ResourceWatcherInterface* watcher,
113
+ bool delay_unsubscription = false);
167
114
 
168
115
  // Adds and removes drop stats for cluster_name and eds_service_name.
169
116
  RefCountedPtr<XdsClusterDropStats> AddClusterDropStats(
@@ -204,6 +151,22 @@ class XdsClient : public DualRefCounted<XdsClient> {
204
151
  const grpc_channel_args& args);
205
152
 
206
153
  private:
154
+ struct XdsResourceKey {
155
+ std::string id;
156
+ std::vector<URI::QueryParam> query_params;
157
+
158
+ bool operator<(const XdsResourceKey& other) const {
159
+ int c = id.compare(other.id);
160
+ if (c != 0) return c < 0;
161
+ return query_params < other.query_params;
162
+ }
163
+ };
164
+
165
+ struct XdsResourceName {
166
+ std::string authority;
167
+ XdsResourceKey key;
168
+ };
169
+
207
170
  // Contains a channel to the xds server and all the data related to the
208
171
  // channel. Holds a ref to the xds client object.
209
172
  class ChannelState : public DualRefCounted<ChannelState> {
@@ -234,11 +197,11 @@ class XdsClient : public DualRefCounted<XdsClient> {
234
197
  void StartConnectivityWatchLocked();
235
198
  void CancelConnectivityWatchLocked();
236
199
 
237
- void SubscribeLocked(const std::string& type_url,
238
- const XdsApi::ResourceName& name)
200
+ void SubscribeLocked(const XdsResourceType* type,
201
+ const XdsResourceName& name)
239
202
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
240
- void UnsubscribeLocked(const std::string& type_url,
241
- const XdsApi::ResourceName& name,
203
+ void UnsubscribeLocked(const XdsResourceType* type,
204
+ const XdsResourceName& name,
242
205
  bool delay_unsubscription)
243
206
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
244
207
 
@@ -260,55 +223,22 @@ class XdsClient : public DualRefCounted<XdsClient> {
260
223
  OrphanablePtr<RetryableCall<LrsCallState>> lrs_calld_;
261
224
 
262
225
  // Stores the most recent accepted resource version for each resource type.
263
- std::map<std::string /*type*/, std::string /*version*/>
226
+ std::map<const XdsResourceType*, std::string /*version*/>
264
227
  resource_type_version_map_;
265
228
  };
266
229
 
267
- struct ListenerState {
268
- std::map<ListenerWatcherInterface*, RefCountedPtr<ListenerWatcherInterface>>
269
- watchers;
270
- // The latest data seen from LDS.
271
- absl::optional<XdsApi::LdsUpdate> update;
272
- XdsApi::ResourceMetadata meta;
273
- };
274
-
275
- struct RouteConfigState {
276
- std::map<RouteConfigWatcherInterface*,
277
- RefCountedPtr<RouteConfigWatcherInterface>>
278
- watchers;
279
- // The latest data seen from RDS.
280
- absl::optional<XdsApi::RdsUpdate> update;
281
- XdsApi::ResourceMetadata meta;
282
- };
283
-
284
- struct ClusterState {
285
- std::map<ClusterWatcherInterface*, RefCountedPtr<ClusterWatcherInterface>>
286
- watchers;
287
- // The latest data seen from CDS.
288
- absl::optional<XdsApi::CdsUpdate> update;
289
- XdsApi::ResourceMetadata meta;
290
- };
291
-
292
- struct EndpointState {
293
- std::map<EndpointWatcherInterface*, RefCountedPtr<EndpointWatcherInterface>>
230
+ struct ResourceState {
231
+ std::map<ResourceWatcherInterface*, RefCountedPtr<ResourceWatcherInterface>>
294
232
  watchers;
295
- // The latest data seen from EDS.
296
- absl::optional<XdsApi::EdsUpdate> update;
233
+ // The latest data seen for the resource.
234
+ std::unique_ptr<XdsResourceType::ResourceData> resource;
297
235
  XdsApi::ResourceMetadata meta;
298
236
  };
299
237
 
300
238
  struct AuthorityState {
301
239
  RefCountedPtr<ChannelState> channel_state;
302
- std::map<std::string /*listener_name*/, ListenerState> listener_map;
303
- std::map<std::string /*route_config_name*/, RouteConfigState>
304
- route_config_map;
305
- std::map<std::string /*cluster_name*/, ClusterState> cluster_map;
306
- std::map<std::string /*eds_service_name*/, EndpointState> endpoint_map;
307
-
308
- bool HasSubscribedResources() {
309
- return !listener_map.empty() || !route_config_map.empty() ||
310
- !cluster_map.empty() || !endpoint_map.empty();
311
- }
240
+ std::map<const XdsResourceType*, std::map<XdsResourceKey, ResourceState>>
241
+ resource_map;
312
242
  };
313
243
 
314
244
  struct LoadReportState {
@@ -331,6 +261,19 @@ class XdsClient : public DualRefCounted<XdsClient> {
331
261
  void NotifyOnErrorLocked(grpc_error_handle error)
332
262
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
333
263
 
264
+ void MaybeRegisterResourceTypeLocked(const XdsResourceType* resource_type)
265
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
266
+
267
+ // Gets the type for resource_type, or null if the type is unknown.
268
+ const XdsResourceType* GetResourceTypeLocked(absl::string_view resource_type)
269
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
270
+
271
+ static absl::StatusOr<XdsResourceName> ParseXdsResourceName(
272
+ absl::string_view name, const XdsResourceType* type);
273
+ static std::string ConstructFullXdsResourceName(
274
+ absl::string_view authority, absl::string_view resource_type,
275
+ const XdsResourceKey& key);
276
+
334
277
  XdsApi::ClusterLoadReportMap BuildLoadReportSnapshotLocked(
335
278
  bool send_all_clusters, const std::set<std::string>& clusters)
336
279
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
@@ -348,6 +291,13 @@ class XdsClient : public DualRefCounted<XdsClient> {
348
291
 
349
292
  Mutex mu_;
350
293
 
294
+ // Stores resource type objects seen by type URL.
295
+ std::map<absl::string_view /*resource_type*/, const XdsResourceType*>
296
+ resource_types_ ABSL_GUARDED_BY(mu_);
297
+ std::map<absl::string_view /*v2_resource_type*/, const XdsResourceType*>
298
+ v2_resource_types_ ABSL_GUARDED_BY(mu_);
299
+ upb::SymbolTable symtab_ ABSL_GUARDED_BY(mu_);
300
+
351
301
  // Map of existing xDS server channels.
352
302
  std::map<XdsBootstrap::XdsServer, ChannelState*> xds_server_channel_map_
353
303
  ABSL_GUARDED_BY(mu_);
@@ -363,15 +313,8 @@ class XdsClient : public DualRefCounted<XdsClient> {
363
313
 
364
314
  // Stores started watchers whose resource name was not parsed successfully,
365
315
  // waiting to be cancelled or reset in Orphan().
366
- std::map<ListenerWatcherInterface*, RefCountedPtr<ListenerWatcherInterface>>
367
- invalid_listener_watchers_ ABSL_GUARDED_BY(mu_);
368
- std::map<RouteConfigWatcherInterface*,
369
- RefCountedPtr<RouteConfigWatcherInterface>>
370
- invalid_route_config_watchers_ ABSL_GUARDED_BY(mu_);
371
- std::map<ClusterWatcherInterface*, RefCountedPtr<ClusterWatcherInterface>>
372
- invalid_cluster_watchers_ ABSL_GUARDED_BY(mu_);
373
- std::map<EndpointWatcherInterface*, RefCountedPtr<EndpointWatcherInterface>>
374
- invalid_endpoint_watchers_ ABSL_GUARDED_BY(mu_);
316
+ std::map<ResourceWatcherInterface*, RefCountedPtr<ResourceWatcherInterface>>
317
+ invalid_watchers_ ABSL_GUARDED_BY(mu_);
375
318
 
376
319
  bool shutting_down_ ABSL_GUARDED_BY(mu_) = false;
377
320
  };