grpc 1.28.0 → 1.30.0

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 (497) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +7694 -11190
  3. data/include/grpc/grpc.h +2 -2
  4. data/include/grpc/grpc_security.h +22 -9
  5. data/include/grpc/grpc_security_constants.h +1 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +19 -21
  7. data/include/grpc/impl/codegen/port_platform.h +6 -2
  8. data/include/grpc/module.modulemap +24 -39
  9. data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +203 -236
  11. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_proxy.cc +17 -10
  15. data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
  16. data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
  17. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -4
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +240 -301
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
  28. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +84 -37
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
  34. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -2
  35. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  36. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  37. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  38. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +73 -59
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +16 -20
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +184 -133
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  48. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +40 -43
  49. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
  50. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  51. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +32 -5
  53. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  54. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
  55. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +16 -16
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
  58. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +20 -31
  59. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -3
  60. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  61. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  62. data/src/core/ext/filters/client_channel/service_config.cc +104 -144
  63. data/src/core/ext/filters/client_channel/service_config.h +28 -98
  64. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  65. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  66. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  67. data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
  68. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  69. data/src/core/ext/filters/client_channel/xds/xds_api.cc +348 -221
  70. data/src/core/ext/filters/client_channel/xds/xds_api.h +37 -37
  71. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +44 -49
  72. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +4 -3
  73. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
  74. data/src/core/ext/filters/client_channel/xds/xds_client.cc +532 -339
  75. data/src/core/ext/filters/client_channel/xds/xds_client.h +57 -22
  76. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
  77. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +31 -19
  78. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
  79. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  80. data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
  83. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +7 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.h +4 -4
  86. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +4 -4
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +23 -22
  89. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  90. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  92. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  93. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  94. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  96. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  97. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  98. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  99. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  100. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  101. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  102. data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
  103. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  104. data/src/core/ext/transport/chttp2/transport/writing.cc +15 -8
  105. data/src/core/ext/transport/inproc/inproc_transport.cc +19 -0
  106. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
  107. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -875
  108. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  109. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
  110. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  111. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
  112. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  113. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
  114. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
  115. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +21 -8
  116. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +43 -7
  117. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
  118. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  119. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  120. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
  121. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  122. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
  123. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +47 -26
  124. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +115 -65
  125. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
  126. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  127. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
  128. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
  129. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
  130. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +28 -13
  131. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
  133. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +88 -6
  134. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
  137. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
  138. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -0
  139. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
  140. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
  141. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +12 -4
  142. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
  144. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
  145. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +16 -0
  146. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
  147. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +2 -1
  148. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
  151. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
  152. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +63 -41
  153. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +173 -77
  154. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
  156. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -0
  157. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
  158. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +90 -30
  159. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
  160. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  161. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  163. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  164. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
  165. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  166. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +36 -0
  168. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
  169. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
  170. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  171. data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
  172. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
  173. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
  174. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
  175. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
  176. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  177. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
  178. data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
  179. data/src/core/ext/upb-generated/validate/validate.upb.h +69 -63
  180. data/src/core/lib/channel/channel_args.cc +15 -14
  181. data/src/core/lib/channel/channel_args.h +3 -1
  182. data/src/core/lib/channel/channel_stack.h +20 -13
  183. data/src/core/lib/channel/channelz.cc +5 -6
  184. data/src/core/lib/channel/channelz.h +3 -2
  185. data/src/core/lib/channel/channelz_registry.cc +5 -3
  186. data/src/core/lib/channel/connected_channel.cc +7 -5
  187. data/src/core/lib/channel/context.h +1 -1
  188. data/src/core/lib/channel/handshaker.cc +11 -13
  189. data/src/core/lib/channel/handshaker.h +4 -2
  190. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  191. data/src/core/lib/channel/status_util.cc +2 -3
  192. data/src/core/lib/compression/message_compress.cc +5 -1
  193. data/src/core/lib/debug/stats.cc +21 -27
  194. data/src/core/lib/debug/stats.h +3 -1
  195. data/src/core/lib/gpr/spinlock.h +2 -3
  196. data/src/core/lib/gpr/string.cc +2 -26
  197. data/src/core/lib/gpr/string.h +0 -16
  198. data/src/core/lib/gpr/sync_abseil.cc +2 -0
  199. data/src/core/lib/gpr/time.cc +4 -0
  200. data/src/core/lib/gpr/time_posix.cc +1 -1
  201. data/src/core/lib/gprpp/atomic.h +6 -6
  202. data/src/core/lib/gprpp/fork.cc +1 -1
  203. data/src/core/lib/gprpp/host_port.cc +29 -35
  204. data/src/core/lib/gprpp/host_port.h +14 -17
  205. data/src/core/lib/gprpp/map.h +5 -11
  206. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  207. data/src/core/lib/http/format_request.cc +46 -65
  208. data/src/core/lib/http/httpcli.cc +2 -3
  209. data/src/core/lib/http/httpcli.h +2 -3
  210. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  211. data/src/core/lib/http/parser.h +2 -3
  212. data/src/core/lib/iomgr/buffer_list.h +22 -21
  213. data/src/core/lib/iomgr/call_combiner.h +3 -2
  214. data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
  215. data/src/core/lib/iomgr/closure.h +2 -3
  216. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  217. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  218. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  219. data/src/core/lib/iomgr/error.cc +6 -9
  220. data/src/core/lib/iomgr/error.h +0 -1
  221. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  222. data/src/core/lib/iomgr/ev_apple.h +43 -0
  223. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
  224. data/src/core/lib/iomgr/ev_epollex_linux.cc +2 -3
  225. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  226. data/src/core/lib/iomgr/ev_posix.cc +2 -3
  227. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  228. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  229. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  230. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  231. data/src/core/lib/iomgr/port.h +1 -0
  232. data/src/core/lib/iomgr/python_util.h +46 -0
  233. data/src/core/lib/iomgr/resolve_address.h +4 -6
  234. data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
  235. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  236. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  237. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
  238. data/src/core/lib/iomgr/resource_quota.cc +4 -6
  239. data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
  240. data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
  241. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  242. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  243. data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -26
  244. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +8 -5
  247. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  248. data/src/core/lib/iomgr/tcp_custom.cc +2 -3
  249. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -9
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -4
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
  253. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  254. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  255. data/src/core/lib/iomgr/timer_generic.cc +2 -3
  256. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  257. data/src/core/lib/iomgr/timer_heap.h +2 -3
  258. data/src/core/lib/iomgr/udp_server.cc +9 -14
  259. data/src/core/lib/json/json.h +3 -2
  260. data/src/core/lib/json/json_reader.cc +5 -5
  261. data/src/core/lib/json/json_writer.cc +13 -12
  262. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  263. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  264. data/src/core/lib/security/credentials/credentials.cc +0 -84
  265. data/src/core/lib/security/credentials/credentials.h +8 -59
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +3 -8
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
  274. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +55 -27
  276. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +13 -0
  278. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  279. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
  280. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +38 -11
  281. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
  282. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -7
  283. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  284. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  285. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  286. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -25
  287. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
  288. data/src/core/lib/security/security_connector/ssl_utils.cc +59 -12
  289. data/src/core/lib/security/security_connector/ssl_utils.h +12 -10
  290. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +77 -51
  291. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
  292. data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
  293. data/src/core/lib/slice/slice_intern.cc +2 -3
  294. data/src/core/lib/slice/slice_internal.h +14 -0
  295. data/src/core/lib/slice/slice_utils.h +9 -0
  296. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  297. data/src/core/lib/surface/call.cc +2 -3
  298. data/src/core/lib/surface/call_log_batch.cc +50 -58
  299. data/src/core/lib/surface/channel.cc +53 -31
  300. data/src/core/lib/surface/channel.h +35 -4
  301. data/src/core/lib/surface/channel_ping.cc +2 -3
  302. data/src/core/lib/surface/completion_queue.cc +33 -33
  303. data/src/core/lib/surface/event_string.cc +18 -25
  304. data/src/core/lib/surface/event_string.h +3 -1
  305. data/src/core/lib/surface/init_secure.cc +1 -4
  306. data/src/core/lib/surface/server.cc +570 -369
  307. data/src/core/lib/surface/server.h +32 -0
  308. data/src/core/lib/surface/version.cc +2 -2
  309. data/src/core/lib/transport/byte_stream.h +7 -2
  310. data/src/core/lib/transport/connectivity_state.cc +7 -6
  311. data/src/core/lib/transport/connectivity_state.h +5 -3
  312. data/src/core/lib/transport/metadata.cc +3 -3
  313. data/src/core/lib/transport/metadata_batch.h +2 -3
  314. data/src/core/lib/transport/static_metadata.h +1 -1
  315. data/src/core/lib/transport/status_conversion.cc +6 -14
  316. data/src/core/lib/transport/transport.cc +2 -3
  317. data/src/core/lib/transport/transport.h +3 -2
  318. data/src/core/lib/transport/transport_op_string.cc +61 -102
  319. data/src/core/lib/uri/uri_parser.h +2 -3
  320. data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
  321. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  322. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +8 -1
  323. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  324. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -2
  325. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  326. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  327. data/src/core/tsi/fake_transport_security.cc +10 -15
  328. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  329. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  330. data/src/core/tsi/ssl_transport_security.cc +52 -39
  331. data/src/core/tsi/ssl_transport_security.h +8 -8
  332. data/src/core/tsi/ssl_types.h +0 -2
  333. data/src/core/tsi/transport_security.h +6 -9
  334. data/src/core/tsi/transport_security_grpc.h +2 -3
  335. data/src/core/tsi/transport_security_interface.h +3 -3
  336. data/src/ruby/ext/grpc/rb_call.c +9 -1
  337. data/src/ruby/lib/grpc/errors.rb +103 -42
  338. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  339. data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
  340. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  341. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  342. data/src/ruby/lib/grpc/structs.rb +1 -1
  343. data/src/ruby/lib/grpc/version.rb +1 -1
  344. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  345. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
  346. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  347. data/src/ruby/spec/debug_message_spec.rb +134 -0
  348. data/src/ruby/spec/generic/service_spec.rb +2 -0
  349. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +5 -0
  350. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -0
  351. data/src/ruby/spec/testdata/ca.pem +18 -13
  352. data/src/ruby/spec/testdata/client.key +26 -14
  353. data/src/ruby/spec/testdata/client.pem +18 -12
  354. data/src/ruby/spec/testdata/server1.key +26 -14
  355. data/src/ruby/spec/testdata/server1.pem +20 -14
  356. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  357. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  358. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  359. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  360. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  361. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  362. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  363. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  364. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  365. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  366. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  367. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  368. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  369. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  370. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  371. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  372. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  373. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  374. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  375. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  376. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  377. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  378. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  379. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  380. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  381. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  382. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  383. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  384. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  385. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  386. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  387. data/third_party/boringssl-with-bazel/err_data.c +329 -297
  388. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  389. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
  390. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  391. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  392. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  393. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  394. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  395. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
  397. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
  399. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
  400. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  401. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
  404. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  405. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +14 -11
  406. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  408. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  409. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
  410. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
  411. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  412. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  413. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +432 -160
  414. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  415. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -14
  416. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  417. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +80 -99
  418. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
  419. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  420. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  421. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  422. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  423. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  424. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  425. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  426. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  427. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  428. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  429. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
  430. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
  431. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
  432. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  433. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
  435. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
  436. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  437. data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -12
  438. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  439. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  440. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  442. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  443. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
  444. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
  445. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
  446. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +16 -0
  447. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +5 -0
  448. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
  449. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
  451. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  453. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  455. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  456. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
  458. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  459. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  460. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +172 -77
  461. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  462. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +5 -3
  464. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  465. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  466. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  467. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  468. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
  469. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +14 -3
  470. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +28 -20
  471. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +12 -4
  472. data/third_party/boringssl-with-bazel/src/ssl/internal.h +64 -47
  473. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  474. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  475. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  476. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
  477. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
  478. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +6 -1
  479. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  480. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +64 -5
  481. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  482. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +6 -2
  483. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
  484. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
  485. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -27
  486. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
  487. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +50 -20
  488. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  489. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  490. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  491. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  492. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  493. metadata +111 -37
  494. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
  495. data/src/core/lib/gprpp/string_view.h +0 -60
  496. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  497. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
