grpc-flamingo 1.11.0 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (452) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1150 -176
  3. data/etc/roots.pem +40 -196
  4. data/include/grpc/grpc.h +49 -8
  5. data/include/grpc/grpc_security.h +123 -2
  6. data/include/grpc/grpc_security_constants.h +6 -0
  7. data/include/grpc/impl/codegen/fork.h +4 -4
  8. data/include/grpc/impl/codegen/grpc_types.h +26 -5
  9. data/include/grpc/impl/codegen/log.h +112 -0
  10. data/include/grpc/impl/codegen/port_platform.h +55 -4
  11. data/include/grpc/module.modulemap +2 -0
  12. data/include/grpc/support/log.h +2 -80
  13. data/include/grpc/support/string_util.h +2 -0
  14. data/include/grpc/support/sync.h +0 -16
  15. data/src/boringssl/err_data.c +602 -588
  16. data/src/core/ext/{census → filters/census}/grpc_context.cc +0 -0
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +1234 -1070
  19. data/src/core/ext/filters/client_channel/client_channel.h +5 -0
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +113 -0
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +71 -0
  22. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -0
  23. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  24. data/src/core/ext/filters/client_channel/http_proxy.cc +22 -5
  25. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy.h +30 -10
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +120 -127
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +36 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +36 -102
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +37 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +25 -22
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +19 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +54 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +19 -0
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +54 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +4 -17
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +37 -63
  40. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +306 -239
  41. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +444 -392
  42. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +538 -98
  43. data/src/core/ext/filters/client_channel/lb_policy_factory.cc +8 -0
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -0
  45. data/src/core/ext/filters/client_channel/method_params.h +4 -0
  46. data/src/core/ext/filters/client_channel/resolver.h +10 -0
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -19
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +320 -0
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +62 -9
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +49 -294
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +537 -0
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +112 -87
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +17 -2
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +6 -5
  55. data/src/core/ext/filters/{load_reporting/server_load_reporting_filter.h → client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc} +7 -8
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +29 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +32 -15
  58. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -0
  59. data/src/core/ext/filters/client_channel/subchannel.cc +58 -15
  60. data/src/core/ext/filters/client_channel/subchannel.h +11 -0
  61. data/src/core/ext/filters/deadline/deadline_filter.cc +18 -15
  62. data/src/core/ext/filters/deadline/deadline_filter.h +5 -5
  63. data/src/core/ext/filters/http/client/http_client_filter.cc +10 -9
  64. data/src/core/ext/filters/http/client_authority_filter.cc +6 -5
  65. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +6 -6
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +123 -131
  67. data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
  68. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  69. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
  70. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -2
  71. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +9 -8
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +97 -48
  73. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -7
  74. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +3 -3
  75. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +12 -8
  76. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -3
  77. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -2
  78. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +2 -2
  79. data/src/core/ext/transport/chttp2/transport/parsing.cc +14 -12
  80. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  81. data/src/core/ext/transport/chttp2/transport/writing.cc +32 -27
  82. data/src/core/ext/transport/inproc/inproc_transport.cc +87 -49
  83. data/src/core/lib/channel/channel_args.cc +28 -0
  84. data/src/core/lib/channel/channel_args.h +4 -0
  85. data/src/core/lib/channel/channel_stack.cc +22 -29
  86. data/src/core/lib/channel/channel_stack.h +2 -2
  87. data/src/core/lib/channel/channel_stack_builder.cc +0 -3
  88. data/src/core/lib/channel/channel_stack_builder.h +0 -2
  89. data/src/core/lib/channel/channel_trace.cc +28 -63
  90. data/src/core/lib/channel/channel_trace.h +13 -17
  91. data/src/core/lib/channel/channelz.cc +153 -0
  92. data/src/core/lib/channel/channelz.h +133 -0
  93. data/src/core/lib/channel/channelz_registry.cc +145 -0
  94. data/src/core/lib/channel/channelz_registry.h +120 -0
  95. data/src/core/lib/channel/connected_channel.cc +8 -1
  96. data/src/core/lib/channel/handshaker.cc +71 -0
  97. data/src/core/lib/channel/handshaker.h +4 -0
  98. data/src/core/lib/debug/stats.h +7 -0
  99. data/src/core/lib/debug/stats_data.cc +5 -0
  100. data/src/core/lib/debug/stats_data.h +120 -0
  101. data/src/core/lib/debug/trace.cc +2 -1
  102. data/src/core/lib/debug/trace.h +12 -1
  103. data/src/core/lib/gpr/alloc.h +28 -0
  104. data/src/core/lib/gpr/arena.cc +38 -45
  105. data/src/core/lib/gpr/log.cc +8 -2
  106. data/src/core/lib/gpr/log_android.cc +4 -0
  107. data/src/core/lib/gpr/log_linux.cc +4 -0
  108. data/src/core/lib/gpr/log_posix.cc +4 -0
  109. data/src/core/lib/gpr/log_windows.cc +5 -0
  110. data/src/core/lib/gpr/string.cc +28 -0
  111. data/src/core/lib/gpr/string.h +10 -0
  112. data/src/core/lib/gprpp/abstract.h +5 -2
  113. data/src/core/lib/gprpp/fork.cc +268 -0
  114. data/src/core/lib/gprpp/fork.h +88 -0
  115. data/src/core/lib/gprpp/inlined_vector.h +87 -37
  116. data/src/core/lib/gprpp/memory.h +12 -0
  117. data/src/core/lib/gprpp/mutex_lock.h +42 -0
  118. data/src/core/lib/gprpp/orphanable.h +10 -12
  119. data/src/core/lib/gprpp/ref_counted.h +10 -12
  120. data/src/core/lib/gprpp/ref_counted_ptr.h +65 -8
  121. data/src/core/lib/gprpp/thd.h +0 -3
  122. data/src/core/lib/gprpp/thd_posix.cc +5 -54
  123. data/src/core/lib/gprpp/thd_windows.cc +0 -7
  124. data/src/core/lib/http/httpcli_security_connector.cc +1 -3
  125. data/src/core/lib/iomgr/call_combiner.cc +13 -13
  126. data/src/core/lib/iomgr/call_combiner.h +84 -1
  127. data/src/core/lib/iomgr/closure.h +6 -5
  128. data/src/core/lib/iomgr/combiner.cc +30 -13
  129. data/src/core/lib/iomgr/combiner.h +1 -1
  130. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  131. data/src/core/lib/iomgr/error.cc +12 -0
  132. data/src/core/lib/iomgr/error.h +5 -0
  133. data/src/core/lib/iomgr/ev_epoll1_linux.cc +138 -51
  134. data/src/core/lib/iomgr/ev_epollex_linux.cc +276 -93
  135. data/src/core/lib/iomgr/ev_epollsig_linux.cc +58 -50
  136. data/src/core/lib/iomgr/ev_poll_posix.cc +163 -42
  137. data/src/core/lib/iomgr/ev_posix.cc +88 -24
  138. data/src/core/lib/iomgr/ev_posix.h +48 -12
  139. data/src/core/lib/iomgr/exec_ctx.cc +15 -9
  140. data/src/core/lib/iomgr/exec_ctx.h +48 -20
  141. data/src/core/lib/iomgr/executor.cc +274 -142
  142. data/src/core/lib/iomgr/executor.h +82 -16
  143. data/src/core/lib/iomgr/fork_posix.cc +42 -19
  144. data/src/core/lib/iomgr/iocp_windows.cc +9 -4
  145. data/src/core/lib/iomgr/iomgr.cc +2 -0
  146. data/src/core/lib/iomgr/iomgr.h +5 -0
  147. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  148. data/src/core/lib/iomgr/is_epollexclusive_available.cc +1 -0
  149. data/src/core/lib/iomgr/lockfree_event.cc +5 -1
  150. data/src/core/lib/iomgr/polling_entity.cc +11 -2
  151. data/src/core/lib/iomgr/pollset_custom.cc +2 -2
  152. data/src/core/lib/iomgr/port.h +51 -1
  153. data/src/core/lib/iomgr/resolve_address.h +1 -1
  154. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  155. data/src/core/lib/iomgr/resolve_address_windows.cc +3 -2
  156. data/src/core/lib/iomgr/resource_quota.cc +89 -12
  157. data/src/core/lib/iomgr/resource_quota.h +16 -0
  158. data/src/core/lib/iomgr/sockaddr_posix.h +1 -1
  159. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  160. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  161. data/src/core/lib/iomgr/socket_mutator.h +1 -1
  162. data/src/core/lib/iomgr/socket_utils.h +9 -0
  163. data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -1
  164. data/src/core/lib/iomgr/socket_utils_linux.cc +0 -1
  165. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -3
  166. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  167. data/src/core/lib/iomgr/socket_utils_uv.cc +4 -0
  168. data/src/core/lib/iomgr/socket_utils_windows.cc +4 -0
  169. data/src/core/lib/iomgr/socket_windows.cc +33 -0
  170. data/src/core/lib/iomgr/socket_windows.h +6 -0
  171. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -5
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +10 -11
  173. data/src/core/lib/iomgr/tcp_custom.cc +11 -11
  174. data/src/core/lib/iomgr/tcp_posix.cc +49 -36
  175. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  176. data/src/core/lib/iomgr/tcp_server_posix.cc +16 -36
  177. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  178. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +17 -5
  179. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -0
  180. data/src/core/lib/iomgr/tcp_uv.cc +3 -0
  181. data/src/core/lib/iomgr/tcp_windows.cc +18 -2
  182. data/src/core/lib/iomgr/tcp_windows.h +2 -0
  183. data/src/core/lib/iomgr/timer.h +4 -3
  184. data/src/core/lib/iomgr/timer_generic.cc +133 -51
  185. data/src/core/lib/iomgr/timer_manager.cc +12 -14
  186. data/src/core/lib/iomgr/timer_uv.cc +3 -0
  187. data/src/core/lib/iomgr/udp_server.cc +106 -52
  188. data/src/core/lib/iomgr/udp_server.h +8 -4
  189. data/src/core/lib/json/json.cc +12 -1
  190. data/src/core/lib/json/json.h +5 -0
  191. data/src/core/lib/profiling/basic_timers.cc +1 -0
  192. data/src/core/lib/security/context/security_context.cc +8 -8
  193. data/src/core/lib/security/context/security_context.h +6 -2
  194. data/src/core/lib/security/credentials/alts/alts_credentials.h +0 -20
  195. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +3 -2
  196. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +7 -7
  197. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +1 -38
  198. data/src/core/lib/security/credentials/credentials.h +1 -0
  199. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +89 -115
  200. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +16 -0
  201. data/src/core/lib/security/credentials/jwt/json_token.h +2 -0
  202. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +2 -0
  203. data/src/core/lib/security/credentials/local/local_credentials.cc +77 -0
  204. data/src/core/lib/security/credentials/local/local_credentials.h +40 -0
  205. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +11 -7
  206. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  207. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +17 -3
  208. data/src/core/lib/security/security_connector/alts_security_connector.cc +2 -1
  209. data/src/core/lib/security/security_connector/load_system_roots.h +29 -0
  210. data/src/core/lib/{gpr/fork.h → security/security_connector/load_system_roots_fallback.cc} +10 -13
  211. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +165 -0
  212. data/src/core/lib/security/security_connector/load_system_roots_linux.h +44 -0
  213. data/src/core/lib/security/security_connector/local_security_connector.cc +245 -0
  214. data/src/core/lib/security/security_connector/local_security_connector.h +58 -0
  215. data/src/core/lib/security/security_connector/security_connector.cc +79 -32
  216. data/src/core/lib/security/security_connector/security_connector.h +5 -3
  217. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  218. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  219. data/src/core/lib/security/transport/security_handshaker.cc +7 -2
  220. data/src/core/lib/security/transport/server_auth_filter.cc +4 -7
  221. data/src/core/lib/security/util/json_util.cc +4 -0
  222. data/src/core/lib/slice/slice.cc +6 -2
  223. data/src/core/lib/slice/slice_buffer.cc +27 -7
  224. data/src/core/lib/slice/slice_hash_table.h +4 -0
  225. data/src/core/lib/slice/slice_weak_hash_table.h +4 -0
  226. data/src/core/lib/surface/call.cc +119 -58
  227. data/src/core/lib/surface/call.h +7 -0
  228. data/src/core/lib/surface/channel.cc +50 -18
  229. data/src/core/lib/surface/channel.h +4 -0
  230. data/src/core/lib/surface/completion_queue.cc +153 -18
  231. data/src/core/lib/surface/completion_queue.h +20 -2
  232. data/src/core/lib/surface/completion_queue_factory.cc +13 -4
  233. data/src/core/lib/surface/init.cc +7 -8
  234. data/src/core/lib/surface/init.h +0 -1
  235. data/src/core/lib/surface/server.cc +16 -0
  236. data/src/core/lib/surface/version.cc +1 -1
  237. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  238. data/src/core/lib/transport/bdp_estimator.h +2 -2
  239. data/src/core/lib/transport/byte_stream.cc +1 -1
  240. data/src/core/lib/transport/connectivity_state.cc +6 -7
  241. data/src/core/lib/transport/service_config.cc +2 -2
  242. data/src/core/lib/transport/service_config.h +3 -3
  243. data/src/core/lib/transport/transport.cc +22 -10
  244. data/src/core/lib/transport/transport.h +18 -18
  245. data/src/core/lib/transport/transport_op_string.cc +1 -8
  246. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -4
  247. data/src/core/tsi/alts/crypt/aes_gcm.cc +2 -0
  248. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -7
  249. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +10 -0
  250. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +2 -2
  251. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +38 -3
  252. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -0
  253. data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -1
  254. data/src/core/tsi/alts/handshaker/altscontext.pb.h +1 -2
  255. data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -1
  256. data/src/core/tsi/alts/handshaker/handshaker.pb.h +1 -2
  257. data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -1
  258. data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +1 -1
  259. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  260. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +47 -1
  261. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +3 -1
  262. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -11
  263. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +7 -2
  264. data/src/core/tsi/fake_transport_security.cc +1 -0
  265. data/src/core/tsi/grpc_shadow_boringssl.h +3006 -0
  266. data/src/core/tsi/local_transport_security.cc +209 -0
  267. data/src/core/tsi/local_transport_security.h +51 -0
  268. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  269. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +5 -5
  270. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +6 -0
  271. data/src/core/tsi/ssl_transport_security.cc +245 -116
  272. data/src/core/tsi/ssl_types.h +2 -0
  273. data/src/core/tsi/transport_security.cc +14 -0
  274. data/src/core/tsi/transport_security.h +2 -0
  275. data/src/core/tsi/transport_security_interface.h +11 -1
  276. data/src/ruby/bin/math_client.rb +17 -9
  277. data/src/ruby/ext/grpc/extconf.rb +1 -26
  278. data/src/ruby/ext/grpc/rb_channel_credentials.c +3 -3
  279. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +42 -16
  280. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +65 -26
  281. data/src/ruby/lib/grpc/generic/active_call.rb +19 -23
  282. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -1
  283. data/src/ruby/lib/grpc/version.rb +1 -1
  284. data/src/ruby/pb/generate_proto_ruby.sh +7 -1
  285. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +4 -1
  286. data/src/ruby/spec/call_credentials_spec.rb +1 -1
  287. data/src/ruby/spec/call_spec.rb +1 -1
  288. data/src/ruby/spec/channel_credentials_spec.rb +1 -1
  289. data/src/ruby/spec/channel_spec.rb +1 -1
  290. data/src/ruby/spec/client_auth_spec.rb +1 -12
  291. data/src/ruby/spec/client_server_spec.rb +1 -1
  292. data/src/ruby/spec/compression_options_spec.rb +1 -1
  293. data/src/ruby/spec/error_sanity_spec.rb +1 -1
  294. data/src/ruby/spec/generic/client_stub_spec.rb +16 -4
  295. data/src/ruby/spec/generic/rpc_desc_spec.rb +1 -1
  296. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  297. data/src/ruby/spec/generic/service_spec.rb +1 -1
  298. data/src/ruby/spec/google_rpc_status_utils_spec.rb +1 -12
  299. data/src/ruby/spec/pb/duplicate/codegen_spec.rb +1 -0
  300. data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
  301. data/src/ruby/spec/server_credentials_spec.rb +1 -1
  302. data/src/ruby/spec/server_spec.rb +1 -1
  303. data/src/ruby/spec/spec_helper.rb +1 -0
  304. data/src/ruby/spec/support/services.rb +1 -1
  305. data/src/ruby/spec/time_consts_spec.rb +1 -1
  306. data/third_party/address_sorting/address_sorting.c +17 -11
  307. data/third_party/address_sorting/address_sorting_windows.c +43 -3
  308. data/third_party/address_sorting/include/address_sorting/address_sorting.h +3 -0
  309. data/third_party/boringssl/crypto/asn1/a_int.c +33 -28
  310. data/third_party/boringssl/crypto/asn1/a_mbstr.c +24 -22
  311. data/third_party/boringssl/crypto/asn1/a_utf8.c +13 -11
  312. data/third_party/boringssl/crypto/asn1/asn1_locl.h +3 -0
  313. data/third_party/boringssl/crypto/asn1/tasn_dec.c +40 -19
  314. data/third_party/boringssl/crypto/bio/fd.c +1 -0
  315. data/third_party/boringssl/crypto/bio/file.c +2 -0
  316. data/third_party/boringssl/crypto/bn_extra/convert.c +6 -5
  317. data/third_party/boringssl/crypto/bytestring/ber.c +1 -4
  318. data/third_party/boringssl/crypto/bytestring/cbb.c +116 -16
  319. data/third_party/boringssl/crypto/bytestring/cbs.c +151 -20
  320. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +203 -0
  321. data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +2 -0
  322. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +1 -2
  323. data/third_party/boringssl/crypto/cpu-aarch64-fuchsia.c +55 -0
  324. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +2 -1
  325. data/third_party/boringssl/crypto/dsa/dsa.c +16 -54
  326. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +9 -10
  327. data/third_party/boringssl/crypto/ecdh/ecdh.c +4 -3
  328. data/third_party/boringssl/crypto/fipsmodule/bcm.c +11 -542
  329. data/third_party/boringssl/crypto/fipsmodule/bn/add.c +57 -112
  330. data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +4 -3
  331. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +128 -70
  332. data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +32 -71
  333. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +64 -118
  334. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +284 -122
  335. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +31 -65
  336. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +274 -218
  337. data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +2 -1
  338. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +187 -27
  339. data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +1 -1
  340. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +124 -81
  341. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +8 -30
  342. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +321 -347
  343. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +326 -66
  344. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +77 -25
  345. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +199 -222
  346. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +27 -47
  347. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +155 -96
  348. data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +1 -1
  349. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +10 -10
  350. data/third_party/boringssl/crypto/fipsmodule/des/internal.h +2 -0
  351. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +78 -47
  352. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +99 -163
  353. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +3 -10
  354. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +44 -23
  355. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +59 -90
  356. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +38 -65
  357. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +5378 -5418
  358. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +17 -26
  359. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +15 -11
  360. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +45 -51
  361. data/third_party/boringssl/crypto/fipsmodule/ec/{util-64.c → util.c} +0 -5
  362. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +144 -264
  363. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +78 -62
  364. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +256 -0
  365. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +36 -32
  366. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +9 -7
  367. data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +16 -40
  368. data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +1 -6
  369. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +57 -39
  370. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +309 -142
  371. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +581 -0
  372. data/third_party/boringssl/crypto/fipsmodule/tls/internal.h +39 -0
  373. data/third_party/boringssl/crypto/fipsmodule/tls/kdf.c +165 -0
  374. data/third_party/boringssl/crypto/internal.h +65 -2
  375. data/third_party/boringssl/crypto/mem.c +0 -2
  376. data/third_party/boringssl/crypto/obj/obj.c +6 -73
  377. data/third_party/boringssl/crypto/thread_pthread.c +35 -5
  378. data/third_party/boringssl/crypto/x509/a_strex.c +11 -11
  379. data/third_party/boringssl/crypto/x509/vpm_int.h +1 -0
  380. data/third_party/boringssl/crypto/x509/x509_vfy.c +4 -0
  381. data/third_party/boringssl/crypto/x509/x509_vpm.c +44 -22
  382. data/third_party/boringssl/crypto/x509/x_name.c +13 -0
  383. data/third_party/boringssl/include/openssl/aead.h +10 -0
  384. data/third_party/boringssl/include/openssl/asn1.h +2 -3
  385. data/third_party/boringssl/include/openssl/base.h +5 -14
  386. data/third_party/boringssl/include/openssl/bio.h +1 -1
  387. data/third_party/boringssl/include/openssl/bn.h +62 -18
  388. data/third_party/boringssl/include/openssl/bytestring.h +53 -28
  389. data/third_party/boringssl/include/openssl/crypto.h +4 -0
  390. data/third_party/boringssl/include/openssl/ec.h +10 -4
  391. data/third_party/boringssl/include/openssl/ec_key.h +7 -6
  392. data/third_party/boringssl/include/openssl/err.h +9 -9
  393. data/third_party/boringssl/include/openssl/evp.h +1 -1
  394. data/third_party/boringssl/include/openssl/rsa.h +35 -10
  395. data/third_party/boringssl/include/openssl/ssl.h +167 -19
  396. data/third_party/boringssl/include/openssl/ssl3.h +0 -1
  397. data/third_party/boringssl/include/openssl/stack.h +1 -1
  398. data/third_party/boringssl/include/openssl/tls1.h +10 -2
  399. data/third_party/boringssl/include/openssl/x509.h +4 -0
  400. data/third_party/boringssl/include/openssl/x509v3.h +1 -0
  401. data/third_party/boringssl/ssl/d1_both.cc +16 -2
  402. data/third_party/boringssl/ssl/dtls_method.cc +1 -1
  403. data/third_party/boringssl/ssl/handoff.cc +285 -0
  404. data/third_party/boringssl/ssl/handshake.cc +26 -12
  405. data/third_party/boringssl/ssl/handshake_client.cc +101 -95
  406. data/third_party/boringssl/ssl/handshake_server.cc +14 -2
  407. data/third_party/boringssl/ssl/internal.h +132 -79
  408. data/third_party/boringssl/ssl/s3_both.cc +2 -2
  409. data/third_party/boringssl/ssl/s3_lib.cc +3 -1
  410. data/third_party/boringssl/ssl/s3_pkt.cc +0 -18
  411. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +1 -4
  412. data/third_party/boringssl/ssl/ssl_asn1.cc +47 -43
  413. data/third_party/boringssl/ssl/ssl_cipher.cc +12 -8
  414. data/third_party/boringssl/ssl/ssl_key_share.cc +3 -1
  415. data/third_party/boringssl/ssl/ssl_lib.cc +83 -14
  416. data/third_party/boringssl/ssl/ssl_privkey.cc +6 -0
  417. data/third_party/boringssl/ssl/ssl_stat.cc +6 -6
  418. data/third_party/boringssl/ssl/ssl_versions.cc +12 -85
  419. data/third_party/boringssl/ssl/ssl_x509.cc +59 -61
  420. data/third_party/boringssl/ssl/t1_enc.cc +73 -124
  421. data/third_party/boringssl/ssl/t1_lib.cc +367 -41
  422. data/third_party/boringssl/ssl/tls13_both.cc +8 -0
  423. data/third_party/boringssl/ssl/tls13_client.cc +98 -184
  424. data/third_party/boringssl/ssl/tls13_enc.cc +88 -158
  425. data/third_party/boringssl/ssl/tls13_server.cc +91 -137
  426. data/third_party/boringssl/ssl/tls_method.cc +0 -17
  427. data/third_party/boringssl/ssl/tls_record.cc +1 -10
  428. data/third_party/boringssl/third_party/fiat/curve25519.c +921 -2753
  429. data/third_party/boringssl/third_party/fiat/curve25519_tables.h +7880 -0
  430. data/third_party/boringssl/third_party/fiat/internal.h +32 -20
  431. data/third_party/boringssl/third_party/fiat/p256.c +1824 -0
  432. metadata +86 -71
  433. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +0 -253
  434. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +0 -222
  435. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +0 -71
  436. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +0 -61
  437. data/src/core/lib/channel/channel_trace_registry.cc +0 -80
  438. data/src/core/lib/channel/channel_trace_registry.h +0 -43
  439. data/src/core/lib/gpr/fork.cc +0 -78
  440. data/src/core/tsi/transport_security_adapter.cc +0 -235
  441. data/src/core/tsi/transport_security_adapter.h +0 -41
  442. data/src/ruby/bin/apis/google/protobuf/empty.rb +0 -29
  443. data/src/ruby/bin/apis/pubsub_demo.rb +0 -241
  444. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +0 -159
  445. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +0 -88
  446. data/src/ruby/pb/test/client.rb +0 -764
  447. data/src/ruby/pb/test/server.rb +0 -252
  448. data/src/ruby/spec/pb/package_with_underscore/checker_spec.rb +0 -54
  449. data/src/ruby/spec/pb/package_with_underscore/data.proto +0 -23
  450. data/src/ruby/spec/pb/package_with_underscore/service.proto +0 -23
  451. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +0 -247
  452. data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +0 -1674
