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,6 +21,7 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
24
25
  #include "src/core/ext/filters/client_channel/client_channel_factory.h"
25
26
  #include "src/core/ext/filters/client_channel/resolver.h"
26
27
  #include "src/core/lib/channel/channel_stack.h"
@@ -39,6 +40,10 @@ extern grpc_core::TraceFlag grpc_client_channel_trace;
39
40
 
40
41
  extern const grpc_channel_filter grpc_client_channel_filter;
41
42
 
43
+ void grpc_client_channel_populate_child_refs(
44
+ grpc_channel_element* elem, grpc_core::ChildRefsList* child_subchannels,
45
+ grpc_core::ChildRefsList* child_channels);
46
+
42
47
  grpc_connectivity_state grpc_client_channel_check_connectivity_state(
43
48
  grpc_channel_element* elem, int try_to_connect);
44
49
 
@@ -0,0 +1,113 @@
1
+ /*
2
+ *
3
+ * Copyright 2018 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/ext/filters/client_channel/client_channel.h"
22
+ #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
23
+ #include "src/core/lib/gpr/useful.h"
24
+ #include "src/core/lib/surface/channel.h"
25
+ #include "src/core/lib/transport/connectivity_state.h"
26
+
27
+ namespace grpc_core {
28
+ namespace channelz {
29
+ namespace {
30
+
31
+ void* client_channel_channelz_copy(void* p) { return p; }
32
+
33
+ void client_channel_channelz_destroy(void* p) {}
34
+
35
+ int client_channel_channelz_cmp(void* a, void* b) { return GPR_ICMP(a, b); }
36
+
37
+ } // namespace
38
+
39
+ static const grpc_arg_pointer_vtable client_channel_channelz_vtable = {
40
+ client_channel_channelz_copy, client_channel_channelz_destroy,
41
+ client_channel_channelz_cmp};
42
+
43
+ ClientChannelNode::ClientChannelNode(grpc_channel* channel,
44
+ size_t channel_tracer_max_nodes,
45
+ bool is_top_level_channel)
46
+ : ChannelNode(channel, channel_tracer_max_nodes, is_top_level_channel) {
47
+ client_channel_ =
48
+ grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
49
+ GPR_ASSERT(client_channel_->filter == &grpc_client_channel_filter);
50
+ }
51
+
52
+ void ClientChannelNode::PopulateConnectivityState(grpc_json* json) {
53
+ grpc_connectivity_state state;
54
+ if (ChannelIsDestroyed()) {
55
+ state = GRPC_CHANNEL_SHUTDOWN;
56
+ } else {
57
+ state =
58
+ grpc_client_channel_check_connectivity_state(client_channel_, false);
59
+ }
60
+ json = grpc_json_create_child(nullptr, json, "state", nullptr,
61
+ GRPC_JSON_OBJECT, false);
62
+ grpc_json_create_child(nullptr, json, "state",
63
+ grpc_connectivity_state_name(state), GRPC_JSON_STRING,
64
+ false);
65
+ }
66
+
67
+ void ClientChannelNode::PopulateChildRefs(grpc_json* json) {
68
+ ChildRefsList child_subchannels;
69
+ ChildRefsList child_channels;
70
+ grpc_json* json_iterator = nullptr;
71
+ grpc_client_channel_populate_child_refs(client_channel_, &child_subchannels,
72
+ &child_channels);
73
+ if (!child_subchannels.empty()) {
74
+ grpc_json* array_parent = grpc_json_create_child(
75
+ nullptr, json, "subchannelRef", nullptr, GRPC_JSON_ARRAY, false);
76
+ for (size_t i = 0; i < child_subchannels.size(); ++i) {
77
+ json_iterator =
78
+ grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
79
+ GRPC_JSON_OBJECT, false);
80
+ grpc_json_add_number_string_child(json_iterator, nullptr, "subchannelId",
81
+ child_subchannels[i]);
82
+ }
83
+ }
84
+ if (!child_channels.empty()) {
85
+ grpc_json* array_parent = grpc_json_create_child(
86
+ nullptr, json, "channelRef", nullptr, GRPC_JSON_ARRAY, false);
87
+ json_iterator = nullptr;
88
+ for (size_t i = 0; i < child_channels.size(); ++i) {
89
+ json_iterator =
90
+ grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
91
+ GRPC_JSON_OBJECT, false);
92
+ grpc_json_add_number_string_child(json_iterator, nullptr, "channelId",
93
+ child_channels[i]);
94
+ }
95
+ }
96
+ }
97
+
98
+ grpc_arg ClientChannelNode::CreateChannelArg() {
99
+ return grpc_channel_arg_pointer_create(
100
+ const_cast<char*>(GRPC_ARG_CHANNELZ_CHANNEL_NODE_CREATION_FUNC),
101
+ reinterpret_cast<void*>(MakeClientChannelNode),
102
+ &client_channel_channelz_vtable);
103
+ }
104
+
105
+ RefCountedPtr<ChannelNode> ClientChannelNode::MakeClientChannelNode(
106
+ grpc_channel* channel, size_t channel_tracer_max_nodes,
107
+ bool is_top_level_channel) {
108
+ return MakeRefCounted<ClientChannelNode>(channel, channel_tracer_max_nodes,
109
+ is_top_level_channel);
110
+ }
111
+
112
+ } // namespace channelz
113
+ } // namespace grpc_core
@@ -0,0 +1,71 @@
1
+ /*
2
+ *
3
+ * Copyright 2018 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_CHANNELZ_H
20
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_CHANNELZ_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include "src/core/lib/channel/channel_args.h"
25
+ #include "src/core/lib/channel/channel_stack.h"
26
+ #include "src/core/lib/channel/channelz.h"
27
+ #include "src/core/lib/gprpp/inlined_vector.h"
28
+
29
+ namespace grpc_core {
30
+
31
+ // TODO(ncteisen), this only contains the uuids of the children for now,
32
+ // since that is all that is strictly needed. In a future enhancement we will
33
+ // add human readable names as in the channelz.proto
34
+ typedef InlinedVector<intptr_t, 10> ChildRefsList;
35
+
36
+ namespace channelz {
37
+
38
+ // Subtype of ChannelNode that overrides and provides client_channel specific
39
+ // functionality like querying for connectivity_state and subchannel data.
40
+ class ClientChannelNode : public ChannelNode {
41
+ public:
42
+ static RefCountedPtr<ChannelNode> MakeClientChannelNode(
43
+ grpc_channel* channel, size_t channel_tracer_max_nodes,
44
+ bool is_top_level_channel);
45
+
46
+ // Override this functionality since client_channels have a notion of
47
+ // channel connectivity.
48
+ void PopulateConnectivityState(grpc_json* json) override;
49
+
50
+ // Override this functionality since client_channels have subchannels
51
+ void PopulateChildRefs(grpc_json* json) override;
52
+
53
+ // Helper to create a channel arg to ensure this type of ChannelNode is
54
+ // created.
55
+ static grpc_arg CreateChannelArg();
56
+
57
+ protected:
58
+ GPRC_ALLOW_CLASS_TO_USE_NON_PUBLIC_DELETE
59
+ GPRC_ALLOW_CLASS_TO_USE_NON_PUBLIC_NEW
60
+ ClientChannelNode(grpc_channel* channel, size_t channel_tracer_max_nodes,
61
+ bool is_top_level_channel);
62
+ virtual ~ClientChannelNode() {}
63
+
64
+ private:
65
+ grpc_channel_element* client_channel_;
66
+ };
67
+
68
+ } // namespace channelz
69
+ } // namespace grpc_core
70
+
71
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_CHANNELZ_H */
@@ -25,6 +25,7 @@
25
25
  #include <grpc/support/alloc.h>
