grpc 1.18.0 → 1.22.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 (428) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4731 -7404
  3. data/etc/roots.pem +146 -0
  4. data/include/grpc/grpc.h +11 -6
  5. data/include/grpc/grpc_security.h +297 -4
  6. data/include/grpc/grpc_security_constants.h +1 -1
  7. data/include/grpc/impl/codegen/byte_buffer.h +13 -0
  8. data/include/grpc/impl/codegen/gpr_types.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +30 -7
  10. data/include/grpc/impl/codegen/port_platform.h +88 -7
  11. data/include/grpc/impl/codegen/slice.h +2 -22
  12. data/include/grpc/impl/codegen/status.h +2 -1
  13. data/include/grpc/impl/codegen/sync_posix.h +18 -0
  14. data/include/grpc/slice.h +3 -3
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
  16. data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
  19. data/src/core/ext/filters/client_channel/client_channel.h +2 -10
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
  26. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
  27. data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
  28. data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
  29. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
  30. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
  47. data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
  48. data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
  50. data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
  51. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
  52. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
  53. data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
  65. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
  66. data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
  67. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
  68. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
  69. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
  70. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
  71. data/src/core/ext/filters/client_channel/resolver.cc +54 -1
  72. data/src/core/ext/filters/client_channel/resolver.h +52 -23
  73. data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
  74. data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
  75. data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
  76. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
  77. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
  78. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
  79. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
  80. data/src/core/ext/filters/client_channel/server_address.cc +4 -54
  81. data/src/core/ext/filters/client_channel/server_address.h +1 -13
  82. data/src/core/ext/filters/client_channel/service_config.cc +329 -0
  83. data/src/core/ext/filters/client_channel/service_config.h +205 -0
  84. data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
  85. data/src/core/ext/filters/client_channel/subchannel.h +295 -128
  86. data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
  87. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
  88. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
  89. data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
  90. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  91. data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
  92. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  93. data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
  94. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
  95. data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
  96. data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
  97. data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
  98. data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
  99. data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
  102. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
  104. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
  106. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
  107. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
  110. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  111. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
  113. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  114. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
  116. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
  118. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
  120. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  122. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
  124. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
  131. data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
  133. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
  136. data/src/core/lib/channel/channel_args.cc +2 -101
  137. data/src/core/lib/channel/channel_args.h +3 -37
  138. data/src/core/lib/channel/channel_stack.h +10 -6
  139. data/src/core/lib/channel/channel_trace.cc +4 -4
  140. data/src/core/lib/channel/channel_trace.h +4 -4
  141. data/src/core/lib/channel/channelz.cc +168 -38
  142. data/src/core/lib/channel/channelz.h +40 -44
  143. data/src/core/lib/channel/channelz_registry.cc +75 -107
  144. data/src/core/lib/channel/channelz_registry.h +10 -28
  145. data/src/core/lib/channel/connected_channel.cc +2 -2
  146. data/src/core/lib/channel/context.h +2 -2
  147. data/src/core/lib/channel/handshaker.cc +151 -218
  148. data/src/core/lib/channel/handshaker.h +110 -101
  149. data/src/core/lib/channel/handshaker_factory.h +11 -19
  150. data/src/core/lib/channel/handshaker_registry.cc +67 -51
  151. data/src/core/lib/channel/handshaker_registry.h +21 -16
  152. data/src/core/lib/compression/algorithm_metadata.h +3 -3
  153. data/src/core/lib/compression/compression.cc +14 -9
  154. data/src/core/lib/compression/compression_args.cc +127 -0
  155. data/src/core/lib/compression/compression_args.h +55 -0
  156. data/src/core/lib/compression/compression_internal.cc +16 -12
  157. data/src/core/lib/compression/compression_internal.h +1 -1
  158. data/src/core/lib/compression/stream_compression.cc +3 -2
  159. data/src/core/lib/compression/stream_compression.h +2 -2
  160. data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
  161. data/src/core/lib/debug/trace.cc +13 -7
  162. data/src/core/lib/debug/trace.h +14 -1
  163. data/src/core/lib/gpr/arena.h +13 -9
  164. data/src/core/lib/gpr/cpu_posix.cc +5 -3
  165. data/src/core/lib/gpr/env.h +3 -6
  166. data/src/core/lib/gpr/env_linux.cc +6 -1
  167. data/src/core/lib/gpr/env_posix.cc +5 -0
  168. data/src/core/lib/gpr/env_windows.cc +7 -5
  169. data/src/core/lib/gpr/log.cc +9 -13
  170. data/src/core/lib/gpr/log_posix.cc +2 -1
  171. data/src/core/lib/gpr/string.cc +20 -7
  172. data/src/core/lib/gpr/string.h +10 -3
  173. data/src/core/lib/gpr/sync_posix.cc +65 -4
  174. data/src/core/lib/gpr/time.cc +8 -0
  175. data/src/core/lib/gpr/time_posix.cc +21 -2
  176. data/src/core/lib/gprpp/arena.cc +103 -0
  177. data/src/core/lib/gprpp/arena.h +121 -0
  178. data/src/core/lib/gprpp/atomic.h +75 -5
  179. data/src/core/lib/gprpp/fork.cc +13 -32
  180. data/src/core/lib/gprpp/fork.h +5 -1
  181. data/src/core/lib/gprpp/global_config.h +96 -0
  182. data/src/core/lib/gprpp/global_config_custom.h +29 -0
  183. data/src/core/lib/gprpp/global_config_env.cc +135 -0
  184. data/src/core/lib/gprpp/global_config_env.h +131 -0
  185. data/src/core/lib/gprpp/global_config_generic.h +44 -0
  186. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  187. data/src/core/lib/gprpp/map.h +436 -0
  188. data/src/core/lib/gprpp/memory.h +2 -2
  189. data/src/core/lib/gprpp/optional.h +48 -0
  190. data/src/core/lib/gprpp/orphanable.h +6 -5
  191. data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
  192. data/src/core/lib/gprpp/ref_counted.h +36 -17
  193. data/src/core/lib/gprpp/sync.h +126 -0
  194. data/src/core/lib/gprpp/thd.h +42 -7
  195. data/src/core/lib/gprpp/thd_posix.cc +31 -13
  196. data/src/core/lib/gprpp/thd_windows.cc +47 -34
  197. data/src/core/lib/http/httpcli.cc +6 -5
  198. data/src/core/lib/http/httpcli_security_connector.cc +13 -15
  199. data/src/core/lib/http/parser.cc +3 -2
  200. data/src/core/lib/http/parser.h +2 -1
  201. data/src/core/lib/iomgr/buffer_list.cc +182 -24
  202. data/src/core/lib/iomgr/buffer_list.h +72 -10
  203. data/src/core/lib/iomgr/call_combiner.cc +84 -90
  204. data/src/core/lib/iomgr/call_combiner.h +75 -82
  205. data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
  206. data/src/core/lib/iomgr/cfstream_handle.h +86 -0
  207. data/src/core/lib/iomgr/combiner.cc +11 -3
  208. data/src/core/lib/iomgr/combiner.h +1 -1
  209. data/src/core/lib/iomgr/endpoint.cc +2 -2
  210. data/src/core/lib/iomgr/endpoint.h +3 -2
  211. data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
  212. data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
  213. data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
  214. data/src/core/lib/iomgr/error.cc +21 -17
  215. data/src/core/lib/iomgr/error.h +36 -6
  216. data/src/core/lib/iomgr/error_cfstream.cc +52 -0
  217. data/src/core/lib/iomgr/error_cfstream.h +31 -0
  218. data/src/core/lib/iomgr/error_internal.h +1 -1
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
  222. data/src/core/lib/iomgr/ev_posix.cc +29 -19
  223. data/src/core/lib/iomgr/ev_posix.h +19 -3
  224. data/src/core/lib/iomgr/ev_windows.cc +2 -2
  225. data/src/core/lib/iomgr/exec_ctx.cc +1 -0
  226. data/src/core/lib/iomgr/exec_ctx.h +137 -8
  227. data/src/core/lib/iomgr/executor.cc +147 -95
  228. data/src/core/lib/iomgr/executor.h +55 -49
  229. data/src/core/lib/iomgr/fork_posix.cc +6 -5
  230. data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
  231. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
  232. data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
  233. data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
  234. data/src/core/lib/iomgr/internal_errqueue.h +105 -3
  235. data/src/core/lib/iomgr/iomgr.cc +20 -13
  236. data/src/core/lib/iomgr/iomgr.h +15 -0
  237. data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
  238. data/src/core/lib/iomgr/iomgr_custom.h +2 -0
  239. data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
  240. data/src/core/lib/iomgr/iomgr_internal.h +12 -0
  241. data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
  242. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
  243. data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
  244. data/src/core/lib/iomgr/lockfree_event.cc +4 -4
  245. data/src/core/lib/iomgr/port.h +35 -0
  246. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  247. data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
  248. data/src/core/lib/iomgr/resource_quota.cc +40 -37
  249. data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
  250. data/src/core/lib/iomgr/socket_windows.cc +19 -0
  251. data/src/core/lib/iomgr/socket_windows.h +8 -0
  252. data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
  253. data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
  254. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  255. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  256. data/src/core/lib/iomgr/tcp_custom.cc +10 -14
  257. data/src/core/lib/iomgr/tcp_posix.cc +256 -140
  258. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  259. data/src/core/lib/iomgr/tcp_server.h +24 -0
  260. data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
  261. data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
  262. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  263. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
  264. data/src/core/lib/iomgr/tcp_uv.cc +5 -7
  265. data/src/core/lib/iomgr/tcp_windows.cc +8 -14
  266. data/src/core/lib/iomgr/timer.h +2 -1
  267. data/src/core/lib/iomgr/timer_generic.cc +16 -16
  268. data/src/core/lib/iomgr/timer_manager.cc +20 -11
  269. data/src/core/lib/iomgr/udp_server.cc +8 -6
  270. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
  271. data/src/core/lib/json/json.cc +1 -4
  272. data/src/core/lib/profiling/basic_timers.cc +10 -4
  273. data/src/core/lib/security/context/security_context.cc +6 -7
  274. data/src/core/lib/security/context/security_context.h +3 -4
  275. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  276. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  277. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
  278. data/src/core/lib/security/credentials/credentials.h +9 -1
  279. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
  280. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
  281. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  282. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
  284. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  285. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
  286. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
  287. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
  288. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  289. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
  290. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
  291. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
  292. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
  293. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
  294. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
  295. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
  296. data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
  297. data/src/core/lib/security/security_connector/security_connector.cc +0 -1
  298. data/src/core/lib/security/security_connector/security_connector.h +3 -3
  299. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
  300. data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
  301. data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
  302. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
  303. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
  304. data/src/core/lib/security/transport/auth_filters.h +5 -2
  305. data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
  306. data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
  307. data/src/core/lib/security/transport/security_handshaker.cc +271 -303
  308. data/src/core/lib/security/transport/security_handshaker.h +11 -2
  309. data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
  310. data/src/core/lib/slice/b64.h +2 -2
  311. data/src/core/lib/slice/percent_encoding.cc +3 -3
  312. data/src/core/lib/slice/percent_encoding.h +3 -3
  313. data/src/core/lib/slice/slice.cc +174 -122
  314. data/src/core/lib/slice/slice_buffer.cc +54 -21
  315. data/src/core/lib/slice/slice_hash_table.h +4 -4
  316. data/src/core/lib/slice/slice_intern.cc +49 -107
  317. data/src/core/lib/slice/slice_internal.h +264 -3
  318. data/src/core/lib/slice/slice_string_helpers.cc +10 -1
  319. data/src/core/lib/slice/slice_string_helpers.h +3 -1
  320. data/src/core/lib/slice/slice_utils.h +50 -0
  321. data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
  322. data/src/core/lib/surface/api_trace.h +1 -1
  323. data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
  324. data/src/core/lib/surface/call.cc +67 -46
  325. data/src/core/lib/surface/call.h +7 -2
  326. data/src/core/lib/surface/call_details.cc +0 -1
  327. data/src/core/lib/surface/channel.cc +89 -97
  328. data/src/core/lib/surface/channel.h +60 -6
  329. data/src/core/lib/surface/channel_init.h +5 -0
  330. data/src/core/lib/surface/completion_queue.cc +221 -216
  331. data/src/core/lib/surface/completion_queue.h +2 -1
  332. data/src/core/lib/surface/init.cc +82 -33
  333. data/src/core/lib/surface/init.h +1 -0
  334. data/src/core/lib/surface/init_secure.cc +1 -1
  335. data/src/core/lib/surface/lame_client.cc +5 -7
  336. data/src/core/lib/surface/server.cc +42 -47
  337. data/src/core/lib/surface/validate_metadata.cc +14 -8
  338. data/src/core/lib/surface/validate_metadata.h +13 -2
  339. data/src/core/lib/surface/version.cc +1 -1
  340. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  341. data/src/core/lib/transport/bdp_estimator.h +2 -2
  342. data/src/core/lib/transport/connectivity_state.cc +10 -40
  343. data/src/core/lib/transport/connectivity_state.h +0 -8
  344. data/src/core/lib/transport/error_utils.cc +12 -0
  345. data/src/core/lib/transport/metadata.cc +258 -267
  346. data/src/core/lib/transport/metadata.h +227 -16
  347. data/src/core/lib/transport/metadata_batch.cc +1 -1
  348. data/src/core/lib/transport/metadata_batch.h +1 -1
  349. data/src/core/lib/transport/static_metadata.cc +477 -399
  350. data/src/core/lib/transport/static_metadata.h +273 -182
  351. data/src/core/lib/transport/status_metadata.cc +3 -3
  352. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  353. data/src/core/lib/transport/timeout_encoding.h +1 -1
  354. data/src/core/lib/transport/transport.cc +39 -72
  355. data/src/core/lib/transport/transport.h +59 -24
  356. data/src/core/lib/transport/transport_impl.h +1 -1
  357. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  358. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  359. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
  360. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
  361. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  362. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
  363. data/src/core/tsi/fake_transport_security.cc +4 -4
  364. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  365. data/src/core/tsi/ssl_transport_security.cc +12 -10
  366. data/src/core/tsi/ssl_transport_security.h +24 -4
  367. data/src/ruby/bin/math_pb.rb +18 -16
  368. data/src/ruby/ext/grpc/extconf.rb +12 -4
  369. data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
  370. data/src/ruby/ext/grpc/rb_channel.c +14 -10
  371. data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
  372. data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
  373. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  374. data/src/ruby/ext/grpc/rb_grpc.c +23 -24
  375. data/src/ruby/ext/grpc/rb_grpc.h +4 -2
  376. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
  377. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
  378. data/src/ruby/ext/grpc/rb_server.c +8 -4
  379. data/src/ruby/lib/grpc/errors.rb +22 -3
  380. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  381. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
  382. data/src/ruby/lib/grpc/version.rb +1 -1
  383. data/src/ruby/pb/README.md +1 -1
  384. data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
  385. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
  386. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
  387. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
  388. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
  389. data/src/ruby/spec/errors_spec.rb +141 -0
  390. data/third_party/cares/cares/ares.h +12 -0
  391. data/third_party/cares/cares/ares_create_query.c +5 -1
  392. data/third_party/cares/cares/ares_data.c +74 -73
  393. data/third_party/cares/cares/ares_destroy.c +6 -1
  394. data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
  395. data/third_party/cares/cares/ares_gethostbyname.c +15 -4
  396. data/third_party/cares/cares/ares_getnameinfo.c +11 -0
  397. data/third_party/cares/cares/ares_init.c +274 -173
  398. data/third_party/cares/cares/ares_library_init.c +21 -3
  399. data/third_party/cares/cares/ares_options.c +6 -2
  400. data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
  401. data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
  402. data/third_party/cares/cares/ares_platform.c +7 -0
  403. data/third_party/cares/cares/ares_private.h +19 -11
  404. data/third_party/cares/cares/ares_process.c +27 -2
  405. data/third_party/cares/cares/ares_rules.h +1 -1
  406. data/third_party/cares/cares/ares_search.c +7 -0
  407. data/third_party/cares/cares/ares_send.c +6 -0
  408. data/third_party/cares/cares/ares_strsplit.c +174 -0
  409. data/third_party/cares/cares/ares_strsplit.h +43 -0
  410. data/third_party/cares/cares/ares_version.h +4 -4
  411. data/third_party/cares/cares/config-win32.h +1 -1
  412. data/third_party/cares/cares/inet_ntop.c +2 -3
  413. data/third_party/cares/config_darwin/ares_config.h +3 -0
  414. data/third_party/cares/config_freebsd/ares_config.h +3 -0
  415. data/third_party/cares/config_linux/ares_config.h +3 -0
  416. data/third_party/cares/config_openbsd/ares_config.h +3 -0
  417. metadata +83 -48
  418. data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
  419. data/src/core/ext/filters/client_channel/request_routing.h +0 -177
  420. data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
  421. data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
  422. data/src/core/lib/channel/handshaker_factory.cc +0 -42
  423. data/src/core/lib/gpr/arena.cc +0 -192
  424. data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
  425. data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
  426. data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
  427. data/src/core/lib/transport/service_config.cc +0 -106
  428. data/src/core/lib/transport/service_config.h +0 -249