@@ -21,116 +21,556 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <string.h>
25
+
26
+ #include <grpc/support/alloc.h>
27
+
24
28
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
25
29
  #include "src/core/ext/filters/client_channel/subchannel.h"
30
+ #include "src/core/lib/channel/channel_args.h"
26
31
  #include "src/core/lib/debug/trace.h"
32
+ #include "src/core/lib/gprpp/abstract.h"
33
+ #include "src/core/lib/gprpp/inlined_vector.h"
34
+ #include "src/core/lib/gprpp/orphanable.h"
35
+ #include "src/core/lib/gprpp/ref_counted.h"
27
36
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
37
+ #include "src/core/lib/iomgr/closure.h"
38
+ #include "src/core/lib/iomgr/combiner.h"
39
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
28
40
  #include "src/core/lib/transport/connectivity_state.h"
29
41
 
30
- // TODO(roth): This code is intended to be shared between pick_first and
31
- // round_robin. However, the interface needs more work to provide clean
32
- // encapsulation. For example, the structs here have some fields that are
33
- // only used in one of the two (e.g., the state counters in
34
- // grpc_lb_subchannel_list and the prev_connectivity_state field in
35
- // grpc_lb_subchannel_data are only used in round_robin, and the
36
- // checking_subchannel field in grpc_lb_subchannel_list is only used by
37
- // pick_first). Also, there is probably some code duplication between the
38
- // connectivity state notification callback code in both pick_first and
39
- // round_robin that could be refactored and moved here. In a future PR,
40
- // need to clean this up.
41
-
42
- typedef struct grpc_lb_subchannel_list grpc_lb_subchannel_list;
43
-
44
- typedef struct {
45
- /** backpointer to owning subchannel list */
46
- grpc_lb_subchannel_list* subchannel_list;
47
- /** subchannel itself */
48
- grpc_subchannel* subchannel;
49
- grpc_core::RefCountedPtr<grpc_core::ConnectedSubchannel> connected_subchannel;
50
- /** Is a connectivity notification pending? */
51
- bool connectivity_notification_pending;
52
- /** notification that connectivity has changed on subchannel */
53
- grpc_closure connectivity_changed_closure;
54
- /** previous and current connectivity states. Updated by \a
55
- * \a connectivity_changed_closure based on
56
- * \a pending_connectivity_state_unsafe. */
57
- grpc_connectivity_state prev_connectivity_state;
58
- grpc_connectivity_state curr_connectivity_state;
59
- /** connectivity state to be updated by
60
- * grpc_subchannel_notify_on_state_change(), not guarded by
61
- * the combiner. To be copied to \a curr_connectivity_state by
62
- * \a connectivity_changed_closure. */
63
- grpc_connectivity_state pending_connectivity_state_unsafe;
64
- /** the subchannel's target user data */
65
- void* user_data;
66
- /** vtable to operate over \a user_data */
67
- const grpc_lb_user_data_vtable* user_data_vtable;
68
- } grpc_lb_subchannel_data;
69
-
70
- /// Unrefs the subchannel contained in sd.
71
- void grpc_lb_subchannel_data_unref_subchannel(grpc_lb_subchannel_data* sd,
72
- const char* reason);
73
-
74
- /// Starts watching the connectivity state of the subchannel.
75
- /// The connectivity_changed_cb callback must invoke either
76
- /// grpc_lb_subchannel_data_stop_connectivity_watch() or again call
77
- /// grpc_lb_subchannel_data_start_connectivity_watch().
78
- void grpc_lb_subchannel_data_start_connectivity_watch(
79
- grpc_lb_subchannel_data* sd);
80
-
81
- /// Stops watching the connectivity state of the subchannel.
82
- void grpc_lb_subchannel_data_stop_connectivity_watch(
83
- grpc_lb_subchannel_data* sd);
84
-
85
- struct grpc_lb_subchannel_list {
86
- /** backpointer to owning policy */
87
- grpc_core::LoadBalancingPolicy* policy;
88
-
89
- grpc_core::TraceFlag* tracer;
90
-
91
- /** all our subchannels */
92
- size_t num_subchannels;
93
- grpc_lb_subchannel_data* subchannels;
94
-
95
- /** Index into subchannels of the one we're currently checking.
96
- * Used when connecting to subchannels serially instead of in parallel. */
97
- // TODO(roth): When we have time, we can probably make this go away
98
- // and compute the index dynamically by subtracting
99
- // subchannel_list->subchannels from the subchannel_data pointer.
100
- size_t checking_subchannel;
101
-
102
- /** how many subchannels are in state READY */
103
- size_t num_ready;
104
- /** how many subchannels are in state TRANSIENT_FAILURE */
105
- size_t num_transient_failures;
106
- /** how many subchannels are in state IDLE */
107
- size_t num_idle;
108
-
109
- /** There will be one ref for each entry in subchannels for which there is a
110
- * pending connectivity state watcher callback. */
111
- gpr_refcount refcount;
112
-
113
- /** Is this list shutting down? This may be true due to the shutdown of the
114
- * policy itself or because a newer update has arrived while this one hadn't
115
- * finished processing. */
116
- bool shutting_down;
42
+ // Code for maintaining a list of subchannels within an LB policy.
43
+ //
44
+ // To use this, callers must create their own subclasses, like so:
45
+ /*
46
+
47
+ class MySubchannelList; // Forward declaration.
48
+
49
+ class MySubchannelData
50
+ : public SubchannelData<MySubchannelList, MySubchannelData> {
51
+ public:
52
+ void ProcessConnectivityChangeLocked(
53
+ grpc_connectivity_state connectivity_state, grpc_error* error) override {
54
+ // ...code to handle connectivity changes...
55
+ }
56
+ };
57
+
58
+ class MySubchannelList
59
+ : public SubchannelList<MySubchannelList, MySubchannelData> {
60
+ };
61
+
62
+ */
63
+ // All methods with a Locked() suffix must be called from within the
64
+ // client_channel combiner.
65
+
66
+ namespace grpc_core {
67
+
68
+ // Stores data for a particular subchannel in a subchannel list.
69
+ // Callers must create a subclass that implements the
70
+ // ProcessConnectivityChangeLocked() method.
71
+ template <typename SubchannelListType, typename SubchannelDataType>
72
+ class SubchannelData {
73
+ public:
74
+ // Returns a pointer to the subchannel list containing this object.
75
+ SubchannelListType* subchannel_list() const { return subchannel_list_; }
76
+
77
+ // Returns the index into the subchannel list of this object.
78
+ size_t Index() const {
79
+ return static_cast<size_t>(static_cast<const SubchannelDataType*>(this) -
80
+ subchannel_list_->subchannel(0));
81
+ }
82
+
83
+ // Returns a pointer to the subchannel.
84
+ grpc_subchannel* subchannel() const { return subchannel_; }
85
+
86
+ // Returns the connected subchannel. Will be null if the subchannel
87
+ // is not connected.
88
+ ConnectedSubchannel* connected_subchannel() const {
89
+ return connected_subchannel_.get();
90
+ }
91
+
92
+ // Synchronously checks the subchannel's connectivity state.
93
+ // Must not be called while there is a connectivity notification
94
+ // pending (i.e., between calling StartConnectivityWatchLocked() or
95
+ // RenewConnectivityWatchLocked() and the resulting invocation of
96
+ // ProcessConnectivityChangeLocked()).
97
+ grpc_connectivity_state CheckConnectivityStateLocked(grpc_error** error) {
98
+ GPR_ASSERT(!connectivity_notification_pending_);
99
+ pending_connectivity_state_unsafe_ =
100
+ grpc_subchannel_check_connectivity(subchannel(), error);
101
+ UpdateConnectedSubchannelLocked();
102
+ return pending_connectivity_state_unsafe_;
103
+ }
104
+
105
+ // Unrefs the subchannel. May be used if an individual subchannel is
106
+ // no longer needed even though the subchannel list as a whole is not
107
+ // being unreffed.
108
+ virtual void UnrefSubchannelLocked(const char* reason);
109
+
110
+ // Resets the connection backoff.
111
+ // TODO(roth): This method should go away when we move the backoff
112
+ // code out of the subchannel and into the LB policies.
113
+ void ResetBackoffLocked();
114
+
115
+ // Starts watching the connectivity state of the subchannel.
116
+ // ProcessConnectivityChangeLocked() will be called when the
117
+ // connectivity state changes.
118
+ void StartConnectivityWatchLocked();
119
+
120
+ // Renews watching the connectivity state of the subchannel.
121
+ void RenewConnectivityWatchLocked();
122
+
123
+ // Stops watching the connectivity state of the subchannel.
124
+ void StopConnectivityWatchLocked();
125
+
126
+ // Cancels watching the connectivity state of the subchannel.
127
+ // Must be called only while there is a connectivity notification
128
+ // pending (i.e., between calling StartConnectivityWatchLocked() or
129
+ // RenewConnectivityWatchLocked() and the resulting invocation of
130
+ // ProcessConnectivityChangeLocked()).
131
+ // From within ProcessConnectivityChangeLocked(), use
132
+ // StopConnectivityWatchLocked() instead.
133
+ void CancelConnectivityWatchLocked(const char* reason);
134
+
135
+ // Cancels any pending connectivity watch and unrefs the subchannel.
136
+ void ShutdownLocked();
137
+
138
+ GRPC_ABSTRACT_BASE_CLASS
139
+
140
+ protected:
141
+ SubchannelData(SubchannelListType* subchannel_list,
142
+ const grpc_lb_user_data_vtable* user_data_vtable,
143
+ const grpc_lb_address& address, grpc_subchannel* subchannel,
144
+ grpc_combiner* combiner);
145
+
146
+ virtual ~SubchannelData();
147
+
148
+ // After StartConnectivityWatchLocked() or RenewConnectivityWatchLocked()
149
+ // is called, this method will be invoked when the subchannel's connectivity
150
+ // state changes.
151
+ // Implementations must invoke either RenewConnectivityWatchLocked() or
152
+ // StopConnectivityWatchLocked() before returning.
153
+ virtual void ProcessConnectivityChangeLocked(
154
+ grpc_connectivity_state connectivity_state,
155
+ grpc_error* error) GRPC_ABSTRACT;
156
+
157
+ private:
158
+ // Updates connected_subchannel_ based on pending_connectivity_state_unsafe_.
159
+ // Returns true if the connectivity state should be reported.
160
+ bool UpdateConnectedSubchannelLocked();
161
+
162
+ static void OnConnectivityChangedLocked(void* arg, grpc_error* error);
163
+
164
+ // Backpointer to owning subchannel list. Not owned.
165
+ SubchannelListType* subchannel_list_;
166
+
167
+ // The subchannel and connected subchannel.
168
+ grpc_subchannel* subchannel_;
169
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
170
+
171
+ // Notification that connectivity has changed on subchannel.
172
+ grpc_closure connectivity_changed_closure_;
173
+ // Is a connectivity notification pending?
174
+ bool connectivity_notification_pending_ = false;
175
+ // Connectivity state to be updated by
176
+ // grpc_subchannel_notify_on_state_change(), not guarded by
177
+ // the combiner.
178
+ grpc_connectivity_state pending_connectivity_state_unsafe_;
179
+ };
180
+
181
+ // A list of subchannels.
182
+ template <typename SubchannelListType, typename SubchannelDataType>
183
+ class SubchannelList
184
+ : public InternallyRefCountedWithTracing<SubchannelListType> {
185
+ public:
186
+ typedef InlinedVector<SubchannelDataType, 10> SubchannelVector;
187
+
188
+ // The number of subchannels in the list.
189
+ size_t num_subchannels() const { return subchannels_.size(); }
190
+
191
+ // The data for the subchannel at a particular index.
192
+ SubchannelDataType* subchannel(size_t index) { return &subchannels_[index]; }
193
+
194
+ // Returns true if the subchannel list is shutting down.
195
+ bool shutting_down() const { return shutting_down_; }
196
+
197
+ // Populates refs_list with the uuids of this SubchannelLists's subchannels.
198
+ void PopulateChildRefsList(ChildRefsList* refs_list) {
199
+ for (size_t i = 0; i < subchannels_.size(); ++i) {
200
+ if (subchannels_[i].subchannel() != nullptr) {
201
+ grpc_core::channelz::SubchannelNode* subchannel_node =
202
+ grpc_subchannel_get_channelz_node(subchannels_[i].subchannel());
203
+ if (subchannel_node != nullptr) {
204
+ refs_list->push_back(subchannel_node->subchannel_uuid());
205
+ }
206
+ }
207
+ }
208
+ }
209
+
210
+ // Accessors.
211
+ LoadBalancingPolicy* policy() const { return policy_; }
212
+ TraceFlag* tracer() const { return tracer_; }
213
+
214
+ // Resets connection backoff of all subchannels.
215
+ // TODO(roth): We will probably need to rethink this as part of moving
216
+ // the backoff code out of subchannels and into LB policies.
217
+ void ResetBackoffLocked();
218
+
219
+ // Note: Caller must ensure that this is invoked inside of the combiner.
220
+ void Orphan() override {
221
+ ShutdownLocked();
222
+ InternallyRefCountedWithTracing<SubchannelListType>::Unref(DEBUG_LOCATION,
223
+ "shutdown");
224
+ }
225
+
226
+ GRPC_ABSTRACT_BASE_CLASS
227
+
228
+ protected:
229
+ SubchannelList(LoadBalancingPolicy* policy, TraceFlag* tracer,
230
+ const grpc_lb_addresses* addresses, grpc_combiner* combiner,
231
+ grpc_client_channel_factory* client_channel_factory,
232
+ const grpc_channel_args& args);
233
+
234
+ virtual ~SubchannelList();
235
+
236
+ private:
237
+ // So New() can call our private ctor.
238
+ template <typename T, typename... Args>
239
+ friend T* New(Args&&... args);
240
+
241
+ // For accessing Ref() and Unref().
242
+ friend class SubchannelData<SubchannelListType, SubchannelDataType>;
243
+
244
+ void ShutdownLocked();
245
+
246
+ // Backpointer to owning policy.
247
+ LoadBalancingPolicy* policy_;
248
+
249
+ TraceFlag* tracer_;
250
+
251
+ grpc_combiner* combiner_;
252
+
253
+ // The list of subchannels.
254
+ SubchannelVector subchannels_;
255
+
256
+ // Is this list shutting down? This may be true due to the shutdown of the
257
+ // policy itself or because a newer update has arrived while this one hadn't
258
+ // finished processing.
259
+ bool shutting_down_ = false;
117
260
  };
118
261
 
119
- grpc_lb_subchannel_list* grpc_lb_subchannel_list_create(
120
- grpc_core::LoadBalancingPolicy* p, grpc_core::TraceFlag* tracer,
262
+ //
263
+ // implementation -- no user-servicable parts below
264
+ //
265
+
266
+ //
267
+ // SubchannelData
268
+ //
269
+
270
+ template <typename SubchannelListType, typename SubchannelDataType>
271
+ SubchannelData<SubchannelListType, SubchannelDataType>::SubchannelData(
272
+ SubchannelListType* subchannel_list,
273
+ const grpc_lb_user_data_vtable* user_data_vtable,
274
+ const grpc_lb_address& address, grpc_subchannel* subchannel,
275
+ grpc_combiner* combiner)
276
+ : subchannel_list_(subchannel_list),
277
+ subchannel_(subchannel),
278
+ // We assume that the current state is IDLE. If not, we'll get a
279
+ // callback telling us that.
280
+ pending_connectivity_state_unsafe_(GRPC_CHANNEL_IDLE) {
281
+ GRPC_CLOSURE_INIT(
282
+ &connectivity_changed_closure_,
283
+ (&SubchannelData<SubchannelListType,
284
+ SubchannelDataType>::OnConnectivityChangedLocked),
285
+ this, grpc_combiner_scheduler(combiner));
286
+ }
287
+
288
+ template <typename SubchannelListType, typename SubchannelDataType>
289
+ SubchannelData<SubchannelListType, SubchannelDataType>::~SubchannelData() {
290
+ UnrefSubchannelLocked("subchannel_data_destroy");
291
+ }
292
+
293
+ template <typename SubchannelListType, typename SubchannelDataType>
294
+ void SubchannelData<SubchannelListType, SubchannelDataType>::
295
+ UnrefSubchannelLocked(const char* reason) {
296
+ if (subchannel_ != nullptr) {
297
+ if (subchannel_list_->tracer()->enabled()) {
298
+ gpr_log(GPR_INFO,
299
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
300
+ " (subchannel %p): unreffing subchannel",
301
+ subchannel_list_->tracer()->name(), subchannel_list_->policy(),
302
+ subchannel_list_, Index(), subchannel_list_->num_subchannels(),
303
+ subchannel_);
304
+ }
305
+ GRPC_SUBCHANNEL_UNREF(subchannel_, reason);
306
+ subchannel_ = nullptr;
307
+ connected_subchannel_.reset();
308
+ }
309
+ }
310
+
311
+ template <typename SubchannelListType, typename SubchannelDataType>
312
+ void SubchannelData<SubchannelListType,
313
+ SubchannelDataType>::ResetBackoffLocked() {
314
+ if (subchannel_ != nullptr) {
315
+ grpc_subchannel_reset_backoff(subchannel_);
316
+ }
317
+ }
318
+
319
+ template <typename SubchannelListType, typename SubchannelDataType>
320
+ void SubchannelData<SubchannelListType,
321
+ SubchannelDataType>::StartConnectivityWatchLocked() {
322
+ if (subchannel_list_->tracer()->enabled()) {
323
+ gpr_log(GPR_INFO,
324
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
325
+ " (subchannel %p): starting watch: requesting connectivity change "
326
+ "notification (from %s)",
327
+ subchannel_list_->tracer()->name(), subchannel_list_->policy(),
328
+ subchannel_list_, Index(), subchannel_list_->num_subchannels(),
329
+ subchannel_,
330
+ grpc_connectivity_state_name(pending_connectivity_state_unsafe_));
331
+ }
332
+ GPR_ASSERT(!connectivity_notification_pending_);
333
+ connectivity_notification_pending_ = true;
334
+ subchannel_list()->Ref(DEBUG_LOCATION, "connectivity_watch").release();
335
+ grpc_subchannel_notify_on_state_change(
336
+ subchannel_, subchannel_list_->policy()->interested_parties(),
337
+ &pending_connectivity_state_unsafe_, &connectivity_changed_closure_);
338
+ }
339
+
340
+ template <typename SubchannelListType, typename SubchannelDataType>
341
+ void SubchannelData<SubchannelListType,
342
+ SubchannelDataType>::RenewConnectivityWatchLocked() {
343
+ if (subchannel_list_->tracer()->enabled()) {
344
+ gpr_log(GPR_INFO,
345
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
346
+ " (subchannel %p): renewing watch: requesting connectivity change "
347
+ "notification (from %s)",
348
+ subchannel_list_->tracer()->name(), subchannel_list_->policy(),
349
+ subchannel_list_, Index(), subchannel_list_->num_subchannels(),
350
+ subchannel_,
351
+ grpc_connectivity_state_name(pending_connectivity_state_unsafe_));
352
+ }
353
+ GPR_ASSERT(connectivity_notification_pending_);
354
+ grpc_subchannel_notify_on_state_change(
355
+ subchannel_, subchannel_list_->policy()->interested_parties(),
356
+ &pending_connectivity_state_unsafe_, &connectivity_changed_closure_);
357
+ }
358
+
359
+ template <typename SubchannelListType, typename SubchannelDataType>
360
+ void SubchannelData<SubchannelListType,
361
+ SubchannelDataType>::StopConnectivityWatchLocked() {
362
+ if (subchannel_list_->tracer()->enabled()) {
363
+ gpr_log(GPR_INFO,
364
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
365
+ " (subchannel %p): stopping connectivity watch",
366
+ subchannel_list_->tracer()->name(), subchannel_list_->policy(),
367
+ subchannel_list_, Index(), subchannel_list_->num_subchannels(),
368
+ subchannel_);
369
+ }
370
+ GPR_ASSERT(connectivity_notification_pending_);
371
+ connectivity_notification_pending_ = false;
372
+ subchannel_list()->Unref(DEBUG_LOCATION, "connectivity_watch");
373
+ }
374
+
375
+ template <typename SubchannelListType, typename SubchannelDataType>
376
+ void SubchannelData<SubchannelListType, SubchannelDataType>::
377
+ CancelConnectivityWatchLocked(const char* reason) {
378
+ if (subchannel_list_->tracer()->enabled()) {
379
+ gpr_log(GPR_INFO,
380
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
381
+ " (subchannel %p): canceling connectivity watch (%s)",
382
+ subchannel_list_->tracer()->name(), subchannel_list_->policy(),
383
+ subchannel_list_, Index(), subchannel_list_->num_subchannels(),
384
+ subchannel_, reason);
385
+ }
386
+ GPR_ASSERT(connectivity_notification_pending_);
387
+ grpc_subchannel_notify_on_state_change(subchannel_, nullptr, nullptr,
388
+ &connectivity_changed_closure_);
389
+ }
390
+
391
+ template <typename SubchannelListType, typename SubchannelDataType>
392
+ bool SubchannelData<SubchannelListType,
393
+ SubchannelDataType>::UpdateConnectedSubchannelLocked() {
394
+ // If the subchannel is READY, take a ref to the connected subchannel.
395
+ if (pending_connectivity_state_unsafe_ == GRPC_CHANNEL_READY) {
396
+ connected_subchannel_ =
397
+ grpc_subchannel_get_connected_subchannel(subchannel_);
398
+ // If the subchannel became disconnected between the time that READY
399
+ // was reported and the time we got here (e.g., between when a
400
+ // notification callback is scheduled and when it was actually run in
401
+ // the combiner), then the connected subchannel may have disappeared out
402
+ // from under us. In that case, we don't actually want to consider the
403
+ // subchannel to be in state READY. Instead, we use IDLE as the
404
+ // basis for any future connectivity watch; this is the one state that
405
+ // the subchannel will never transition back into, so this ensures
406
+ // that we will get a notification for the next state, even if that state
407
+ // is READY again (e.g., if the subchannel has transitioned back to
408
+ // READY before the next watch gets requested).
409
+ if (connected_subchannel_ == nullptr) {
410
+ if (subchannel_list_->tracer()->enabled()) {
411
+ gpr_log(GPR_INFO,
412
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
413
+ " (subchannel %p): state is READY but connected subchannel is "
414
+ "null; moving to state IDLE",
415
+ subchannel_list_->tracer()->name(), subchannel_list_->policy(),
416
+ subchannel_list_, Index(), subchannel_list_->num_subchannels(),
417
+ subchannel_);
418
+ }
419
+ pending_connectivity_state_unsafe_ = GRPC_CHANNEL_IDLE;
420
+ return false;
421
+ }
422
+ } else {
423
+ // For any state other than READY, unref the connected subchannel.
424
+ connected_subchannel_.reset();
425
+ }
426
+ return true;
427
+ }
428
+
429
+ template <typename SubchannelListType, typename SubchannelDataType>
430
+ void SubchannelData<SubchannelListType, SubchannelDataType>::
431
+ OnConnectivityChangedLocked(void* arg, grpc_error* error) {
432
+ SubchannelData* sd = static_cast<SubchannelData*>(arg);
433
+ if (sd->subchannel_list_->tracer()->enabled()) {
434
+ gpr_log(
435
+ GPR_INFO,
436
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
437
+ " (subchannel %p): connectivity changed: state=%s, error=%s, "
438
+ "shutting_down=%d",
439
+ sd->subchannel_list_->tracer()->name(), sd->subchannel_list_->policy(),
440
+ sd->subchannel_list_, sd->Index(),
441
+ sd->subchannel_list_->num_subchannels(), sd->subchannel_,
442
+ grpc_connectivity_state_name(sd->pending_connectivity_state_unsafe_),
443
+ grpc_error_string(error), sd->subchannel_list_->shutting_down());
444
+ }
445
+ // If shutting down, unref subchannel and stop watching.
446
+ if (sd->subchannel_list_->shutting_down() || error == GRPC_ERROR_CANCELLED) {
447
+ sd->UnrefSubchannelLocked("connectivity_shutdown");
448
+ sd->StopConnectivityWatchLocked();
449
+ return;
450
+ }
451
+ // Get or release ref to connected subchannel.
452
+ if (!sd->UpdateConnectedSubchannelLocked()) {
453
+ // We don't want to report this connectivity state, so renew the watch.
454
+ sd->RenewConnectivityWatchLocked();
455
+ return;
456
+ }
457
+ // Call the subclass's ProcessConnectivityChangeLocked() method.
458
+ sd->ProcessConnectivityChangeLocked(sd->pending_connectivity_state_unsafe_,
459
+ GRPC_ERROR_REF(error));
460
+ }
461
+
462
+ template <typename SubchannelListType, typename SubchannelDataType>
463
+ void SubchannelData<SubchannelListType, SubchannelDataType>::ShutdownLocked() {
464
+ // If there's a pending notification for this subchannel, cancel it;
465
+ // the callback is responsible for unreffing the subchannel.
466
+ // Otherwise, unref the subchannel directly.
467
+ if (connectivity_notification_pending_) {
468
+ CancelConnectivityWatchLocked("shutdown");
469
+ } else if (subchannel_ != nullptr) {
470
+ UnrefSubchannelLocked("shutdown");
471
+ }
472
+ }
473
+
474
+ //
475
+ // SubchannelList
476
+ //
477
+
478
+ template <typename SubchannelListType, typename SubchannelDataType>
479
+ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
480
+ LoadBalancingPolicy* policy, TraceFlag* tracer,
121
481
  const grpc_lb_addresses* addresses, grpc_combiner* combiner,
122
482
  grpc_client_channel_factory* client_channel_factory,
123
- const grpc_channel_args& args, grpc_iomgr_cb_func connectivity_changed_cb);
483
+ const grpc_channel_args& args)
484
+ : InternallyRefCountedWithTracing<SubchannelListType>(tracer),
485
+ policy_(policy),
486
+ tracer_(tracer),
487
+ combiner_(GRPC_COMBINER_REF(combiner, "subchannel_list")) {
488
+ if (tracer_->enabled()) {
489
+ gpr_log(GPR_INFO,
490
+ "[%s %p] Creating subchannel list %p for %" PRIuPTR " subchannels",
491
+ tracer_->name(), policy, this, addresses->num_addresses);
492
+ }
493
+ subchannels_.reserve(addresses->num_addresses);
494
+ // We need to remove the LB addresses in order to be able to compare the
495
+ // subchannel keys of subchannels from a different batch of addresses.
496
+ static const char* keys_to_remove[] = {GRPC_ARG_SUBCHANNEL_ADDRESS,
497
+ GRPC_ARG_LB_ADDRESSES};
498
+ // Create a subchannel for each address.
499
+ grpc_subchannel_args sc_args;
500
+ for (size_t i = 0; i < addresses->num_addresses; i++) {
501
+ // If there were any balancer, we would have chosen grpclb policy instead.
502
+ GPR_ASSERT(!addresses->addresses[i].is_balancer);
503
+ memset(&sc_args, 0, sizeof(grpc_subchannel_args));
504
+ grpc_arg addr_arg =
505
+ grpc_create_subchannel_address_arg(&addresses->addresses[i].address);
506
+ grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
507
+ &args, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove), &addr_arg, 1);
508
+ gpr_free(addr_arg.value.string);
509
+ sc_args.args = new_args;
510
+ grpc_subchannel* subchannel = grpc_client_channel_factory_create_subchannel(
511
+ client_channel_factory, &sc_args);
512
+ grpc_channel_args_destroy(new_args);
513
+ if (subchannel == nullptr) {
514
+ // Subchannel could not be created.
515
+ if (tracer_->enabled()) {
516
+ char* address_uri =
517
+ grpc_sockaddr_to_uri(&addresses->addresses[i].address);
518
+ gpr_log(GPR_INFO,
519
+ "[%s %p] could not create subchannel for address uri %s, "
520
+ "ignoring",
521
+ tracer_->name(), policy_, address_uri);
522
+ gpr_free(address_uri);
523
+ }
524
+ continue;
525
+ }
526
+ if (tracer_->enabled()) {
527
+ char* address_uri =
528
+ grpc_sockaddr_to_uri(&addresses->addresses[i].address);
529
+ gpr_log(GPR_INFO,
530
+ "[%s %p] subchannel list %p index %" PRIuPTR
531
+ ": Created subchannel %p for address uri %s",
532
+ tracer_->name(), policy_, this, subchannels_.size(), subchannel,
533
+ address_uri);
534
+ gpr_free(address_uri);
535
+ }
536
+ subchannels_.emplace_back(static_cast<SubchannelListType*>(this),
537
+ addresses->user_data_vtable,
538
+ addresses->addresses[i], subchannel, combiner);
539
+ }
540
+ }
541
+
542
+ template <typename SubchannelListType, typename SubchannelDataType>
543
+ SubchannelList<SubchannelListType, SubchannelDataType>::~SubchannelList() {
544
+ if (tracer_->enabled()) {
545
+ gpr_log(GPR_INFO, "[%s %p] Destroying subchannel_list %p", tracer_->name(),
546
+ policy_, this);
547
+ }
548
+ GRPC_COMBINER_UNREF(combiner_, "subchannel_list");
549
+ }
124
550
 