26
26
 
27
27
  #include "src/core/ext/filters/client_channel/client_channel.h"
28
+ #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
28
29
  #include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
29
30
  #include "src/core/ext/filters/client_channel/http_proxy.h"
30
31
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
@@ -35,6 +36,14 @@
35
36
  #include "src/core/lib/surface/channel_init.h"
36
37
 
37
38
  static bool append_filter(grpc_channel_stack_builder* builder, void* arg) {
39
+ const grpc_channel_args* args =
40
+ grpc_channel_stack_builder_get_channel_arguments(builder);
41
+ grpc_arg args_to_add[] = {
42
+ grpc_core::channelz::ClientChannelNode::CreateChannelArg()};
43
+ grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
44
+ args, args_to_add, GPR_ARRAY_SIZE(args_to_add));
45
+ grpc_channel_stack_builder_set_channel_arguments(builder, new_args);
46
+ grpc_channel_args_destroy(new_args);
38
47
  return grpc_channel_stack_builder_append_filter(
39
48
  builder, static_cast<const grpc_channel_filter*>(arg), nullptr, nullptr);
40
49
  }
@@ -326,7 +326,7 @@ static void http_connect_handshaker_do_handshake(
326
326
 
327
327
  static const grpc_handshaker_vtable http_connect_handshaker_vtable = {
328
328
  http_connect_handshaker_destroy, http_connect_handshaker_shutdown,
329
- http_connect_handshaker_do_handshake};
329
+ http_connect_handshaker_do_handshake, "http_connect"};
330
330
 
