grpc 1.30.0 → 1.31.1

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

Potentially problematic release.


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

Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +560 -619
  3. data/include/grpc/grpc_security.h +8 -0
  4. data/include/grpc/grpc_security_constants.h +3 -0
  5. data/include/grpc/impl/codegen/grpc_types.h +7 -5
  6. data/include/grpc/impl/codegen/port_platform.h +0 -32
  7. data/src/core/ext/filters/client_channel/backend_metric.cc +12 -9
  8. data/src/core/ext/filters/client_channel/client_channel.cc +406 -261
  9. data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
  10. data/src/core/ext/filters/client_channel/config_selector.h +93 -0
  11. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +2 -0
  13. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
  14. data/src/core/ext/filters/client_channel/http_proxy.cc +6 -4
  15. data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +39 -23
  17. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -6
  18. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +3 -4
  19. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +381 -72
  20. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -5
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +5 -2
  22. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +6 -5
  23. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +8 -6
  24. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +9 -7
  25. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +7 -5
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -48
  27. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  28. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +21 -18
  29. data/src/core/ext/filters/client_channel/resolver_registry.cc +13 -14
  30. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +6 -7
  31. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +33 -28
  32. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +39 -20
  33. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  34. data/src/core/ext/filters/client_channel/subchannel.cc +1 -1
  35. data/src/core/ext/filters/client_channel/xds/xds_api.cc +327 -123
  36. data/src/core/ext/filters/client_channel/xds/xds_api.h +72 -7
  37. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +12 -23
  38. data/src/core/ext/filters/client_channel/xds/xds_client.cc +112 -33
  39. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +10 -10
  40. data/src/core/ext/filters/http/client/http_client_filter.cc +5 -5
  41. data/src/core/ext/filters/http/http_filters_plugin.cc +2 -1
  42. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +74 -33
  43. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +3 -1
  44. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -80
  45. data/src/core/ext/filters/message_size/message_size_filter.h +6 -0
  46. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +383 -347
  47. data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
  48. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
  49. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
  50. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
  51. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +19 -4
  52. data/src/core/ext/transport/chttp2/transport/flow_control.cc +22 -27
  53. data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
  54. data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
  55. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
  56. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  57. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
  58. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
  59. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
  61. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
  62. data/src/core/ext/transport/chttp2/transport/internal.h +13 -0
  63. data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
  64. data/src/core/ext/transport/chttp2/transport/writing.cc +9 -14
  65. data/src/core/ext/transport/inproc/inproc_transport.cc +35 -15
  66. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
  67. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
  68. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -1
  69. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +80 -69
  70. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +24 -23
  71. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +66 -56
  72. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
  73. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +2 -2
  74. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +317 -311
  75. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +42 -34
  76. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +7 -7
  77. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +79 -61
  78. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +55 -49
  79. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +9 -8
  80. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +1 -1
  81. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +163 -169
  82. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +51 -45
  83. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +4 -5
  84. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +107 -100
  85. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +137 -117
  86. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +9 -9
  87. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +105 -87
  88. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +12 -13
  89. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -1
  90. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
  91. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
  92. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -1
  93. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
  94. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -1
  95. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +49 -42
  96. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +70 -62
  97. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
  98. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +81 -65
  99. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -1
  100. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +1 -1
  101. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
  102. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +9 -10
  103. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
  104. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
  105. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -1
  106. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +7 -7
  107. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +648 -696
  108. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
  109. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
  110. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -1
  111. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
  112. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +234 -199
  113. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
  114. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +13 -13
  115. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +1 -2
  116. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +20 -18
  117. data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
  118. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +18 -17
  119. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
  120. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
  121. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
  122. data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
  123. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
  124. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
  125. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
  126. data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
  127. data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
  128. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
  129. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +3 -3
  130. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +412 -386
  131. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
  132. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
  133. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
  134. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
  135. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
  136. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
  137. data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
  138. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
  139. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
  140. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
  141. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
  142. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
  143. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
  144. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
  145. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
  146. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
  147. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +5 -6
  148. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
  149. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
  150. data/src/core/ext/upb-generated/validate/validate.upb.h +536 -535
  151. data/src/core/lib/channel/channel_trace.cc +2 -6
  152. data/src/core/lib/channel/channelz.cc +5 -15
  153. data/src/core/lib/gpr/log_linux.cc +6 -8
  154. data/src/core/lib/gpr/log_posix.cc +6 -8
  155. data/src/core/lib/gpr/string.cc +10 -9
  156. data/src/core/lib/gpr/string.h +4 -2
  157. data/src/core/lib/gprpp/global_config_env.cc +8 -6
  158. data/src/core/lib/http/httpcli.cc +13 -10
  159. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  160. data/src/core/lib/iomgr/cfstream_handle.cc +1 -0
  161. data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
  162. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  163. data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -6
  164. data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -21
  165. data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
  166. data/src/core/lib/iomgr/ev_posix.cc +2 -0
  167. data/src/core/lib/iomgr/iomgr.cc +10 -0
  168. data/src/core/lib/iomgr/iomgr.h +10 -0
  169. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  170. data/src/core/lib/iomgr/port.h +1 -21
  171. data/src/core/lib/iomgr/resolve_address_custom.cc +13 -18
  172. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -8
  173. data/src/core/lib/iomgr/resource_quota.cc +34 -31
  174. data/src/core/lib/iomgr/sockaddr_utils.cc +7 -5
  175. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  176. data/src/core/lib/iomgr/socket_utils_common_posix.cc +95 -55
  177. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  178. data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -11
  179. data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
  180. data/src/core/lib/iomgr/tcp_client_posix.cc +27 -36
  181. data/src/core/lib/iomgr/tcp_client_windows.cc +9 -9
  182. data/src/core/lib/iomgr/tcp_custom.cc +1 -1
  183. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  184. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  185. data/src/core/lib/iomgr/tcp_server.h +7 -5
  186. data/src/core/lib/iomgr/tcp_server_custom.cc +6 -14
  187. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -41
  188. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
  189. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -7
  190. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -9
  191. data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
  192. data/src/core/lib/iomgr/timer_generic.cc +13 -12
  193. data/src/core/lib/iomgr/udp_server.cc +24 -23
  194. data/src/core/lib/iomgr/udp_server.h +5 -2
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
  198. data/src/core/lib/json/json_reader.cc +20 -21
  199. data/src/core/lib/security/credentials/credentials.h +5 -3
  200. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  201. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +12 -9
  202. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
  203. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +19 -28
  204. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -6
  205. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
  206. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
  207. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +10 -0
  208. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +10 -10
  209. data/src/core/lib/security/security_connector/security_connector.cc +2 -0
  210. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  211. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -11
  212. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +5 -0
  213. data/src/core/lib/security/security_connector/ssl_utils.cc +44 -23
  214. data/src/core/lib/security/security_connector/ssl_utils.h +6 -2
  215. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +27 -24
  216. data/src/core/lib/security/transport/auth_filters.h +0 -5
  217. data/src/core/lib/security/transport/client_auth_filter.cc +10 -9
  218. data/src/core/lib/security/util/json_util.cc +12 -13
  219. data/src/core/lib/slice/slice.cc +38 -1
  220. data/src/core/lib/slice/slice_internal.h +1 -0
  221. data/src/core/lib/surface/call.cc +40 -41
  222. data/src/core/lib/surface/completion_queue.cc +271 -14
  223. data/src/core/lib/surface/completion_queue.h +8 -0
  224. data/src/core/lib/surface/init.cc +2 -0
  225. data/src/core/lib/surface/server.cc +565 -632
  226. data/src/core/lib/surface/server.h +34 -12
  227. data/src/core/lib/surface/version.cc +2 -2
  228. data/src/core/lib/transport/transport.h +6 -0
  229. data/src/core/lib/uri/uri_parser.cc +8 -15
  230. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  231. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +23 -13
  232. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -0
  233. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
  234. data/src/core/tsi/ssl_transport_security.cc +108 -11
  235. data/src/core/tsi/ssl_transport_security.h +14 -2
  236. data/src/core/tsi/transport_security_interface.h +5 -0
  237. data/src/ruby/bin/math_services_pb.rb +4 -4
  238. data/src/ruby/ext/grpc/extconf.rb +5 -2
  239. data/src/ruby/ext/grpc/rb_call.c +3 -2
  240. data/src/ruby/ext/grpc/rb_call.h +4 -0
  241. data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
  242. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  243. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  244. data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
  245. data/src/ruby/lib/grpc/generic/interceptors.rb +1 -1
  246. data/src/ruby/lib/grpc/version.rb +1 -1
  247. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +2 -2
  248. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +5 -0
  249. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +28 -12
  250. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  251. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +2 -0
  252. data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
  253. data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
  254. data/src/ruby/spec/pb/codegen/package_option_spec.rb +25 -1
  255. data/src/ruby/spec/support/services.rb +10 -4
  256. data/src/ruby/spec/user_agent_spec.rb +74 -0
  257. data/third_party/boringssl-with-bazel/err_data.c +89 -83
  258. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  259. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
  260. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
  261. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
  262. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  263. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  264. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
  265. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
  266. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
  267. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
  268. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  269. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
  270. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +12 -52
  271. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +0 -22
  272. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +143 -0
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +11 -1
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +2 -1
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +13 -11
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +24 -23
  278. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +20 -16
  279. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -2
  280. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  281. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
  282. data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -15
  283. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
  284. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
  285. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +0 -29
  286. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +116 -363
  287. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +7 -45
  288. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
  289. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
  290. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
  291. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  292. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
  293. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
  294. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +41 -0
  295. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
  296. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +28 -9
  297. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
  298. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
  299. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
  300. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
  301. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
  302. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
  303. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  304. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
  305. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
  306. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
  307. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +33 -16
  308. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -10
  309. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +789 -715
  310. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +3 -3
  311. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -2
  312. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -2
  313. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +9 -0
  314. data/third_party/boringssl-with-bazel/src/ssl/internal.h +17 -14
  315. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -7
  316. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +28 -0
  317. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +4 -24
  318. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
  319. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +45 -24
  320. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +31 -21
  321. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +12 -9
  322. data/third_party/re2/re2/bitmap256.h +117 -0
  323. data/third_party/re2/re2/bitstate.cc +385 -0
  324. data/third_party/re2/re2/compile.cc +1279 -0
  325. data/third_party/re2/re2/dfa.cc +2130 -0
  326. data/third_party/re2/re2/filtered_re2.cc +121 -0
  327. data/third_party/re2/re2/filtered_re2.h +109 -0
  328. data/third_party/re2/re2/mimics_pcre.cc +197 -0
  329. data/third_party/re2/re2/nfa.cc +713 -0
  330. data/third_party/re2/re2/onepass.cc +623 -0
  331. data/third_party/re2/re2/parse.cc +2464 -0
  332. data/third_party/re2/re2/perl_groups.cc +119 -0
  333. data/third_party/re2/re2/pod_array.h +55 -0
  334. data/third_party/re2/re2/prefilter.cc +710 -0
  335. data/third_party/re2/re2/prefilter.h +108 -0
  336. data/third_party/re2/re2/prefilter_tree.cc +407 -0
  337. data/third_party/re2/re2/prefilter_tree.h +139 -0
  338. data/third_party/re2/re2/prog.cc +988 -0
  339. data/third_party/re2/re2/prog.h +436 -0
  340. data/third_party/re2/re2/re2.cc +1362 -0
  341. data/third_party/re2/re2/re2.h +1002 -0
  342. data/third_party/re2/re2/regexp.cc +980 -0
  343. data/third_party/re2/re2/regexp.h +659 -0
  344. data/third_party/re2/re2/set.cc +154 -0
  345. data/third_party/re2/re2/set.h +80 -0
  346. data/third_party/re2/re2/simplify.cc +657 -0
  347. data/third_party/re2/re2/sparse_array.h +392 -0
  348. data/third_party/re2/re2/sparse_set.h +264 -0
  349. data/third_party/re2/re2/stringpiece.cc +65 -0
  350. data/third_party/re2/re2/stringpiece.h +210 -0
  351. data/third_party/re2/re2/tostring.cc +351 -0
  352. data/third_party/re2/re2/unicode_casefold.cc +582 -0
  353. data/third_party/re2/re2/unicode_casefold.h +78 -0
  354. data/third_party/re2/re2/unicode_groups.cc +6269 -0
  355. data/third_party/re2/re2/unicode_groups.h +67 -0
  356. data/third_party/re2/re2/walker-inl.h +246 -0
  357. data/third_party/re2/util/benchmark.h +156 -0
  358. data/third_party/re2/util/flags.h +26 -0
  359. data/third_party/re2/util/logging.h +109 -0
  360. data/third_party/re2/util/malloc_counter.h +19 -0
  361. data/third_party/re2/util/mix.h +41 -0
  362. data/third_party/re2/util/mutex.h +148 -0
  363. data/third_party/re2/util/pcre.cc +1025 -0
  364. data/third_party/re2/util/pcre.h +681 -0
  365. data/third_party/re2/util/rune.cc +260 -0
  366. data/third_party/re2/util/strutil.cc +149 -0
  367. data/third_party/re2/util/strutil.h +21 -0
  368. data/third_party/re2/util/test.h +50 -0
  369. data/third_party/re2/util/utf.h +44 -0
  370. data/third_party/re2/util/util.h +42 -0
  371. data/third_party/upb/upb/decode.c +467 -504
  372. data/third_party/upb/upb/encode.c +163 -121
  373. data/third_party/upb/upb/msg.c +130 -64
  374. data/third_party/upb/upb/msg.h +418 -14
  375. data/third_party/upb/upb/port_def.inc +35 -6
  376. data/third_party/upb/upb/port_undef.inc +8 -1
  377. data/third_party/upb/upb/table.c +53 -75
  378. data/third_party/upb/upb/table.int.h +11 -43
  379. data/third_party/upb/upb/upb.c +148 -124
  380. data/third_party/upb/upb/upb.h +65 -147
  381. data/third_party/upb/upb/upb.hpp +86 -0
  382. metadata +90 -30
  383. data/third_party/upb/upb/generated_util.h +0 -105