125
- void grpc_lb_subchannel_list_ref(grpc_lb_subchannel_list* subchannel_list,
126
- const char* reason);
551
+ template <typename SubchannelListType, typename SubchannelDataType>
552
+ void SubchannelList<SubchannelListType, SubchannelDataType>::ShutdownLocked() {
553
+ if (tracer_->enabled()) {
554
+ gpr_log(GPR_INFO, "[%s %p] Shutting down subchannel_list %p",
555
+ tracer_->name(), policy_, this);
556
+ }
557
+ GPR_ASSERT(!shutting_down_);
558
+ shutting_down_ = true;
559
+ for (size_t i = 0; i < subchannels_.size(); i++) {
560
+ SubchannelDataType* sd = &subchannels_[i];
561
+ sd->ShutdownLocked();
562
+ }
563
+ }
127
564
 
128
- void grpc_lb_subchannel_list_unref(grpc_lb_subchannel_list* subchannel_list,
129
- const char* reason);
565
+ template <typename SubchannelListType, typename SubchannelDataType>
566
+ void SubchannelList<SubchannelListType,
567
+ SubchannelDataType>::ResetBackoffLocked() {
568
+ for (size_t i = 0; i < subchannels_.size(); i++) {
569
+ SubchannelDataType* sd = &subchannels_[i];
570
+ sd->ResetBackoffLocked();
571
+ }
572
+ }
130
573
 
131
- /// Mark subchannel_list as discarded. Unsubscribes all its subchannels. The
132
- /// connectivity state notification callback will ultimately unref it.
133
- void grpc_lb_subchannel_list_shutdown_and_unref(
134
- grpc_lb_subchannel_list* subchannel_list, const char* reason);
574
+ } // namespace grpc_core
135
575
 
136
576
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_SUBCHANNEL_LIST_H */