331
331
  static grpc_handshaker* grpc_http_connect_handshaker_create() {
332
332
  http_connect_handshaker* handshaker =
@@ -37,17 +37,21 @@
37
37
  #include "src/core/lib/slice/b64.h"
38
38
 
39
39
  /**
40
- * Parses the 'http_proxy' env var and returns the proxy hostname to resolve or
41
- * nullptr on error. Also sets 'user_cred' to user credentials if present in the
42
- * 'http_proxy' env var, otherwise leaves it unchanged. It is caller's
43
- * responsibility to gpr_free user_cred.
40
+ * Parses the 'https_proxy' env var (fallback on 'http_proxy') and returns the
41
+ * proxy hostname to resolve or nullptr on error. Also sets 'user_cred' to user
42
+ * credentials if present in the 'http_proxy' env var, otherwise leaves it
43
+ * unchanged. It is caller's responsibility to gpr_free user_cred.
44
44
  */
45
45
  static char* get_http_proxy_server(char** user_cred) {
46
46
  GPR_ASSERT(user_cred != nullptr);
47
47
  char* proxy_name = nullptr;
48
- char* uri_str = gpr_getenv("http_proxy");
49
48
  char** authority_strs = nullptr;
50
49
  size_t authority_nstrs;
50
+ /* Prefer using 'https_proxy'. Fallback on 'http_proxy' if it is not set. The
51
+ * fallback behavior can be removed if there's a demand for it.
52
+ */
53
+ char* uri_str = gpr_getenv("https_proxy");
54
+ if (uri_str == nullptr) uri_str = gpr_getenv("http_proxy");
51
55
  if (uri_str == nullptr) return nullptr;
52
56
  grpc_uri* uri = grpc_uri_parse(uri_str, false /* suppress_errors */);
53
57
  if (uri == nullptr || uri->authority == nullptr) {
@@ -83,11 +87,24 @@ done:
83
87
  return proxy_name;
84
88
  }
85
89
 
90
+ /**
91
+ * Checks the value of GRPC_ARG_ENABLE_HTTP_PROXY to determine if http_proxy
92
+ * should be used.
93
+ */
94
+ bool http_proxy_enabled(const grpc_channel_args* args) {
95
+ const grpc_arg* arg =
96
+ grpc_channel_args_find(args, GRPC_ARG_ENABLE_HTTP_PROXY);
97
+ return grpc_channel_arg_get_bool(arg, true);
98
+ }
99
+
86
100
  static bool proxy_mapper_map_name(grpc_proxy_mapper* mapper,
87
101
  const char* server_uri,
88
102
  const grpc_channel_args* args,
89
103
  char** name_to_resolve,
90
104
  grpc_channel_args** new_args) {
105
+ if (!http_proxy_enabled(args)) {
106
+ return false;
107
+ }
91
108
  char* user_cred = nullptr;
92
109
  *name_to_resolve = get_http_proxy_server(&user_cred);
93
110
  if (*name_to_resolve == nullptr) return false;
@@ -44,13 +44,13 @@ void LoadBalancingPolicy::TryReresolutionLocked(
44
44
  GRPC_CLOSURE_SCHED(request_reresolution_, error);
45
45
  request_reresolution_ = nullptr;
46
46
  if (grpc_lb_trace->enabled()) {
47
- gpr_log(GPR_DEBUG,
47
+ gpr_log(GPR_INFO,
48
48
  "%s %p: scheduling re-resolution closure with error=%s.",
49
49
  grpc_lb_trace->name(), this, grpc_error_string(error));
50
50
  }
51
51
  } else {
52
52
  if (grpc_lb_trace->enabled()) {
53
- gpr_log(GPR_DEBUG, "%s %p: no available re-resolution closure.",
53
+ gpr_log(GPR_INFO, "%s %p: no available re-resolution closure.",
54
54
  grpc_lb_trace->name(), this);
55
55
  }
56
56
  }
@@ -21,6 +21,7 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
24
25
  #include "src/core/ext/filters/client_channel/client_channel_factory.h"
25
26
  #include "src/core/ext/filters/client_channel/subchannel.h"
26
27
  #include "src/core/lib/gprpp/abstract.h"
@@ -70,6 +71,7 @@ class LoadBalancingPolicy
70
71
  /// Storage for LB token in \a initial_metadata, or nullptr if not used.
71
72
  grpc_linked_mdelem lb_token_mdelem_storage;
72
73
  /// Closure to run when pick is complete, if not completed synchronously.
74
+ /// If null, pick will fail if a result is not available synchronously.
73
75
  grpc_closure* on_complete;
74
76
  /// Will be set to the selected subchannel, or nullptr on failure or when
75
77
  /// the LB policy decides to drop the call.
@@ -98,10 +100,15 @@ class LoadBalancingPolicy
98
100
  /// Finds an appropriate subchannel for a call, based on data in \a pick.
99
101
  /// \a pick must remain alive until the pick is complete.
100
102
  ///
101
- /// If the pick succeeds and a result is known immediately, returns true.
102
- /// Otherwise, \a pick->on_complete will be invoked once the pick is
103
- /// complete with its error argument set to indicate success or failure.
104
- virtual bool PickLocked(PickState* pick) GRPC_ABSTRACT;
103
+ /// If a result is known immediately, returns true, setting \a *error
104
+ /// upon failure. Otherwise, \a pick->on_complete will be invoked once
105
+ /// the pick is complete with its error argument set to indicate success
106
+ /// or failure.
107
+ ///
108
+ /// If \a pick->on_complete is null and no result is known immediately,
109
+ /// a synchronous failure will be returned (i.e., \a *error will be
110
+ /// set and true will be returned).
111
+ virtual bool PickLocked(PickState* pick, grpc_error** error) GRPC_ABSTRACT;
105
112
 
106
113
  /// Cancels \a pick.
107
114
  /// The \a on_complete callback of the pending pick will be invoked with
@@ -132,17 +139,22 @@ class LoadBalancingPolicy
132
139
  virtual void HandOffPendingPicksLocked(LoadBalancingPolicy* new_policy)
133
140
  GRPC_ABSTRACT;
134
141
 
135
- /// Performs a connected subchannel ping via \a ConnectedSubchannel::Ping()
136
- /// against one of the connected subchannels managed by the policy.
137
- /// Note: This is intended only for use in tests.
138
- virtual void PingOneLocked(grpc_closure* on_initiate,
139
- grpc_closure* on_ack) GRPC_ABSTRACT;
140
-
141
142
  /// Tries to enter a READY connectivity state.
142
143
  /// TODO(roth): As part of restructuring how we handle IDLE state,
143
144
  /// consider whether this method is still needed.
144
145
  virtual void ExitIdleLocked() GRPC_ABSTRACT;
145
146
 
147
+ /// Resets connection backoff.
148
+ virtual void ResetBackoffLocked() GRPC_ABSTRACT;
149
+
150
+ /// Populates child_subchannels and child_channels with the uuids of this
151
+ /// LB policy's referenced children. This is not invoked from the
152
+ /// client_channel's combiner. The implementation is responsible for
153
+ /// providing its own synchronization.
154
+ virtual void FillChildRefsForChannelz(ChildRefsList* child_subchannels,
155
+ ChildRefsList* child_channels)
156
+ GRPC_ABSTRACT;
157
+
146
158
  void Orphan() override {
147
159
  // Invoke ShutdownAndUnrefLocked() inside of the combiner.
148
160
  GRPC_CLOSURE_SCHED(
@@ -162,6 +174,8 @@ class LoadBalancingPolicy
162
174
  GRPC_ABSTRACT_BASE_CLASS
163
175
 
164
176
  protected:
177
+ GPRC_ALLOW_CLASS_TO_USE_NON_PUBLIC_DELETE
178
+
165
179
  explicit LoadBalancingPolicy(const Args& args);
166
180
  virtual ~LoadBalancingPolicy();
167
181
 
@@ -194,6 +208,12 @@ class LoadBalancingPolicy
194
208
  grpc_pollset_set* interested_parties_;
195
209
  /// Callback to force a re-resolution.
196
210
  grpc_closure* request_reresolution_;
211
+
212
+ // Dummy classes needed for alignment issues.
213
+ // See https://github.com/grpc/grpc/issues/16032 for context.
214
+ // TODO(ncteisen): remove this as soon as the issue is resolved.
215
+ ChildRefsList dummy_list_foo;
216
+ ChildRefsList dummy_list_bar;
197
217
  };
198
218
 
199
219
  } // namespace grpc_core
@@ -35,9 +35,10 @@ static grpc_error* init_channel_elem(grpc_channel_element* elem,
35
35
  static void destroy_channel_elem(grpc_channel_element* elem) {}
36
36
 
37
37
  namespace {
38
+
38
39
  struct call_data {
39
40
  // Stats object to update.
40
- grpc_grpclb_client_stats* client_stats;
41
+ grpc_core::RefCountedPtr<grpc_core::GrpcLbClientStats> client_stats;
41
42
  // State for intercepting send_initial_metadata.
42
43
  grpc_closure on_complete_for_send;
43
44
  grpc_closure* original_on_complete_for_send;
@@ -47,6 +48,7 @@ struct call_data {
47
48
  grpc_closure* original_recv_initial_metadata_ready;
48
49
  bool recv_initial_metadata_succeeded;
49
50
  };
51
+
50
52
  } // namespace
51
53
 
52
54
  static void on_complete_for_send(void* arg, grpc_error* error) {
@@ -72,11 +74,11 @@ static grpc_error* init_call_elem(grpc_call_element* elem,
72
74
  // Get stats object from context and take a ref.
73
75
  GPR_ASSERT(args->context != nullptr);
74
76
  if (args->context[GRPC_GRPCLB_CLIENT_STATS].value != nullptr) {
75
- calld->client_stats =
76
- grpc_grpclb_client_stats_ref(static_cast<grpc_grpclb_client_stats*>(
77
- args->context[GRPC_GRPCLB_CLIENT_STATS].value));
77
+ calld->client_stats = static_cast<grpc_core::GrpcLbClientStats*>(
78
+ args->context[GRPC_GRPCLB_CLIENT_STATS].value)
79
+ ->Ref();
78
80
  // Record call started.
79
- grpc_grpclb_client_stats_add_call_started(calld->client_stats);
81
+ calld->client_stats->AddCallStarted();
80
82
  }
81
83
  return GRPC_ERROR_NONE;
82
84
  }
@@ -88,12 +90,12 @@ static void destroy_call_elem(grpc_call_element* elem,
88
90
  if (calld->client_stats != nullptr) {
89
91
  // Record call finished, optionally setting client_failed_to_send and
90
92
  // received.
91
- grpc_grpclb_client_stats_add_call_finished(
93
+ calld->client_stats->AddCallFinished(
92
94
  !calld->send_initial_metadata_succeeded /* client_failed_to_send */,
93
- calld->recv_initial_metadata_succeeded /* known_received */,
94
- calld->client_stats);
95
+ calld->recv_initial_metadata_succeeded /* known_received */);
95
96
  // All done, so unref the stats object.
96
- grpc_grpclb_client_stats_unref(calld->client_stats);
97
+ // TODO(roth): Eliminate this once filter stack is converted to C++.
98
+ calld->client_stats.reset();
97
99
  }
98
100
  }
99
101
 
@@ -76,6 +76,7 @@
76
76
  #include "src/core/ext/filters/client_channel/client_channel.h"
77
77
  #include "src/core/ext/filters/client_channel/client_channel_factory.h"
78
78
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h"
79
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h"
79
80
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h"
80
81
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
81
82
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h"
@@ -91,6 +92,7 @@
91
92
  #include "src/core/lib/gpr/string.h"
92
93
  #include "src/core/lib/gprpp/manual_constructor.h"
93
94
  #include "src/core/lib/gprpp/memory.h"
95
+ #include "src/core/lib/gprpp/mutex_lock.h"
94
96
  #include "src/core/lib/gprpp/orphanable.h"
95
97
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
96
98
  #include "src/core/lib/iomgr/combiner.h"
@@ -122,7 +124,7 @@ class GrpcLb : public LoadBalancingPolicy {
122
124
  GrpcLb(const grpc_lb_addresses* addresses, const Args& args);
123
125
 
124
126
  void UpdateLocked(const grpc_channel_args& args) override;
125
- bool PickLocked(PickState* pick) override;
127
+ bool PickLocked(PickState* pick, grpc_error** error) override;
126
128
  void CancelPickLocked(PickState* pick, grpc_error* error) override;
127
129
  void CancelMatchingPicksLocked(uint32_t initial_metadata_flags_mask,
128
130
  uint32_t initial_metadata_flags_eq,
@@ -132,8 +134,10 @@ class GrpcLb : public LoadBalancingPolicy {
132
134
  grpc_connectivity_state CheckConnectivityLocked(
133
135
  grpc_error** connectivity_error) override;
134
136
  void HandOffPendingPicksLocked(LoadBalancingPolicy* new_policy) override;
135
- void PingOneLocked(grpc_closure* on_initiate, grpc_closure* on_ack) override;
136
137
  void ExitIdleLocked() override;
138
+ void ResetBackoffLocked() override;
139
+ void FillChildRefsForChannelz(ChildRefsList* child_subchannels,
140
+ ChildRefsList* child_channels) override;
137
141
 
138
142
  private:
139
143
  /// Linked list of pending pick requests. It stores all information needed to
@@ -158,20 +162,12 @@ class GrpcLb : public LoadBalancingPolicy {
158
162
  // The LB token associated with the pick. This is set via user_data in
159
163
  // the pick.
160
164
  grpc_mdelem lb_token;
161
- // Stats for client-side load reporting. Note that this holds a
162
- // reference, which must be either passed on via context or unreffed.
163
- grpc_grpclb_client_stats* client_stats = nullptr;
165
+ // Stats for client-side load reporting.
166
+ RefCountedPtr<GrpcLbClientStats> client_stats;
164
167
  // Next pending pick.
165
168
  PendingPick* next = nullptr;
166
169
  };
167
170
 
168
- /// A linked list of pending pings waiting for the RR policy to be created.
169
- struct PendingPing {
170
- grpc_closure* on_initiate;
171
- grpc_closure* on_ack;
172
- PendingPing* next = nullptr;
173
- };
174
-
175
171
  /// Contains a call to the LB server and all the data related to the call.
176
172
  class BalancerCallState
177
173
  : public InternallyRefCountedWithTracing<BalancerCallState> {
@@ -185,10 +181,15 @@ class GrpcLb : public LoadBalancingPolicy {
185
181
 
186
182
  void StartQuery();
187
183
 
188
- grpc_grpclb_client_stats* client_stats() const { return client_stats_; }
184
+ GrpcLbClientStats* client_stats() const { return client_stats_.get(); }
185
+
189
186
  bool seen_initial_response() const { return seen_initial_response_; }
190
187
 
191
188
  private:
189
+ // So Delete() can access our private dtor.
190
+ template <typename T>
191
+ friend void grpc_core::Delete(T*);
192
+
192
193
  ~BalancerCallState();
193
194
 
194
195
  GrpcLb* grpclb_policy() const {
@@ -232,7 +233,7 @@ class GrpcLb : public LoadBalancingPolicy {
232
233
 
233
234
  // The stats for client-side load reporting associated with this LB call.
234
235
  // Created after the first serverlist is received.
235
- grpc_grpclb_client_stats* client_stats_ = nullptr;
236
+ RefCountedPtr<GrpcLbClientStats> client_stats_;
236
237
  grpc_millis client_stats_report_interval_ = 0;
237
238
  grpc_timer client_load_report_timer_;
238
239
  bool client_load_report_timer_callback_pending_ = false;
@@ -265,14 +266,12 @@ class GrpcLb : public LoadBalancingPolicy {
265
266
  void AddPendingPick(PendingPick* pp);
266
267
  static void OnPendingPickComplete(void* arg, grpc_error* error);
267
268
 
268
- // Pending ping methods.
269
- void AddPendingPing(grpc_closure* on_initiate, grpc_closure* on_ack);
270
-
271
269
  // Methods for dealing with the RR policy.
272
270
  void CreateOrUpdateRoundRobinPolicyLocked();
273
271
  grpc_channel_args* CreateRoundRobinPolicyArgsLocked();
274
272
  void CreateRoundRobinPolicyLocked(const Args& args);
275
- bool PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp);
273
+ bool PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp,
274
+ grpc_error** error);
276
275
  void UpdateConnectivityStateFromRoundRobinPolicyLocked(
277
276
  grpc_error* rr_state_error);
278
277
  static void OnRoundRobinConnectivityChangedLocked(void* arg,
@@ -293,6 +292,9 @@ class GrpcLb : public LoadBalancingPolicy {
293
292
 
294
293
  // The channel for communicating with the LB server.
295
294
  grpc_channel* lb_channel_ = nullptr;
295
+ // Mutex to protect the channel to the LB server. This is used when
296
+ // processing a channelz request.
297
+ gpr_mu lb_channel_mu_;
296
298
  grpc_connectivity_state lb_channel_connectivity_;
297
299
  grpc_closure lb_channel_on_connectivity_changed_;
298
300
  // Are we already watching the LB channel's connectivity?
@@ -332,9 +334,8 @@ class GrpcLb : public LoadBalancingPolicy {
332
334
  grpc_timer lb_fallback_timer_;
333
335
  grpc_closure lb_on_fallback_;
334
336
 
335
- // Pending picks and pings that are waiting on the RR policy's connectivity.
337
+ // Pending picks that are waiting on the RR policy's connectivity.
336
338
  PendingPick* pending_picks_ = nullptr;
337
- PendingPing* pending_pings_ = nullptr;
338
339
 
339
340
  // The RR policy to use for the backends.
340
341
  OrphanablePtr<LoadBalancingPolicy> rr_policy_;
@@ -394,7 +395,7 @@ grpc_lb_addresses* ExtractBackendAddresses(const grpc_lb_addresses* addresses) {
394
395
  bool IsServerValid(const grpc_grpclb_server* server, size_t idx, bool log) {
395
396
  if (server->drop) return false;
396
397
  const grpc_grpclb_ip_address* ip = &server->ip_address;
397
- if (server->port >> 16 != 0) {
398
+ if (GPR_UNLIKELY(server->port >> 16 != 0)) {
398
399
  if (log) {
399
400
  gpr_log(GPR_ERROR,
400
401
  "Invalid port '%d' at index %lu of serverlist. Ignoring.",
@@ -402,7 +403,7 @@ bool IsServerValid(const grpc_grpclb_server* server, size_t idx, bool log) {
402
403
  }
403
404
  return false;
404
405
  }
405
- if (ip->size != 4 && ip->size != 16) {
406
+ if (GPR_UNLIKELY(ip->size != 4 && ip->size != 16)) {
406
407
  if (log) {
407
408
  gpr_log(GPR_ERROR,
408
409
  "Expected IP to be 4 or 16 bytes, got %d at index %lu of "
@@ -543,9 +544,6 @@ GrpcLb::BalancerCallState::~BalancerCallState() {
543
544
  grpc_byte_buffer_destroy(send_message_payload_);
544
545
  grpc_byte_buffer_destroy(recv_message_payload_);
545
546
  grpc_slice_unref_internal(lb_call_status_details_);
546
- if (client_stats_ != nullptr) {
547
- grpc_grpclb_client_stats_unref(client_stats_);
548
- }
549
547
  }
550
548
 
551
549
  void GrpcLb::BalancerCallState::Orphan() {
@@ -668,22 +666,22 @@ void GrpcLb::BalancerCallState::MaybeSendClientLoadReportLocked(
668
666
 
669
667
  bool GrpcLb::BalancerCallState::LoadReportCountersAreZero(
670
668
  grpc_grpclb_request* request) {
671
- grpc_grpclb_dropped_call_counts* drop_entries =
672
- static_cast<grpc_grpclb_dropped_call_counts*>(
669
+ GrpcLbClientStats::DroppedCallCounts* drop_entries =
670
+ static_cast<GrpcLbClientStats::DroppedCallCounts*>(
673
671
  request->client_stats.calls_finished_with_drop.arg);
674
672
  return request->client_stats.num_calls_started == 0 &&
675
673
  request->client_stats.num_calls_finished == 0 &&
676
674
  request->client_stats.num_calls_finished_with_client_failed_to_send ==
677
675
  0 &&
678
676
  request->client_stats.num_calls_finished_known_received == 0 &&
679
- (drop_entries == nullptr || drop_entries->num_entries == 0);
677
+ (drop_entries == nullptr || drop_entries->size() == 0);
680
678
  }
681
679
 
682
680
  void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
683
681
  // Construct message payload.
684
682
  GPR_ASSERT(send_message_payload_ == nullptr);
685
683
  grpc_grpclb_request* request =
686
- grpc_grpclb_load_report_request_create_locked(client_stats_);
684
+ grpc_grpclb_load_report_request_create_locked(client_stats_.get());
687
685
  // Skip client load report if the counters were all zero in the last
688
686
  // report and they are still zero in this one.
689
687
  if (LoadReportCountersAreZero(request)) {
@@ -710,7 +708,7 @@ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
710
708
  this, grpc_combiner_scheduler(grpclb_policy()->combiner()));
711
709
  grpc_call_error call_error = grpc_call_start_batch_and_execute(
712
710
  lb_call_, &op, 1, &client_load_report_closure_);
713
- if (call_error != GRPC_CALL_OK) {
711
+ if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
714
712
  gpr_log(GPR_ERROR, "[grpclb %p] call_error=%d", grpclb_policy_.get(),
715
713
  call_error);
716
714
  GPR_ASSERT(GRPC_CALL_OK == call_error);
@@ -774,7 +772,7 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked(
774
772
  if (grpc_lb_glb_trace.enabled()) {
775
773
  gpr_log(GPR_INFO,
776
774
  "[grpclb %p] Received initial LB response message; "
777
- "client load reporting interval = %" PRIdPTR " milliseconds",
775
+ "client load reporting interval = %" PRId64 " milliseconds",
778
776
  grpclb_policy, lb_calld->client_stats_report_interval_);
779
777
  }
780
778
  } else if (grpc_lb_glb_trace.enabled()) {
@@ -809,7 +807,7 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked(
809
807
  // serverlist returned from the current LB call.
810
808
  if (lb_calld->client_stats_report_interval_ > 0 &&
811
809
  lb_calld->client_stats_ == nullptr) {
812
- lb_calld->client_stats_ = grpc_grpclb_client_stats_create();
810
+ lb_calld->client_stats_.reset(New<GrpcLbClientStats>());
813
811
  // TODO(roth): We currently track this ref manually. Once the
814
812
  // ClosureRef API is ready, we should pass the RefCountedPtr<> along
815
813
  // with the callback.
@@ -932,7 +930,7 @@ grpc_lb_addresses* ExtractBalancerAddresses(
932
930
  size_t lb_addresses_idx = 0;
933
931
  for (size_t i = 0; i < addresses->num_addresses; ++i) {
934
932
  if (!addresses->addresses[i].is_balancer) continue;
935
- if (addresses->addresses[i].user_data != nullptr) {
933
+ if (GPR_UNLIKELY(addresses->addresses[i].user_data != nullptr)) {
936
934
  gpr_log(GPR_ERROR,
937
935
  "This LB policy doesn't support user data. It will be ignored");
938
936
  }
@@ -999,6 +997,13 @@ grpc_channel_args* BuildBalancerChannelArgs(
999
997
  // address updates into the LB channel.
1000
998
  grpc_core::FakeResolverResponseGenerator::MakeChannelArg(
1001
999
  response_generator),
1000
+ // A channel arg indicating the target is a grpclb load balancer.
1001
+ grpc_channel_arg_integer_create(
1002
+ const_cast<char*>(GRPC_ARG_ADDRESS_IS_GRPCLB_LOAD_BALANCER), 1),
1003
+ // A channel arg indicating this is an internal channels, aka it is
1004
+ // owned by components in Core, not by the user application.
1005
+ grpc_channel_arg_integer_create(
1006
+ const_cast<char*>(GRPC_ARG_CHANNELZ_CHANNEL_IS_INTERNAL_CHANNEL), 1),
1002
1007
  };
1003
1008
  // Construct channel args.
1004
1009
  grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
@@ -1028,6 +1033,7 @@ GrpcLb::GrpcLb(const grpc_lb_addresses* addresses,
1028
1033
  .set_max_backoff(GRPC_GRPCLB_RECONNECT_MAX_BACKOFF_SECONDS *
1029
1034
  1000)) {
1030
1035
  // Initialization.
1036
+ gpr_mu_init(&lb_channel_mu_);
1031
1037
  grpc_subchannel_index_ref();
1032
1038
  GRPC_CLOSURE_INIT(&lb_channel_on_connectivity_changed_,
1033
1039
  &GrpcLb::OnBalancerChannelConnectivityChangedLocked, this,
@@ -1065,7 +1071,7 @@ GrpcLb::GrpcLb(const grpc_lb_addresses* addresses,
1065
1071
 
1066
1072
  GrpcLb::~GrpcLb() {
1067
1073
  GPR_ASSERT(pending_picks_ == nullptr);
1068
- GPR_ASSERT(pending_pings_ == nullptr);
1074
+ gpr_mu_destroy(&lb_channel_mu_);
1069
1075
  gpr_free((void*)server_name_);
1070
1076
  grpc_channel_args_destroy(args_);
1071
1077
  grpc_connectivity_state_destroy(&state_tracker_);
@@ -1095,8 +1101,10 @@ void GrpcLb::ShutdownLocked() {
1095
1101
  // OnBalancerChannelConnectivityChangedLocked(), and we need to be
1096
1102
  // alive when that callback is invoked.
1097
1103
  if (lb_channel_ != nullptr) {
1104
+ gpr_mu_lock(&lb_channel_mu_);
1098
1105
  grpc_channel_destroy(lb_channel_);
1099
1106
  lb_channel_ = nullptr;
1107
+ gpr_mu_unlock(&lb_channel_mu_);
1100
1108
  }
1101
1109
  grpc_connectivity_state_set(&state_tracker_, GRPC_CHANNEL_SHUTDOWN,
1102
1110
  GRPC_ERROR_REF(error), "grpclb_shutdown");
@@ -1108,14 +1116,6 @@ void GrpcLb::ShutdownLocked() {
1108
1116
  // Note: pp is deleted in this callback.
1109
1117
  GRPC_CLOSURE_SCHED(&pp->on_complete, GRPC_ERROR_REF(error));
1110
1118
  }
1111
- // Clear pending pings.
1112
- PendingPing* pping;
1113
- while ((pping = pending_pings_) != nullptr) {
1114
- pending_pings_ = pping->next;
1115
- GRPC_CLOSURE_SCHED(pping->on_initiate, GRPC_ERROR_REF(error));
1116
- GRPC_CLOSURE_SCHED(pping->on_ack, GRPC_ERROR_REF(error));
1117
- Delete(pping);
1118
- }
1119
1119
  GRPC_ERROR_UNREF(error);
1120
1120
  }
1121
1121
 
@@ -1129,9 +1129,10 @@ void GrpcLb::HandOffPendingPicksLocked(LoadBalancingPolicy* new_policy) {
1129
1129
  pending_picks_ = pp->next;
1130
1130
  pp->pick->on_complete = pp->original_on_complete;
1131
1131
  pp->pick->user_data = nullptr;
1132
- if (new_policy->PickLocked(pp->pick)) {
1132
+ grpc_error* error = GRPC_ERROR_NONE;
1133
+ if (new_policy->PickLocked(pp->pick, &error)) {
1133
1134
  // Synchronous return; schedule closure.
1134
- GRPC_CLOSURE_SCHED(pp->pick->on_complete, GRPC_ERROR_NONE);
1135
+ GRPC_CLOSURE_SCHED(pp->pick->on_complete, error);
1135
1136
  }
1136
1137
  Delete(pp);
1137
1138
  }
@@ -1215,54 +1216,56 @@ void GrpcLb::ExitIdleLocked() {
1215
1216
  }
1216
1217
  }
1217
1218
 
1218
- bool GrpcLb::PickLocked(PickState* pick) {
1219
+ void GrpcLb::ResetBackoffLocked() {
1220
+ if (lb_channel_ != nullptr) {
1221
+ grpc_channel_reset_connect_backoff(lb_channel_);
1222
+ }
1223
+ if (rr_policy_ != nullptr) {
1224
+ rr_policy_->ResetBackoffLocked();
1225
+ }
1226
+ }
1227
+
1228
+ bool GrpcLb::PickLocked(PickState* pick, grpc_error** error) {
1219
1229
  PendingPick* pp = PendingPickCreate(pick);
1220
1230
  bool pick_done = false;
1221
1231
  if (rr_policy_ != nullptr) {
1222
- const grpc_connectivity_state rr_connectivity_state =
1223
- rr_policy_->CheckConnectivityLocked(nullptr);
1224
- // The RR policy may have transitioned to SHUTDOWN but the callback
1225
- // registered to capture this event (on_rr_connectivity_changed_) may not
1226
- // have been invoked yet. We need to make sure we aren't trying to pick
1227
- // from an RR policy instance that's in shutdown.
1228
- if (rr_connectivity_state == GRPC_CHANNEL_SHUTDOWN) {
1232
+ if (grpc_lb_glb_trace.enabled()) {
1233
+ gpr_log(GPR_INFO, "[grpclb %p] about to PICK from RR %p", this,
1234
+ rr_policy_.get());
1235
+ }
1236
+ pick_done =
1237
+ PickFromRoundRobinPolicyLocked(false /* force_async */, pp, error);
1238
+ } else { // rr_policy_ == NULL
1239
+ if (pick->on_complete == nullptr) {
1240
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1241
+ "No pick result available but synchronous result required.");
1242
+ pick_done = true;
1243
+ } else {
1229
1244
  if (grpc_lb_glb_trace.enabled()) {
1230
1245
  gpr_log(GPR_INFO,
1231
- "[grpclb %p] NOT picking from from RR %p: RR conn state=%s",
1232
- this, rr_policy_.get(),
1233
- grpc_connectivity_state_name(rr_connectivity_state));
1246
+ "[grpclb %p] No RR policy. Adding to grpclb's pending picks",
1247
+ this);
1234
1248
  }
1235
1249
  AddPendingPick(pp);
1236
- pick_done = false;
1237
- } else { // RR not in shutdown
1238
- if (grpc_lb_glb_trace.enabled()) {
1239
- gpr_log(GPR_INFO, "[grpclb %p] about to PICK from RR %p", this,
1240
- rr_policy_.get());
1250
+ if (!started_picking_) {
1251
+ StartPickingLocked();
1241
1252
  }
1242
- pick_done = PickFromRoundRobinPolicyLocked(false /* force_async */, pp);
1243
- }
1244
- } else { // rr_policy_ == NULL
1245
- if (grpc_lb_glb_trace.enabled()) {
1246
- gpr_log(GPR_DEBUG,
1247
- "[grpclb %p] No RR policy. Adding to grpclb's pending picks",
1248
- this);
1249
- }
1250
- AddPendingPick(pp);
1251
- if (!started_picking_) {
1252
- StartPickingLocked();
1253
+ pick_done = false;
1253
1254
  }
1254
- pick_done = false;
1255
1255
  }
1256
1256
  return pick_done;
1257
1257
  }
1258
1258
 
1259
- void GrpcLb::PingOneLocked(grpc_closure* on_initiate, grpc_closure* on_ack) {
1260
- if (rr_policy_ != nullptr) {
1261
- rr_policy_->PingOneLocked(on_initiate, on_ack);
1262
- } else {
1263
- AddPendingPing(on_initiate, on_ack);
1264
- if (!started_picking_) {
1265
- StartPickingLocked();
1259
+ void GrpcLb::FillChildRefsForChannelz(ChildRefsList* child_subchannels,
1260
+ ChildRefsList* child_channels) {
1261
+ // delegate to the RoundRobin to fill the children subchannels.
1262
+ rr_policy_->FillChildRefsForChannelz(child_subchannels, child_channels);
1263
+ MutexLock lock(&lb_channel_mu_);
1264
+ if (lb_channel_ != nullptr) {
1265
+ grpc_core::channelz::ChannelNode* channel_node =
1266
+ grpc_channel_get_channelz_node(lb_channel_);
1267
+ if (channel_node != nullptr) {
1268
+ child_channels->push_back(channel_node->channel_uuid());
1266
1269
  }
1267
1270
  }
1268
1271
  }
@@ -1280,7 +1283,7 @@ void GrpcLb::NotifyOnStateChangeLocked(grpc_connectivity_state* current,
1280
1283
 
1281
1284
  void GrpcLb::ProcessChannelArgsLocked(const grpc_channel_args& args) {
1282
1285
  const grpc_arg* arg = grpc_channel_args_find(&args, GRPC_ARG_LB_ADDRESSES);
1283
- if (arg == nullptr || arg->type != GRPC_ARG_POINTER) {
1286
+ if (GPR_UNLIKELY(arg == nullptr || arg->type != GRPC_ARG_POINTER)) {
1284
1287
  // Ignore this update.
1285
1288
  gpr_log(
1286
1289
  GPR_ERROR,
@@ -1310,9 +1313,11 @@ void GrpcLb::ProcessChannelArgsLocked(const grpc_channel_args& args) {
1310
1313
  if (lb_channel_ == nullptr) {
1311
1314
  char* uri_str;
1312
1315
  gpr_asprintf(&uri_str, "fake:///%s", server_name_);
1316
+ gpr_mu_lock(&lb_channel_mu_);
1313
1317
  lb_channel_ = grpc_client_channel_factory_create_channel(
1314
1318
  client_channel_factory(), uri_str,
1315
1319
  GRPC_CLIENT_CHANNEL_TYPE_LOAD_BALANCING, lb_channel_args);
1320
+ gpr_mu_unlock(&lb_channel_mu_);
1316
1321
  GPR_ASSERT(lb_channel_ != nullptr);
1317
1322
  gpr_free(uri_str);
1318
1323
  }
@@ -1409,14 +1414,13 @@ void GrpcLb::OnFallbackTimerLocked(void* arg, grpc_error* error) {
1409
1414
  void GrpcLb::StartBalancerCallRetryTimerLocked() {
1410
1415
  grpc_millis next_try = lb_call_backoff_.NextAttemptTime();
1411
1416
  if (grpc_lb_glb_trace.enabled()) {
1412
- gpr_log(GPR_DEBUG, "[grpclb %p] Connection to LB server lost...", this);
1417
+ gpr_log(GPR_INFO, "[grpclb %p] Connection to LB server lost...", this);
1413
1418
  grpc_millis timeout = next_try - ExecCtx::Get()->Now();
1414
1419
  if (timeout > 0) {
1415
- gpr_log(GPR_DEBUG,
1416
- "[grpclb %p] ... retry_timer_active in %" PRIuPTR "ms.", this,
1417
- timeout);
1420
+ gpr_log(GPR_INFO, "[grpclb %p] ... retry_timer_active in %" PRId64 "ms.",
1421
+ this, timeout);
1418
1422
  } else {
1419
- gpr_log(GPR_DEBUG, "[grpclb %p] ... retry_timer_active immediately.",
1423
+ gpr_log(GPR_INFO, "[grpclb %p] ... retry_timer_active immediately.",
1420
1424
  this);
1421
1425
  }
1422
1426
  }
@@ -1509,7 +1513,7 @@ grpc_error* AddLbTokenToInitialMetadata(
1509
1513
 
1510
1514
  // Destroy function used when embedding client stats in call context.
1511
1515
  void DestroyClientStats(void* arg) {
1512
- grpc_grpclb_client_stats_unref(static_cast<grpc_grpclb_client_stats*>(arg));
1516
+ static_cast<GrpcLbClientStats*>(arg)->Unref();
1513
1517
  }
1514
1518
 
1515
1519
  void GrpcLb::PendingPickSetMetadataAndContext(PendingPick* pp) {
@@ -1517,7 +1521,7 @@ void GrpcLb::PendingPickSetMetadataAndContext(PendingPick* pp) {
1517
1521
  * policy (e.g., all addresses failed to connect). There won't be any
1518
1522
  * user_data/token available */
1519
1523
  if (pp->pick->connected_subchannel != nullptr) {
1520
- if (!GRPC_MDISNULL(pp->lb_token)) {
1524
+ if (GPR_LIKELY(!GRPC_MDISNULL(pp->lb_token))) {
1521
1525
  AddLbTokenToInitialMetadata(GRPC_MDELEM_REF(pp->lb_token),
1522
1526
  &pp->pick->lb_token_mdelem_storage,
1523
1527
  pp->pick->initial_metadata);
@@ -1530,14 +1534,12 @@ void GrpcLb::PendingPickSetMetadataAndContext(PendingPick* pp) {
1530
1534
  // Pass on client stats via context. Passes ownership of the reference.
1531
1535
  if (pp->client_stats != nullptr) {
1532
1536
  pp->pick->subchannel_call_context[GRPC_GRPCLB_CLIENT_STATS].value =
1533
- pp->client_stats;
1537
+ pp->client_stats.release();
1534
1538
  pp->pick->subchannel_call_context[GRPC_GRPCLB_CLIENT_STATS].destroy =
1535
1539
  DestroyClientStats;
1536
1540
  }
1537
1541
  } else {
1538
- if (pp->client_stats != nullptr) {
1539
- grpc_grpclb_client_stats_unref(pp->client_stats);
1540
- }
1542
+ pp->client_stats.reset();
1541
1543
  }
1542
1544
  }
1543
1545
 
@@ -1567,18 +1569,6 @@ void GrpcLb::AddPendingPick(PendingPick* pp) {
1567
1569
  pending_picks_ = pp;
1568
1570
  }
1569
1571
 
1570
- //
1571
- // PendingPing
1572
- //
1573
-
1574
- void GrpcLb::AddPendingPing(grpc_closure* on_initiate, grpc_closure* on_ack) {
1575
- PendingPing* pping = New<PendingPing>();
1576
- pping->on_initiate = on_initiate;
1577
- pping->on_ack = on_ack;
1578
- pping->next = pending_pings_;
1579
- pending_pings_ = pping;
1580
- }
1581
-
1582
1572
  //
1583
1573
  // code for interacting with the RR policy
1584
1574
  //
@@ -1588,7 +1578,8 @@ void GrpcLb::AddPendingPing(grpc_closure* on_initiate, grpc_closure* on_ack) {
1588
1578
  // cleanups this callback would otherwise be responsible for.
1589
1579
  // If \a force_async is true, then we will manually schedule the
1590
1580
  // completion callback even if the pick is available immediately.
1591
- bool GrpcLb::PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp) {
1581
+ bool GrpcLb::PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp,
1582
+ grpc_error** error) {
1592
1583
  // Check for drops if we are not using fallback backend addresses.
1593
1584
  if (serverlist_ != nullptr) {
1594
1585
  // Look at the index into the serverlist to see if we should drop this call.
@@ -1603,8 +1594,8 @@ bool GrpcLb::PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp) {
1603
1594
  // subchannel call (and therefore no client_load_reporting filter)
1604
1595
  // for dropped calls.
1605
1596
  if (lb_calld_ != nullptr && lb_calld_->client_stats() != nullptr) {
1606
- grpc_grpclb_client_stats_add_call_dropped_locked(
1607
- server->load_balance_token, lb_calld_->client_stats());
1597
+ lb_calld_->client_stats()->AddCallDroppedLocked(
1598
+ server->load_balance_token);
1608
1599
  }
1609
1600
  if (force_async) {
1610
1601
  GRPC_CLOSURE_SCHED(pp->original_on_complete, GRPC_ERROR_NONE);
@@ -1617,16 +1608,17 @@ bool GrpcLb::PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp) {
1617
1608
  }
1618
1609
  // Set client_stats and user_data.
1619
1610
  if (lb_calld_ != nullptr && lb_calld_->client_stats() != nullptr) {
1620
- pp->client_stats = grpc_grpclb_client_stats_ref(lb_calld_->client_stats());
1611
+ pp->client_stats = lb_calld_->client_stats()->Ref();
1621
1612
  }
1622
1613
  GPR_ASSERT(pp->pick->user_data == nullptr);
1623
1614
  pp->pick->user_data = (void**)&pp->lb_token;
1624
1615
  // Pick via the RR policy.
1625
- bool pick_done = rr_policy_->PickLocked(pp->pick);
1616
+ bool pick_done = rr_policy_->PickLocked(pp->pick, error);
1626
1617
  if (pick_done) {
1627
1618
  PendingPickSetMetadataAndContext(pp);
1628
1619
  if (force_async) {
1629
- GRPC_CLOSURE_SCHED(pp->original_on_complete, GRPC_ERROR_NONE);
1620
+ GRPC_CLOSURE_SCHED(pp->original_on_complete, *error);
1621
+ *error = GRPC_ERROR_NONE;
1630
1622
  pick_done = false;
1631
1623
  }
1632
1624
  Delete(pp);
@@ -1642,7 +1634,7 @@ void GrpcLb::CreateRoundRobinPolicyLocked(const Args& args) {
1642
1634
  GPR_ASSERT(rr_policy_ == nullptr);
1643
1635
  rr_policy_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
1644
1636
  "round_robin", args);
1645
- if (rr_policy_ == nullptr) {
1637
+ if (GPR_UNLIKELY(rr_policy_ == nullptr)) {
1646
1638
  gpr_log(GPR_ERROR, "[grpclb %p] Failure creating a RoundRobin policy",
1647
1639
  this);
1648
1640
  return;
@@ -1678,26 +1670,18 @@ void GrpcLb::CreateRoundRobinPolicyLocked(const Args& args) {
1678
1670
  "[grpclb %p] Pending pick about to (async) PICK from RR %p", this,
1679
1671
  rr_policy_.get());
1680
1672
  }
1681
- PickFromRoundRobinPolicyLocked(true /* force_async */, pp);
1682
- }
1683
- // Send pending pings to RR policy.
1684
- PendingPing* pping;
1685
- while ((pping = pending_pings_)) {
1686
- pending_pings_ = pping->next;
1687
- if (grpc_lb_glb_trace.enabled()) {
1688
- gpr_log(GPR_INFO, "[grpclb %p] Pending ping about to PING from RR %p",
1689
- this, rr_policy_.get());
1690
- }
1691
- rr_policy_->PingOneLocked(pping->on_initiate, pping->on_ack);
1692
- Delete(pping);
1673
+ grpc_error* error = GRPC_ERROR_NONE;
1674
+ PickFromRoundRobinPolicyLocked(true /* force_async */, pp, &error);
1693
1675
  }
1694
1676
  }
1695
1677
 
1696
1678
  grpc_channel_args* GrpcLb::CreateRoundRobinPolicyArgsLocked() {
1697
1679
  grpc_lb_addresses* addresses;
1680
+ bool is_backend_from_grpclb_load_balancer = false;
1698
1681
  if (serverlist_ != nullptr) {
1699
1682
  GPR_ASSERT(serverlist_->num_servers > 0);
1700
1683
  addresses = ProcessServerlist(serverlist_);
1684
+ is_backend_from_grpclb_load_balancer = true;
1701
1685
  } else {
1702
1686
  // If CreateOrUpdateRoundRobinPolicyLocked() is invoked when we haven't
1703
1687
  // received any serverlist from the balancer, we use the fallback backends
@@ -1711,9 +1695,18 @@ grpc_channel_args* GrpcLb::CreateRoundRobinPolicyArgsLocked() {
1711
1695
  // Replace the LB addresses in the channel args that we pass down to
1712
1696
  // the subchannel.
1713
1697
  static const char* keys_to_remove[] = {GRPC_ARG_LB_ADDRESSES};
1714
- const grpc_arg arg = grpc_lb_addresses_create_channel_arg(addresses);
1698
+ const grpc_arg args_to_add[] = {
1699
+ grpc_lb_addresses_create_channel_arg(addresses),
1700
+ // A channel arg indicating if the target is a backend inferred from a
1701
+ // grpclb load balancer.
1702
+ grpc_channel_arg_integer_create(
1703
+ const_cast<char*>(
1704
+ GRPC_ARG_ADDRESS_IS_BACKEND_FROM_GRPCLB_LOAD_BALANCER),
1705
+ is_backend_from_grpclb_load_balancer),
1706
+ };
1715
1707
  grpc_channel_args* args = grpc_channel_args_copy_and_add_and_remove(
1716
- args_, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove), &arg, 1);
1708
+ args_, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove), args_to_add,
1709
+ GPR_ARRAY_SIZE(args_to_add));
1717
1710
  grpc_lb_addresses_destroy(addresses);
1718
1711
  return args;
1719
1712
  }
@@ -1724,7 +1717,7 @@ void GrpcLb::CreateOrUpdateRoundRobinPolicyLocked() {
1724
1717
  GPR_ASSERT(args != nullptr);
1725
1718
  if (rr_policy_ != nullptr) {
1726
1719
  if (grpc_lb_glb_trace.enabled()) {
1727
- gpr_log(GPR_DEBUG, "[grpclb %p] Updating RR policy %p", this,
1720
+ gpr_log(GPR_INFO, "[grpclb %p] Updating RR policy %p", this,
1728
1721
  rr_policy_.get());
1729
1722
  }
1730
1723
  rr_policy_->UpdateLocked(*args);
@@ -1735,7 +1728,7 @@ void GrpcLb::CreateOrUpdateRoundRobinPolicyLocked() {
1735
1728
  lb_policy_args.args = args;
1736
1729
  CreateRoundRobinPolicyLocked(lb_policy_args);
1737
1730
  if (grpc_lb_glb_trace.enabled()) {
1738
- gpr_log(GPR_DEBUG, "[grpclb %p] Created new RR policy %p", this,
1731
+ gpr_log(GPR_INFO, "[grpclb %p] Created new RR policy %p", this,
1739
1732
  rr_policy_.get());
1740
1733
  }
1741
1734
  }
@@ -1751,7 +1744,7 @@ void GrpcLb::OnRoundRobinRequestReresolutionLocked(void* arg,
1751
1744
  }
1752
1745
  if (grpc_lb_glb_trace.enabled()) {
1753
1746
  gpr_log(
1754
- GPR_DEBUG,
1747
+ GPR_INFO,
1755
1748
  "[grpclb %p] Re-resolution requested from the internal RR policy (%p).",
1756
1749
  grpclb_policy, grpclb_policy->rr_policy_.get());
1757
1750
  }