@@ -41,6 +41,11 @@ grpc_error* grpc_tcp_server_add_port(grpc_tcp_server* s,
41
41
  return grpc_tcp_server_impl->add_port(s, addr, out_port);
42
42
  }
43
43
 
44
+ grpc_core::TcpServerFdHandler* grpc_tcp_server_create_fd_handler(
45
+ grpc_tcp_server* s) {
46
+ return grpc_tcp_server_impl->create_fd_handler(s);
47
+ }
48
+
44
49
  unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server* s,
45
50
  unsigned port_index) {
46
51
  return grpc_tcp_server_impl->port_fd_count(s, port_index);
@@ -22,7 +22,9 @@
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
24
  #include <grpc/grpc.h>
25
+ #include <grpc/impl/codegen/grpc_types.h>
25
26
 
27
+ #include "src/core/lib/gprpp/abstract.h"
26
28
  #include "src/core/lib/iomgr/closure.h"
27
29
  #include "src/core/lib/iomgr/endpoint.h"
28
30
  #include "src/core/lib/iomgr/resolve_address.h"
@@ -37,6 +39,10 @@ typedef struct grpc_tcp_server_acceptor {
37
39
  /* Indices that may be passed to grpc_tcp_server_port_fd(). */
38
40
  unsigned port_index;
39
41
  unsigned fd_index;
42
+ /* Data when the connection is passed to tcp_server from external. */
43
+ bool external_connection;
44
+ int listener_fd;
45
+ grpc_byte_buffer* pending_data;
40
46
  } grpc_tcp_server_acceptor;
41
47
 
42
48
  /* Called for newly connected TCP connections.
@@ -44,6 +50,18 @@ typedef struct grpc_tcp_server_acceptor {
44
50
  typedef void (*grpc_tcp_server_cb)(void* arg, grpc_endpoint* ep,
45
51
  grpc_pollset* accepting_pollset,
46
52
  grpc_tcp_server_acceptor* acceptor);
53
+ namespace grpc_core {
54
+ // An interface for a handler to take a externally connected fd as a internal
55
+ // connection.
56
+ class TcpServerFdHandler {
57
+ public:
58
+ virtual ~TcpServerFdHandler() = default;
59
+ virtual void Handle(int listener_fd, int fd,
60
+ grpc_byte_buffer* pending_read) GRPC_ABSTRACT;
61
+
62
+ GRPC_ABSTRACT_BASE_CLASS;
63
+ };
64
+ } // namespace grpc_core
47
65
 
48
66
  typedef struct grpc_tcp_server_vtable {
49
67
  grpc_error* (*create)(grpc_closure* shutdown_complete,
@@ -54,6 +72,7 @@ typedef struct grpc_tcp_server_vtable {
54
72
  void* cb_arg);
55
73
  grpc_error* (*add_port)(grpc_tcp_server* s, const grpc_resolved_address* addr,
56
74
  int* out_port);
75
+ grpc_core::TcpServerFdHandler* (*create_fd_handler)(grpc_tcp_server* s);
57
76
  unsigned (*port_fd_count)(grpc_tcp_server* s, unsigned port_index);
58
77
  int (*port_fd)(grpc_tcp_server* s, unsigned port_index, unsigned fd_index);
59
78
  grpc_tcp_server* (*ref)(grpc_tcp_server* s);
@@ -88,6 +107,11 @@ grpc_error* grpc_tcp_server_add_port(grpc_tcp_server* s,
88
107
  const grpc_resolved_address* addr,
89
108
  int* out_port);
90
109
 
110
+ /* Create and return a TcpServerFdHandler so that it can be used by upper layer
111
+ to hand over an externally connected fd to the grpc server. */
112
+ grpc_core::TcpServerFdHandler* grpc_tcp_server_create_fd_handler(
113
+ grpc_tcp_server* s);
114
+
91
115
  /* Number of fds at the given port_index, or 0 if port_index is out of
92
116
  bounds. */
93
117
  unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server* s, unsigned port_index);