@@ -22,47 +22,40 @@
22
22
 
23
23
  #include <stdio.h>
24
24
 
25
+ #include <vector>
26
+
27
+ #include "absl/strings/str_format.h"
28
+ #include "absl/strings/str_join.h"
29
+
25
30
  #include <grpc/byte_buffer.h>
26
31
  #include <grpc/support/string_util.h>
27
32
  #include "src/core/lib/gpr/string.h"
28
33
 
29
- static void addhdr(gpr_strvec* buf, grpc_event* ev) {
30
- char* tmp;
31
- gpr_asprintf(&tmp, "tag:%p", ev->tag);
32
- gpr_strvec_add(buf, tmp);
34
+ static void addhdr(grpc_event* ev, std::vector<std::string>* buf) {
35
+ buf->push_back(absl::StrFormat("tag:%p", ev->tag));
33
36
  }
34
37
 
35
38
  static const char* errstr(int success) { return success ? "OK" : "ERROR"; }
36
39
 
37
- static void adderr(gpr_strvec* buf, int success) {
38
- char* tmp;
39
- gpr_asprintf(&tmp, " %s", errstr(success));
40
- gpr_strvec_add(buf, tmp);
40
+ static void adderr(int success, std::vector<std::string>* buf) {
41
+ buf->push_back(absl::StrFormat(" %s", errstr(success)));
41
42
  }
42
43
 
43
- char* grpc_event_string(grpc_event* ev) {
44
- char* out;
45
- gpr_strvec buf;
46
-
47
- if (ev == nullptr) return gpr_strdup("null");
48
-
49
- gpr_strvec_init(&buf);
50
-
44
+ std::string grpc_event_string(grpc_event* ev) {
45
+ if (ev == nullptr) return "null";
46
+ std::vector<std::string> out;
51
47
  switch (ev->type) {
52
48
  case GRPC_QUEUE_TIMEOUT:
53
- gpr_strvec_add(&buf, gpr_strdup("QUEUE_TIMEOUT"));
49
+ out.push_back("QUEUE_TIMEOUT");
54
50
  break;
55
51
  case GRPC_QUEUE_SHUTDOWN:
56
- gpr_strvec_add(&buf, gpr_strdup("QUEUE_SHUTDOWN"));
52
+ out.push_back("QUEUE_SHUTDOWN");
57
53
  break;
58
54
  case GRPC_OP_COMPLETE:
59
- gpr_strvec_add(&buf, gpr_strdup("OP_COMPLETE: "));
60
- addhdr(&buf, ev);
61
- adderr(&buf, ev->success);
55
+ out.push_back("OP_COMPLETE: ");
56
+ addhdr(ev, &out);
57
+ adderr(ev->success, &out);
62
58
  break;
63
59
  }
64
-
65
- out = gpr_strvec_flatten(&buf, nullptr);
66
- gpr_strvec_destroy(&buf);
67
- return out;
60
+ return absl::StrJoin(out, "");
68
61
  }
@@ -21,9 +21,11 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <string>
25
+
24
26
  #include <grpc/grpc.h>
25
27
 
26
28
  /* Returns a string describing an event. Must be later freed with gpr_free() */
27
- char* grpc_event_string(grpc_event* ev);
29
+ std::string grpc_event_string(grpc_event* ev);
28
30
 
29
31
  #endif /* GRPC_CORE_LIB_SURFACE_EVENT_STRING_H */
@@ -78,7 +78,4 @@ void grpc_register_security_filters(void) {
78
78
  maybe_prepend_server_auth_filter, nullptr);
79
79
  }
80
80
 
81
- void grpc_security_init() {
82
- grpc_core::SecurityRegisterHandshakerFactories();
83
- grpc_control_plane_credentials_init();
84
- }
81
+ void grpc_security_init() { grpc_core::SecurityRegisterHandshakerFactories(); }
@@ -52,11 +52,11 @@ grpc_core::TraceFlag grpc_server_channel_trace(false, "server_channel");
52
52
 
53
53
  using grpc_core::LockedMultiProducerSingleConsumerQueue;
54
54
 
55
- static void server_on_recv_initial_metadata(void* ptr, grpc_error* error);
56
- static void server_recv_trailing_metadata_ready(void* user_data,
57
- grpc_error* error);
58
-
59
55
  namespace {
56
+
57
+ void server_on_recv_initial_metadata(void* ptr, grpc_error* error);
58
+ void server_recv_trailing_metadata_ready(void* user_data, grpc_error* error);
59
+
60
60
  struct listener {
61
61
  void* arg;
62
62
  void (*start)(grpc_server* server, void* arg, grpc_pollset** pollsets,
@@ -72,17 +72,39 @@ enum requested_call_type { BATCH_CALL, REGISTERED_CALL };
72
72
  struct registered_method;
73
73
 
74
74
  struct requested_call {
75
- grpc_core::ManualConstructor<
76
- grpc_core::MultiProducerSingleConsumerQueue::Node>
77
- mpscq_node;
78
- requested_call_type type;
79
- size_t cq_idx;
80
- void* tag;
81
- grpc_server* server;
82
- grpc_completion_queue* cq_bound_to_call;
83
- grpc_call** call;
75
+ requested_call(void* tag_arg, grpc_completion_queue* call_cq,
76
+ grpc_call** call_arg, grpc_metadata_array* initial_md,
77
+ grpc_call_details* details)
78
+ : type(BATCH_CALL),
79
+ tag(tag_arg),
80
+ cq_bound_to_call(call_cq),
81
+ call(call_arg),
82
+ initial_metadata(initial_md) {
83
+ details->reserved = nullptr;
84
+ data.batch.details = details;
85
+ }
86
+
87
+ requested_call(void* tag_arg, grpc_completion_queue* call_cq,
88
+ grpc_call** call_arg, grpc_metadata_array* initial_md,
89
+ registered_method* rm, gpr_timespec* deadline,
90
+ grpc_byte_buffer** optional_payload)
91
+ : type(REGISTERED_CALL),
92
+ tag(tag_arg),
93
+ cq_bound_to_call(call_cq),
94
+ call(call_arg),
95
+ initial_metadata(initial_md) {
96
+ data.registered.method = rm;
97
+ data.registered.deadline = deadline;
98
+ data.registered.optional_payload = optional_payload;
99
+ }
100
+
101
+ grpc_core::MultiProducerSingleConsumerQueue::Node mpscq_node;
102
+ const requested_call_type type;
103
+ void* const tag;
104
+ grpc_completion_queue* const cq_bound_to_call;
105
+ grpc_call** const call;
84
106
  grpc_cq_completion completion;
85
- grpc_metadata_array* initial_metadata;
107
+ grpc_metadata_array* const initial_metadata;
86
108
  union {
87
109
  struct {
88
110
  grpc_call_details* details;
@@ -117,13 +139,13 @@ struct channel_data {
117
139
  intptr_t channelz_socket_uuid;
118
140
  };
119
141
 
120
- typedef struct shutdown_tag {
142
+ struct shutdown_tag {
121
143
  void* tag;
122
144
  grpc_completion_queue* cq;
123
145
  grpc_cq_completion completion;
124
- } shutdown_tag;
146
+ };
125
147
 
126
- typedef enum {
148
+ enum call_state {
127
149
  /* waiting for metadata */
128
150
  NOT_STARTED,
129
151
  /* initial metadata read, not flow controlled in yet */
@@ -132,9 +154,60 @@ typedef enum {
132
154
  ACTIVATED,
133
155
  /* cancelled before being queued */
134
156
  ZOMBIED
135
- } call_state;
157
+ };
136
158
 
137
- typedef struct request_matcher request_matcher;
159
+ struct call_data;
160
+
161
+ grpc_call_error ValidateServerRequest(
162
+ grpc_completion_queue* cq_for_notification, void* tag,
163
+ grpc_byte_buffer** optional_payload, registered_method* rm);
164
+
165
+ // RPCs that come in from the transport must be matched against RPC requests
166
+ // from the application. An incoming request from the application can be matched
167
+ // to an RPC that has already arrived or can be queued up for later use.
168
+ // Likewise, an RPC coming in from the transport can either be matched to a
169
+ // request that already arrived from the application or can be queued up for
170
+ // later use (marked pending). If there is a match, the request's tag is posted
171
+ // on the request's notification CQ.
172
+ //
173
+ // RequestMatcherInterface is the base class to provide this functionality.
174
+ class RequestMatcherInterface {
175
+ public:
176
+ virtual ~RequestMatcherInterface() {}
177
+
178
+ // Unref the calls associated with any incoming RPCs in the pending queue (not
179
+ // yet matched to an application-requested RPC).
180
+ virtual void ZombifyPending() = 0;
181
+
182
+ // Mark all application-requested RPCs failed if they have not been matched to
183
+ // an incoming RPC. The error parameter indicates why the RPCs are being
184
+ // failed (always server shutdown in all current implementations).
185
+ virtual void KillRequests(grpc_error* error) = 0;
186
+
187
+ // How many request queues are supported by this matcher. This is an abstract
188
+ // concept that essentially maps to gRPC completion queues.
189
+ virtual size_t request_queue_count() const = 0;
190
+
191
+ // This function is invoked when the application requests a new RPC whose
192
+ // information is in the call parameter. The request_queue_index marks the
193
+ // queue onto which to place this RPC, and is typically associated with a gRPC
194
+ // CQ. If there are pending RPCs waiting to be matched, publish one (match it
195
+ // and notify the CQ).
196
+ virtual void RequestCallWithPossiblePublish(size_t request_queue_index,
197
+ requested_call* call) = 0;
198
+
199
+ // This function is invoked on an incoming RPC, represented by the calld
200
+ // object. The RequestMatcher will try to match it against an
201
+ // application-requested RPC if possible or will place it in the pending queue
202
+ // otherwise. To enable some measure of fairness between server CQs, the match
203
+ // is done starting at the start_request_queue_index parameter in a cyclic
204
+ // order rather than always starting at 0.
205
+ virtual void MatchOrQueue(size_t start_request_queue_index,
206
+ call_data* calld) = 0;
207
+
208
+ // Returns the server associated with this request matcher
209
+ virtual grpc_server* server() const = 0;
210
+ };
138
211
 
139
212
  struct call_data {
140
213
  call_data(grpc_call_element* elem, const grpc_call_element_args& args)
@@ -144,7 +217,7 @@ struct call_data {
144
217
  ::server_on_recv_initial_metadata, elem,
145
218
  grpc_schedule_on_exec_ctx);
146
219
  GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready,
147
- server_recv_trailing_metadata_ready, elem,
220
+ ::server_recv_trailing_metadata_ready, elem,
148
221
  grpc_schedule_on_exec_ctx);
149
222
  }
150
223
  ~call_data() {
@@ -177,7 +250,7 @@ struct call_data {
177
250
  grpc_metadata_array initial_metadata =
178
251
  grpc_metadata_array(); // Zero-initialize the C struct.
179
252
 
180
- request_matcher* matcher = nullptr;
253
+ RequestMatcherInterface* matcher = nullptr;
181
254
  grpc_byte_buffer* payload = nullptr;
182
255
 
183
256
  grpc_closure got_initial_metadata;
@@ -196,27 +269,31 @@ struct call_data {
196
269
  grpc_core::CallCombiner* call_combiner;
197
270
  };
198
271
 
199
- struct request_matcher {
200
- grpc_server* server;
201
- call_data* pending_head;
202
- call_data* pending_tail;
203
- LockedMultiProducerSingleConsumerQueue* requests_per_cq;
204
- };
205
-
206
272
  struct registered_method {
207
- char* method;
208
- char* host;
209
- grpc_server_register_method_payload_handling payload_handling;
210
- uint32_t flags;
273
+ registered_method(
274
+ const char* method_arg, const char* host_arg,
275
+ grpc_server_register_method_payload_handling payload_handling_arg,
276
+ uint32_t flags_arg)
277
+ : method(method_arg == nullptr ? "" : method_arg),
278
+ host(host_arg == nullptr ? "" : host_arg),
279
+ payload_handling(payload_handling_arg),
280
+ flags(flags_arg) {}
281
+
282
+ ~registered_method() = default;
283
+
284
+ const std::string method;
285
+ const std::string host;
286
+ const grpc_server_register_method_payload_handling payload_handling;
287
+ const uint32_t flags;
211
288
  /* one request matcher per method */
212
- request_matcher matcher;
289
+ std::unique_ptr<RequestMatcherInterface> matcher;
213
290
  registered_method* next;
214
291
  };
215
292
 
216
- typedef struct {
293
+ struct channel_broadcaster {
217
294
  grpc_channel** channels;
218
295
  size_t num_channels;
219
- } channel_broadcaster;
296
+ };
220
297
  } // namespace
221
298
 
222
299
  struct grpc_server {
@@ -245,9 +322,13 @@ struct grpc_server {
245
322
  bool starting;
246
323
  gpr_cv starting_cv;
247
324
 
325
+ // TODO(vjpai): Convert from a linked-list head pointer to a std::vector once
326
+ // grpc_server has a real constructor/destructor
248
327
  registered_method* registered_methods;
249
328
  /** one request matcher for unregistered methods */
250
- request_matcher unregistered_request_matcher;
329
+ // TODO(vjpai): Convert to a std::unique_ptr once grpc_server has a real
330
+ // constructor and destructor.
331
+ RequestMatcherInterface* unregistered_request_matcher;
251
332
 
252
333
  gpr_atm shutdown_flag;
253
334
  uint8_t shutdown_published;
@@ -269,19 +350,26 @@ struct grpc_server {
269
350
  #define SERVER_FROM_CALL_ELEM(elem) \
270
351
  (((channel_data*)(elem)->channel_data)->server)
271
352
 
272
- static void publish_new_rpc(void* calld, grpc_error* error);
273
- static void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
274
- grpc_error* error);
353
+ namespace {
354
+ void publish_call(grpc_server* server, call_data* calld, size_t cq_idx,
355
+ requested_call* rc);
356
+ void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
357
+ grpc_error* error);
275
358
  /* Before calling maybe_finish_shutdown, we must hold mu_global and not
276
359
  hold mu_call */
277
- static void maybe_finish_shutdown(grpc_server* server);
360
+ void maybe_finish_shutdown(grpc_server* server);
361
+
362
+ void kill_zombie(void* elem, grpc_error* /*error*/) {
363
+ grpc_call_unref(
364
+ grpc_call_from_top_element(static_cast<grpc_call_element*>(elem)));
365
+ }
278
366
 
279
367
  /*
280
368
  * channel broadcaster
281
369
  */
282
370
 
283
371
  /* assumes server locked */
284
- static void channel_broadcaster_init(grpc_server* s, channel_broadcaster* cb) {
372
+ void channel_broadcaster_init(grpc_server* s, channel_broadcaster* cb) {
285
373
  channel_data* c;
286
374
  size_t count = 0;
287
375
  for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
@@ -302,15 +390,15 @@ struct shutdown_cleanup_args {
302
390
  grpc_slice slice;
303
391
  };
304
392
 
305
- static void shutdown_cleanup(void* arg, grpc_error* /*error*/) {
393
+ void shutdown_cleanup(void* arg, grpc_error* /*error*/) {
306
394
  struct shutdown_cleanup_args* a =
307
395
  static_cast<struct shutdown_cleanup_args*>(arg);
308
396
  grpc_slice_unref_internal(a->slice);
309
397
  gpr_free(a);
310
398
  }
311
399
 
312
- static void send_shutdown(grpc_channel* channel, bool send_goaway,
313
- grpc_error* send_disconnect) {
400
+ void send_shutdown(grpc_channel* channel, bool send_goaway,
401
+ grpc_error* send_disconnect) {
314
402
  struct shutdown_cleanup_args* sc =
315
403
  static_cast<struct shutdown_cleanup_args*>(gpr_malloc(sizeof(*sc)));
316
404
  GRPC_CLOSURE_INIT(&sc->closure, shutdown_cleanup, sc,
@@ -331,9 +419,8 @@ static void send_shutdown(grpc_channel* channel, bool send_goaway,
331
419
  elem->filter->start_transport_op(elem, op);
332
420
  }
333
421
 
334
- static void channel_broadcaster_shutdown(channel_broadcaster* cb,
335
- bool send_goaway,
336
- grpc_error* force_disconnect) {
422
+ void channel_broadcaster_shutdown(channel_broadcaster* cb, bool send_goaway,
423
+ grpc_error* force_disconnect) {
337
424
  size_t i;
338
425
 
339
426
  for (i = 0; i < cb->num_channels; i++) {
@@ -349,63 +436,243 @@ static void channel_broadcaster_shutdown(channel_broadcaster* cb,
349
436
  * request_matcher
350
437
  */
351
438
 
352
- static void request_matcher_init(request_matcher* rm, grpc_server* server) {
353
- rm->server = server;
354
- rm->pending_head = rm->pending_tail = nullptr;
355
- rm->requests_per_cq = static_cast<LockedMultiProducerSingleConsumerQueue*>(
356
- gpr_malloc(sizeof(*rm->requests_per_cq) * server->cq_count));
357
- for (size_t i = 0; i < server->cq_count; i++) {
358
- new (&rm->requests_per_cq[i]) LockedMultiProducerSingleConsumerQueue();
439
+ // The RealRequestMatcher is an implementation of RequestMatcherInterface that
440
+ // actually uses all the features of RequestMatcherInterface: expecting the
441
+ // application to explicitly request RPCs and then matching those to incoming
442
+ // RPCs, along with a slow path by which incoming RPCs are put on a locked
443
+ // pending list if they aren't able to be matched to an application request.
444
+ class RealRequestMatcher : public RequestMatcherInterface {
445
+ public:
446
+ explicit RealRequestMatcher(grpc_server* server)
447
+ : server_(server), requests_per_cq_(server->cq_count) {}
448
+
449
+ ~RealRequestMatcher() override {
450
+ for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) {
451
+ GPR_ASSERT(queue.Pop() == nullptr);
452
+ }
359
453
  }
360
- }
361
454
 
362
- static void request_matcher_destroy(request_matcher* rm) {
363
- for (size_t i = 0; i < rm->server->cq_count; i++) {
364
- GPR_ASSERT(rm->requests_per_cq[i].Pop() == nullptr);
365
- rm->requests_per_cq[i].~LockedMultiProducerSingleConsumerQueue();
455
+ void ZombifyPending() override {
456
+ while (pending_head_ != nullptr) {
457
+ call_data* calld = pending_head_;
458
+ pending_head_ = calld->pending_next;
459
+ gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
460
+ GRPC_CLOSURE_INIT(
461
+ &calld->kill_zombie_closure, kill_zombie,
462
+ grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
463
+ grpc_schedule_on_exec_ctx);
464
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
465
+ GRPC_ERROR_NONE);
466
+ }
366
467
  }
367
- gpr_free(rm->requests_per_cq);
368
- }
369
468
 
370
- static void kill_zombie(void* elem, grpc_error* /*error*/) {
371
- grpc_call_unref(
372
- grpc_call_from_top_element(static_cast<grpc_call_element*>(elem)));
373
- }
469
+ void KillRequests(grpc_error* error) override {
470
+ for (size_t i = 0; i < requests_per_cq_.size(); i++) {
471
+ requested_call* rc;
472
+ while ((rc = reinterpret_cast<requested_call*>(
473
+ requests_per_cq_[i].Pop())) != nullptr) {
474
+ fail_call(server_, i, rc, GRPC_ERROR_REF(error));
475
+ }
476
+ }
477
+ GRPC_ERROR_UNREF(error);
478
+ }
374
479
 
375
- static void request_matcher_zombify_all_pending_calls(request_matcher* rm) {
376
- while (rm->pending_head) {
377
- call_data* calld = rm->pending_head;
378
- rm->pending_head = calld->pending_next;
379
- gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
380
- GRPC_CLOSURE_INIT(
381
- &calld->kill_zombie_closure, kill_zombie,
382
- grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
383
- grpc_schedule_on_exec_ctx);
384
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
385
- GRPC_ERROR_NONE);
480
+ size_t request_queue_count() const override {
481
+ return requests_per_cq_.size();
482
+ }
483
+
484
+ void RequestCallWithPossiblePublish(size_t request_queue_index,
485
+ requested_call* call) override {
486
+ if (requests_per_cq_[request_queue_index].Push(&call->mpscq_node)) {
487
+ /* this was the first queued request: we need to lock and start
488
+ matching calls */
489
+ gpr_mu_lock(&server_->mu_call);
490
+ call_data* calld;
491
+ while ((calld = pending_head_) != nullptr) {
492
+ requested_call* rc = reinterpret_cast<requested_call*>(
493
+ requests_per_cq_[request_queue_index].Pop());
494
+ if (rc == nullptr) break;
495
+ pending_head_ = calld->pending_next;
496
+ gpr_mu_unlock(&server_->mu_call);
497
+ if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) {
498
+ // Zombied Call
499
+ GRPC_CLOSURE_INIT(
500
+ &calld->kill_zombie_closure, kill_zombie,
501
+ grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
502
+ grpc_schedule_on_exec_ctx);
503
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
504
+ GRPC_ERROR_NONE);
505
+ } else {
506
+ publish_call(server_, calld, request_queue_index, rc);
507
+ }
508
+ gpr_mu_lock(&server_->mu_call);
509
+ }
510
+ gpr_mu_unlock(&server_->mu_call);
511
+ }
386
512
  }
387
- }
388
513
 
389
- static void request_matcher_kill_requests(grpc_server* server,
390
- request_matcher* rm,
391
- grpc_error* error) {
392
- requested_call* rc;
393
- for (size_t i = 0; i < server->cq_count; i++) {
394
- while ((rc = reinterpret_cast<requested_call*>(
395
- rm->requests_per_cq[i].Pop())) != nullptr) {
396
- fail_call(server, i, rc, GRPC_ERROR_REF(error));
514
+ void MatchOrQueue(size_t start_request_queue_index,
515
+ call_data* calld) override {
516
+ for (size_t i = 0; i < requests_per_cq_.size(); i++) {
517
+ size_t cq_idx = (start_request_queue_index + i) % requests_per_cq_.size();
518
+ requested_call* rc =
519
+ reinterpret_cast<requested_call*>(requests_per_cq_[cq_idx].TryPop());
520
+ if (rc == nullptr) {
521
+ continue;
522
+ } else {
523
+ GRPC_STATS_INC_SERVER_CQS_CHECKED(i);
524
+ gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
525
+ publish_call(server_, calld, cq_idx, rc);
526
+ return; /* early out */
527
+ }
528
+ }
529
+
530
+ /* no cq to take the request found: queue it on the slow list */
531
+ GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED();
532
+ gpr_mu_lock(&server_->mu_call);
533
+
534
+ // We need to ensure that all the queues are empty. We do this under
535
+ // the server mu_call lock to ensure that if something is added to
536
+ // an empty request queue, it will block until the call is actually
537
+ // added to the pending list.
538
+ for (size_t i = 0; i < requests_per_cq_.size(); i++) {
539
+ size_t cq_idx = (start_request_queue_index + i) % requests_per_cq_.size();
540
+ requested_call* rc =
541
+ reinterpret_cast<requested_call*>(requests_per_cq_[cq_idx].Pop());
542
+ if (rc == nullptr) {
543
+ continue;
544
+ } else {
545
+ gpr_mu_unlock(&server_->mu_call);
546
+ GRPC_STATS_INC_SERVER_CQS_CHECKED(i + requests_per_cq_.size());
547
+ gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
548
+ publish_call(server_, calld, cq_idx, rc);
549
+ return; /* early out */
550
+ }
551
+ }
552
+
553
+ gpr_atm_no_barrier_store(&calld->state, PENDING);
554
+ if (pending_head_ == nullptr) {
555
+ pending_tail_ = pending_head_ = calld;
556
+ } else {
557
+ pending_tail_->pending_next = calld;
558
+ pending_tail_ = calld;
397
559
  }
560
+ gpr_mu_unlock(&server_->mu_call);
561
+ }
562
+
563
+ grpc_server* server() const override { return server_; }
564
+
565
+ private:
566
+ grpc_server* const server_;
567
+ call_data* pending_head_ = nullptr;
568
+ call_data* pending_tail_ = nullptr;
569
+ std::vector<LockedMultiProducerSingleConsumerQueue> requests_per_cq_;
570
+ };
571
+
572
+ // AllocatingRequestMatchers don't allow the application to request an RPC in
573
+ // advance or queue up any incoming RPC for later match. Instead, MatchOrQueue
574
+ // will call out to an allocation function passed in at the construction of the
575
+ // object. These request matchers are designed for the C++ callback API, so they
576
+ // only support 1 completion queue (passed in at the constructor).
577
+ class AllocatingRequestMatcherBase : public RequestMatcherInterface {
578
+ public:
579
+ AllocatingRequestMatcherBase(grpc_server* server, grpc_completion_queue* cq)
580
+ : server_(server), cq_(cq) {
581
+ size_t idx;
582
+ for (idx = 0; idx < server->cq_count; idx++) {
583
+ if (server->cqs[idx] == cq) {
584
+ break;
585
+ }
586
+ }
587
+ GPR_ASSERT(idx < server->cq_count);
588
+ cq_idx_ = idx;
589
+ }
590
+
591
+ void ZombifyPending() override {}
592
+
593
+ void KillRequests(grpc_error* error) override { GRPC_ERROR_UNREF(error); }
594
+
595
+ size_t request_queue_count() const override { return 0; }
596
+
597
+ void RequestCallWithPossiblePublish(size_t /*request_queue_index*/,
598
+ requested_call* /*call*/) final {
599
+ GPR_ASSERT(false);
398
600
  }
399
- GRPC_ERROR_UNREF(error);
400
- }
601
+
602
+ grpc_server* server() const override { return server_; }
603
+
604
+ // Supply the completion queue related to this request matcher
605
+ grpc_completion_queue* cq() const { return cq_; }
606
+
607
+ // Supply the completion queue's index relative to the server.
608
+ size_t cq_idx() const { return cq_idx_; }
609
+
610
+ private:
611
+ grpc_server* const server_;
612
+ grpc_completion_queue* const cq_;
613
+ size_t cq_idx_;
614
+ };
615
+
616
+ // An allocating request matcher for non-registered methods (used for generic
617
+ // API and unimplemented RPCs).
618
+ class AllocatingRequestMatcherBatch : public AllocatingRequestMatcherBase {
619
+ public:
620
+ AllocatingRequestMatcherBatch(
621
+ grpc_server* server, grpc_completion_queue* cq,
622
+ std::function<grpc_core::ServerBatchCallAllocation()> allocator)
623
+ : AllocatingRequestMatcherBase(server, cq),
624
+ allocator_(std::move(allocator)) {}
625
+ void MatchOrQueue(size_t /*start_request_queue_index*/,
626
+ call_data* calld) override {
627
+ grpc_core::ServerBatchCallAllocation call_info = allocator_();
628
+ GPR_ASSERT(ValidateServerRequest(cq(), static_cast<void*>(call_info.tag),
629
+ nullptr, nullptr) == GRPC_CALL_OK);
630
+ requested_call* rc = new requested_call(
631
+ static_cast<void*>(call_info.tag), cq(), call_info.call,
632
+ call_info.initial_metadata, call_info.details);
633
+ gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
634
+ publish_call(server(), calld, cq_idx(), rc);
635
+ }
636
+
637
+ private:
638
+ std::function<grpc_core::ServerBatchCallAllocation()> allocator_;
639
+ };
640
+
641
+ // An allocating request matcher for registered methods.
642
+ class AllocatingRequestMatcherRegistered : public AllocatingRequestMatcherBase {
643
+ public:
644
+ AllocatingRequestMatcherRegistered(
645
+ grpc_server* server, grpc_completion_queue* cq, registered_method* rm,
646
+ std::function<grpc_core::ServerRegisteredCallAllocation()> allocator)
647
+ : AllocatingRequestMatcherBase(server, cq),
648
+ registered_method_(rm),
649
+ allocator_(std::move(allocator)) {}
650
+ void MatchOrQueue(size_t /*start_request_queue_index*/,
651
+ call_data* calld) override {
652
+ grpc_core::ServerRegisteredCallAllocation call_info = allocator_();
653
+ GPR_ASSERT(ValidateServerRequest(cq(), static_cast<void*>(call_info.tag),
654
+ call_info.optional_payload,
655
+ registered_method_) == GRPC_CALL_OK);
656
+ requested_call* rc = new requested_call(
657
+ static_cast<void*>(call_info.tag), cq(), call_info.call,
658
+ call_info.initial_metadata, registered_method_, call_info.deadline,
659
+ call_info.optional_payload);
660
+ gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
661
+ publish_call(server(), calld, cq_idx(), rc);
662
+ }
663
+
664
+ private:
665
+ registered_method* const registered_method_;
666
+ std::function<grpc_core::ServerRegisteredCallAllocation()> allocator_;
667
+ };
401
668
 
402
669
  /*
403
670
  * server proper
404
671
  */
405
672
 
406
- static void server_ref(grpc_server* server) { server->internal_refcount.Ref(); }
673
+ void server_ref(grpc_server* server) { server->internal_refcount.Ref(); }
407
674
 
408
- static void server_delete(grpc_server* server) {
675
+ void server_delete(grpc_server* server) {
409
676
  registered_method* rm;
410
677
  size_t i;
411
678
  server->channelz_server.reset();
@@ -415,16 +682,9 @@ static void server_delete(grpc_server* server) {
415
682
  gpr_cv_destroy(&server->starting_cv);
416
683
  while ((rm = server->registered_methods) != nullptr) {
417
684
  server->registered_methods = rm->next;
418
- if (server->started) {
419
- request_matcher_destroy(&rm->matcher);
420
- }
421
- gpr_free(rm->method);
422
- gpr_free(rm->host);
423
- gpr_free(rm);
424
- }
425
- if (server->started) {
426
- request_matcher_destroy(&server->unregistered_request_matcher);
685
+ delete rm;
427
686
  }
687
+ delete server->unregistered_request_matcher;
428
688
  for (i = 0; i < server->cq_count; i++) {
429
689
  GRPC_CQ_INTERNAL_UNREF(server->cqs[i], "server");
430
690
  }
@@ -434,30 +694,28 @@ static void server_delete(grpc_server* server) {
434
694
  gpr_free(server);
435
695
  }
436
696
 
437
- static void server_unref(grpc_server* server) {
697
+ void server_unref(grpc_server* server) {
438
698
  if (GPR_UNLIKELY(server->internal_refcount.Unref())) {
439
699
  server_delete(server);
440
700
  }
441
701
  }
442
702
 
443
- static int is_channel_orphaned(channel_data* chand) {
444
- return chand->next == chand;
445
- }
703
+ int is_channel_orphaned(channel_data* chand) { return chand->next == chand; }
446
704
 
447
- static void orphan_channel(channel_data* chand) {
705
+ void orphan_channel(channel_data* chand) {
448
706
  chand->next->prev = chand->prev;
449
707
  chand->prev->next = chand->next;
450
708
  chand->next = chand->prev = chand;
451
709
  }
452
710
 
453
- static void finish_destroy_channel(void* cd, grpc_error* /*error*/) {
711
+ void finish_destroy_channel(void* cd, grpc_error* /*error*/) {
454
712
  channel_data* chand = static_cast<channel_data*>(cd);
455
713
  grpc_server* server = chand->server;
456
714
  GRPC_CHANNEL_INTERNAL_UNREF(chand->channel, "server");
457
715
  server_unref(server);
458
716
  }
459
717
 
460
- static void destroy_channel(channel_data* chand) {
718
+ void destroy_channel(channel_data* chand) {
461
719
  if (is_channel_orphaned(chand)) return;
462
720
  GPR_ASSERT(chand->server != nullptr);
463
721
  orphan_channel(chand);
@@ -478,12 +736,12 @@ static void destroy_channel(channel_data* chand) {
478
736
  op);
479
737
  }
480
738
 
481
- static void done_request_event(void* req, grpc_cq_completion* /*c*/) {
482
- gpr_free(req);
739
+ void done_request_event(void* req, grpc_cq_completion* /*c*/) {
740
+ delete static_cast<requested_call*>(req);
483
741
  }
484
742
 
485
- static void publish_call(grpc_server* server, call_data* calld, size_t cq_idx,
486
- requested_call* rc) {
743
+ void publish_call(grpc_server* server, call_data* calld, size_t cq_idx,
744
+ requested_call* rc) {
487
745
  grpc_call_set_completion_queue(calld->call, rc->cq_bound_to_call);
488
746
  grpc_call* call = calld->call;
489
747
  *rc->call = call;
@@ -515,12 +773,12 @@ static void publish_call(grpc_server* server, call_data* calld, size_t cq_idx,
515
773
  rc, &rc->completion, true);
516
774
  }
517
775
 
518
- static void publish_new_rpc(void* arg, grpc_error* error) {
776
+ void publish_new_rpc(void* arg, grpc_error* error) {
519
777
  grpc_call_element* call_elem = static_cast<grpc_call_element*>(arg);
520
778
  call_data* calld = static_cast<call_data*>(call_elem->call_data);
521
779
  channel_data* chand = static_cast<channel_data*>(call_elem->channel_data);
522
- request_matcher* rm = calld->matcher;
523
- grpc_server* server = rm->server;
780
+ RequestMatcherInterface* rm = calld->matcher;
781
+ grpc_server* server = rm->server();
524
782
 
525
783
  if (error != GRPC_ERROR_NONE || gpr_atm_acq_load(&server->shutdown_flag)) {
526
784
  gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
@@ -533,56 +791,11 @@ static void publish_new_rpc(void* arg, grpc_error* error) {
533
791
  return;
534
792
  }
535
793
 
536
- for (size_t i = 0; i < server->cq_count; i++) {
537
- size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
538
- requested_call* rc =
539
- reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].TryPop());
540
- if (rc == nullptr) {
541
- continue;
542
- } else {
543
- GRPC_STATS_INC_SERVER_CQS_CHECKED(i);
544
- gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
545
- publish_call(server, calld, cq_idx, rc);
546
- return; /* early out */
547
- }
548
- }
549
-
550
- /* no cq to take the request found: queue it on the slow list */
551
- GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED();
552
- gpr_mu_lock(&server->mu_call);
553
-
554
- // We need to ensure that all the queues are empty. We do this under
555
- // the server mu_call lock to ensure that if something is added to
556
- // an empty request queue, it will block until the call is actually
557
- // added to the pending list.
558
- for (size_t i = 0; i < server->cq_count; i++) {
559
- size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
560
- requested_call* rc =
561
- reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].Pop());
562
- if (rc == nullptr) {
563
- continue;
564
- } else {
565
- gpr_mu_unlock(&server->mu_call);
566
- GRPC_STATS_INC_SERVER_CQS_CHECKED(i + server->cq_count);
567
- gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
568
- publish_call(server, calld, cq_idx, rc);
569
- return; /* early out */
570
- }
571
- }
572
-
573
- gpr_atm_no_barrier_store(&calld->state, PENDING);
574
- if (rm->pending_head == nullptr) {
575
- rm->pending_tail = rm->pending_head = calld;
576
- } else {
577
- rm->pending_tail->pending_next = calld;
578
- rm->pending_tail = calld;
579
- }
580
- calld->pending_next = nullptr;
581
- gpr_mu_unlock(&server->mu_call);
794
+ rm->MatchOrQueue(chand->cq_idx, calld);
582
795
  }
583
796
 
584
- static void finish_start_new_rpc(
585
- grpc_server* server, grpc_call_element* elem, request_matcher* rm,
797
+ void finish_start_new_rpc(
798
+ grpc_server* server, grpc_call_element* elem, RequestMatcherInterface* rm,
586
799
  grpc_server_register_method_payload_handling payload_handling) {
587
800
  call_data* calld = static_cast<call_data*>(elem->call_data);
588
801
 
@@ -615,7 +828,7 @@ static void finish_start_new_rpc(
615
828
  }
616
829
  }
617
830
 
618
- static void start_new_rpc(grpc_call_element* elem) {
831
+ void start_new_rpc(grpc_call_element* elem) {
619
832
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
620
833
  call_data* calld = static_cast<call_data*>(elem->call_data);
621
834
  grpc_server* server = chand->server;
@@ -640,7 +853,8 @@ static void start_new_rpc(grpc_call_element* elem) {
640
853
  GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
641
854
  continue;
642
855
  }
643
- finish_start_new_rpc(server, elem, &rm->server_registered_method->matcher,
856
+ finish_start_new_rpc(server, elem,
857
+ rm->server_registered_method->matcher.get(),
644
858
  rm->server_registered_method->payload_handling);
645
859
  return;
646
860
  }
@@ -657,16 +871,17 @@ static void start_new_rpc(grpc_call_element* elem) {
657
871
  GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
658
872
  continue;
659
873
  }
660
- finish_start_new_rpc(server, elem, &rm->server_registered_method->matcher,
874
+ finish_start_new_rpc(server, elem,
875
+ rm->server_registered_method->matcher.get(),
661
876
  rm->server_registered_method->payload_handling);
662
877
  return;
663
878
  }
664
879
  }
665
- finish_start_new_rpc(server, elem, &server->unregistered_request_matcher,
880
+ finish_start_new_rpc(server, elem, server->unregistered_request_matcher,
666
881
  GRPC_SRM_PAYLOAD_NONE);
667
882
  }
668
883
 
669
- static int num_listeners(grpc_server* server) {
884
+ int num_listeners(grpc_server* server) {
670
885
  listener* l;
671
886
  int n = 0;
672
887
  for (l = server->listeners; l; l = l->next) {
@@ -675,12 +890,11 @@ static int num_listeners(grpc_server* server) {
675
890
  return n;
676
891
  }
677
892
 
678
- static void done_shutdown_event(void* server,
679
- grpc_cq_completion* /*completion*/) {
893
+ void done_shutdown_event(void* server, grpc_cq_completion* /*completion*/) {
680
894
  server_unref(static_cast<grpc_server*>(server));
681
895
  }
682
896
 
683
- static int num_channels(grpc_server* server) {
897
+ int num_channels(grpc_server* server) {
684
898
  channel_data* chand;
685
899
  int n = 0;
686
900
  for (chand = server->root_channel_data.next;
@@ -690,23 +904,20 @@ static int num_channels(grpc_server* server) {
690
904
  return n;
691
905
  }
692
906
 
693
- static void kill_pending_work_locked(grpc_server* server, grpc_error* error) {
907
+ void kill_pending_work_locked(grpc_server* server, grpc_error* error) {
694
908
  if (server->started) {
695
- request_matcher_kill_requests(server, &server->unregistered_request_matcher,
696
- GRPC_ERROR_REF(error));
697
- request_matcher_zombify_all_pending_calls(
698
- &server->unregistered_request_matcher);
909
+ server->unregistered_request_matcher->KillRequests(GRPC_ERROR_REF(error));
910
+ server->unregistered_request_matcher->ZombifyPending();
699
911
  for (registered_method* rm = server->registered_methods; rm;
700
912
  rm = rm->next) {
701
- request_matcher_kill_requests(server, &rm->matcher,
702
- GRPC_ERROR_REF(error));
703
- request_matcher_zombify_all_pending_calls(&rm->matcher);
913
+ rm->matcher->KillRequests(GRPC_ERROR_REF(error));
914
+ rm->matcher->ZombifyPending();
704
915
  }
705
916
  }
706
917
  GRPC_ERROR_UNREF(error);
707
918
  }
708
919
 
709
- static void maybe_finish_shutdown(grpc_server* server) {
920
+ void maybe_finish_shutdown(grpc_server* server) {
710
921
  size_t i;
711
922
  if (!gpr_atm_acq_load(&server->shutdown_flag) || server->shutdown_published) {
712
923
  return;
@@ -741,7 +952,7 @@ static void maybe_finish_shutdown(grpc_server* server) {
741
952
  }
742
953
  }
743
954
 
744
- static void server_on_recv_initial_metadata(void* ptr, grpc_error* error) {
955
+ void server_on_recv_initial_metadata(void* ptr, grpc_error* error) {
745
956
  grpc_call_element* elem = static_cast<grpc_call_element*>(ptr);
746
957
  call_data* calld = static_cast<call_data*>(elem->call_data);
747
958
  grpc_millis op_deadline;
@@ -787,8 +998,7 @@ static void server_on_recv_initial_metadata(void* ptr, grpc_error* error) {
787
998
  grpc_core::Closure::Run(DEBUG_LOCATION, closure, error);
788
999
  }
789
1000
 
790
- static void server_recv_trailing_metadata_ready(void* user_data,
791
- grpc_error* error) {
1001
+ void server_recv_trailing_metadata_ready(void* user_data, grpc_error* error) {
792
1002
  grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
793
1003
  call_data* calld = static_cast<call_data*>(elem->call_data);
794
1004
  if (calld->on_done_recv_initial_metadata != nullptr) {
@@ -809,8 +1019,8 @@ static void server_recv_trailing_metadata_ready(void* user_data,
809
1019
  calld->original_recv_trailing_metadata_ready, error);
810
1020
  }
811
1021
 
812
- static void server_mutate_op(grpc_call_element* elem,
813
- grpc_transport_stream_op_batch* op) {
1022
+ void server_mutate_op(grpc_call_element* elem,
1023
+ grpc_transport_stream_op_batch* op) {
814
1024
  call_data* calld = static_cast<call_data*>(elem->call_data);
815
1025
 
816
1026
  if (op->recv_initial_metadata) {
@@ -832,13 +1042,13 @@ static void server_mutate_op(grpc_call_element* elem,
832
1042
  }
833
1043
  }
834
1044
 
835
- static void server_start_transport_stream_op_batch(
1045
+ void server_start_transport_stream_op_batch(
836
1046
  grpc_call_element* elem, grpc_transport_stream_op_batch* op) {
837
1047
  server_mutate_op(elem, op);
838
1048
  grpc_call_next_op(elem, op);
839
1049
  }
840
1050
 
841
- static void got_initial_metadata(void* ptr, grpc_error* error) {
1051
+ void got_initial_metadata(void* ptr, grpc_error* error) {
842
1052
  grpc_call_element* elem = static_cast<grpc_call_element*>(ptr);
843
1053
  call_data* calld = static_cast<call_data*>(elem->call_data);
844
1054
  if (error == GRPC_ERROR_NONE) {
@@ -856,8 +1066,8 @@ static void got_initial_metadata(void* ptr, grpc_error* error) {
856
1066
  }
857
1067
  }
858
1068
 
859
- static void accept_stream(void* cd, grpc_transport* /*transport*/,
860
- const void* transport_server_data) {
1069
+ void accept_stream(void* cd, grpc_transport* /*transport*/,
1070
+ const void* transport_server_data) {
861
1071
  channel_data* chand = static_cast<channel_data*>(cd);
862
1072
  /* create a call */
863
1073
  grpc_call_create_args args;
@@ -892,25 +1102,25 @@ static void accept_stream(void* cd, grpc_transport* /*transport*/,
892
1102
  grpc_call_start_batch_and_execute(call, &op, 1, &calld->got_initial_metadata);
893
1103
  }
894
1104
 
895
- static grpc_error* server_init_call_elem(grpc_call_element* elem,
896
- const grpc_call_element_args* args) {
1105
+ grpc_error* server_init_call_elem(grpc_call_element* elem,
1106
+ const grpc_call_element_args* args) {
897
1107
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
898
1108
  server_ref(chand->server);
899
1109
  new (elem->call_data) call_data(elem, *args);
900
1110
  return GRPC_ERROR_NONE;
901
1111
  }
902
1112
 
903
- static void server_destroy_call_elem(grpc_call_element* elem,
904
- const grpc_call_final_info* /*final_info*/,
905
- grpc_closure* /*ignored*/) {
1113
+ void server_destroy_call_elem(grpc_call_element* elem,
1114
+ const grpc_call_final_info* /*final_info*/,
1115
+ grpc_closure* /*ignored*/) {
906
1116
  call_data* calld = static_cast<call_data*>(elem->call_data);
907
1117
  calld->~call_data();
908
1118
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
909
1119
  server_unref(chand->server);
910
1120
  }
911
1121
 
912
- static grpc_error* server_init_channel_elem(grpc_channel_element* elem,
913
- grpc_channel_element_args* args) {
1122
+ grpc_error* server_init_channel_elem(grpc_channel_element* elem,
1123
+ grpc_channel_element_args* args) {
914
1124
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
915
1125
  GPR_ASSERT(args->is_first);
916
1126
  GPR_ASSERT(!args->is_last);
@@ -921,7 +1131,7 @@ static grpc_error* server_init_channel_elem(grpc_channel_element* elem,
921
1131
  return GRPC_ERROR_NONE;
922
1132
  }
923
1133
 
924
- static void server_destroy_channel_elem(grpc_channel_element* elem) {
1134
+ void server_destroy_channel_elem(grpc_channel_element* elem) {
925
1135
  size_t i;
926
1136
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
927
1137
  if (chand->registered_methods) {
@@ -955,6 +1165,115 @@ static void server_destroy_channel_elem(grpc_channel_element* elem) {
955
1165
  }
956
1166
  }
957
1167
 
1168
+ void register_completion_queue(grpc_server* server, grpc_completion_queue* cq,
1169
+ void* reserved) {
1170
+ size_t i, n;
1171
+ GPR_ASSERT(!reserved);
1172
+ for (i = 0; i < server->cq_count; i++) {
1173
+ if (server->cqs[i] == cq) return;
1174
+ }
1175
+
1176
+ GRPC_CQ_INTERNAL_REF(cq, "server");
1177
+ n = server->cq_count++;
1178
+ server->cqs = static_cast<grpc_completion_queue**>(gpr_realloc(
1179
+ server->cqs, server->cq_count * sizeof(grpc_completion_queue*)));
1180
+ server->cqs[n] = cq;
1181
+ }
1182
+
1183
+ bool streq(const std::string& a, const char* b) {
1184
+ return (a.empty() && b == nullptr) ||
1185
+ ((b != nullptr) && !strcmp(a.c_str(), b));
1186
+ }
1187
+
1188
+ class ConnectivityWatcher
1189
+ : public grpc_core::AsyncConnectivityStateWatcherInterface {
1190
+ public:
1191
+ explicit ConnectivityWatcher(channel_data* chand) : chand_(chand) {
1192
+ GRPC_CHANNEL_INTERNAL_REF(chand_->channel, "connectivity");
1193
+ }
1194
+
1195
+ ~ConnectivityWatcher() {
1196
+ GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel, "connectivity");
1197
+ }
1198
+
1199
+ private:
1200
+ void OnConnectivityStateChange(grpc_connectivity_state new_state) override {
1201
+ // Don't do anything until we are being shut down.
1202
+ if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
1203
+ // Shut down channel.
1204
+ grpc_server* server = chand_->server;
1205
+ gpr_mu_lock(&server->mu_global);
1206
+ destroy_channel(chand_);
1207
+ gpr_mu_unlock(&server->mu_global);
1208
+ }
1209
+
1210
+ channel_data* chand_;
1211
+ };
1212
+
1213
+ void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) {
1214
+ (void)done_arg;
1215
+ gpr_free(storage);
1216
+ }
1217
+
1218
+ void listener_destroy_done(void* s, grpc_error* /*error*/) {
1219
+ grpc_server* server = static_cast<grpc_server*>(s);
1220
+ gpr_mu_lock(&server->mu_global);
1221
+ server->listeners_destroyed++;
1222
+ maybe_finish_shutdown(server);
1223
+ gpr_mu_unlock(&server->mu_global);
1224
+ }
1225
+
1226
+ grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx,
1227
+ requested_call* rc) {
1228
+ if (gpr_atm_acq_load(&server->shutdown_flag)) {
1229
+ fail_call(server, cq_idx, rc,
1230
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
1231
+ return GRPC_CALL_OK;
1232
+ }
1233
+ RequestMatcherInterface* rm;
1234
+ switch (rc->type) {
1235
+ case BATCH_CALL:
1236
+ rm = server->unregistered_request_matcher;
1237
+ break;
1238
+ case REGISTERED_CALL:
1239
+ rm = rc->data.registered.method->matcher.get();
1240
+ break;
1241
+ }
1242
+ rm->RequestCallWithPossiblePublish(cq_idx, rc);
1243
+ return GRPC_CALL_OK;
1244
+ }
1245
+
1246
+ void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
1247
+ grpc_error* error) {
1248
+ *rc->call = nullptr;
1249
+ rc->initial_metadata->count = 0;
1250
+ GPR_ASSERT(error != GRPC_ERROR_NONE);
1251
+
1252
+ grpc_cq_end_op(server->cqs[cq_idx], rc->tag, error, done_request_event, rc,
1253
+ &rc->completion);
1254
+ }
1255
+ } // namespace
1256
+
1257
+ namespace grpc_core {
1258
+
1259
+ void SetServerRegisteredMethodAllocator(
1260
+ grpc_server* server, grpc_completion_queue* cq, void* method_tag,
1261
+ std::function<ServerRegisteredCallAllocation()> allocator) {
1262
+ registered_method* rm = static_cast<registered_method*>(method_tag);
1263
+ rm->matcher.reset(new AllocatingRequestMatcherRegistered(
1264
+ server, cq, rm, std::move(allocator)));
1265
+ }
1266
+
1267
+ void SetServerBatchMethodAllocator(
1268
+ grpc_server* server, grpc_completion_queue* cq,
1269
+ std::function<ServerBatchCallAllocation()> allocator) {
1270
+ GPR_DEBUG_ASSERT(server->unregistered_request_matcher == nullptr);
1271
+ server->unregistered_request_matcher =
1272
+ new AllocatingRequestMatcherBatch(server, cq, std::move(allocator));
1273
+ }
1274
+
1275
+ }; // namespace grpc_core
1276
+
958
1277
  const grpc_channel_filter grpc_server_top_filter = {
959
1278
  server_start_transport_stream_op_batch,
960
1279
  grpc_channel_next_op,
@@ -969,22 +1288,6 @@ const grpc_channel_filter grpc_server_top_filter = {
969
1288
  "server",
970
1289
  };
971
1290
 
972
- static void register_completion_queue(grpc_server* server,
973
- grpc_completion_queue* cq,
974
- void* reserved) {
975
- size_t i, n;
976
- GPR_ASSERT(!reserved);
977
- for (i = 0; i < server->cq_count; i++) {
978
- if (server->cqs[i] == cq) return;
979
- }
980
-
981
- GRPC_CQ_INTERNAL_REF(cq, "server");
982
- n = server->cq_count++;
983
- server->cqs = static_cast<grpc_completion_queue**>(gpr_realloc(
984
- server->cqs, server->cq_count * sizeof(grpc_completion_queue*)));
985
- server->cqs[n] = cq;
986
- }
987
-
988
1291
  void grpc_server_register_completion_queue(grpc_server* server,
989
1292
  grpc_completion_queue* cq,
990
1293
  void* reserved) {
@@ -1050,13 +1353,6 @@ grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) {
1050
1353
  return server;
1051
1354
  }
1052
1355
 
1053
- static int streq(const char* a, const char* b) {
1054
- if (a == nullptr && b == nullptr) return 1;
1055
- if (a == nullptr) return 0;
1056
- if (b == nullptr) return 0;
1057
- return 0 == strcmp(a, b);
1058
- }
1059
-
1060
1356
  void* grpc_server_register_method(
1061
1357
  grpc_server* server, const char* method, const char* host,
1062
1358
  grpc_server_register_method_payload_handling payload_handling,
@@ -1083,12 +1379,8 @@ void* grpc_server_register_method(
1083
1379
  flags);
1084
1380
  return nullptr;
1085
1381
  }
1086
- m = static_cast<registered_method*>(gpr_zalloc(sizeof(registered_method)));
1087
- m->method = gpr_strdup(method);
1088
- m->host = gpr_strdup(host);
1382
+ m = new registered_method(method, host, payload_handling, flags);
1089
1383
  m->next = server->registered_methods;
1090
- m->payload_handling = payload_handling;
1091
- m->flags = flags;
1092
1384
  server->registered_methods = m;
1093
1385
  return m;
1094
1386
  }
@@ -1109,9 +1401,13 @@ void grpc_server_start(grpc_server* server) {
1109
1401
  grpc_cq_pollset(server->cqs[i]);
1110
1402
  }
1111
1403
  }
1112
- request_matcher_init(&server->unregistered_request_matcher, server);
1404
+ if (server->unregistered_request_matcher == nullptr) {
1405
+ server->unregistered_request_matcher = new RealRequestMatcher(server);
1406
+ }
1113
1407
  for (registered_method* rm = server->registered_methods; rm; rm = rm->next) {
1114
- request_matcher_init(&rm->matcher, server);
1408
+ if (rm->matcher == nullptr) {
1409
+ rm->matcher.reset(new RealRequestMatcher(server));
1410
+ }
1115
1411
  }
1116
1412
 
1117
1413
  gpr_mu_lock(&server->mu_global);
@@ -1134,31 +1430,6 @@ void grpc_server_get_pollsets(grpc_server* server, grpc_pollset*** pollsets,
1134
1430
  *pollsets = server->pollsets;
1135
1431
  }
1136
1432
 
1137
- class ConnectivityWatcher
1138
- : public grpc_core::AsyncConnectivityStateWatcherInterface {
1139
- public:
1140
- explicit ConnectivityWatcher(channel_data* chand) : chand_(chand) {
1141
- GRPC_CHANNEL_INTERNAL_REF(chand_->channel, "connectivity");
1142
- }
1143
-
1144
- ~ConnectivityWatcher() {
1145
- GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel, "connectivity");
1146
- }
1147
-
1148
- private:
1149
- void OnConnectivityStateChange(grpc_connectivity_state new_state) override {
1150
- // Don't do anything until we are being shut down.
1151
- if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
1152
- // Shut down channel.
1153
- grpc_server* server = chand_->server;
1154
- gpr_mu_lock(&server->mu_global);
1155
- destroy_channel(chand_);
1156
- gpr_mu_unlock(&server->mu_global);
1157
- }
1158
-
1159
- channel_data* chand_;
1160
- };
1161
-
1162
1433
  void grpc_server_setup_transport(
1163
1434
  grpc_server* s, grpc_transport* transport, grpc_pollset* accepting_pollset,
1164
1435
  const grpc_channel_args* args,
@@ -1215,10 +1486,10 @@ void grpc_server_setup_transport(
1215
1486
  static_cast<channel_registered_method*>(gpr_zalloc(alloc));
1216
1487
  for (rm = s->registered_methods; rm; rm = rm->next) {
1217
1488
  grpc_core::ExternallyManagedSlice host;
1218
- grpc_core::ExternallyManagedSlice method(rm->method);
1219
- const bool has_host = rm->host != nullptr;
1489
+ grpc_core::ExternallyManagedSlice method(rm->method.c_str());
1490
+ const bool has_host = !rm->host.empty();
1220
1491
  if (has_host) {
1221
- host = grpc_core::ExternallyManagedSlice(rm->host);
1492
+ host = grpc_core::ExternallyManagedSlice(rm->host.c_str());
1222
1493
  }
1223
1494
  hash = GRPC_MDSTR_KV_HASH(has_host ? host.Hash() : 0, method.Hash());
1224
1495
  for (probes = 0; chand->registered_methods[(hash + probes) % slots]
@@ -1258,19 +1529,6 @@ void grpc_server_setup_transport(
1258
1529
  grpc_transport_perform_op(transport, op);
1259
1530
  }
1260
1531
 
1261
- void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) {
1262
- (void)done_arg;
1263
- gpr_free(storage);
1264
- }
1265
-
1266
- static void listener_destroy_done(void* s, grpc_error* /*error*/) {
1267
- grpc_server* server = static_cast<grpc_server*>(s);
1268
- gpr_mu_lock(&server->mu_global);
1269
- server->listeners_destroyed++;
1270
- maybe_finish_shutdown(server);
1271
- gpr_mu_unlock(&server->mu_global);
1272
- }
1273
-
1274
1532
  /*
1275
1533
  - Kills all pending requests-for-incoming-RPC-calls (i.e the requests made via
1276
1534
  grpc_server_request_call and grpc_server_request_registered call will now be
@@ -1420,59 +1678,51 @@ void grpc_server_add_listener(
1420
1678
  server->listeners = l;
1421
1679
  }
1422
1680
 
1423
- static grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx,
1424
- requested_call* rc) {
1425
- call_data* calld = nullptr;
1426
- request_matcher* rm = nullptr;
1427
- if (gpr_atm_acq_load(&server->shutdown_flag)) {
1428
- fail_call(server, cq_idx, rc,
1429
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
1430
- return GRPC_CALL_OK;
1681
+ namespace {
1682
+ grpc_call_error ValidateServerRequest(
1683
+ grpc_completion_queue* cq_for_notification, void* tag,
1684
+ grpc_byte_buffer** optional_payload, registered_method* rm) {
1685
+ if ((rm == nullptr && optional_payload != nullptr) ||
1686
+ ((rm != nullptr) && ((optional_payload == nullptr) !=
1687
+ (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)))) {
1688
+ return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
1431
1689
  }
1432
- switch (rc->type) {
1433
- case BATCH_CALL:
1434
- rm = &server->unregistered_request_matcher;
1435
- break;
1436
- case REGISTERED_CALL:
1437
- rm = &rc->data.registered.method->matcher;
1438
- break;
1690
+ if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
1691
+ return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
1439
1692
  }
1440
- if (rm->requests_per_cq[cq_idx].Push(rc->mpscq_node.get())) {
1441
- /* this was the first queued request: we need to lock and start
1442
- matching calls */
1443
- gpr_mu_lock(&server->mu_call);
1444
- while ((calld = rm->pending_head) != nullptr) {
1445
- rc = reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].Pop());
1446
- if (rc == nullptr) break;
1447
- rm->pending_head = calld->pending_next;
1448
- gpr_mu_unlock(&server->mu_call);
1449
- if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) {
1450
- // Zombied Call
1451
- GRPC_CLOSURE_INIT(
1452
- &calld->kill_zombie_closure, kill_zombie,
1453
- grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
1454
- grpc_schedule_on_exec_ctx);
1455
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
1456
- GRPC_ERROR_NONE);
1457
- } else {
1458
- publish_call(server, calld, cq_idx, rc);
1459
- }
1460
- gpr_mu_lock(&server->mu_call);
1693
+ return GRPC_CALL_OK;
1694
+ }
1695
+ grpc_call_error ValidateServerRequestAndCq(
1696
+ size_t* cq_idx, grpc_server* server,
1697
+ grpc_completion_queue* cq_for_notification, void* tag,
1698
+ grpc_byte_buffer** optional_payload, registered_method* rm) {
1699
+ size_t idx;
1700
+ for (idx = 0; idx < server->cq_count; idx++) {
1701
+ if (server->cqs[idx] == cq_for_notification) {
1702
+ break;
1461
1703
  }
1462
- gpr_mu_unlock(&server->mu_call);
1463
1704
  }
1705
+ if (idx == server->cq_count) {
1706
+ return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
1707
+ }
1708
+ grpc_call_error error =
1709
+ ValidateServerRequest(cq_for_notification, tag, optional_payload, rm);
1710
+ if (error != GRPC_CALL_OK) {
1711
+ return error;
1712
+ }
1713
+
1714
+ *cq_idx = idx;
1464
1715
  return GRPC_CALL_OK;
1465
1716
  }
1717
+ } // namespace
1466
1718
 
1467
1719
  grpc_call_error grpc_server_request_call(
1468
1720
  grpc_server* server, grpc_call** call, grpc_call_details* details,
1469
1721
  grpc_metadata_array* initial_metadata,
1470
1722
  grpc_completion_queue* cq_bound_to_call,
1471
1723
  grpc_completion_queue* cq_for_notification, void* tag) {
1472
- grpc_call_error error;
1473
1724
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1474
1725
  grpc_core::ExecCtx exec_ctx;
1475
- requested_call* rc = static_cast<requested_call*>(gpr_malloc(sizeof(*rc)));
1476
1726
  GRPC_STATS_INC_SERVER_REQUESTED_CALLS();
1477
1727
  GRPC_API_TRACE(
1478
1728
  "grpc_server_request_call("
@@ -1481,35 +1731,17 @@ grpc_call_error grpc_server_request_call(
1481
1731
  7,
1482
1732
  (server, call, details, initial_metadata, cq_bound_to_call,
1483
1733
  cq_for_notification, tag));
1734
+
1484
1735
  size_t cq_idx;
1485
- for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
1486
- if (server->cqs[cq_idx] == cq_for_notification) {
1487
- break;
1488
- }
1489
- }
1490
- if (cq_idx == server->cq_count) {
1491
- gpr_free(rc);
1492
- error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
1493
- goto done;
1736
+ grpc_call_error error = ValidateServerRequestAndCq(
1737
+ &cq_idx, server, cq_for_notification, tag, nullptr, nullptr);
1738
+ if (error != GRPC_CALL_OK) {
1739
+ return error;
1494
1740
  }
1495
- if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
1496
- gpr_free(rc);
1497
- error = GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
1498
- goto done;
1499
- }
1500
- details->reserved = nullptr;
1501
- rc->cq_idx = cq_idx;
1502
- rc->type = BATCH_CALL;
1503
- rc->server = server;
1504
- rc->tag = tag;
1505
- rc->cq_bound_to_call = cq_bound_to_call;
1506
- rc->call = call;
1507
- rc->data.batch.details = details;
1508
- rc->initial_metadata = initial_metadata;
1509
- error = queue_call_request(server, cq_idx, rc);
1510
- done:
1511
-
1512
- return error;
1741
+
1742
+ requested_call* rc = new requested_call(tag, cq_bound_to_call, call,
1743
+ initial_metadata, details);
1744
+ return queue_call_request(server, cq_idx, rc);
1513
1745
  }
1514
1746
 
1515
1747
  grpc_call_error grpc_server_request_registered_call(
@@ -1520,7 +1752,6 @@ grpc_call_error grpc_server_request_registered_call(
1520
1752
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
1521
1753
  grpc_core::ExecCtx exec_ctx;
1522
1754
  GRPC_STATS_INC_SERVER_REQUESTED_CALLS();
1523
- requested_call* rc = static_cast<requested_call*>(gpr_malloc(sizeof(*rc)));
1524
1755
  registered_method* rm = static_cast<registered_method*>(rmp);
1525
1756
  GRPC_API_TRACE(
1526
1757
  "grpc_server_request_registered_call("
@@ -1532,48 +1763,18 @@ grpc_call_error grpc_server_request_registered_call(
1532
1763
  cq_bound_to_call, cq_for_notification, tag));
1533
1764
 
1534
1765
  size_t cq_idx;
1535
- for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
1536
- if (server->cqs[cq_idx] == cq_for_notification) {
1537
- break;
1538
- }
1539
- }
1540
- if (cq_idx == server->cq_count) {
1541
- gpr_free(rc);
1542
- return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
1543
- }
1544
- if ((optional_payload == nullptr) !=
1545
- (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)) {
1546
- gpr_free(rc);
1547
- return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
1766
+ grpc_call_error error = ValidateServerRequestAndCq(
1767
+ &cq_idx, server, cq_for_notification, tag, optional_payload, rm);
1768
+ if (error != GRPC_CALL_OK) {
1769
+ return error;
1548
1770
  }
1549
1771
 
1550
- if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
1551
- gpr_free(rc);
1552
- return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
1553
- }
1554
- rc->cq_idx = cq_idx;
1555
- rc->type = REGISTERED_CALL;
1556
- rc->server = server;
1557
- rc->tag = tag;
1558
- rc->cq_bound_to_call = cq_bound_to_call;
1559
- rc->call = call;
1560
- rc->data.registered.method = rm;
1561
- rc->data.registered.deadline = deadline;
1562
- rc->initial_metadata = initial_metadata;
1563
- rc->data.registered.optional_payload = optional_payload;
1772
+ requested_call* rc =
1773
+ new requested_call(tag, cq_bound_to_call, call, initial_metadata, rm,
1774
+ deadline, optional_payload);
1564
1775
  return queue_call_request(server, cq_idx, rc);
1565
1776
  }
1566
1777
 
1567
- static void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
1568
- grpc_error* error) {
1569
- *rc->call = nullptr;
1570
- rc->initial_metadata->count = 0;
1571
- GPR_ASSERT(error != GRPC_ERROR_NONE);
1572
-
1573
- grpc_cq_end_op(server->cqs[cq_idx], rc->tag, error, done_request_event, rc,
1574
- &rc->completion);
1575
- }
1576
-
1577
1778
  const grpc_channel_args* grpc_server_get_channel_args(grpc_server* server) {
1578
1779
  return server->channel_args;
1579
1780
  }