@@ -338,6 +338,7 @@ inline uint32_t grpc_slice_hash_internal(const grpc_slice& s) {
338
338
  grpc_slice grpc_slice_from_moved_buffer(grpc_core::UniquePtr<char> p,
339
339
  size_t len);
340
340
  grpc_slice grpc_slice_from_moved_string(grpc_core::UniquePtr<char> p);
341
+ grpc_slice grpc_slice_from_cpp_string(std::string str);
341
342
 
342
343
  // Returns the memory used by this slice, not counting the slice structure
343
344
  // itself. This means that inlined and slices from static strings will return
@@ -24,6 +24,11 @@
24
24
  #include <stdlib.h>
25
25
  #include <string.h>
26
26
 
27
+ #include <string>
28
+
29
+ #include "absl/strings/str_cat.h"
30
+ #include "absl/strings/str_format.h"
31
+
27
32
  #include <grpc/compression.h>
28
33
  #include <grpc/grpc.h>
29
34
  #include <grpc/slice.h>
@@ -225,7 +230,9 @@ struct grpc_call {
225
230
  grpc_closure receiving_initial_metadata_ready;
226
231
  grpc_closure receiving_trailing_metadata_ready;
227
232
  uint32_t test_only_last_message_flags = 0;
228
- gpr_atm cancelled = 0;
233
+ // Status about operation of call
234
+ bool sent_server_trailing_metadata = false;
235
+ gpr_atm cancelled_with_error = 0;
229
236
 
230
237
  grpc_closure release_call;
231
238
 
@@ -686,7 +693,7 @@ static void done_termination(void* arg, grpc_error* /*error*/) {
686
693
  }
687
694
 
688
695
  static void cancel_with_error(grpc_call* c, grpc_error* error) {
689
- if (!gpr_atm_rel_cas(&c->cancelled, 0, 1)) {
696
+ if (!gpr_atm_rel_cas(&c->cancelled_with_error, 0, 1)) {
690
697
  GRPC_ERROR_UNREF(error);
691
698
  return;
692
699
  }
@@ -751,13 +758,13 @@ static void set_final_status(grpc_call* call, grpc_error* error) {
751
758
  }
752
759
  } else {
753
760
  *call->final_op.server.cancelled =
754
- error != GRPC_ERROR_NONE ||
755
- reinterpret_cast<grpc_error*>(gpr_atm_acq_load(&call->status_error)) !=
756
- GRPC_ERROR_NONE;
761
+ error != GRPC_ERROR_NONE || !call->sent_server_trailing_metadata;
757
762
  grpc_core::channelz::ServerNode* channelz_server =
758
763
  grpc_server_get_channelz_node(call->final_op.server.server);
759
764
  if (channelz_server != nullptr) {
760
- if (*call->final_op.server.cancelled) {
765
+ if (*call->final_op.server.cancelled ||
766
+ reinterpret_cast<grpc_error*>(
767
+ gpr_atm_acq_load(&call->status_error)) != GRPC_ERROR_NONE) {
761
768
  channelz_server->RecordCallFailed();
762
769
  } else {
763
770
  channelz_server->RecordCallSucceeded();
@@ -1049,14 +1056,12 @@ static void recv_trailing_filter(void* args, grpc_metadata_batch* b,
1049
1056
  grpc_get_status_code_from_metadata(b->idx.named.grpc_status->md);
1050
1057
  grpc_error* error = GRPC_ERROR_NONE;
1051
1058
  if (status_code != GRPC_STATUS_OK) {
1052
- char* peer_msg = nullptr;
1053
1059
  char* peer = grpc_call_get_peer(call);
1054
- gpr_asprintf(&peer_msg, "Error received from peer %s", peer);
1055
- error = grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(peer_msg),
1056
- GRPC_ERROR_INT_GRPC_STATUS,
1057
- static_cast<intptr_t>(status_code));
1060
+ error = grpc_error_set_int(
1061
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1062
+ absl::StrCat("Error received from peer ", peer).c_str()),
1063
+ GRPC_ERROR_INT_GRPC_STATUS, static_cast<intptr_t>(status_code));
1058
1064
  gpr_free(peer);
1059
- gpr_free(peer_msg);
1060
1065
  }
1061
1066
  if (b->idx.named.grpc_message != nullptr) {
1062
1067
  error = grpc_error_set_str(
@@ -1367,49 +1372,41 @@ static void receiving_stream_ready_in_call_combiner(void* bctlp,
1367
1372
 
1368
1373
  static void GPR_ATTRIBUTE_NOINLINE
1369
1374
  handle_both_stream_and_msg_compression_set(grpc_call* call) {
1370
- char* error_msg = nullptr;
1371
- gpr_asprintf(&error_msg,
1372
- "Incoming stream has both stream compression (%d) and message "
1373
- "compression (%d).",
1374
- call->incoming_stream_compression_algorithm,
1375
- call->incoming_message_compression_algorithm);
1376
- gpr_log(GPR_ERROR, "%s", error_msg);
1377
- cancel_with_status(call, GRPC_STATUS_INTERNAL, error_msg);
1378
- gpr_free(error_msg);
1375
+ std::string error_msg = absl::StrFormat(
1376
+ "Incoming stream has both stream compression (%d) and message "
1377
+ "compression (%d).",
1378
+ call->incoming_stream_compression_algorithm,
1379
+ call->incoming_message_compression_algorithm);
1380
+ gpr_log(GPR_ERROR, "%s", error_msg.c_str());
1381
+ cancel_with_status(call, GRPC_STATUS_INTERNAL, error_msg.c_str());
1379
1382
  }
1380
1383
 
1381
1384
  static void GPR_ATTRIBUTE_NOINLINE
1382
1385
  handle_error_parsing_compression_algorithm(grpc_call* call) {
1383
- char* error_msg = nullptr;
1384
- gpr_asprintf(&error_msg,
1385
- "Error in incoming message compression (%d) or stream "
1386
- "compression (%d).",
1387
- call->incoming_stream_compression_algorithm,
1388
- call->incoming_message_compression_algorithm);
1389
- cancel_with_status(call, GRPC_STATUS_INTERNAL, error_msg);
1390
- gpr_free(error_msg);
1386
+ std::string error_msg = absl::StrFormat(
1387
+ "Error in incoming message compression (%d) or stream "
1388
+ "compression (%d).",
1389
+ call->incoming_stream_compression_algorithm,
1390
+ call->incoming_message_compression_algorithm);
1391
+ cancel_with_status(call, GRPC_STATUS_INTERNAL, error_msg.c_str());
1391
1392
  }
1392
1393
 
1393
1394
  static void GPR_ATTRIBUTE_NOINLINE handle_invalid_compression(
1394
1395
  grpc_call* call, grpc_compression_algorithm compression_algorithm) {
1395
- char* error_msg = nullptr;
1396
- gpr_asprintf(&error_msg, "Invalid compression algorithm value '%d'.",
1397
- compression_algorithm);
1398
- gpr_log(GPR_ERROR, "%s", error_msg);
1399
- cancel_with_status(call, GRPC_STATUS_UNIMPLEMENTED, error_msg);
1400
- gpr_free(error_msg);
1396
+ std::string error_msg = absl::StrFormat(
1397
+ "Invalid compression algorithm value '%d'.", compression_algorithm);
1398
+ gpr_log(GPR_ERROR, "%s", error_msg.c_str());
1399
+ cancel_with_status(call, GRPC_STATUS_UNIMPLEMENTED, error_msg.c_str());
1401
1400
  }
1402
1401
 
1403
1402
  static void GPR_ATTRIBUTE_NOINLINE handle_compression_algorithm_disabled(
1404
1403
  grpc_call* call, grpc_compression_algorithm compression_algorithm) {
1405
- char* error_msg = nullptr;
1406
1404
  const char* algo_name = nullptr;
1407
1405
  grpc_compression_algorithm_name(compression_algorithm, &algo_name);
1408
- gpr_asprintf(&error_msg, "Compression algorithm '%s' is disabled.",
1409
- algo_name);
1410
- gpr_log(GPR_ERROR, "%s", error_msg);
1411
- cancel_with_status(call, GRPC_STATUS_UNIMPLEMENTED, error_msg);
1412
- gpr_free(error_msg);
1406
+ std::string error_msg =
1407
+ absl::StrFormat("Compression algorithm '%s' is disabled.", algo_name);
1408
+ gpr_log(GPR_ERROR, "%s", error_msg.c_str());
1409
+ cancel_with_status(call, GRPC_STATUS_UNIMPLEMENTED, error_msg.c_str());
1413
1410
  }
1414
1411
 
1415
1412
  static void GPR_ATTRIBUTE_NOINLINE handle_compression_algorithm_not_accepted(
@@ -1791,6 +1788,8 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1791
1788
  }
1792
1789
  stream_op_payload->send_trailing_metadata.send_trailing_metadata =
1793
1790
  &call->metadata_batch[0 /* is_receiving */][1 /* is_trailing */];
1791
+ stream_op_payload->send_trailing_metadata.sent =
1792
+ &call->sent_server_trailing_metadata;
1794
1793
  has_send_ops = true;
1795
1794
  break;
1796
1795
  }
@@ -39,6 +39,7 @@
39
39
  #include "src/core/lib/gpr/string.h"
40
40
  #include "src/core/lib/gpr/tls.h"
41
41
  #include "src/core/lib/gprpp/atomic.h"
42
+ #include "src/core/lib/iomgr/closure.h"
42
43
  #include "src/core/lib/iomgr/executor.h"
43
44
  #include "src/core/lib/iomgr/pollset.h"
44
45
  #include "src/core/lib/iomgr/timer.h"
@@ -208,6 +209,9 @@ struct cq_vtable {
208
209
  void* reserved);
209
210
  grpc_event (*pluck)(grpc_completion_queue* cq, void* tag,
210
211
  gpr_timespec deadline, void* reserved);
212
+ // TODO(vjpai): Remove proxy_pollset once callback_alternative no longer
213
+ // needed.
214
+ grpc_pollset* (*proxy_pollset)(grpc_completion_queue* cq);
211
215
  };
212
216
 
213
217
  namespace {
@@ -309,7 +313,7 @@ struct cq_pluck_data {
309
313
  };
310
314
 
311
315
  struct cq_callback_data {
312
- cq_callback_data(
316
+ explicit cq_callback_data(
313
317
  grpc_experimental_completion_queue_functor* shutdown_callback)
314
318
  : shutdown_callback(shutdown_callback) {}
315
319
 
@@ -327,17 +331,88 @@ struct cq_callback_data {
327
331
  Initial count is dropped by grpc_completion_queue_shutdown. */
328
332
  grpc_core::Atomic<intptr_t> pending_events{1};
329
333
 
330
- /** Counter of how many things have ever been queued on this completion queue
331
- useful for avoiding locks to check the queue */
332
- grpc_core::Atomic<intptr_t> things_queued_ever{0};
334
+ /** 0 initially. 1 once we initiated shutdown */
335
+ bool shutdown_called = false;
336
+
337
+ /** A callback that gets invoked when the CQ completes shutdown */
338
+ grpc_experimental_completion_queue_functor* shutdown_callback;
339
+ };
340
+
341
+ // TODO(vjpai): Remove all callback_alternative variants when event manager is
342
+ // the only supported poller.
343
+ struct cq_callback_alternative_data {
344
+ explicit cq_callback_alternative_data(
345
+ grpc_experimental_completion_queue_functor* shutdown_callback)
346
+ : implementation(SharedNextableCQ()),
347
+ shutdown_callback(shutdown_callback) {}
348
+
349
+ /* This just points to a single shared nextable CQ */
350
+ grpc_completion_queue* const implementation;
351
+
352
+ /** Number of outstanding events (+1 if not shut down)
353
+ Initial count is dropped by grpc_completion_queue_shutdown */
354
+ grpc_core::Atomic<intptr_t> pending_events{1};
333
355
 
334
356
  /** 0 initially. 1 once we initiated shutdown */
335
357
  bool shutdown_called = false;
336
358
 
337
359
  /** A callback that gets invoked when the CQ completes shutdown */
338
360
  grpc_experimental_completion_queue_functor* shutdown_callback;
361
+
362
+ static grpc_completion_queue* SharedNextableCQ() {
363
+ grpc_core::MutexLock lock(&*shared_cq_next_mu);
364
+
365
+ if (shared_cq_next == nullptr) {
366
+ shared_cq_next = grpc_completion_queue_create_for_next(nullptr);
367
+ int num_nexting_threads = GPR_CLAMP(gpr_cpu_num_cores(), 1, 32);
368
+ threads_remaining.Store(num_nexting_threads,
369
+ grpc_core::MemoryOrder::RELEASE);
370
+ for (int i = 0; i < num_nexting_threads; i++) {
371
+ grpc_core::Executor::Run(
372
+ GRPC_CLOSURE_CREATE(
373
+ [](void* arg, grpc_error* /*error*/) {
374
+ grpc_completion_queue* cq =
375
+ static_cast<grpc_completion_queue*>(arg);
376
+ while (true) {
377
+ grpc_event event = grpc_completion_queue_next(
378
+ cq, gpr_inf_future(GPR_CLOCK_REALTIME), nullptr);
379
+ if (event.type == GRPC_QUEUE_SHUTDOWN) {
380
+ break;
381
+ }
382
+ GPR_DEBUG_ASSERT(event.type == GRPC_OP_COMPLETE);
383
+ // We can always execute the callback inline rather than
384
+ // pushing it to another Executor thread because this
385
+ // thread is definitely running on an executor, does not
386
+ // hold any application locks before executing the callback,
387
+ // and cannot be entered recursively.
388
+ auto* functor = static_cast<
389
+ grpc_experimental_completion_queue_functor*>(event.tag);
390
+ functor->functor_run(functor, event.success);
391
+ }
392
+ if (threads_remaining.FetchSub(
393
+ 1, grpc_core::MemoryOrder::ACQ_REL) == 1) {
394
+ grpc_completion_queue_destroy(cq);
395
+ }
396
+ },
397
+ shared_cq_next, nullptr),
398
+ GRPC_ERROR_NONE, grpc_core::ExecutorType::DEFAULT,
399
+ grpc_core::ExecutorJobType::LONG);
400
+ }
401
+ }
402
+ return shared_cq_next;
403
+ }
404
+ // Use manually-constructed Mutex to avoid static construction issues
405
+ static grpc_core::ManualConstructor<grpc_core::Mutex> shared_cq_next_mu;
406
+ static grpc_completion_queue*
407
+ shared_cq_next; // GUARDED_BY(shared_cq_next_mu)
408
+ static grpc_core::Atomic<int> threads_remaining;
339
409
  };
340
410
 
411
+ grpc_core::ManualConstructor<grpc_core::Mutex>
412
+ cq_callback_alternative_data::shared_cq_next_mu;
413
+ grpc_completion_queue* cq_callback_alternative_data::shared_cq_next = nullptr;
414
+ grpc_core::Atomic<int> cq_callback_alternative_data::threads_remaining{0};
415
+
341
416
  } // namespace
342
417
 
343
418
  /* Completion queue structure */
@@ -350,6 +425,12 @@ struct grpc_completion_queue {
350
425
  const cq_vtable* vtable;
351
426
  const cq_poller_vtable* poller_vtable;
352
427
 
428
+ // The pollset entry is allowed to enable proxy CQs like the
429
+ // callback_alternative.
430
+ // TODO(vjpai): Consider removing pollset and reverting to previous
431
+ // calculation of pollset once callback_alternative is no longer needed.
432
+ grpc_pollset* pollset;
433
+
353
434
  #ifndef NDEBUG
354
435
  void** outstanding_tags;
355
436
  size_t outstanding_tag_count;
@@ -364,13 +445,17 @@ struct grpc_completion_queue {
364
445
  static void cq_finish_shutdown_next(grpc_completion_queue* cq);
365
446
  static void cq_finish_shutdown_pluck(grpc_completion_queue* cq);
366
447
  static void cq_finish_shutdown_callback(grpc_completion_queue* cq);
448
+ static void cq_finish_shutdown_callback_alternative(grpc_completion_queue* cq);
367
449
  static void cq_shutdown_next(grpc_completion_queue* cq);
368
450
  static void cq_shutdown_pluck(grpc_completion_queue* cq);
369
451
  static void cq_shutdown_callback(grpc_completion_queue* cq);
452
+ static void cq_shutdown_callback_alternative(grpc_completion_queue* cq);
370
453
 
371
454
  static bool cq_begin_op_for_next(grpc_completion_queue* cq, void* tag);
372
455
  static bool cq_begin_op_for_pluck(grpc_completion_queue* cq, void* tag);
373
456
  static bool cq_begin_op_for_callback(grpc_completion_queue* cq, void* tag);
457
+ static bool cq_begin_op_for_callback_alternative(grpc_completion_queue* cq,
458
+ void* tag);
374
459
 
375
460
  // A cq_end_op function is called when an operation on a given CQ with
376
461
  // a given tag has completed. The storage argument is a reference to the
@@ -393,12 +478,20 @@ static void cq_end_op_for_callback(
393
478
  void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
394
479
  grpc_cq_completion* storage, bool internal);
395
480
 
481
+ static void cq_end_op_for_callback_alternative(
482
+ grpc_completion_queue* cq, void* tag, grpc_error* error,
483
+ void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
484
+ grpc_cq_completion* storage, bool internal);
485
+
396
486
  static grpc_event cq_next(grpc_completion_queue* cq, gpr_timespec deadline,
397
487
  void* reserved);
398
488
 
399
489
  static grpc_event cq_pluck(grpc_completion_queue* cq, void* tag,
400
490
  gpr_timespec deadline, void* reserved);
401
491
 
492
+ static grpc_pollset* cq_proxy_pollset_for_callback_alternative(
493
+ grpc_completion_queue* cq);
494
+
402
495
  // Note that cq_init_next and cq_init_pluck do not use the shutdown_callback
403
496
  static void cq_init_next(
404
497
  void* data, grpc_experimental_completion_queue_functor* shutdown_callback);
@@ -406,29 +499,39 @@ static void cq_init_pluck(
406
499
  void* data, grpc_experimental_completion_queue_functor* shutdown_callback);
407
500
  static void cq_init_callback(
408
501
  void* data, grpc_experimental_completion_queue_functor* shutdown_callback);
502
+ // poller becomes only option.
503
+ static void cq_init_callback_alternative(
504
+ void* data, grpc_experimental_completion_queue_functor* shutdown_callback);
409
505
  static void cq_destroy_next(void* data);
410
506
  static void cq_destroy_pluck(void* data);
411
507
  static void cq_destroy_callback(void* data);
508
+ static void cq_destroy_callback_alternative(void* data);
412
509
 
413
510
  /* Completion queue vtables based on the completion-type */
414
- static const cq_vtable g_cq_vtable[] = {
511
+ // TODO(vjpai): Make this const again once we stop needing callback_alternative
512
+ static cq_vtable g_polling_cq_vtable[] = {
415
513
  /* GRPC_CQ_NEXT */
416
514
  {GRPC_CQ_NEXT, sizeof(cq_next_data), cq_init_next, cq_shutdown_next,
417
515
  cq_destroy_next, cq_begin_op_for_next, cq_end_op_for_next, cq_next,
418
- nullptr},
516
+ nullptr, nullptr},
419
517
  /* GRPC_CQ_PLUCK */
420
518
  {GRPC_CQ_PLUCK, sizeof(cq_pluck_data), cq_init_pluck, cq_shutdown_pluck,
421
519
  cq_destroy_pluck, cq_begin_op_for_pluck, cq_end_op_for_pluck, nullptr,
422
- cq_pluck},
520
+ cq_pluck, nullptr},
423
521
  /* GRPC_CQ_CALLBACK */
424
522
  {GRPC_CQ_CALLBACK, sizeof(cq_callback_data), cq_init_callback,
425
523
  cq_shutdown_callback, cq_destroy_callback, cq_begin_op_for_callback,
426
- cq_end_op_for_callback, nullptr, nullptr},
524
+ cq_end_op_for_callback, nullptr, nullptr, nullptr},
427
525
  };
428
526
 
527
+ // Separate vtable for non-polling cqs, assign at init
528
+ static cq_vtable g_nonpolling_cq_vtable[sizeof(g_polling_cq_vtable) /
529
+ sizeof(g_polling_cq_vtable[0])];
530
+
429
531
  #define DATA_FROM_CQ(cq) ((void*)(cq + 1))
430
- #define POLLSET_FROM_CQ(cq) \
532
+ #define INLINE_POLLSET_FROM_CQ(cq) \
431
533
  ((grpc_pollset*)(cq->vtable->data_size + (char*)DATA_FROM_CQ(cq)))
534
+ #define POLLSET_FROM_CQ(cq) (cq->pollset)
432
535
 
433
536
  grpc_core::TraceFlag grpc_cq_pluck_trace(false, "queue_pluck");
434
537
 
@@ -447,6 +550,46 @@ static void on_pollset_shutdown_done(void* cq, grpc_error* error);
447
550
  void grpc_cq_global_init() {
448
551
  gpr_tls_init(&g_cached_event);
449
552
  gpr_tls_init(&g_cached_cq);
553
+ g_nonpolling_cq_vtable[GRPC_CQ_NEXT] = g_polling_cq_vtable[GRPC_CQ_NEXT];
554
+ g_nonpolling_cq_vtable[GRPC_CQ_PLUCK] = g_polling_cq_vtable[GRPC_CQ_PLUCK];
555
+ g_nonpolling_cq_vtable[GRPC_CQ_CALLBACK] =
556
+ g_polling_cq_vtable[GRPC_CQ_CALLBACK];
557
+ }
558
+
559
+ // TODO(vjpai): Remove when callback_alternative is no longer needed
560
+ void grpc_cq_init() {
561
+ // If the iomgr runs in the background, we can use the preferred callback CQ.
562
+ // If the iomgr is non-polling, we cannot use the alternative callback CQ.
563
+ if (!grpc_iomgr_run_in_background() && !grpc_iomgr_non_polling()) {
564
+ cq_callback_alternative_data::shared_cq_next_mu.Init();
565
+ g_polling_cq_vtable[GRPC_CQ_CALLBACK] = {
566
+ GRPC_CQ_CALLBACK,
567
+ sizeof(cq_callback_alternative_data),
568
+ cq_init_callback_alternative,
569
+ cq_shutdown_callback_alternative,
570
+ cq_destroy_callback_alternative,
571
+ cq_begin_op_for_callback_alternative,
572
+ cq_end_op_for_callback_alternative,
573
+ nullptr,
574
+ nullptr,
575
+ cq_proxy_pollset_for_callback_alternative};
576
+ }
577
+ }
578
+
579
+ // TODO(vjpai): Remove when callback_alternative is no longer needed
580
+ void grpc_cq_shutdown() {
581
+ if (!grpc_iomgr_run_in_background() && !grpc_iomgr_non_polling()) {
582
+ {
583
+ grpc_core::MutexLock lock(
584
+ &*cq_callback_alternative_data::shared_cq_next_mu);
585
+ if (cq_callback_alternative_data::shared_cq_next != nullptr) {
586
+ grpc_completion_queue_shutdown(
587
+ cq_callback_alternative_data::shared_cq_next);
588
+ }
589
+ cq_callback_alternative_data::shared_cq_next = nullptr;
590
+ }
591
+ cq_callback_alternative_data::shared_cq_next_mu.Destroy();
592
+ }
450
593
  }
451
594
 
452
595
  void grpc_completion_queue_thread_local_cache_init(grpc_completion_queue* cq) {
@@ -525,7 +668,9 @@ grpc_completion_queue* grpc_completion_queue_create_internal(
525
668
  "polling_type=%d)",
526
669
  2, (completion_type, polling_type));
527
670
 
528
- const cq_vtable* vtable = &g_cq_vtable[completion_type];
671
+ const cq_vtable* vtable = (polling_type == GRPC_CQ_NON_POLLING)
672
+ ? &g_nonpolling_cq_vtable[completion_type]
673
+ : &g_polling_cq_vtable[completion_type];
529
674
  const cq_poller_vtable* poller_vtable =
530
675
  &g_poller_vtable_by_poller_type[polling_type];
531
676
 
@@ -542,9 +687,18 @@ grpc_completion_queue* grpc_completion_queue_create_internal(
542
687
  /* One for destroy(), one for pollset_shutdown */
543
688
  new (&cq->owning_refs) grpc_core::RefCount(2);
544
689
 
545
- poller_vtable->init(POLLSET_FROM_CQ(cq), &cq->mu);
546
690
  vtable->init(DATA_FROM_CQ(cq), shutdown_callback);
547
691
 
692
+ // TODO(vjpai): When callback_alternative is no longer needed, cq->pollset can
693
+ // be removed and the nullptr proxy_pollset value below can be the definition
694
+ // of POLLSET_FROM_CQ.
695
+ cq->pollset = cq->vtable->proxy_pollset == nullptr
696
+ ? INLINE_POLLSET_FROM_CQ(cq)
697
+ : cq->vtable->proxy_pollset(cq);
698
+ // Init the inline pollset. If a proxy CQ is used, the proxy pollset will be
699
+ // init'ed in its CQ init.
700
+ cq->poller_vtable->init(INLINE_POLLSET_FROM_CQ(cq), &cq->mu);
701
+
548
702
  GRPC_CLOSURE_INIT(&cq->pollset_shutdown_done, on_pollset_shutdown_done, cq,
549
703
  grpc_schedule_on_exec_ctx);
550
704
  return cq;
@@ -582,6 +736,17 @@ static void cq_destroy_callback(void* data) {
582
736
  cqd->~cq_callback_data();
583
737
  }
584
738
 
739
+ static void cq_init_callback_alternative(
740
+ void* data, grpc_experimental_completion_queue_functor* shutdown_callback) {
741
+ new (data) cq_callback_alternative_data(shutdown_callback);
742
+ }
743
+
744
+ static void cq_destroy_callback_alternative(void* data) {
745
+ cq_callback_alternative_data* cqd =
746
+ static_cast<cq_callback_alternative_data*>(data);
747
+ cqd->~cq_callback_alternative_data();
748
+ }
749
+
585
750
  grpc_cq_completion_type grpc_get_cq_completion_type(grpc_completion_queue* cq) {
586
751
  return cq->vtable->cq_completion_type;
587
752
  }
@@ -622,7 +787,9 @@ void grpc_cq_internal_unref(grpc_completion_queue* cq) {
622
787
  #endif
623
788
  if (GPR_UNLIKELY(cq->owning_refs.Unref(debug_location, reason))) {
624
789
  cq->vtable->destroy(DATA_FROM_CQ(cq));
625
- cq->poller_vtable->destroy(POLLSET_FROM_CQ(cq));
790
+ // Only destroy the inlined pollset. If a proxy CQ is used, the proxy
791
+ // pollset will be destroyed by the proxy CQ.
792
+ cq->poller_vtable->destroy(INLINE_POLLSET_FROM_CQ(cq));
626
793
  #ifndef NDEBUG
627
794
  gpr_free(cq->outstanding_tags);
628
795
  #endif
@@ -673,6 +840,14 @@ static bool cq_begin_op_for_callback(grpc_completion_queue* cq, void* /*tag*/) {
673
840
  return cqd->pending_events.IncrementIfNonzero();
674
841
  }
675
842
 
843
+ static bool cq_begin_op_for_callback_alternative(grpc_completion_queue* cq,
844
+ void* tag) {
845
+ cq_callback_alternative_data* cqd =
846
+ static_cast<cq_callback_alternative_data*> DATA_FROM_CQ(cq);
847
+ return grpc_cq_begin_op(cqd->implementation, tag) &&
848
+ cqd->pending_events.IncrementIfNonzero();
849
+ }
850
+
676
851
  bool grpc_cq_begin_op(grpc_completion_queue* cq, void* tag) {
677
852
  #ifndef NDEBUG
678
853
  gpr_mu_lock(cq->mu);
@@ -836,7 +1011,7 @@ static void cq_end_op_for_pluck(
836
1011
  GRPC_ERROR_UNREF(error);
837
1012
  }
838
1013
 
839
- static void functor_callback(void* arg, grpc_error* error) {
1014
+ void functor_callback(void* arg, grpc_error* error) {
840
1015
  auto* functor = static_cast<grpc_experimental_completion_queue_functor*>(arg);
841
1016
  functor->functor_run(functor, error == GRPC_ERROR_NONE);
842
1017
  }
@@ -870,7 +1045,6 @@ static void cq_end_op_for_callback(
870
1045
 
871
1046
  cq_check_tag(cq, tag, true); /* Used in debug builds only */
872
1047
 
873
- cqd->things_queued_ever.FetchAdd(1, grpc_core::MemoryOrder::RELAXED);
874
1048
  if (cqd->pending_events.FetchSub(1, grpc_core::MemoryOrder::ACQ_REL) == 1) {
875
1049
  cq_finish_shutdown_callback(cq);
876
1050
  }
@@ -897,6 +1071,40 @@ static void cq_end_op_for_callback(
897
1071
  GRPC_CLOSURE_CREATE(functor_callback, functor, nullptr), error);
898
1072
  }
899
1073
 
1074
+ static void cq_end_op_for_callback_alternative(
1075
+ grpc_completion_queue* cq, void* tag, grpc_error* error,
1076
+ void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
1077
+ grpc_cq_completion* storage, bool internal) {
1078
+ GPR_TIMER_SCOPE("cq_end_op_for_callback_alternative", 0);
1079
+
1080
+ cq_callback_alternative_data* cqd =
1081
+ static_cast<cq_callback_alternative_data*> DATA_FROM_CQ(cq);
1082
+
1083
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_api_trace) ||
1084
+ (GRPC_TRACE_FLAG_ENABLED(grpc_trace_operation_failures) &&
1085
+ error != GRPC_ERROR_NONE)) {
1086
+ const char* errmsg = grpc_error_string(error);
1087
+ GRPC_API_TRACE(
1088
+ "cq_end_op_for_callback_alternative(cq=%p, tag=%p, error=%s, "
1089
+ "done=%p, done_arg=%p, storage=%p)",
1090
+ 6, (cq, tag, errmsg, done, done_arg, storage));
1091
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_operation_failures) &&
1092
+ error != GRPC_ERROR_NONE) {
1093
+ gpr_log(GPR_ERROR, "Operation failed: tag=%p, error=%s", tag, errmsg);
1094
+ }
1095
+ }
1096
+
1097
+ // Pass through the actual work to the internal nextable CQ
1098
+ grpc_cq_end_op(cqd->implementation, tag, error, done, done_arg, storage,
1099
+ internal);
1100
+
1101
+ cq_check_tag(cq, tag, true); /* Used in debug builds only */
1102
+
1103
+ if (cqd->pending_events.FetchSub(1, grpc_core::MemoryOrder::ACQ_REL) == 1) {
1104
+ cq_finish_shutdown_callback_alternative(cq);
1105
+ }
1106
+ }
1107
+
900
1108
  void grpc_cq_end_op(grpc_completion_queue* cq, void* tag, grpc_error* error,
901
1109
  void (*done)(void* done_arg, grpc_cq_completion* storage),
902
1110
  void* done_arg, grpc_cq_completion* storage,
@@ -904,6 +1112,13 @@ void grpc_cq_end_op(grpc_completion_queue* cq, void* tag, grpc_error* error,
904
1112
  cq->vtable->end_op(cq, tag, error, done, done_arg, storage, internal);
905
1113
  }
906
1114
 
1115
+ static grpc_pollset* cq_proxy_pollset_for_callback_alternative(
1116
+ grpc_completion_queue* cq) {
1117
+ cq_callback_alternative_data* cqd =
1118
+ static_cast<cq_callback_alternative_data*>(DATA_FROM_CQ(cq));
1119
+ return POLLSET_FROM_CQ(cqd->implementation);
1120
+ }
1121
+
907
1122
  struct cq_is_finished_arg {
908
1123
  gpr_atm last_seen_things_queued_ever;
909
1124
  grpc_completion_queue* cq;
@@ -1384,6 +1599,21 @@ static void cq_finish_shutdown_callback(grpc_completion_queue* cq) {
1384
1599
  GRPC_ERROR_NONE);
1385
1600
  }
1386
1601
 
1602
+ static void cq_finish_shutdown_callback_alternative(grpc_completion_queue* cq) {
1603
+ cq_callback_alternative_data* cqd =
1604
+ static_cast<cq_callback_alternative_data*> DATA_FROM_CQ(cq);
1605
+ auto* callback = cqd->shutdown_callback;
1606
+
1607
+ GPR_ASSERT(cqd->shutdown_called);
1608
+
1609
+ // Shutdown the non-proxy pollset
1610
+ cq->poller_vtable->shutdown(INLINE_POLLSET_FROM_CQ(cq),
1611
+ &cq->pollset_shutdown_done);
1612
+ grpc_core::Executor::Run(
1613
+ GRPC_CLOSURE_CREATE(functor_callback, callback, nullptr),
1614
+ GRPC_ERROR_NONE);
1615
+ }
1616
+
1387
1617
  static void cq_shutdown_callback(grpc_completion_queue* cq) {
1388
1618
  cq_callback_data* cqd = static_cast<cq_callback_data*> DATA_FROM_CQ(cq);
1389
1619
 
@@ -1410,6 +1640,33 @@ static void cq_shutdown_callback(grpc_completion_queue* cq) {
1410
1640
  GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down (callback cq)");
1411
1641
  }
1412
1642
 
1643
+ static void cq_shutdown_callback_alternative(grpc_completion_queue* cq) {
1644
+ cq_callback_alternative_data* cqd =
1645
+ static_cast<cq_callback_alternative_data*> DATA_FROM_CQ(cq);
1646
+
1647
+ /* Need an extra ref for cq here because:
1648
+ * We call cq_finish_shutdown_callback() below, which calls pollset shutdown.
1649
+ * Pollset shutdown decrements the cq ref count which can potentially destroy
1650
+ * the cq (if that happens to be the last ref).
1651
+ * Creating an extra ref here prevents the cq from getting destroyed while
1652
+ * this function is still active */
1653
+ GRPC_CQ_INTERNAL_REF(cq, "shutting_down (callback cq)");
1654
+ gpr_mu_lock(cq->mu);
1655
+ if (cqd->shutdown_called) {
1656
+ gpr_mu_unlock(cq->mu);
1657
+ GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down (callback cq)");
1658
+ return;
1659
+ }
1660
+ cqd->shutdown_called = true;
1661
+ if (cqd->pending_events.FetchSub(1, grpc_core::MemoryOrder::ACQ_REL) == 1) {
1662
+ gpr_mu_unlock(cq->mu);
1663
+ cq_finish_shutdown_callback_alternative(cq);
1664
+ } else {
1665
+ gpr_mu_unlock(cq->mu);
1666
+ }
1667
+ GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down (callback cq)");
1668
+ }
1669
+
1413
1670
  /* Shutdown simply drops a ref that we reserved at creation time; if we drop
1414
1671
  to zero here, then enter shutdown mode and wake up any waiters */
1415
1672
  void grpc_completion_queue_shutdown(grpc_completion_queue* cq) {