@@ -220,7 +220,7 @@ static void finish_accept(grpc_tcp_listener* sp, grpc_custom_socket* socket) {
220
220
  GRPC_LOG_IF_ERROR("getpeername error", err);
221
221
  GRPC_ERROR_UNREF(err);
222
222
  }
223
- if (grpc_tcp_trace.enabled()) {
223
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
224
224
  if (peer_name_string) {
225
225
  gpr_log(GPR_INFO, "SERVER_CONNECT: %p accepted connection: %s",
226
226
  sp->server, peer_name_string);
@@ -233,6 +233,7 @@ static void finish_accept(grpc_tcp_listener* sp, grpc_custom_socket* socket) {
233
233
  acceptor->from_server = sp->server;
234
234
  acceptor->port_index = sp->port_index;
235
235
  acceptor->fd_index = 0;
236
+ acceptor->external_connection = false;
236
237
  sp->server->on_accept_cb(sp->server->on_accept_cb_arg, ep, nullptr, acceptor);
237
238
  gpr_free(peer_name_string);
238
239
  }
@@ -372,7 +373,7 @@ static grpc_error* tcp_server_add_port(grpc_tcp_server* s,
372
373
  addr = &wildcard;
373
374
  }
374
375
 
375
- if (grpc_tcp_trace.enabled()) {
376
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
376
377
  char* port_string;
377
378
  grpc_sockaddr_to_string(&port_string, addr, 0);
378
379
  const char* str = grpc_error_string(error);
@@ -418,7 +419,7 @@ static void tcp_server_start(grpc_tcp_server* server, grpc_pollset** pollsets,
418
419
  (void)pollsets;
419
420
  (void)pollset_count;
420
421
  GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD();
421
- if (grpc_tcp_trace.enabled()) {
422
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
422
423
  gpr_log(GPR_INFO, "SERVER_START %p", server);
423
424
  }
424
425
  GPR_ASSERT(on_accept_cb);
@@ -456,16 +457,17 @@ static void tcp_server_shutdown_listeners(grpc_tcp_server* s) {
456
457
  }
457
458
  }
458
459
 
460
+ static grpc_core::TcpServerFdHandler* tcp_server_create_fd_handler(
461
+ grpc_tcp_server* s) {
462
+ return nullptr;
463
+ }
464
+
459
465
  grpc_tcp_server_vtable custom_tcp_server_vtable = {
460
- tcp_server_create,
461
- tcp_server_start,
462
- tcp_server_add_port,
463
- tcp_server_port_fd_count,
464
- tcp_server_port_fd,
465
- tcp_server_ref,
466
- tcp_server_shutdown_starting_add,
467
- tcp_server_unref,
468
- tcp_server_shutdown_listeners};
466
+ tcp_server_create, tcp_server_start,
467
+ tcp_server_add_port, tcp_server_create_fd_handler,
468
+ tcp_server_port_fd_count, tcp_server_port_fd,
469
+ tcp_server_ref, tcp_server_shutdown_starting_add,
470
+ tcp_server_unref, tcp_server_shutdown_listeners};
469
471
 
470
472
  #ifdef GRPC_UV_TEST
471
473
  grpc_tcp_server_vtable* default_tcp_server_vtable = &custom_tcp_server_vtable;
@@ -27,8 +27,6 @@
27
27
 
28
28
  #ifdef GRPC_POSIX_SOCKET_TCP_SERVER
29
29
 
30
- #include "src/core/lib/iomgr/tcp_server.h"
31
-
32
30
  #include <errno.h>
33
31
  #include <fcntl.h>
34
32
  #include <netinet/in.h>
@@ -47,11 +45,14 @@
47
45
 
48
46
  #include "src/core/lib/channel/channel_args.h"
49
47
  #include "src/core/lib/gpr/string.h"
48
+ #include "src/core/lib/gprpp/memory.h"
49
+ #include "src/core/lib/iomgr/exec_ctx.h"
50
50
  #include "src/core/lib/iomgr/resolve_address.h"
51
51
  #include "src/core/lib/iomgr/sockaddr.h"
52
52
  #include "src/core/lib/iomgr/sockaddr_utils.h"
53
53
  #include "src/core/lib/iomgr/socket_utils_posix.h"
54
54
  #include "src/core/lib/iomgr/tcp_posix.h"
55
+ #include "src/core/lib/iomgr/tcp_server.h"
55
56
  #include "src/core/lib/iomgr/tcp_server_utils_posix.h"
56
57
  #include "src/core/lib/iomgr/unix_sockets_posix.h"
57
58
 
@@ -96,6 +97,7 @@ static grpc_error* tcp_server_create(grpc_closure* shutdown_complete,
96
97
  s->tail = nullptr;
97
98
  s->nports = 0;
98
99
  s->channel_args = grpc_channel_args_copy(args);
100
+ s->fd_handler = nullptr;
99
101
  gpr_atm_no_barrier_store(&s->next_pollset_to_assign, 0);
100
102
  *server = s;
101
103
  return GRPC_ERROR_NONE;
@@ -117,6 +119,7 @@ static void finish_shutdown(grpc_tcp_server* s) {
117
119
  gpr_free(sp);
118
120
  }
119
121
  grpc_channel_args_destroy(s->channel_args);
122
+ grpc_core::Delete(s->fd_handler);
120
123
 
121
124
  gpr_free(s);
122
125
  }
@@ -217,12 +220,25 @@ static void on_read(void* arg, grpc_error* err) {
217
220
  }
218
221
  }
219
222
 
223
+ /* For UNIX sockets, the accept call might not fill up the member sun_path
224
+ * of sockaddr_un, so explicitly call getsockname to get it. */
225
+ if (grpc_is_unix_socket(&addr)) {
226
+ memset(&addr, 0, sizeof(addr));
227
+ addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
228
+ if (getsockname(fd, reinterpret_cast<struct sockaddr*>(addr.addr),
229
+ &(addr.len)) < 0) {
230
+ gpr_log(GPR_ERROR, "Failed getsockname: %s", strerror(errno));
231
+ close(fd);
232
+ goto error;
233
+ }
234
+ }
235
+
220
236
  grpc_set_socket_no_sigpipe_if_possible(fd);
221
237
 
222
238
  addr_str = grpc_sockaddr_to_uri(&addr);
223
239
  gpr_asprintf(&name, "tcp-server-connection:%s", addr_str);
224
240
 
225
- if (grpc_tcp_trace.enabled()) {
241
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
226
242
  gpr_log(GPR_INFO, "SERVER_CONNECT: incoming connection: %s", addr_str);
227
243
  }
228
244
 
@@ -241,6 +257,7 @@ static void on_read(void* arg, grpc_error* err) {
241
257
  acceptor->from_server = sp->server;
242
258
  acceptor->port_index = sp->port_index;
243
259
  acceptor->fd_index = sp->fd_index;
260
+ acceptor->external_connection = false;
244
261
 
245
262
  sp->server->on_accept_cb(
246
263
  sp->server->on_accept_cb_arg,
@@ -549,14 +566,71 @@ static void tcp_server_shutdown_listeners(grpc_tcp_server* s) {
549
566
  gpr_mu_unlock(&s->mu);
550
567
  }
551
568
 
569
+ namespace {
570
+ class ExternalConnectionHandler : public grpc_core::TcpServerFdHandler {
571
+ public:
572
+ explicit ExternalConnectionHandler(grpc_tcp_server* s) : s_(s) {}
573
+
574
+ // TODO(yangg) resolve duplicate code with on_read
575
+ void Handle(int listener_fd, int fd, grpc_byte_buffer* buf) override {
576
+ grpc_pollset* read_notifier_pollset;
577
+ grpc_resolved_address addr;
578
+ char* addr_str;
579
+ char* name;
580
+ memset(&addr, 0, sizeof(addr));
581
+ addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
582
+ grpc_core::ExecCtx exec_ctx;
583
+
584
+ if (getpeername(fd, reinterpret_cast<struct sockaddr*>(addr.addr),
585
+ &(addr.len)) < 0) {
586
+ gpr_log(GPR_ERROR, "Failed getpeername: %s", strerror(errno));
587
+ close(fd);
588
+ return;
589
+ }
590
+ grpc_set_socket_no_sigpipe_if_possible(fd);
591
+ addr_str = grpc_sockaddr_to_uri(&addr);
592
+ gpr_asprintf(&name, "tcp-server-connection:%s", addr_str);
593
+ if (grpc_tcp_trace.enabled()) {
594
+ gpr_log(GPR_INFO, "SERVER_CONNECT: incoming external connection: %s",
595
+ addr_str);
596
+ }
597
+ grpc_fd* fdobj = grpc_fd_create(fd, name, true);
598
+ read_notifier_pollset =
599
+ s_->pollsets[static_cast<size_t>(gpr_atm_no_barrier_fetch_add(
600
+ &s_->next_pollset_to_assign, 1)) %
601
+ s_->pollset_count];
602
+ grpc_pollset_add_fd(read_notifier_pollset, fdobj);
603
+ grpc_tcp_server_acceptor* acceptor =
604
+ static_cast<grpc_tcp_server_acceptor*>(gpr_malloc(sizeof(*acceptor)));
605
+ acceptor->from_server = s_;
606
+ acceptor->port_index = -1;
607
+ acceptor->fd_index = -1;
608
+ acceptor->external_connection = true;
609
+ acceptor->listener_fd = listener_fd;
610
+ acceptor->pending_data = buf;
611
+ s_->on_accept_cb(s_->on_accept_cb_arg,
612
+ grpc_tcp_create(fdobj, s_->channel_args, addr_str),
613
+ read_notifier_pollset, acceptor);
614
+ gpr_free(name);
615
+ gpr_free(addr_str);
616
+ }
617
+
618
+ private:
619
+ grpc_tcp_server* s_;
620
+ };
621
+ } // namespace
622
+
623
+ static grpc_core::TcpServerFdHandler* tcp_server_create_fd_handler(
624
+ grpc_tcp_server* s) {
625
+ s->fd_handler = grpc_core::New<ExternalConnectionHandler>(s);
626
+ return s->fd_handler;
627
+ }
628
+
552
629
  grpc_tcp_server_vtable grpc_posix_tcp_server_vtable = {
553
- tcp_server_create,
554
- tcp_server_start,
555
- tcp_server_add_port,
556
- tcp_server_port_fd_count,
557
- tcp_server_port_fd,
558
- tcp_server_ref,
559
- tcp_server_shutdown_starting_add,
560
- tcp_server_unref,
561
- tcp_server_shutdown_listeners};
630
+ tcp_server_create, tcp_server_start,
631
+ tcp_server_add_port, tcp_server_create_fd_handler,
632
+ tcp_server_port_fd_count, tcp_server_port_fd,
633
+ tcp_server_ref, tcp_server_shutdown_starting_add,
634
+ tcp_server_unref, tcp_server_shutdown_listeners};
635
+
562
636
  #endif /* GRPC_POSIX_SOCKET_TCP_SERVER */
@@ -92,6 +92,9 @@ struct grpc_tcp_server {
92
92
 
93
93
  /* channel args for this server */
94
94
  grpc_channel_args* channel_args;
95
+
96
+ /* a handler for external connections, owned */
97
+ grpc_core::TcpServerFdHandler* fd_handler;
95
98
  };
96
99
 
97
100
  /* If successful, add a listener to \a s for \a addr, set \a dsmode for the
@@ -255,7 +255,7 @@ static grpc_error* start_accept_locked(grpc_tcp_listener* port) {
255
255
  }
256
256
 
257
257
  sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
258
- WSA_FLAG_OVERLAPPED);
258
+ grpc_get_default_wsa_socket_flags());
259
259
  if (sock == INVALID_SOCKET) {
260
260
  error = GRPC_WSA_ERROR(WSAGetLastError(), "WSASocket");
261
261
  goto failure;
@@ -372,6 +372,7 @@ static void on_accept(void* arg, grpc_error* error) {
372
372
  acceptor->from_server = sp->server;
373
373
  acceptor->port_index = sp->port_index;
374
374
  acceptor->fd_index = 0;
375
+ acceptor->external_connection = false;
375
376
  sp->server->on_accept_cb(sp->server->on_accept_cb_arg, ep, NULL, acceptor);
376
377
  }
377
378
  /* As we were notified from the IOCP of one and exactly one accept,
@@ -493,7 +494,7 @@ static grpc_error* tcp_server_add_port(grpc_tcp_server* s,
493
494
  }
494
495
 
495
496
  sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
496
- WSA_FLAG_OVERLAPPED);
497
+ grpc_get_default_wsa_socket_flags());
497
498
  if (sock == INVALID_SOCKET) {
498
499
  error = GRPC_WSA_ERROR(WSAGetLastError(), "WSASocket");
499
500
  goto done;
@@ -545,16 +546,17 @@ static int tcp_server_port_fd(grpc_tcp_server* s, unsigned port_index,
545
546
  return -1;
546
547
  }
547
548
 
549
+ static grpc_core::TcpServerFdHandler* tcp_server_create_fd_handler(
550
+ grpc_tcp_server* s) {
551
+ return nullptr;
552
+ }
553
+
548
554
  static void tcp_server_shutdown_listeners(grpc_tcp_server* s) {}
549
555
 
550
556
  grpc_tcp_server_vtable grpc_windows_tcp_server_vtable = {
551
- tcp_server_create,
552
- tcp_server_start,
553
- tcp_server_add_port,
554
- tcp_server_port_fd_count,
555
- tcp_server_port_fd,
556
- tcp_server_ref,
557
- tcp_server_shutdown_starting_add,
558
- tcp_server_unref,
559
- tcp_server_shutdown_listeners};
557
+ tcp_server_create, tcp_server_start,
558
+ tcp_server_add_port, tcp_server_create_fd_handler,
559
+ tcp_server_port_fd_count, tcp_server_port_fd,
560
+ tcp_server_ref, tcp_server_shutdown_starting_add,
561
+ tcp_server_unref, tcp_server_shutdown_listeners};
560
562
  #endif /* GRPC_WINSOCK_SOCKET */
@@ -33,7 +33,6 @@
33
33
  #include "src/core/lib/gpr/string.h"
34
34
  #include "src/core/lib/iomgr/error.h"
35
35
  #include "src/core/lib/iomgr/iomgr_custom.h"
36
- #include "src/core/lib/iomgr/network_status_tracker.h"
37
36
  #include "src/core/lib/iomgr/resolve_address_custom.h"
38
37
  #include "src/core/lib/iomgr/resource_quota.h"
39
38
  #include "src/core/lib/iomgr/tcp_custom.h"
@@ -54,7 +53,7 @@ typedef struct uv_socket_t {
54
53
  char* read_buf;
55
54
  size_t read_len;
56
55
 
57
- bool pending_connection;
56
+ int pending_connections;
58
57
  grpc_custom_socket* accept_socket;
59
58
  grpc_error* accept_error;
60
59
 
@@ -207,7 +206,7 @@ static grpc_error* uv_socket_init_helper(uv_socket_t* uv_socket, int domain) {
207
206
  // Node uses a garbage collector to call destructors, so we don't
208
207
  // want to hold the uv loop open with active gRPC objects.
209
208
  uv_unref((uv_handle_t*)uv_socket->handle);
210
- uv_socket->pending_connection = false;
209
+ uv_socket->pending_connections = 0;
211
210
  uv_socket->accept_socket = nullptr;
212
211
  uv_socket->accept_error = GRPC_ERROR_NONE;
213
212
  return GRPC_ERROR_NONE;
@@ -244,14 +243,14 @@ static grpc_error* uv_socket_getsockname(grpc_custom_socket* socket,
244
243
 
245
244
  static void accept_new_connection(grpc_custom_socket* socket) {
246
245
  uv_socket_t* uv_socket = (uv_socket_t*)socket->impl;
247
- if (!uv_socket->pending_connection || !uv_socket->accept_socket) {
246
+ if (uv_socket->pending_connections == 0 || !uv_socket->accept_socket) {
248
247
  return;
249
248
  }
250
249
  grpc_custom_socket* new_socket = uv_socket->accept_socket;
251
250
  grpc_error* error = uv_socket->accept_error;
252
251
  uv_socket->accept_socket = nullptr;
253
252
  uv_socket->accept_error = GRPC_ERROR_NONE;
254
- uv_socket->pending_connection = false;
253
+ uv_socket->pending_connections -= 1;
255
254
  if (uv_socket->accept_error != GRPC_ERROR_NONE) {
256
255
  uv_stream_t dummy_handle;
257
256
  uv_accept((uv_stream_t*)uv_socket->handle, &dummy_handle);
@@ -271,8 +270,6 @@ static void accept_new_connection(grpc_custom_socket* socket) {
271
270
  static void uv_on_connect(uv_stream_t* server, int status) {
272
271
  grpc_custom_socket* socket = (grpc_custom_socket*)server->data;
273
272
  uv_socket_t* uv_socket = (uv_socket_t*)socket->impl;
274
- GPR_ASSERT(!uv_socket->pending_connection);
275
- uv_socket->pending_connection = true;
276
273
  if (status < 0) {
277
274
  switch (status) {
278
275
  case UV_EINTR:
@@ -282,6 +279,7 @@ static void uv_on_connect(uv_stream_t* server, int status) {
282
279
  uv_socket->accept_error = tcp_error_create("accept failed", status);
283
280
  }
284
281
  }
282
+ uv_socket->pending_connections += 1;
285
283
  accept_new_connection(socket);
286
284
  }
287
285
 
@@ -24,7 +24,6 @@
24
24
 
25
25
  #include <limits.h>
26
26
 
27
- #include "src/core/lib/iomgr/network_status_tracker.h"
28
27
  #include "src/core/lib/iomgr/sockaddr_windows.h"
29
28
 
30
29
  #include <grpc/slice_buffer.h>
@@ -75,18 +74,16 @@ static grpc_error* set_dualstack(SOCKET sock) {
75
74
  : GRPC_WSA_ERROR(WSAGetLastError(), "setsockopt(IPV6_V6ONLY)");
76
75
  }
77
76
 
78
- static grpc_error* enable_loopback_fast_path(SOCKET sock) {
77
+ static grpc_error* enable_socket_low_latency(SOCKET sock) {
79
78
  int status;
80
- uint32_t param = 1;
81
- DWORD ret;
82
- status = WSAIoctl(sock, /*SIO_LOOPBACK_FAST_PATH==*/_WSAIOW(IOC_VENDOR, 16),
83
- &param, sizeof(param), NULL, 0, &ret, 0, 0);
79
+ BOOL param = TRUE;
80
+ status = ::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
81
+ reinterpret_cast<char*>(&param), sizeof(param));
84
82
  if (status == SOCKET_ERROR) {
85
83
  status = WSAGetLastError();
86
84
  }
87
- return status == 0 || status == WSAEOPNOTSUPP
88
- ? GRPC_ERROR_NONE
89
- : GRPC_WSA_ERROR(status, "WSAIoctl(SIO_LOOPBACK_FAST_PATH)");
85
+ return status == 0 ? GRPC_ERROR_NONE
86
+ : GRPC_WSA_ERROR(status, "setsockopt(TCP_NODELAY)");
90
87
  }
91
88
 
92
89
  grpc_error* grpc_tcp_prepare_socket(SOCKET sock) {
@@ -95,7 +92,7 @@ grpc_error* grpc_tcp_prepare_socket(SOCKET sock) {
95
92
  if (err != GRPC_ERROR_NONE) return err;
96
93
  err = set_dualstack(sock);
97
94
  if (err != GRPC_ERROR_NONE) return err;
98
- err = enable_loopback_fast_path(sock);
95
+ err = enable_socket_low_latency(sock);
99
96
  if (err != GRPC_ERROR_NONE) return err;
100
97
  return GRPC_ERROR_NONE;
101
98
  }
@@ -242,7 +239,7 @@ static void on_read(void* tcpp, grpc_error* error) {
242
239
  #define DEFAULT_TARGET_READ_SIZE 8192
243
240
  #define MAX_WSABUF_COUNT 16
244
241
  static void win_read(grpc_endpoint* ep, grpc_slice_buffer* read_slices,
245
- grpc_closure* cb) {
242
+ grpc_closure* cb, bool urgent) {
246
243
  grpc_tcp* tcp = (grpc_tcp*)ep;
247
244
  grpc_winsocket* handle = tcp->socket;
248
245
  grpc_winsocket_callback_info* info = &handle->read_info;
@@ -470,7 +467,6 @@ static void win_shutdown(grpc_endpoint* ep, grpc_error* why) {
470
467
  }
471
468
 
472
469
  static void win_destroy(grpc_endpoint* ep) {
473
- grpc_network_status_unregister_endpoint(ep);
474
470
  grpc_tcp* tcp = (grpc_tcp*)ep;
475
471
  grpc_slice_buffer_reset_and_unref_internal(&tcp->last_read_buffer);
476
472
  TCP_UNREF(tcp, "destroy");
@@ -526,8 +522,6 @@ grpc_endpoint* grpc_tcp_create(grpc_winsocket* socket,
526
522
  tcp->peer_string = gpr_strdup(peer_string);
527
523
  grpc_slice_buffer_init(&tcp->last_read_buffer);
528
524
  tcp->resource_user = grpc_resource_user_create(resource_quota, peer_string);
529
- /* Tell network status tracking code about the new endpoint */
530
- grpc_network_status_register_endpoint(&tcp->base);
531
525
  grpc_resource_quota_unref_internal(resource_quota);
532
526
 
533
527
  return &tcp->base;
@@ -29,7 +29,8 @@
29
29
 
30
30
  typedef struct grpc_timer {
31
31
  grpc_millis deadline;
32
- uint32_t heap_index; /* INVALID_HEAP_INDEX if not in heap */
32
+ // Uninitialized if not using heap, or INVALID_HEAP_INDEX if not in heap.
33
+ uint32_t heap_index;
33
34
  bool pending;
34
35
  struct grpc_timer* next;
35
36
  struct grpc_timer* prev;
@@ -361,7 +361,7 @@ static void timer_init(grpc_timer* timer, grpc_millis deadline,
361
361
  timer->hash_table_next = nullptr;
362
362
  #endif
363
363
 
364
- if (grpc_timer_trace.enabled()) {
364
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_trace)) {
365
365
  gpr_log(GPR_INFO, "TIMER %p: SET %" PRId64 " now %" PRId64 " call %p[%p]",
366
366
  timer, deadline, grpc_core::ExecCtx::Get()->Now(), closure,
367
367
  closure->cb);
@@ -397,7 +397,7 @@ static void timer_init(grpc_timer* timer, grpc_millis deadline,
397
397
  timer->heap_index = INVALID_HEAP_INDEX;
398
398
  list_join(&shard->list, timer);
399
399
  }
400
- if (grpc_timer_trace.enabled()) {
400
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_trace)) {
401
401
  gpr_log(GPR_INFO,
402
402
  " .. add to shard %d with queue_deadline_cap=%" PRId64
403
403
  " => is_first_timer=%s",
@@ -419,7 +419,7 @@ static void timer_init(grpc_timer* timer, grpc_millis deadline,
419
419
  grpc_timer_check. */
420
420
  if (is_first_timer) {
421
421
  gpr_mu_lock(&g_shared_mutables.mu);
422
- if (grpc_timer_trace.enabled()) {
422
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_trace)) {
423
423
  gpr_log(GPR_INFO, " .. old shard min_deadline=%" PRId64,
424
424
  shard->min_deadline);
425
425
  }
@@ -463,7 +463,7 @@ static void timer_cancel(grpc_timer* timer) {
463
463
 
464
464
  timer_shard* shard = &g_shards[GPR_HASH_POINTER(timer, g_num_shards)];
465
465
  gpr_mu_lock(&shard->mu);
466
- if (grpc_timer_trace.enabled()) {
466
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_trace)) {
467
467
  gpr_log(GPR_INFO, "TIMER %p: CANCEL pending=%s", timer,
468
468
  timer->pending ? "true" : "false");
469
469
  }
@@ -487,7 +487,7 @@ static void timer_cancel(grpc_timer* timer) {
487
487
  /* Rebalances the timer shard by computing a new 'queue_deadline_cap' and moving
488
488
  all relevant timers in shard->list (i.e timers with deadlines earlier than
489
489
  'queue_deadline_cap') into into shard->heap.
490
- Returns 'true' if shard->heap has atleast ONE element
490
+ Returns 'true' if shard->heap has at least ONE element
491
491
  REQUIRES: shard->mu locked */
492
492
  static bool refill_heap(timer_shard* shard, grpc_millis now) {
493
493
  /* Compute the new queue window width and bound by the limits: */
@@ -504,7 +504,7 @@ static bool refill_heap(timer_shard* shard, grpc_millis now) {
504
504
  saturating_add(GPR_MAX(now, shard->queue_deadline_cap),
505
505
  static_cast<grpc_millis>(deadline_delta * 1000.0));
506
506
 
507
- if (grpc_timer_check_trace.enabled()) {
507
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
508
508
  gpr_log(GPR_INFO, " .. shard[%d]->queue_deadline_cap --> %" PRId64,
509
509
  static_cast<int>(shard - g_shards), shard->queue_deadline_cap);
510
510
  }
@@ -512,7 +512,7 @@ static bool refill_heap(timer_shard* shard, grpc_millis now) {
512
512
  next = timer->next;
513
513
 
514
514
  if (timer->deadline < shard->queue_deadline_cap) {
515
- if (grpc_timer_check_trace.enabled()) {
515
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
516
516
  gpr_log(GPR_INFO, " .. add timer with deadline %" PRId64 " to heap",
517
517
  timer->deadline);
518
518
  }
@@ -529,7 +529,7 @@ static bool refill_heap(timer_shard* shard, grpc_millis now) {
529
529
  static grpc_timer* pop_one(timer_shard* shard, grpc_millis now) {
530
530
  grpc_timer* timer;
531
531
  for (;;) {
532
- if (grpc_timer_check_trace.enabled()) {
532
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
533
533
  gpr_log(GPR_INFO, " .. shard[%d]: heap_empty=%s",
534
534
  static_cast<int>(shard - g_shards),
535
535
  grpc_timer_heap_is_empty(&shard->heap) ? "true" : "false");
@@ -539,13 +539,13 @@ static grpc_timer* pop_one(timer_shard* shard, grpc_millis now) {
539
539
  if (!refill_heap(shard, now)) return nullptr;
540
540
  }
541
541
  timer = grpc_timer_heap_top(&shard->heap);
542
- if (grpc_timer_check_trace.enabled()) {
542
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
543
543
  gpr_log(GPR_INFO,
544
544
  " .. check top timer deadline=%" PRId64 " now=%" PRId64,
545
545
  timer->deadline, now);
546
546
  }
547
547
  if (timer->deadline > now) return nullptr;
548
- if (grpc_timer_trace.enabled()) {
548
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_trace)) {
549
549
  gpr_log(GPR_INFO, "TIMER %p: FIRE %" PRId64 "ms late via %s scheduler",
550
550
  timer, now - timer->deadline,
551
551
  timer->closure->scheduler->vtable->name);
@@ -569,7 +569,7 @@ static size_t pop_timers(timer_shard* shard, grpc_millis now,
569
569
  }
570
570
  *new_min_deadline = compute_min_deadline(shard);
571
571
  gpr_mu_unlock(&shard->mu);
572
- if (grpc_timer_check_trace.enabled()) {
572
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
573
573
  gpr_log(GPR_INFO, " .. shard[%d] popped %" PRIdPTR,
574
574
  static_cast<int>(shard - g_shards), n);
575
575
  }
@@ -606,7 +606,7 @@ static grpc_timer_check_result run_some_expired_timers(grpc_millis now,
606
606
  gpr_mu_lock(&g_shared_mutables.mu);
607
607
  result = GRPC_TIMERS_CHECKED_AND_EMPTY;
608
608
 
609
- if (grpc_timer_check_trace.enabled()) {
609
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
610
610
  gpr_log(GPR_INFO, " .. shard[%d]->min_deadline = %" PRId64,
611
611
  static_cast<int>(g_shard_queue[0] - g_shards),
612
612
  g_shard_queue[0]->min_deadline);
@@ -624,7 +624,7 @@ static grpc_timer_check_result run_some_expired_timers(grpc_millis now,
624
624
  result = GRPC_TIMERS_FIRED;
625
625
  }
626
626
 
627
- if (grpc_timer_check_trace.enabled()) {
627
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
628
628
  gpr_log(GPR_INFO,
629
629
  " .. result --> %d"
630
630
  ", shard[%d]->min_deadline %" PRId64 " --> %" PRId64
@@ -691,7 +691,7 @@ static grpc_timer_check_result timer_check(grpc_millis* next) {
691
691
  if (next != nullptr) {
692
692
  *next = GPR_MIN(*next, min_timer);
693
693
  }
694
- if (grpc_timer_check_trace.enabled()) {
694
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
695
695
  gpr_log(GPR_INFO, "TIMER CHECK SKIP: now=%" PRId64 " min_timer=%" PRId64,
696
696
  now, min_timer);
697
697
  }
@@ -704,7 +704,7 @@ static grpc_timer_check_result timer_check(grpc_millis* next) {
704
704
  : GRPC_ERROR_CREATE_FROM_STATIC_STRING("Shutting down timer system");
705
705
 
706
706
  // tracing
707
- if (grpc_timer_check_trace.enabled()) {
707
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
708
708
  char* next_str;
709
709
  if (next == nullptr) {
710
710
  next_str = gpr_strdup("NULL");
@@ -728,7 +728,7 @@ static grpc_timer_check_result timer_check(grpc_millis* next) {
728
728
  grpc_timer_check_result r =
729
729
  run_some_expired_timers(now, next, shutdown_error);
730
730
  // tracing
731
- if (grpc_timer_check_trace.enabled()) {
731
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_timer_check_trace)) {
732
732
  char* next_str;
733
733
  if (next == nullptr) {
734
734
  next_str = gpr_strdup("NULL");