grpc-flamingo 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1318) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/Makefile +23896 -0
  4. data/etc/roots.pem +4475 -0
  5. data/include/grpc/byte_buffer.h +27 -0
  6. data/include/grpc/byte_buffer_reader.h +26 -0
  7. data/include/grpc/census.h +40 -0
  8. data/include/grpc/compression.h +75 -0
  9. data/include/grpc/fork.h +26 -0
  10. data/include/grpc/grpc.h +469 -0
  11. data/include/grpc/grpc_cronet.h +38 -0
  12. data/include/grpc/grpc_posix.h +67 -0
  13. data/include/grpc/grpc_security.h +495 -0
  14. data/include/grpc/grpc_security_constants.h +107 -0
  15. data/include/grpc/impl/codegen/atm.h +95 -0
  16. data/include/grpc/impl/codegen/atm_gcc_atomic.h +91 -0
  17. data/include/grpc/impl/codegen/atm_gcc_sync.h +83 -0
  18. data/include/grpc/impl/codegen/atm_windows.h +126 -0
  19. data/include/grpc/impl/codegen/byte_buffer.h +88 -0
  20. data/include/grpc/impl/codegen/byte_buffer_reader.h +42 -0
  21. data/include/grpc/impl/codegen/compression_types.h +107 -0
  22. data/include/grpc/impl/codegen/connectivity_state.h +44 -0
  23. data/include/grpc/impl/codegen/fork.h +48 -0
  24. data/include/grpc/impl/codegen/gpr_slice.h +69 -0
  25. data/include/grpc/impl/codegen/gpr_types.h +59 -0
  26. data/include/grpc/impl/codegen/grpc_types.h +669 -0
  27. data/include/grpc/impl/codegen/port_platform.h +507 -0
  28. data/include/grpc/impl/codegen/propagation_bits.h +52 -0
  29. data/include/grpc/impl/codegen/slice.h +147 -0
  30. data/include/grpc/impl/codegen/status.h +153 -0
  31. data/include/grpc/impl/codegen/sync.h +63 -0
  32. data/include/grpc/impl/codegen/sync_custom.h +38 -0
  33. data/include/grpc/impl/codegen/sync_generic.h +48 -0
  34. data/include/grpc/impl/codegen/sync_posix.h +34 -0
  35. data/include/grpc/impl/codegen/sync_windows.h +36 -0
  36. data/include/grpc/load_reporting.h +48 -0
  37. data/include/grpc/module.modulemap +74 -0
  38. data/include/grpc/slice.h +172 -0
  39. data/include/grpc/slice_buffer.h +84 -0
  40. data/include/grpc/status.h +26 -0
  41. data/include/grpc/support/alloc.h +68 -0
  42. data/include/grpc/support/atm.h +26 -0
  43. data/include/grpc/support/atm_gcc_atomic.h +26 -0
  44. data/include/grpc/support/atm_gcc_sync.h +26 -0
  45. data/include/grpc/support/atm_windows.h +26 -0
  46. data/include/grpc/support/cpu.h +44 -0
  47. data/include/grpc/support/log.h +104 -0
  48. data/include/grpc/support/log_windows.h +38 -0
  49. data/include/grpc/support/port_platform.h +24 -0
  50. data/include/grpc/support/string_util.h +49 -0
  51. data/include/grpc/support/sync.h +298 -0
  52. data/include/grpc/support/sync_custom.h +26 -0
  53. data/include/grpc/support/sync_generic.h +26 -0
  54. data/include/grpc/support/sync_posix.h +26 -0
  55. data/include/grpc/support/sync_windows.h +26 -0
  56. data/include/grpc/support/thd_id.h +44 -0
  57. data/include/grpc/support/time.h +92 -0
  58. data/include/grpc/support/workaround_list.h +31 -0
  59. data/src/boringssl/err_data.c +1348 -0
  60. data/src/core/ext/census/grpc_context.cc +38 -0
  61. data/src/core/ext/filters/client_channel/backup_poller.cc +174 -0
  62. data/src/core/ext/filters/client_channel/backup_poller.h +35 -0
  63. data/src/core/ext/filters/client_channel/channel_connectivity.cc +248 -0
  64. data/src/core/ext/filters/client_channel/client_channel.cc +3209 -0
  65. data/src/core/ext/filters/client_channel/client_channel.h +57 -0
  66. data/src/core/ext/filters/client_channel/client_channel_factory.cc +67 -0
  67. data/src/core/ext/filters/client_channel/client_channel_factory.h +74 -0
  68. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +62 -0
  69. data/src/core/ext/filters/client_channel/connector.cc +41 -0
  70. data/src/core/ext/filters/client_channel/connector.h +73 -0
  71. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +370 -0
  72. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +34 -0
  73. data/src/core/ext/filters/client_channel/http_proxy.cc +195 -0
  74. data/src/core/ext/filters/client_channel/http_proxy.h +24 -0
  75. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +138 -0
  76. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +29 -0
  77. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1906 -0
  78. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +36 -0
  79. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +108 -0
  80. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +152 -0
  81. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +67 -0
  82. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +304 -0
  83. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +88 -0
  84. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +102 -0
  85. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +190 -0
  86. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +591 -0
  87. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +687 -0
  88. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +253 -0
  89. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +136 -0
  90. data/src/core/ext/filters/client_channel/lb_policy.cc +59 -0
  91. data/src/core/ext/filters/client_channel/lb_policy.h +201 -0
  92. data/src/core/ext/filters/client_channel/lb_policy_factory.cc +155 -0
  93. data/src/core/ext/filters/client_channel/lb_policy_factory.h +127 -0
  94. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +97 -0
  95. data/src/core/ext/filters/client_channel/lb_policy_registry.h +54 -0
  96. data/src/core/ext/filters/client_channel/method_params.cc +178 -0
  97. data/src/core/ext/filters/client_channel/method_params.h +74 -0
  98. data/src/core/ext/filters/client_channel/parse_address.cc +192 -0
  99. data/src/core/ext/filters/client_channel/parse_address.h +50 -0
  100. data/src/core/ext/filters/client_channel/proxy_mapper.cc +48 -0
  101. data/src/core/ext/filters/client_channel/proxy_mapper.h +74 -0
  102. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +122 -0
  103. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +44 -0
  104. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +493 -0
  105. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +53 -0
  106. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +351 -0
  107. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +593 -0
  108. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +74 -0
  109. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +59 -0
  110. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +340 -0
  111. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +297 -0
  112. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +83 -0
  113. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +214 -0
  114. data/src/core/ext/filters/client_channel/resolver.cc +35 -0
  115. data/src/core/ext/filters/client_channel/resolver.h +134 -0
  116. data/src/core/ext/filters/client_channel/resolver_factory.h +71 -0
  117. data/src/core/ext/filters/client_channel/resolver_registry.cc +178 -0
  118. data/src/core/ext/filters/client_channel/resolver_registry.h +83 -0
  119. data/src/core/ext/filters/client_channel/retry_throttle.cc +191 -0
  120. data/src/core/ext/filters/client_channel/retry_throttle.h +77 -0
  121. data/src/core/ext/filters/client_channel/subchannel.cc +815 -0
  122. data/src/core/ext/filters/client_channel/subchannel.h +183 -0
  123. data/src/core/ext/filters/client_channel/subchannel_index.cc +254 -0
  124. data/src/core/ext/filters/client_channel/subchannel_index.h +79 -0
  125. data/src/core/ext/filters/client_channel/uri_parser.cc +314 -0
  126. data/src/core/ext/filters/client_channel/uri_parser.h +50 -0
  127. data/src/core/ext/filters/deadline/deadline_filter.cc +386 -0
  128. data/src/core/ext/filters/deadline/deadline_filter.h +93 -0
  129. data/src/core/ext/filters/http/client/http_client_filter.cc +558 -0
  130. data/src/core/ext/filters/http/client/http_client_filter.h +31 -0
  131. data/src/core/ext/filters/http/client_authority_filter.cc +156 -0
  132. data/src/core/ext/filters/http/client_authority_filter.h +34 -0
  133. data/src/core/ext/filters/http/http_filters_plugin.cc +89 -0
  134. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +499 -0
  135. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +53 -0
  136. data/src/core/ext/filters/http/server/http_server_filter.cc +434 -0
  137. data/src/core/ext/filters/http/server/http_server_filter.h +29 -0
  138. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +222 -0
  139. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.h +30 -0
  140. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +71 -0
  141. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +61 -0
  142. data/src/core/ext/filters/max_age/max_age_filter.cc +543 -0
  143. data/src/core/ext/filters/max_age/max_age_filter.h +26 -0
  144. data/src/core/ext/filters/message_size/message_size_filter.cc +324 -0
  145. data/src/core/ext/filters/message_size/message_size_filter.h +26 -0
  146. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +208 -0
  147. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +27 -0
  148. data/src/core/ext/filters/workarounds/workaround_utils.cc +53 -0
  149. data/src/core/ext/filters/workarounds/workaround_utils.h +39 -0
  150. data/src/core/ext/transport/chttp2/alpn/alpn.cc +44 -0
  151. data/src/core/ext/transport/chttp2/alpn/alpn.h +36 -0
  152. data/src/core/ext/transport/chttp2/client/authority.cc +42 -0
  153. data/src/core/ext/transport/chttp2/client/authority.h +36 -0
  154. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +229 -0
  155. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -0
  156. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +110 -0
  157. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +79 -0
  158. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +230 -0
  159. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +353 -0
  160. data/src/core/ext/transport/chttp2/server/chttp2_server.h +33 -0
  161. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +45 -0
  162. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +74 -0
  163. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +89 -0
  164. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +249 -0
  165. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +56 -0
  166. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +231 -0
  167. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +41 -0
  168. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +35 -0
  169. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3102 -0
  170. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +45 -0
  171. data/src/core/ext/transport/chttp2/transport/flow_control.cc +405 -0
  172. data/src/core/ext/transport/chttp2/transport/flow_control.h +482 -0
  173. data/src/core/ext/transport/chttp2/transport/frame.h +47 -0
  174. data/src/core/ext/transport/chttp2/transport/frame_data.cc +314 -0
  175. data/src/core/ext/transport/chttp2/transport/frame_data.h +84 -0
  176. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +186 -0
  177. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +62 -0
  178. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +131 -0
  179. data/src/core/ext/transport/chttp2/transport/frame_ping.h +45 -0
  180. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +112 -0
  181. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +43 -0
  182. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +238 -0
  183. data/src/core/ext/transport/chttp2/transport/frame_settings.h +60 -0
  184. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +122 -0
  185. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +45 -0
  186. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +699 -0
  187. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +95 -0
  188. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1680 -0
  189. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +109 -0
  190. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +368 -0
  191. data/src/core/ext/transport/chttp2/transport/hpack_table.h +95 -0
  192. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +62 -0
  193. data/src/core/ext/transport/chttp2/transport/http2_settings.h +62 -0
  194. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +92 -0
  195. data/src/core/ext/transport/chttp2/transport/huffsyms.h +33 -0
  196. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +73 -0
  197. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +49 -0
  198. data/src/core/ext/transport/chttp2/transport/internal.h +799 -0
  199. data/src/core/ext/transport/chttp2/transport/parsing.cc +745 -0
  200. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +216 -0
  201. data/src/core/ext/transport/chttp2/transport/stream_map.cc +167 -0
  202. data/src/core/ext/transport/chttp2/transport/stream_map.h +68 -0
  203. data/src/core/ext/transport/chttp2/transport/varint.cc +56 -0
  204. data/src/core/ext/transport/chttp2/transport/varint.h +60 -0
  205. data/src/core/ext/transport/chttp2/transport/writing.cc +641 -0
  206. data/src/core/ext/transport/inproc/inproc_plugin.cc +28 -0
  207. data/src/core/ext/transport/inproc/inproc_transport.cc +1240 -0
  208. data/src/core/ext/transport/inproc/inproc_transport.h +35 -0
  209. data/src/core/lib/avl/avl.cc +306 -0
  210. data/src/core/lib/avl/avl.h +94 -0
  211. data/src/core/lib/backoff/backoff.cc +78 -0
  212. data/src/core/lib/backoff/backoff.h +89 -0
  213. data/src/core/lib/channel/channel_args.cc +413 -0
  214. data/src/core/lib/channel/channel_args.h +127 -0
  215. data/src/core/lib/channel/channel_stack.cc +258 -0
  216. data/src/core/lib/channel/channel_stack.h +280 -0
  217. data/src/core/lib/channel/channel_stack_builder.cc +314 -0
  218. data/src/core/lib/channel/channel_stack_builder.h +160 -0
  219. data/src/core/lib/channel/channel_trace.cc +239 -0
  220. data/src/core/lib/channel/channel_trace.h +133 -0
  221. data/src/core/lib/channel/channel_trace_registry.cc +80 -0
  222. data/src/core/lib/channel/channel_trace_registry.h +43 -0
  223. data/src/core/lib/channel/connected_channel.cc +236 -0
  224. data/src/core/lib/channel/connected_channel.h +34 -0
  225. data/src/core/lib/channel/context.h +49 -0
  226. data/src/core/lib/channel/handshaker.cc +259 -0
  227. data/src/core/lib/channel/handshaker.h +166 -0
  228. data/src/core/lib/channel/handshaker_factory.cc +41 -0
  229. data/src/core/lib/channel/handshaker_factory.h +50 -0
  230. data/src/core/lib/channel/handshaker_registry.cc +97 -0
  231. data/src/core/lib/channel/handshaker_registry.h +48 -0
  232. data/src/core/lib/channel/status_util.cc +100 -0
  233. data/src/core/lib/channel/status_util.h +58 -0
  234. data/src/core/lib/compression/algorithm_metadata.h +61 -0
  235. data/src/core/lib/compression/compression.cc +174 -0
  236. data/src/core/lib/compression/compression_internal.cc +276 -0
  237. data/src/core/lib/compression/compression_internal.h +88 -0
  238. data/src/core/lib/compression/message_compress.cc +187 -0
  239. data/src/core/lib/compression/message_compress.h +40 -0
  240. data/src/core/lib/compression/stream_compression.cc +79 -0
  241. data/src/core/lib/compression/stream_compression.h +116 -0
  242. data/src/core/lib/compression/stream_compression_gzip.cc +230 -0
  243. data/src/core/lib/compression/stream_compression_gzip.h +28 -0
  244. data/src/core/lib/compression/stream_compression_identity.cc +94 -0
  245. data/src/core/lib/compression/stream_compression_identity.h +29 -0
  246. data/src/core/lib/debug/stats.cc +178 -0
  247. data/src/core/lib/debug/stats.h +61 -0
  248. data/src/core/lib/debug/stats_data.cc +682 -0
  249. data/src/core/lib/debug/stats_data.h +435 -0
  250. data/src/core/lib/debug/trace.cc +144 -0
  251. data/src/core/lib/debug/trace.h +104 -0
  252. data/src/core/lib/gpr/alloc.cc +99 -0
  253. data/src/core/lib/gpr/arena.cc +152 -0
  254. data/src/core/lib/gpr/arena.h +41 -0
  255. data/src/core/lib/gpr/atm.cc +35 -0
  256. data/src/core/lib/gpr/cpu_iphone.cc +36 -0
  257. data/src/core/lib/gpr/cpu_linux.cc +82 -0
  258. data/src/core/lib/gpr/cpu_posix.cc +81 -0
  259. data/src/core/lib/gpr/cpu_windows.cc +33 -0
  260. data/src/core/lib/gpr/env.h +43 -0
  261. data/src/core/lib/gpr/env_linux.cc +82 -0
  262. data/src/core/lib/gpr/env_posix.cc +47 -0
  263. data/src/core/lib/gpr/env_windows.cc +72 -0
  264. data/src/core/lib/gpr/fork.cc +78 -0
  265. data/src/core/lib/gpr/fork.h +35 -0
  266. data/src/core/lib/gpr/host_port.cc +98 -0
  267. data/src/core/lib/gpr/host_port.h +43 -0
  268. data/src/core/lib/gpr/log.cc +96 -0
  269. data/src/core/lib/gpr/log_android.cc +72 -0
  270. data/src/core/lib/gpr/log_linux.cc +93 -0
  271. data/src/core/lib/gpr/log_posix.cc +90 -0
  272. data/src/core/lib/gpr/log_windows.cc +97 -0
  273. data/src/core/lib/gpr/mpscq.cc +117 -0
  274. data/src/core/lib/gpr/mpscq.h +86 -0
  275. data/src/core/lib/gpr/murmur_hash.cc +80 -0
  276. data/src/core/lib/gpr/murmur_hash.h +29 -0
  277. data/src/core/lib/gpr/spinlock.h +46 -0
  278. data/src/core/lib/gpr/string.cc +319 -0
  279. data/src/core/lib/gpr/string.h +109 -0
  280. data/src/core/lib/gpr/string_posix.cc +72 -0
  281. data/src/core/lib/gpr/string_util_windows.cc +82 -0
  282. data/src/core/lib/gpr/string_windows.cc +69 -0
  283. data/src/core/lib/gpr/string_windows.h +32 -0
  284. data/src/core/lib/gpr/sync.cc +124 -0
  285. data/src/core/lib/gpr/sync_posix.cc +107 -0
  286. data/src/core/lib/gpr/sync_windows.cc +118 -0
  287. data/src/core/lib/gpr/time.cc +251 -0
  288. data/src/core/lib/gpr/time_posix.cc +167 -0
  289. data/src/core/lib/gpr/time_precise.cc +78 -0
  290. data/src/core/lib/gpr/time_precise.h +29 -0
  291. data/src/core/lib/gpr/time_windows.cc +98 -0
  292. data/src/core/lib/gpr/tls.h +68 -0
  293. data/src/core/lib/gpr/tls_gcc.h +52 -0
  294. data/src/core/lib/gpr/tls_msvc.h +52 -0
  295. data/src/core/lib/gpr/tls_pthread.cc +30 -0
  296. data/src/core/lib/gpr/tls_pthread.h +56 -0
  297. data/src/core/lib/gpr/tmpfile.h +32 -0
  298. data/src/core/lib/gpr/tmpfile_msys.cc +58 -0
  299. data/src/core/lib/gpr/tmpfile_posix.cc +70 -0
  300. data/src/core/lib/gpr/tmpfile_windows.cc +69 -0
  301. data/src/core/lib/gpr/useful.h +65 -0
  302. data/src/core/lib/gpr/wrap_memcpy.cc +42 -0
  303. data/src/core/lib/gprpp/abstract.h +34 -0
  304. data/src/core/lib/gprpp/atomic.h +30 -0
  305. data/src/core/lib/gprpp/atomic_with_atm.h +57 -0
  306. data/src/core/lib/gprpp/atomic_with_std.h +35 -0
  307. data/src/core/lib/gprpp/debug_location.h +52 -0
  308. data/src/core/lib/gprpp/inlined_vector.h +136 -0
  309. data/src/core/lib/gprpp/manual_constructor.h +213 -0
  310. data/src/core/lib/gprpp/memory.h +111 -0
  311. data/src/core/lib/gprpp/orphanable.h +199 -0
  312. data/src/core/lib/gprpp/ref_counted.h +169 -0
  313. data/src/core/lib/gprpp/ref_counted_ptr.h +112 -0
  314. data/src/core/lib/gprpp/thd.h +135 -0
  315. data/src/core/lib/gprpp/thd_posix.cc +209 -0
  316. data/src/core/lib/gprpp/thd_windows.cc +162 -0
  317. data/src/core/lib/http/format_request.cc +122 -0
  318. data/src/core/lib/http/format_request.h +34 -0
  319. data/src/core/lib/http/httpcli.cc +303 -0
  320. data/src/core/lib/http/httpcli.h +127 -0
  321. data/src/core/lib/http/httpcli_security_connector.cc +202 -0
  322. data/src/core/lib/http/parser.cc +371 -0
  323. data/src/core/lib/http/parser.h +113 -0
  324. data/src/core/lib/iomgr/block_annotate.h +57 -0
  325. data/src/core/lib/iomgr/call_combiner.cc +212 -0
  326. data/src/core/lib/iomgr/call_combiner.h +112 -0
  327. data/src/core/lib/iomgr/closure.h +351 -0
  328. data/src/core/lib/iomgr/combiner.cc +358 -0
  329. data/src/core/lib/iomgr/combiner.h +66 -0
  330. data/src/core/lib/iomgr/endpoint.cc +63 -0
  331. data/src/core/lib/iomgr/endpoint.h +98 -0
  332. data/src/core/lib/iomgr/endpoint_pair.h +34 -0
  333. data/src/core/lib/iomgr/endpoint_pair_posix.cc +73 -0
  334. data/src/core/lib/iomgr/endpoint_pair_uv.cc +40 -0
  335. data/src/core/lib/iomgr/endpoint_pair_windows.cc +87 -0
  336. data/src/core/lib/iomgr/error.cc +793 -0
  337. data/src/core/lib/iomgr/error.h +207 -0
  338. data/src/core/lib/iomgr/error_internal.h +63 -0
  339. data/src/core/lib/iomgr/ev_epoll1_linux.cc +1248 -0
  340. data/src/core/lib/iomgr/ev_epoll1_linux.h +31 -0
  341. data/src/core/lib/iomgr/ev_epollex_linux.cc +1494 -0
  342. data/src/core/lib/iomgr/ev_epollex_linux.h +30 -0
  343. data/src/core/lib/iomgr/ev_epollsig_linux.cc +1735 -0
  344. data/src/core/lib/iomgr/ev_epollsig_linux.h +35 -0
  345. data/src/core/lib/iomgr/ev_poll_posix.cc +1758 -0
  346. data/src/core/lib/iomgr/ev_poll_posix.h +29 -0
  347. data/src/core/lib/iomgr/ev_posix.cc +330 -0
  348. data/src/core/lib/iomgr/ev_posix.h +145 -0
  349. data/src/core/lib/iomgr/ev_windows.cc +30 -0
  350. data/src/core/lib/iomgr/exec_ctx.cc +147 -0
  351. data/src/core/lib/iomgr/exec_ctx.h +210 -0
  352. data/src/core/lib/iomgr/executor.cc +301 -0
  353. data/src/core/lib/iomgr/executor.h +50 -0
  354. data/src/core/lib/iomgr/fork_posix.cc +89 -0
  355. data/src/core/lib/iomgr/fork_windows.cc +41 -0
  356. data/src/core/lib/iomgr/gethostname.h +26 -0
  357. data/src/core/lib/iomgr/gethostname_fallback.cc +30 -0
  358. data/src/core/lib/iomgr/gethostname_host_name_max.cc +40 -0
  359. data/src/core/lib/iomgr/gethostname_sysconf.cc +40 -0
  360. data/src/core/lib/iomgr/iocp_windows.cc +152 -0
  361. data/src/core/lib/iomgr/iocp_windows.h +48 -0
  362. data/src/core/lib/iomgr/iomgr.cc +178 -0
  363. data/src/core/lib/iomgr/iomgr.h +36 -0
  364. data/src/core/lib/iomgr/iomgr_custom.cc +63 -0
  365. data/src/core/lib/iomgr/iomgr_custom.h +47 -0
  366. data/src/core/lib/iomgr/iomgr_internal.cc +43 -0
  367. data/src/core/lib/iomgr/iomgr_internal.h +57 -0
  368. data/src/core/lib/iomgr/iomgr_posix.cc +67 -0
  369. data/src/core/lib/iomgr/iomgr_posix.h +26 -0
  370. data/src/core/lib/iomgr/iomgr_uv.cc +40 -0
  371. data/src/core/lib/iomgr/iomgr_windows.cc +87 -0
  372. data/src/core/lib/iomgr/is_epollexclusive_available.cc +104 -0
  373. data/src/core/lib/iomgr/is_epollexclusive_available.h +36 -0
  374. data/src/core/lib/iomgr/load_file.cc +80 -0
  375. data/src/core/lib/iomgr/load_file.h +35 -0
  376. data/src/core/lib/iomgr/lockfree_event.cc +250 -0
  377. data/src/core/lib/iomgr/lockfree_event.h +72 -0
  378. data/src/core/lib/iomgr/nameser.h +106 -0
  379. data/src/core/lib/iomgr/network_status_tracker.cc +36 -0
  380. data/src/core/lib/iomgr/network_status_tracker.h +32 -0
  381. data/src/core/lib/iomgr/polling_entity.cc +87 -0
  382. data/src/core/lib/iomgr/polling_entity.h +68 -0
  383. data/src/core/lib/iomgr/pollset.cc +56 -0
  384. data/src/core/lib/iomgr/pollset.h +99 -0
  385. data/src/core/lib/iomgr/pollset_custom.cc +106 -0
  386. data/src/core/lib/iomgr/pollset_custom.h +35 -0
  387. data/src/core/lib/iomgr/pollset_set.cc +55 -0
  388. data/src/core/lib/iomgr/pollset_set.h +55 -0
  389. data/src/core/lib/iomgr/pollset_set_custom.cc +48 -0
  390. data/src/core/lib/iomgr/pollset_set_custom.h +26 -0
  391. data/src/core/lib/iomgr/pollset_set_windows.cc +51 -0
  392. data/src/core/lib/iomgr/pollset_set_windows.h +26 -0
  393. data/src/core/lib/iomgr/pollset_uv.cc +93 -0
  394. data/src/core/lib/iomgr/pollset_windows.cc +229 -0
  395. data/src/core/lib/iomgr/pollset_windows.h +70 -0
  396. data/src/core/lib/iomgr/port.h +147 -0
  397. data/src/core/lib/iomgr/resolve_address.cc +50 -0
  398. data/src/core/lib/iomgr/resolve_address.h +83 -0
  399. data/src/core/lib/iomgr/resolve_address_custom.cc +187 -0
  400. data/src/core/lib/iomgr/resolve_address_custom.h +43 -0
  401. data/src/core/lib/iomgr/resolve_address_posix.cc +180 -0
  402. data/src/core/lib/iomgr/resolve_address_windows.cc +165 -0
  403. data/src/core/lib/iomgr/resource_quota.cc +871 -0
  404. data/src/core/lib/iomgr/resource_quota.h +142 -0
  405. data/src/core/lib/iomgr/sockaddr.h +32 -0
  406. data/src/core/lib/iomgr/sockaddr_custom.h +54 -0
  407. data/src/core/lib/iomgr/sockaddr_posix.h +55 -0
  408. data/src/core/lib/iomgr/sockaddr_utils.cc +298 -0
  409. data/src/core/lib/iomgr/sockaddr_utils.h +84 -0
  410. data/src/core/lib/iomgr/sockaddr_windows.h +55 -0
  411. data/src/core/lib/iomgr/socket_factory_posix.cc +94 -0
  412. data/src/core/lib/iomgr/socket_factory_posix.h +69 -0
  413. data/src/core/lib/iomgr/socket_mutator.cc +83 -0
  414. data/src/core/lib/iomgr/socket_mutator.h +61 -0
  415. data/src/core/lib/iomgr/socket_utils.h +38 -0
  416. data/src/core/lib/iomgr/socket_utils_common_posix.cc +327 -0
  417. data/src/core/lib/iomgr/socket_utils_linux.cc +43 -0
  418. data/src/core/lib/iomgr/socket_utils_posix.cc +59 -0
  419. data/src/core/lib/iomgr/socket_utils_posix.h +134 -0
  420. data/src/core/lib/iomgr/socket_utils_uv.cc +45 -0
  421. data/src/core/lib/iomgr/socket_utils_windows.cc +43 -0
  422. data/src/core/lib/iomgr/socket_windows.cc +151 -0
  423. data/src/core/lib/iomgr/socket_windows.h +113 -0
  424. data/src/core/lib/iomgr/sys_epoll_wrapper.h +30 -0
  425. data/src/core/lib/iomgr/tcp_client.cc +36 -0
  426. data/src/core/lib/iomgr/tcp_client.h +52 -0
  427. data/src/core/lib/iomgr/tcp_client_custom.cc +151 -0
  428. data/src/core/lib/iomgr/tcp_client_posix.cc +359 -0
  429. data/src/core/lib/iomgr/tcp_client_posix.h +68 -0
  430. data/src/core/lib/iomgr/tcp_client_windows.cc +231 -0
  431. data/src/core/lib/iomgr/tcp_custom.cc +365 -0
  432. data/src/core/lib/iomgr/tcp_custom.h +81 -0
  433. data/src/core/lib/iomgr/tcp_posix.cc +814 -0
  434. data/src/core/lib/iomgr/tcp_posix.h +57 -0
  435. data/src/core/lib/iomgr/tcp_server.cc +73 -0
  436. data/src/core/lib/iomgr/tcp_server.h +122 -0
  437. data/src/core/lib/iomgr/tcp_server_custom.cc +472 -0
  438. data/src/core/lib/iomgr/tcp_server_posix.cc +582 -0
  439. data/src/core/lib/iomgr/tcp_server_utils_posix.h +122 -0
  440. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +208 -0
  441. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +184 -0
  442. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +36 -0
  443. data/src/core/lib/iomgr/tcp_server_windows.cc +559 -0
  444. data/src/core/lib/iomgr/tcp_uv.cc +417 -0
  445. data/src/core/lib/iomgr/tcp_windows.cc +455 -0
  446. data/src/core/lib/iomgr/tcp_windows.h +51 -0
  447. data/src/core/lib/iomgr/time_averaged_stats.cc +64 -0
  448. data/src/core/lib/iomgr/time_averaged_stats.h +73 -0
  449. data/src/core/lib/iomgr/timer.cc +45 -0
  450. data/src/core/lib/iomgr/timer.h +125 -0
  451. data/src/core/lib/iomgr/timer_custom.cc +93 -0
  452. data/src/core/lib/iomgr/timer_custom.h +43 -0
  453. data/src/core/lib/iomgr/timer_generic.cc +663 -0
  454. data/src/core/lib/iomgr/timer_heap.cc +135 -0
  455. data/src/core/lib/iomgr/timer_heap.h +44 -0
  456. data/src/core/lib/iomgr/timer_manager.cc +347 -0
  457. data/src/core/lib/iomgr/timer_manager.h +39 -0
  458. data/src/core/lib/iomgr/timer_uv.cc +63 -0
  459. data/src/core/lib/iomgr/udp_server.cc +692 -0
  460. data/src/core/lib/iomgr/udp_server.h +103 -0
  461. data/src/core/lib/iomgr/unix_sockets_posix.cc +104 -0
  462. data/src/core/lib/iomgr/unix_sockets_posix.h +43 -0
  463. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +49 -0
  464. data/src/core/lib/iomgr/wakeup_fd_cv.cc +107 -0
  465. data/src/core/lib/iomgr/wakeup_fd_cv.h +69 -0
  466. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +83 -0
  467. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +38 -0
  468. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +100 -0
  469. data/src/core/lib/iomgr/wakeup_fd_pipe.h +28 -0
  470. data/src/core/lib/iomgr/wakeup_fd_posix.cc +87 -0
  471. data/src/core/lib/iomgr/wakeup_fd_posix.h +96 -0
  472. data/src/core/lib/json/json.cc +86 -0
  473. data/src/core/lib/json/json.h +94 -0
  474. data/src/core/lib/json/json_common.h +34 -0
  475. data/src/core/lib/json/json_reader.cc +663 -0
  476. data/src/core/lib/json/json_reader.h +146 -0
  477. data/src/core/lib/json/json_string.cc +367 -0
  478. data/src/core/lib/json/json_writer.cc +245 -0
  479. data/src/core/lib/json/json_writer.h +84 -0
  480. data/src/core/lib/profiling/basic_timers.cc +286 -0
  481. data/src/core/lib/profiling/stap_timers.cc +50 -0
  482. data/src/core/lib/profiling/timers.h +94 -0
  483. data/src/core/lib/security/context/security_context.cc +348 -0
  484. data/src/core/lib/security/context/security_context.h +115 -0
  485. data/src/core/lib/security/credentials/alts/alts_credentials.cc +119 -0
  486. data/src/core/lib/security/credentials/alts/alts_credentials.h +102 -0
  487. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +72 -0
  488. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +57 -0
  489. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +67 -0
  490. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +33 -0
  491. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +114 -0
  492. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +126 -0
  493. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +46 -0
  494. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +112 -0
  495. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +58 -0
  496. data/src/core/lib/security/credentials/composite/composite_credentials.cc +269 -0
  497. data/src/core/lib/security/credentials/composite/composite_credentials.h +59 -0
  498. data/src/core/lib/security/credentials/credentials.cc +286 -0
  499. data/src/core/lib/security/credentials/credentials.h +246 -0
  500. data/src/core/lib/security/credentials/credentials_metadata.cc +62 -0
  501. data/src/core/lib/security/credentials/fake/fake_credentials.cc +136 -0
  502. data/src/core/lib/security/credentials/fake/fake_credentials.h +64 -0
  503. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +41 -0
  504. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +322 -0
  505. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +45 -0
  506. data/src/core/lib/security/credentials/iam/iam_credentials.cc +86 -0
  507. data/src/core/lib/security/credentials/iam/iam_credentials.h +31 -0
  508. data/src/core/lib/security/credentials/jwt/json_token.cc +314 -0
  509. data/src/core/lib/security/credentials/jwt/json_token.h +75 -0
  510. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +190 -0
  511. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +49 -0
  512. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +934 -0
  513. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +123 -0
  514. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +532 -0
  515. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +106 -0
  516. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +271 -0
  517. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +46 -0
  518. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +349 -0
  519. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +54 -0
  520. data/src/core/lib/security/security_connector/alts_security_connector.cc +287 -0
  521. data/src/core/lib/security/security_connector/alts_security_connector.h +69 -0
  522. data/src/core/lib/security/security_connector/security_connector.cc +1200 -0
  523. data/src/core/lib/security/security_connector/security_connector.h +283 -0
  524. data/src/core/lib/security/transport/auth_filters.h +37 -0
  525. data/src/core/lib/security/transport/client_auth_filter.cc +418 -0
  526. data/src/core/lib/security/transport/secure_endpoint.cc +429 -0
  527. data/src/core/lib/security/transport/secure_endpoint.h +41 -0
  528. data/src/core/lib/security/transport/security_handshaker.cc +526 -0
  529. data/src/core/lib/security/transport/security_handshaker.h +34 -0
  530. data/src/core/lib/security/transport/server_auth_filter.cc +269 -0
  531. data/src/core/lib/security/transport/target_authority_table.cc +75 -0
  532. data/src/core/lib/security/transport/target_authority_table.h +40 -0
  533. data/src/core/lib/security/transport/tsi_error.cc +29 -0
  534. data/src/core/lib/security/transport/tsi_error.h +29 -0
  535. data/src/core/lib/security/util/json_util.cc +48 -0
  536. data/src/core/lib/security/util/json_util.h +42 -0
  537. data/src/core/lib/slice/b64.cc +240 -0
  538. data/src/core/lib/slice/b64.h +51 -0
  539. data/src/core/lib/slice/percent_encoding.cc +169 -0
  540. data/src/core/lib/slice/percent_encoding.h +65 -0
  541. data/src/core/lib/slice/slice.cc +489 -0
  542. data/src/core/lib/slice/slice_buffer.cc +359 -0
  543. data/src/core/lib/slice/slice_hash_table.h +201 -0
  544. data/src/core/lib/slice/slice_intern.cc +332 -0
  545. data/src/core/lib/slice/slice_internal.h +49 -0
  546. data/src/core/lib/slice/slice_string_helpers.cc +118 -0
  547. data/src/core/lib/slice/slice_string_helpers.h +47 -0
  548. data/src/core/lib/slice/slice_weak_hash_table.h +105 -0
  549. data/src/core/lib/surface/api_trace.cc +24 -0
  550. data/src/core/lib/surface/api_trace.h +52 -0
  551. data/src/core/lib/surface/byte_buffer.cc +92 -0
  552. data/src/core/lib/surface/byte_buffer_reader.cc +129 -0
  553. data/src/core/lib/surface/call.cc +2002 -0
  554. data/src/core/lib/surface/call.h +109 -0
  555. data/src/core/lib/surface/call_details.cc +42 -0
  556. data/src/core/lib/surface/call_log_batch.cc +120 -0
  557. data/src/core/lib/surface/call_test_only.h +43 -0
  558. data/src/core/lib/surface/channel.cc +450 -0
  559. data/src/core/lib/surface/channel.h +83 -0
  560. data/src/core/lib/surface/channel_init.cc +109 -0
  561. data/src/core/lib/surface/channel_init.h +73 -0
  562. data/src/core/lib/surface/channel_ping.cc +65 -0
  563. data/src/core/lib/surface/channel_stack_type.cc +58 -0
  564. data/src/core/lib/surface/channel_stack_type.h +47 -0
  565. data/src/core/lib/surface/completion_queue.cc +1262 -0
  566. data/src/core/lib/surface/completion_queue.h +93 -0
  567. data/src/core/lib/surface/completion_queue_factory.cc +79 -0
  568. data/src/core/lib/surface/completion_queue_factory.h +38 -0
  569. data/src/core/lib/surface/event_string.cc +68 -0
  570. data/src/core/lib/surface/event_string.h +29 -0
  571. data/src/core/lib/surface/init.cc +196 -0
  572. data/src/core/lib/surface/init.h +27 -0
  573. data/src/core/lib/surface/init_secure.cc +81 -0
  574. data/src/core/lib/surface/lame_client.cc +180 -0
  575. data/src/core/lib/surface/lame_client.h +28 -0
  576. data/src/core/lib/surface/metadata_array.cc +36 -0
  577. data/src/core/lib/surface/server.cc +1445 -0
  578. data/src/core/lib/surface/server.h +58 -0
  579. data/src/core/lib/surface/validate_metadata.cc +95 -0
  580. data/src/core/lib/surface/validate_metadata.h +30 -0
  581. data/src/core/lib/surface/version.cc +28 -0
  582. data/src/core/lib/transport/bdp_estimator.cc +87 -0
  583. data/src/core/lib/transport/bdp_estimator.h +94 -0
  584. data/src/core/lib/transport/byte_stream.cc +160 -0
  585. data/src/core/lib/transport/byte_stream.h +164 -0
  586. data/src/core/lib/transport/connectivity_state.cc +196 -0
  587. data/src/core/lib/transport/connectivity_state.h +87 -0
  588. data/src/core/lib/transport/error_utils.cc +118 -0
  589. data/src/core/lib/transport/error_utils.h +46 -0
  590. data/src/core/lib/transport/http2_errors.h +41 -0
  591. data/src/core/lib/transport/metadata.cc +539 -0
  592. data/src/core/lib/transport/metadata.h +165 -0
  593. data/src/core/lib/transport/metadata_batch.cc +329 -0
  594. data/src/core/lib/transport/metadata_batch.h +150 -0
  595. data/src/core/lib/transport/pid_controller.cc +51 -0
  596. data/src/core/lib/transport/pid_controller.h +116 -0
  597. data/src/core/lib/transport/service_config.cc +106 -0
  598. data/src/core/lib/transport/service_config.h +249 -0
  599. data/src/core/lib/transport/static_metadata.cc +601 -0
  600. data/src/core/lib/transport/static_metadata.h +603 -0
  601. data/src/core/lib/transport/status_conversion.cc +100 -0
  602. data/src/core/lib/transport/status_conversion.h +38 -0
  603. data/src/core/lib/transport/status_metadata.cc +54 -0
  604. data/src/core/lib/transport/status_metadata.h +30 -0
  605. data/src/core/lib/transport/timeout_encoding.cc +144 -0
  606. data/src/core/lib/transport/timeout_encoding.h +37 -0
  607. data/src/core/lib/transport/transport.cc +278 -0
  608. data/src/core/lib/transport/transport.h +378 -0
  609. data/src/core/lib/transport/transport_impl.h +71 -0
  610. data/src/core/lib/transport/transport_op_string.cc +214 -0
  611. data/src/core/plugin_registry/grpc_plugin_registry.cc +97 -0
  612. data/src/core/tsi/alts/crypt/aes_gcm.cc +687 -0
  613. data/src/core/tsi/alts/crypt/gsec.cc +189 -0
  614. data/src/core/tsi/alts/crypt/gsec.h +454 -0
  615. data/src/core/tsi/alts/frame_protector/alts_counter.cc +118 -0
  616. data/src/core/tsi/alts/frame_protector/alts_counter.h +98 -0
  617. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +66 -0
  618. data/src/core/tsi/alts/frame_protector/alts_crypter.h +255 -0
  619. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +407 -0
  620. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +55 -0
  621. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +114 -0
  622. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +114 -0
  623. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +105 -0
  624. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +103 -0
  625. data/src/core/tsi/alts/frame_protector/frame_handler.cc +218 -0
  626. data/src/core/tsi/alts/frame_protector/frame_handler.h +236 -0
  627. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +316 -0
  628. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +137 -0
  629. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc +520 -0
  630. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h +323 -0
  631. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc +143 -0
  632. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +149 -0
  633. data/src/core/tsi/alts/handshaker/alts_tsi_event.cc +73 -0
  634. data/src/core/tsi/alts/handshaker/alts_tsi_event.h +93 -0
  635. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +483 -0
  636. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +83 -0
  637. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +52 -0
  638. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +58 -0
  639. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +52 -0
  640. data/src/core/tsi/alts/handshaker/altscontext.pb.c +48 -0
  641. data/src/core/tsi/alts/handshaker/altscontext.pb.h +64 -0
  642. data/src/core/tsi/alts/handshaker/handshaker.pb.c +123 -0
  643. data/src/core/tsi/alts/handshaker/handshaker.pb.h +255 -0
  644. data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +50 -0
  645. data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +78 -0
  646. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +196 -0
  647. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +163 -0
  648. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +180 -0
  649. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +52 -0
  650. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +144 -0
  651. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +49 -0
  652. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +91 -0
  653. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +174 -0
  654. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +100 -0
  655. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +476 -0
  656. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +199 -0
  657. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +296 -0
  658. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +52 -0
  659. data/src/core/tsi/alts_transport_security.cc +63 -0
  660. data/src/core/tsi/alts_transport_security.h +47 -0
  661. data/src/core/tsi/fake_transport_security.cc +787 -0
  662. data/src/core/tsi/fake_transport_security.h +45 -0
  663. data/src/core/tsi/ssl/session_cache/ssl_session.h +73 -0
  664. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +58 -0
  665. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +211 -0
  666. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +93 -0
  667. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +76 -0
  668. data/src/core/tsi/ssl_transport_security.cc +1831 -0
  669. data/src/core/tsi/ssl_transport_security.h +314 -0
  670. data/src/core/tsi/ssl_types.h +42 -0
  671. data/src/core/tsi/transport_security.cc +326 -0
  672. data/src/core/tsi/transport_security.h +127 -0
  673. data/src/core/tsi/transport_security_adapter.cc +235 -0
  674. data/src/core/tsi/transport_security_adapter.h +41 -0
  675. data/src/core/tsi/transport_security_grpc.cc +66 -0
  676. data/src/core/tsi/transport_security_grpc.h +74 -0
  677. data/src/core/tsi/transport_security_interface.h +454 -0
  678. data/src/ruby/bin/apis/google/protobuf/empty.rb +29 -0
  679. data/src/ruby/bin/apis/pubsub_demo.rb +241 -0
  680. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +159 -0
  681. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +88 -0
  682. data/src/ruby/bin/math_client.rb +132 -0
  683. data/src/ruby/bin/math_pb.rb +32 -0
  684. data/src/ruby/bin/math_server.rb +191 -0
  685. data/src/ruby/bin/math_services_pb.rb +51 -0
  686. data/src/ruby/bin/noproto_client.rb +93 -0
  687. data/src/ruby/bin/noproto_server.rb +97 -0
  688. data/src/ruby/ext/grpc/extconf.rb +118 -0
  689. data/src/ruby/ext/grpc/rb_byte_buffer.c +64 -0
  690. data/src/ruby/ext/grpc/rb_byte_buffer.h +35 -0
  691. data/src/ruby/ext/grpc/rb_call.c +1041 -0
  692. data/src/ruby/ext/grpc/rb_call.h +53 -0
  693. data/src/ruby/ext/grpc/rb_call_credentials.c +290 -0
  694. data/src/ruby/ext/grpc/rb_call_credentials.h +31 -0
  695. data/src/ruby/ext/grpc/rb_channel.c +828 -0
  696. data/src/ruby/ext/grpc/rb_channel.h +34 -0
  697. data/src/ruby/ext/grpc/rb_channel_args.c +155 -0
  698. data/src/ruby/ext/grpc/rb_channel_args.h +38 -0
  699. data/src/ruby/ext/grpc/rb_channel_credentials.c +263 -0
  700. data/src/ruby/ext/grpc/rb_channel_credentials.h +32 -0
  701. data/src/ruby/ext/grpc/rb_completion_queue.c +100 -0
  702. data/src/ruby/ext/grpc/rb_completion_queue.h +36 -0
  703. data/src/ruby/ext/grpc/rb_compression_options.c +468 -0
  704. data/src/ruby/ext/grpc/rb_compression_options.h +29 -0
  705. data/src/ruby/ext/grpc/rb_event_thread.c +141 -0
  706. data/src/ruby/ext/grpc/rb_event_thread.h +21 -0
  707. data/src/ruby/ext/grpc/rb_grpc.c +340 -0
  708. data/src/ruby/ext/grpc/rb_grpc.h +72 -0
  709. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +507 -0
  710. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +766 -0
  711. data/src/ruby/ext/grpc/rb_loader.c +57 -0
  712. data/src/ruby/ext/grpc/rb_loader.h +25 -0
  713. data/src/ruby/ext/grpc/rb_server.c +366 -0
  714. data/src/ruby/ext/grpc/rb_server.h +32 -0
  715. data/src/ruby/ext/grpc/rb_server_credentials.c +243 -0
  716. data/src/ruby/ext/grpc/rb_server_credentials.h +32 -0
  717. data/src/ruby/lib/grpc/core/time_consts.rb +56 -0
  718. data/src/ruby/lib/grpc/errors.rb +201 -0
  719. data/src/ruby/lib/grpc/generic/active_call.rb +674 -0
  720. data/src/ruby/lib/grpc/generic/bidi_call.rb +233 -0
  721. data/src/ruby/lib/grpc/generic/client_stub.rb +501 -0
  722. data/src/ruby/lib/grpc/generic/interceptor_registry.rb +53 -0
  723. data/src/ruby/lib/grpc/generic/interceptors.rb +186 -0
  724. data/src/ruby/lib/grpc/generic/rpc_desc.rb +204 -0
  725. data/src/ruby/lib/grpc/generic/rpc_server.rb +490 -0
  726. data/src/ruby/lib/grpc/generic/service.rb +210 -0
  727. data/src/ruby/lib/grpc/google_rpc_status_utils.rb +35 -0
  728. data/src/ruby/lib/grpc/grpc.rb +24 -0
  729. data/src/ruby/lib/grpc/logconfig.rb +44 -0
  730. data/src/ruby/lib/grpc/notifier.rb +45 -0
  731. data/src/ruby/lib/grpc/version.rb +18 -0
  732. data/src/ruby/lib/grpc.rb +35 -0
  733. data/src/ruby/pb/README.md +42 -0
  734. data/src/ruby/pb/generate_proto_ruby.sh +43 -0
  735. data/src/ruby/pb/grpc/health/checker.rb +76 -0
  736. data/src/ruby/pb/grpc/health/v1/health_pb.rb +28 -0
  737. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +41 -0
  738. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +44 -0
  739. data/src/ruby/pb/grpc/testing/metrics_pb.rb +28 -0
  740. data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +49 -0
  741. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +15 -0
  742. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +82 -0
  743. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +14 -0
  744. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +102 -0
  745. data/src/ruby/pb/test/client.rb +764 -0
  746. data/src/ruby/pb/test/server.rb +252 -0
  747. data/src/ruby/spec/call_credentials_spec.rb +42 -0
  748. data/src/ruby/spec/call_spec.rb +180 -0
  749. data/src/ruby/spec/channel_connection_spec.rb +126 -0
  750. data/src/ruby/spec/channel_credentials_spec.rb +82 -0
  751. data/src/ruby/spec/channel_spec.rb +190 -0
  752. data/src/ruby/spec/client_auth_spec.rb +137 -0
  753. data/src/ruby/spec/client_server_spec.rb +664 -0
  754. data/src/ruby/spec/compression_options_spec.rb +149 -0
  755. data/src/ruby/spec/error_sanity_spec.rb +49 -0
  756. data/src/ruby/spec/generic/active_call_spec.rb +672 -0
  757. data/src/ruby/spec/generic/client_interceptors_spec.rb +153 -0
  758. data/src/ruby/spec/generic/client_stub_spec.rb +1067 -0
  759. data/src/ruby/spec/generic/interceptor_registry_spec.rb +65 -0
  760. data/src/ruby/spec/generic/rpc_desc_spec.rb +374 -0
  761. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +127 -0
  762. data/src/ruby/spec/generic/rpc_server_spec.rb +726 -0
  763. data/src/ruby/spec/generic/server_interceptors_spec.rb +218 -0
  764. data/src/ruby/spec/generic/service_spec.rb +261 -0
  765. data/src/ruby/spec/google_rpc_status_utils_spec.rb +293 -0
  766. data/src/ruby/spec/pb/duplicate/codegen_spec.rb +56 -0
  767. data/src/ruby/spec/pb/health/checker_spec.rb +236 -0
  768. data/src/ruby/spec/pb/package_with_underscore/checker_spec.rb +54 -0
  769. data/src/ruby/spec/pb/package_with_underscore/data.proto +23 -0
  770. data/src/ruby/spec/pb/package_with_underscore/service.proto +23 -0
  771. data/src/ruby/spec/server_credentials_spec.rb +79 -0
  772. data/src/ruby/spec/server_spec.rb +209 -0
  773. data/src/ruby/spec/spec_helper.rb +60 -0
  774. data/src/ruby/spec/support/helpers.rb +107 -0
  775. data/src/ruby/spec/support/services.rb +147 -0
  776. data/src/ruby/spec/testdata/README +1 -0
  777. data/src/ruby/spec/testdata/ca.pem +15 -0
  778. data/src/ruby/spec/testdata/client.key +16 -0
  779. data/src/ruby/spec/testdata/client.pem +14 -0
  780. data/src/ruby/spec/testdata/server1.key +16 -0
  781. data/src/ruby/spec/testdata/server1.pem +16 -0
  782. data/src/ruby/spec/time_consts_spec.rb +74 -0
  783. data/third_party/address_sorting/address_sorting.c +369 -0
  784. data/third_party/address_sorting/address_sorting_internal.h +70 -0
  785. data/third_party/address_sorting/address_sorting_posix.c +97 -0
  786. data/third_party/address_sorting/address_sorting_windows.c +55 -0
  787. data/third_party/address_sorting/include/address_sorting/address_sorting.h +110 -0
  788. data/third_party/boringssl/crypto/asn1/a_bitstr.c +271 -0
  789. data/third_party/boringssl/crypto/asn1/a_bool.c +110 -0
  790. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +297 -0
  791. data/third_party/boringssl/crypto/asn1/a_dup.c +111 -0
  792. data/third_party/boringssl/crypto/asn1/a_enum.c +195 -0
  793. data/third_party/boringssl/crypto/asn1/a_gentm.c +261 -0
  794. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +150 -0
  795. data/third_party/boringssl/crypto/asn1/a_int.c +474 -0
  796. data/third_party/boringssl/crypto/asn1/a_mbstr.c +409 -0
  797. data/third_party/boringssl/crypto/asn1/a_object.c +275 -0
  798. data/third_party/boringssl/crypto/asn1/a_octet.c +77 -0
  799. data/third_party/boringssl/crypto/asn1/a_print.c +93 -0
  800. data/third_party/boringssl/crypto/asn1/a_strnid.c +312 -0
  801. data/third_party/boringssl/crypto/asn1/a_time.c +213 -0
  802. data/third_party/boringssl/crypto/asn1/a_type.c +151 -0
  803. data/third_party/boringssl/crypto/asn1/a_utctm.c +303 -0
  804. data/third_party/boringssl/crypto/asn1/a_utf8.c +234 -0
  805. data/third_party/boringssl/crypto/asn1/asn1_lib.c +442 -0
  806. data/third_party/boringssl/crypto/asn1/asn1_locl.h +101 -0
  807. data/third_party/boringssl/crypto/asn1/asn1_par.c +80 -0
  808. data/third_party/boringssl/crypto/asn1/asn_pack.c +105 -0
  809. data/third_party/boringssl/crypto/asn1/f_enum.c +93 -0
  810. data/third_party/boringssl/crypto/asn1/f_int.c +97 -0
  811. data/third_party/boringssl/crypto/asn1/f_string.c +91 -0
  812. data/third_party/boringssl/crypto/asn1/tasn_dec.c +1223 -0
  813. data/third_party/boringssl/crypto/asn1/tasn_enc.c +662 -0
  814. data/third_party/boringssl/crypto/asn1/tasn_fre.c +244 -0
  815. data/third_party/boringssl/crypto/asn1/tasn_new.c +387 -0
  816. data/third_party/boringssl/crypto/asn1/tasn_typ.c +131 -0
  817. data/third_party/boringssl/crypto/asn1/tasn_utl.c +280 -0
  818. data/third_party/boringssl/crypto/asn1/time_support.c +206 -0
  819. data/third_party/boringssl/crypto/base64/base64.c +466 -0
  820. data/third_party/boringssl/crypto/bio/bio.c +636 -0
  821. data/third_party/boringssl/crypto/bio/bio_mem.c +330 -0
  822. data/third_party/boringssl/crypto/bio/connect.c +542 -0
  823. data/third_party/boringssl/crypto/bio/fd.c +275 -0
  824. data/third_party/boringssl/crypto/bio/file.c +313 -0
  825. data/third_party/boringssl/crypto/bio/hexdump.c +192 -0
  826. data/third_party/boringssl/crypto/bio/internal.h +111 -0
  827. data/third_party/boringssl/crypto/bio/pair.c +489 -0
  828. data/third_party/boringssl/crypto/bio/printf.c +115 -0
  829. data/third_party/boringssl/crypto/bio/socket.c +202 -0
  830. data/third_party/boringssl/crypto/bio/socket_helper.c +114 -0
  831. data/third_party/boringssl/crypto/bn_extra/bn_asn1.c +64 -0
  832. data/third_party/boringssl/crypto/bn_extra/convert.c +465 -0
  833. data/third_party/boringssl/crypto/buf/buf.c +231 -0
  834. data/third_party/boringssl/crypto/bytestring/asn1_compat.c +52 -0
  835. data/third_party/boringssl/crypto/bytestring/ber.c +264 -0
  836. data/third_party/boringssl/crypto/bytestring/cbb.c +568 -0
  837. data/third_party/boringssl/crypto/bytestring/cbs.c +487 -0
  838. data/third_party/boringssl/crypto/bytestring/internal.h +75 -0
  839. data/third_party/boringssl/crypto/chacha/chacha.c +167 -0
  840. data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +114 -0
  841. data/third_party/boringssl/crypto/cipher_extra/derive_key.c +152 -0
  842. data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +281 -0
  843. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +867 -0
  844. data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +326 -0
  845. data/third_party/boringssl/crypto/cipher_extra/e_null.c +85 -0
  846. data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +460 -0
  847. data/third_party/boringssl/crypto/cipher_extra/e_rc4.c +87 -0
  848. data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +460 -0
  849. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +681 -0
  850. data/third_party/boringssl/crypto/cipher_extra/internal.h +128 -0
  851. data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +482 -0
  852. data/third_party/boringssl/crypto/cmac/cmac.c +241 -0
  853. data/third_party/boringssl/crypto/conf/conf.c +803 -0
  854. data/third_party/boringssl/crypto/conf/conf_def.h +127 -0
  855. data/third_party/boringssl/crypto/conf/internal.h +31 -0
  856. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
  857. data/third_party/boringssl/crypto/cpu-arm-linux.c +363 -0
  858. data/third_party/boringssl/crypto/cpu-arm.c +38 -0
  859. data/third_party/boringssl/crypto/cpu-intel.c +288 -0
  860. data/third_party/boringssl/crypto/cpu-ppc64le.c +38 -0
  861. data/third_party/boringssl/crypto/crypto.c +198 -0
  862. data/third_party/boringssl/crypto/curve25519/spake25519.c +539 -0
  863. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +247 -0
  864. data/third_party/boringssl/crypto/dh/check.c +217 -0
  865. data/third_party/boringssl/crypto/dh/dh.c +519 -0
  866. data/third_party/boringssl/crypto/dh/dh_asn1.c +160 -0
  867. data/third_party/boringssl/crypto/dh/params.c +93 -0
  868. data/third_party/boringssl/crypto/digest_extra/digest_extra.c +240 -0
  869. data/third_party/boringssl/crypto/dsa/dsa.c +984 -0
  870. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +339 -0
  871. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +563 -0
  872. data/third_party/boringssl/crypto/ecdh/ecdh.c +161 -0
  873. data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +275 -0
  874. data/third_party/boringssl/crypto/engine/engine.c +98 -0
  875. data/third_party/boringssl/crypto/err/err.c +847 -0
  876. data/third_party/boringssl/crypto/err/internal.h +58 -0
  877. data/third_party/boringssl/crypto/evp/digestsign.c +231 -0
  878. data/third_party/boringssl/crypto/evp/evp.c +362 -0
  879. data/third_party/boringssl/crypto/evp/evp_asn1.c +337 -0
  880. data/third_party/boringssl/crypto/evp/evp_ctx.c +446 -0
  881. data/third_party/boringssl/crypto/evp/internal.h +252 -0
  882. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +268 -0
  883. data/third_party/boringssl/crypto/evp/p_ec.c +239 -0
  884. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +256 -0
  885. data/third_party/boringssl/crypto/evp/p_ed25519.c +71 -0
  886. data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +190 -0
  887. data/third_party/boringssl/crypto/evp/p_rsa.c +634 -0
  888. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +189 -0
  889. data/third_party/boringssl/crypto/evp/pbkdf.c +146 -0
  890. data/third_party/boringssl/crypto/evp/print.c +489 -0
  891. data/third_party/boringssl/crypto/evp/scrypt.c +209 -0
  892. data/third_party/boringssl/crypto/evp/sign.c +151 -0
  893. data/third_party/boringssl/crypto/ex_data.c +261 -0
  894. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +1100 -0
  895. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +100 -0
  896. data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +138 -0
  897. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +112 -0
  898. data/third_party/boringssl/crypto/fipsmodule/bcm.c +679 -0
  899. data/third_party/boringssl/crypto/fipsmodule/bn/add.c +371 -0
  900. data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +540 -0
  901. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +370 -0
  902. data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +269 -0
  903. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +254 -0
  904. data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +303 -0
  905. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +733 -0
  906. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +1390 -0
  907. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +627 -0
  908. data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +710 -0
  909. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +413 -0
  910. data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +146 -0
  911. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +483 -0
  912. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +207 -0
  913. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +902 -0
  914. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +894 -0
  915. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +299 -0
  916. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +254 -0
  917. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +53 -0
  918. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +305 -0
  919. data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +502 -0
  920. data/third_party/boringssl/crypto/fipsmodule/cipher/aead.c +284 -0
  921. data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +615 -0
  922. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +1437 -0
  923. data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +233 -0
  924. data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +129 -0
  925. data/third_party/boringssl/crypto/fipsmodule/delocate.h +88 -0
  926. data/third_party/boringssl/crypto/fipsmodule/des/des.c +785 -0
  927. data/third_party/boringssl/crypto/fipsmodule/des/internal.h +238 -0
  928. data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +256 -0
  929. data/third_party/boringssl/crypto/fipsmodule/digest/digests.c +280 -0
  930. data/third_party/boringssl/crypto/fipsmodule/digest/internal.h +112 -0
  931. data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +268 -0
  932. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +943 -0
  933. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +517 -0
  934. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +277 -0
  935. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +316 -0
  936. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +404 -0
  937. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +1131 -0
  938. data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +1674 -0
  939. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9543 -0
  940. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +456 -0
  941. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +113 -0
  942. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +1052 -0
  943. data/third_party/boringssl/crypto/fipsmodule/ec/util-64.c +109 -0
  944. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +474 -0
  945. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +442 -0
  946. data/third_party/boringssl/crypto/fipsmodule/hmac/hmac.c +228 -0
  947. data/third_party/boringssl/crypto/fipsmodule/is_fips.c +27 -0
  948. data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +254 -0
  949. data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +298 -0
  950. data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +211 -0
  951. data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +234 -0
  952. data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +220 -0
  953. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +1063 -0
  954. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +384 -0
  955. data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +95 -0
  956. data/third_party/boringssl/crypto/fipsmodule/modes/polyval.c +91 -0
  957. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +200 -0
  958. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +92 -0
  959. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +358 -0
  960. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +302 -0
  961. data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +263 -0
  962. data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +131 -0
  963. data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +692 -0
  964. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +857 -0
  965. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +1051 -0
  966. data/third_party/boringssl/crypto/fipsmodule/sha/sha1-altivec.c +361 -0
  967. data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +375 -0
  968. data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +337 -0
  969. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +608 -0
  970. data/third_party/boringssl/crypto/hkdf/hkdf.c +112 -0
  971. data/third_party/boringssl/crypto/internal.h +676 -0
  972. data/third_party/boringssl/crypto/lhash/lhash.c +336 -0
  973. data/third_party/boringssl/crypto/mem.c +237 -0
  974. data/third_party/boringssl/crypto/obj/obj.c +621 -0
  975. data/third_party/boringssl/crypto/obj/obj_dat.h +6244 -0
  976. data/third_party/boringssl/crypto/obj/obj_xref.c +122 -0
  977. data/third_party/boringssl/crypto/pem/pem_all.c +262 -0
  978. data/third_party/boringssl/crypto/pem/pem_info.c +379 -0
  979. data/third_party/boringssl/crypto/pem/pem_lib.c +776 -0
  980. data/third_party/boringssl/crypto/pem/pem_oth.c +88 -0
  981. data/third_party/boringssl/crypto/pem/pem_pk8.c +258 -0
  982. data/third_party/boringssl/crypto/pem/pem_pkey.c +227 -0
  983. data/third_party/boringssl/crypto/pem/pem_x509.c +65 -0
  984. data/third_party/boringssl/crypto/pem/pem_xaux.c +65 -0
  985. data/third_party/boringssl/crypto/pkcs7/internal.h +49 -0
  986. data/third_party/boringssl/crypto/pkcs7/pkcs7.c +166 -0
  987. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +233 -0
  988. data/third_party/boringssl/crypto/pkcs8/internal.h +120 -0
  989. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +307 -0
  990. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +513 -0
  991. data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +789 -0
  992. data/third_party/boringssl/crypto/poly1305/internal.h +41 -0
  993. data/third_party/boringssl/crypto/poly1305/poly1305.c +318 -0
  994. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +304 -0
  995. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +839 -0
  996. data/third_party/boringssl/crypto/pool/internal.h +45 -0
  997. data/third_party/boringssl/crypto/pool/pool.c +200 -0
  998. data/third_party/boringssl/crypto/rand_extra/deterministic.c +48 -0
  999. data/third_party/boringssl/crypto/rand_extra/forkunsafe.c +46 -0
  1000. data/third_party/boringssl/crypto/rand_extra/fuchsia.c +43 -0
  1001. data/third_party/boringssl/crypto/rand_extra/rand_extra.c +70 -0
  1002. data/third_party/boringssl/crypto/rand_extra/windows.c +53 -0
  1003. data/third_party/boringssl/crypto/rc4/rc4.c +98 -0
  1004. data/third_party/boringssl/crypto/refcount_c11.c +67 -0
  1005. data/third_party/boringssl/crypto/refcount_lock.c +53 -0
  1006. data/third_party/boringssl/crypto/rsa_extra/rsa_asn1.c +325 -0
  1007. data/third_party/boringssl/crypto/stack/stack.c +380 -0
  1008. data/third_party/boringssl/crypto/thread.c +110 -0
  1009. data/third_party/boringssl/crypto/thread_none.c +59 -0
  1010. data/third_party/boringssl/crypto/thread_pthread.c +176 -0
  1011. data/third_party/boringssl/crypto/thread_win.c +237 -0
  1012. data/third_party/boringssl/crypto/x509/a_digest.c +96 -0
  1013. data/third_party/boringssl/crypto/x509/a_sign.c +128 -0
  1014. data/third_party/boringssl/crypto/x509/a_strex.c +633 -0
  1015. data/third_party/boringssl/crypto/x509/a_verify.c +115 -0
  1016. data/third_party/boringssl/crypto/x509/algorithm.c +153 -0
  1017. data/third_party/boringssl/crypto/x509/asn1_gen.c +841 -0
  1018. data/third_party/boringssl/crypto/x509/by_dir.c +451 -0
  1019. data/third_party/boringssl/crypto/x509/by_file.c +274 -0
  1020. data/third_party/boringssl/crypto/x509/charmap.h +15 -0
  1021. data/third_party/boringssl/crypto/x509/i2d_pr.c +83 -0
  1022. data/third_party/boringssl/crypto/x509/internal.h +66 -0
  1023. data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
  1024. data/third_party/boringssl/crypto/x509/t_crl.c +128 -0
  1025. data/third_party/boringssl/crypto/x509/t_req.c +246 -0
  1026. data/third_party/boringssl/crypto/x509/t_x509.c +547 -0
  1027. data/third_party/boringssl/crypto/x509/t_x509a.c +111 -0
  1028. data/third_party/boringssl/crypto/x509/vpm_int.h +70 -0
  1029. data/third_party/boringssl/crypto/x509/x509.c +157 -0
  1030. data/third_party/boringssl/crypto/x509/x509_att.c +381 -0
  1031. data/third_party/boringssl/crypto/x509/x509_cmp.c +477 -0
  1032. data/third_party/boringssl/crypto/x509/x509_d2.c +106 -0
  1033. data/third_party/boringssl/crypto/x509/x509_def.c +103 -0
  1034. data/third_party/boringssl/crypto/x509/x509_ext.c +206 -0
  1035. data/third_party/boringssl/crypto/x509/x509_lu.c +725 -0
  1036. data/third_party/boringssl/crypto/x509/x509_obj.c +198 -0
  1037. data/third_party/boringssl/crypto/x509/x509_r2x.c +117 -0
  1038. data/third_party/boringssl/crypto/x509/x509_req.c +322 -0
  1039. data/third_party/boringssl/crypto/x509/x509_set.c +164 -0
  1040. data/third_party/boringssl/crypto/x509/x509_trs.c +326 -0
  1041. data/third_party/boringssl/crypto/x509/x509_txt.c +205 -0
  1042. data/third_party/boringssl/crypto/x509/x509_v3.c +278 -0
  1043. data/third_party/boringssl/crypto/x509/x509_vfy.c +2472 -0
  1044. data/third_party/boringssl/crypto/x509/x509_vpm.c +648 -0
  1045. data/third_party/boringssl/crypto/x509/x509cset.c +170 -0
  1046. data/third_party/boringssl/crypto/x509/x509name.c +389 -0
  1047. data/third_party/boringssl/crypto/x509/x509rset.c +81 -0
  1048. data/third_party/boringssl/crypto/x509/x509spki.c +137 -0
  1049. data/third_party/boringssl/crypto/x509/x_algor.c +151 -0
  1050. data/third_party/boringssl/crypto/x509/x_all.c +501 -0
  1051. data/third_party/boringssl/crypto/x509/x_attrib.c +111 -0
  1052. data/third_party/boringssl/crypto/x509/x_crl.c +541 -0
  1053. data/third_party/boringssl/crypto/x509/x_exten.c +75 -0
  1054. data/third_party/boringssl/crypto/x509/x_info.c +98 -0
  1055. data/third_party/boringssl/crypto/x509/x_name.c +541 -0
  1056. data/third_party/boringssl/crypto/x509/x_pkey.c +106 -0
  1057. data/third_party/boringssl/crypto/x509/x_pubkey.c +368 -0
  1058. data/third_party/boringssl/crypto/x509/x_req.c +109 -0
  1059. data/third_party/boringssl/crypto/x509/x_sig.c +69 -0
  1060. data/third_party/boringssl/crypto/x509/x_spki.c +80 -0
  1061. data/third_party/boringssl/crypto/x509/x_val.c +69 -0
  1062. data/third_party/boringssl/crypto/x509/x_x509.c +328 -0
  1063. data/third_party/boringssl/crypto/x509/x_x509a.c +198 -0
  1064. data/third_party/boringssl/crypto/x509v3/ext_dat.h +143 -0
  1065. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +284 -0
  1066. data/third_party/boringssl/crypto/x509v3/pcy_data.c +130 -0
  1067. data/third_party/boringssl/crypto/x509v3/pcy_int.h +217 -0
  1068. data/third_party/boringssl/crypto/x509v3/pcy_lib.c +155 -0
  1069. data/third_party/boringssl/crypto/x509v3/pcy_map.c +130 -0
  1070. data/third_party/boringssl/crypto/x509v3/pcy_node.c +188 -0
  1071. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +840 -0
  1072. data/third_party/boringssl/crypto/x509v3/v3_akey.c +204 -0
  1073. data/third_party/boringssl/crypto/x509v3/v3_akeya.c +72 -0
  1074. data/third_party/boringssl/crypto/x509v3/v3_alt.c +623 -0
  1075. data/third_party/boringssl/crypto/x509v3/v3_bcons.c +133 -0
  1076. data/third_party/boringssl/crypto/x509v3/v3_bitst.c +141 -0
  1077. data/third_party/boringssl/crypto/x509v3/v3_conf.c +462 -0
  1078. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +502 -0
  1079. data/third_party/boringssl/crypto/x509v3/v3_crld.c +561 -0
  1080. data/third_party/boringssl/crypto/x509v3/v3_enum.c +100 -0
  1081. data/third_party/boringssl/crypto/x509v3/v3_extku.c +148 -0
  1082. data/third_party/boringssl/crypto/x509v3/v3_genn.c +251 -0
  1083. data/third_party/boringssl/crypto/x509v3/v3_ia5.c +122 -0
  1084. data/third_party/boringssl/crypto/x509v3/v3_info.c +219 -0
  1085. data/third_party/boringssl/crypto/x509v3/v3_int.c +91 -0
  1086. data/third_party/boringssl/crypto/x509v3/v3_lib.c +370 -0
  1087. data/third_party/boringssl/crypto/x509v3/v3_ncons.c +501 -0
  1088. data/third_party/boringssl/crypto/x509v3/v3_pci.c +287 -0
  1089. data/third_party/boringssl/crypto/x509v3/v3_pcia.c +57 -0
  1090. data/third_party/boringssl/crypto/x509v3/v3_pcons.c +139 -0
  1091. data/third_party/boringssl/crypto/x509v3/v3_pku.c +110 -0
  1092. data/third_party/boringssl/crypto/x509v3/v3_pmaps.c +154 -0
  1093. data/third_party/boringssl/crypto/x509v3/v3_prn.c +229 -0
  1094. data/third_party/boringssl/crypto/x509v3/v3_purp.c +866 -0
  1095. data/third_party/boringssl/crypto/x509v3/v3_skey.c +152 -0
  1096. data/third_party/boringssl/crypto/x509v3/v3_sxnet.c +274 -0
  1097. data/third_party/boringssl/crypto/x509v3/v3_utl.c +1352 -0
  1098. data/third_party/boringssl/include/openssl/aead.h +423 -0
  1099. data/third_party/boringssl/include/openssl/aes.h +170 -0
  1100. data/third_party/boringssl/include/openssl/arm_arch.h +121 -0
  1101. data/third_party/boringssl/include/openssl/asn1.h +982 -0
  1102. data/third_party/boringssl/include/openssl/asn1_mac.h +18 -0
  1103. data/third_party/boringssl/include/openssl/asn1t.h +892 -0
  1104. data/third_party/boringssl/include/openssl/base.h +468 -0
  1105. data/third_party/boringssl/include/openssl/base64.h +187 -0
  1106. data/third_party/boringssl/include/openssl/bio.h +902 -0
  1107. data/third_party/boringssl/include/openssl/blowfish.h +93 -0
  1108. data/third_party/boringssl/include/openssl/bn.h +975 -0
  1109. data/third_party/boringssl/include/openssl/buf.h +137 -0
  1110. data/third_party/boringssl/include/openssl/buffer.h +18 -0
  1111. data/third_party/boringssl/include/openssl/bytestring.h +480 -0
  1112. data/third_party/boringssl/include/openssl/cast.h +96 -0
  1113. data/third_party/boringssl/include/openssl/chacha.h +41 -0
  1114. data/third_party/boringssl/include/openssl/cipher.h +608 -0
  1115. data/third_party/boringssl/include/openssl/cmac.h +87 -0
  1116. data/third_party/boringssl/include/openssl/conf.h +183 -0
  1117. data/third_party/boringssl/include/openssl/cpu.h +196 -0
  1118. data/third_party/boringssl/include/openssl/crypto.h +118 -0
  1119. data/third_party/boringssl/include/openssl/curve25519.h +201 -0
  1120. data/third_party/boringssl/include/openssl/des.h +177 -0
  1121. data/third_party/boringssl/include/openssl/dh.h +298 -0
  1122. data/third_party/boringssl/include/openssl/digest.h +316 -0
  1123. data/third_party/boringssl/include/openssl/dsa.h +435 -0
  1124. data/third_party/boringssl/include/openssl/dtls1.h +16 -0
  1125. data/third_party/boringssl/include/openssl/ec.h +407 -0
  1126. data/third_party/boringssl/include/openssl/ec_key.h +341 -0
  1127. data/third_party/boringssl/include/openssl/ecdh.h +101 -0
  1128. data/third_party/boringssl/include/openssl/ecdsa.h +199 -0
  1129. data/third_party/boringssl/include/openssl/engine.h +109 -0
  1130. data/third_party/boringssl/include/openssl/err.h +458 -0
  1131. data/third_party/boringssl/include/openssl/evp.h +873 -0
  1132. data/third_party/boringssl/include/openssl/ex_data.h +203 -0
  1133. data/third_party/boringssl/include/openssl/hkdf.h +64 -0
  1134. data/third_party/boringssl/include/openssl/hmac.h +186 -0
  1135. data/third_party/boringssl/include/openssl/is_boringssl.h +16 -0
  1136. data/third_party/boringssl/include/openssl/lhash.h +174 -0
  1137. data/third_party/boringssl/include/openssl/lhash_macros.h +174 -0
  1138. data/third_party/boringssl/include/openssl/md4.h +106 -0
  1139. data/third_party/boringssl/include/openssl/md5.h +107 -0
  1140. data/third_party/boringssl/include/openssl/mem.h +156 -0
  1141. data/third_party/boringssl/include/openssl/nid.h +4242 -0
  1142. data/third_party/boringssl/include/openssl/obj.h +233 -0
  1143. data/third_party/boringssl/include/openssl/obj_mac.h +18 -0
  1144. data/third_party/boringssl/include/openssl/objects.h +18 -0
  1145. data/third_party/boringssl/include/openssl/opensslconf.h +67 -0
  1146. data/third_party/boringssl/include/openssl/opensslv.h +18 -0
  1147. data/third_party/boringssl/include/openssl/ossl_typ.h +18 -0
  1148. data/third_party/boringssl/include/openssl/pem.h +397 -0
  1149. data/third_party/boringssl/include/openssl/pkcs12.h +18 -0
  1150. data/third_party/boringssl/include/openssl/pkcs7.h +82 -0
  1151. data/third_party/boringssl/include/openssl/pkcs8.h +230 -0
  1152. data/third_party/boringssl/include/openssl/poly1305.h +51 -0
  1153. data/third_party/boringssl/include/openssl/pool.h +91 -0
  1154. data/third_party/boringssl/include/openssl/rand.h +125 -0
  1155. data/third_party/boringssl/include/openssl/rc4.h +96 -0
  1156. data/third_party/boringssl/include/openssl/ripemd.h +107 -0
  1157. data/third_party/boringssl/include/openssl/rsa.h +731 -0
  1158. data/third_party/boringssl/include/openssl/safestack.h +16 -0
  1159. data/third_party/boringssl/include/openssl/sha.h +256 -0
  1160. data/third_party/boringssl/include/openssl/span.h +191 -0
  1161. data/third_party/boringssl/include/openssl/srtp.h +18 -0
  1162. data/third_party/boringssl/include/openssl/ssl.h +4592 -0
  1163. data/third_party/boringssl/include/openssl/ssl3.h +333 -0
  1164. data/third_party/boringssl/include/openssl/stack.h +485 -0
  1165. data/third_party/boringssl/include/openssl/thread.h +191 -0
  1166. data/third_party/boringssl/include/openssl/tls1.h +610 -0
  1167. data/third_party/boringssl/include/openssl/type_check.h +91 -0
  1168. data/third_party/boringssl/include/openssl/x509.h +1176 -0
  1169. data/third_party/boringssl/include/openssl/x509_vfy.h +614 -0
  1170. data/third_party/boringssl/include/openssl/x509v3.h +826 -0
  1171. data/third_party/boringssl/ssl/bio_ssl.cc +179 -0
  1172. data/third_party/boringssl/ssl/custom_extensions.cc +265 -0
  1173. data/third_party/boringssl/ssl/d1_both.cc +837 -0
  1174. data/third_party/boringssl/ssl/d1_lib.cc +267 -0
  1175. data/third_party/boringssl/ssl/d1_pkt.cc +274 -0
  1176. data/third_party/boringssl/ssl/d1_srtp.cc +232 -0
  1177. data/third_party/boringssl/ssl/dtls_method.cc +193 -0
  1178. data/third_party/boringssl/ssl/dtls_record.cc +353 -0
  1179. data/third_party/boringssl/ssl/handshake.cc +616 -0
  1180. data/third_party/boringssl/ssl/handshake_client.cc +1836 -0
  1181. data/third_party/boringssl/ssl/handshake_server.cc +1662 -0
  1182. data/third_party/boringssl/ssl/internal.h +3011 -0
  1183. data/third_party/boringssl/ssl/s3_both.cc +585 -0
  1184. data/third_party/boringssl/ssl/s3_lib.cc +224 -0
  1185. data/third_party/boringssl/ssl/s3_pkt.cc +443 -0
  1186. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +415 -0
  1187. data/third_party/boringssl/ssl/ssl_asn1.cc +840 -0
  1188. data/third_party/boringssl/ssl/ssl_buffer.cc +286 -0
  1189. data/third_party/boringssl/ssl/ssl_cert.cc +913 -0
  1190. data/third_party/boringssl/ssl/ssl_cipher.cc +1777 -0
  1191. data/third_party/boringssl/ssl/ssl_file.cc +583 -0
  1192. data/third_party/boringssl/ssl/ssl_key_share.cc +250 -0
  1193. data/third_party/boringssl/ssl/ssl_lib.cc +2650 -0
  1194. data/third_party/boringssl/ssl/ssl_privkey.cc +488 -0
  1195. data/third_party/boringssl/ssl/ssl_session.cc +1221 -0
  1196. data/third_party/boringssl/ssl/ssl_stat.cc +224 -0
  1197. data/third_party/boringssl/ssl/ssl_transcript.cc +398 -0
  1198. data/third_party/boringssl/ssl/ssl_versions.cc +472 -0
  1199. data/third_party/boringssl/ssl/ssl_x509.cc +1299 -0
  1200. data/third_party/boringssl/ssl/t1_enc.cc +503 -0
  1201. data/third_party/boringssl/ssl/t1_lib.cc +3457 -0
  1202. data/third_party/boringssl/ssl/tls13_both.cc +551 -0
  1203. data/third_party/boringssl/ssl/tls13_client.cc +977 -0
  1204. data/third_party/boringssl/ssl/tls13_enc.cc +563 -0
  1205. data/third_party/boringssl/ssl/tls13_server.cc +1068 -0
  1206. data/third_party/boringssl/ssl/tls_method.cc +291 -0
  1207. data/third_party/boringssl/ssl/tls_record.cc +712 -0
  1208. data/third_party/boringssl/third_party/fiat/curve25519.c +5062 -0
  1209. data/third_party/boringssl/third_party/fiat/internal.h +142 -0
  1210. data/third_party/cares/ares_build.h +223 -0
  1211. data/third_party/cares/cares/ares.h +658 -0
  1212. data/third_party/cares/cares/ares__close_sockets.c +61 -0
  1213. data/third_party/cares/cares/ares__get_hostent.c +261 -0
  1214. data/third_party/cares/cares/ares__read_line.c +73 -0
  1215. data/third_party/cares/cares/ares__timeval.c +111 -0
  1216. data/third_party/cares/cares/ares_cancel.c +63 -0
  1217. data/third_party/cares/cares/ares_create_query.c +202 -0
  1218. data/third_party/cares/cares/ares_data.c +221 -0
  1219. data/third_party/cares/cares/ares_data.h +72 -0
  1220. data/third_party/cares/cares/ares_destroy.c +108 -0
  1221. data/third_party/cares/cares/ares_dns.h +103 -0
  1222. data/third_party/cares/cares/ares_expand_name.c +209 -0
  1223. data/third_party/cares/cares/ares_expand_string.c +70 -0
  1224. data/third_party/cares/cares/ares_fds.c +59 -0
  1225. data/third_party/cares/cares/ares_free_hostent.c +41 -0
  1226. data/third_party/cares/cares/ares_free_string.c +25 -0
  1227. data/third_party/cares/cares/ares_getenv.c +30 -0
  1228. data/third_party/cares/cares/ares_getenv.h +26 -0
  1229. data/third_party/cares/cares/ares_gethostbyaddr.c +294 -0
  1230. data/third_party/cares/cares/ares_gethostbyname.c +518 -0
  1231. data/third_party/cares/cares/ares_getnameinfo.c +442 -0
  1232. data/third_party/cares/cares/ares_getopt.c +122 -0
  1233. data/third_party/cares/cares/ares_getopt.h +53 -0
  1234. data/third_party/cares/cares/ares_getsock.c +66 -0
  1235. data/third_party/cares/cares/ares_inet_net_pton.h +25 -0
  1236. data/third_party/cares/cares/ares_init.c +2514 -0
  1237. data/third_party/cares/cares/ares_iphlpapi.h +221 -0
  1238. data/third_party/cares/cares/ares_ipv6.h +78 -0
  1239. data/third_party/cares/cares/ares_library_init.c +177 -0
  1240. data/third_party/cares/cares/ares_library_init.h +43 -0
  1241. data/third_party/cares/cares/ares_llist.c +63 -0
  1242. data/third_party/cares/cares/ares_llist.h +39 -0
  1243. data/third_party/cares/cares/ares_mkquery.c +24 -0
  1244. data/third_party/cares/cares/ares_nowarn.c +260 -0
  1245. data/third_party/cares/cares/ares_nowarn.h +61 -0
  1246. data/third_party/cares/cares/ares_options.c +402 -0
  1247. data/third_party/cares/cares/ares_parse_a_reply.c +264 -0
  1248. data/third_party/cares/cares/ares_parse_aaaa_reply.c +264 -0
  1249. data/third_party/cares/cares/ares_parse_mx_reply.c +170 -0
  1250. data/third_party/cares/cares/ares_parse_naptr_reply.c +193 -0
  1251. data/third_party/cares/cares/ares_parse_ns_reply.c +183 -0
  1252. data/third_party/cares/cares/ares_parse_ptr_reply.c +219 -0
  1253. data/third_party/cares/cares/ares_parse_soa_reply.c +133 -0
  1254. data/third_party/cares/cares/ares_parse_srv_reply.c +179 -0
  1255. data/third_party/cares/cares/ares_parse_txt_reply.c +220 -0
  1256. data/third_party/cares/cares/ares_platform.c +11035 -0
  1257. data/third_party/cares/cares/ares_platform.h +43 -0
  1258. data/third_party/cares/cares/ares_private.h +374 -0
  1259. data/third_party/cares/cares/ares_process.c +1448 -0
  1260. data/third_party/cares/cares/ares_query.c +186 -0
  1261. data/third_party/cares/cares/ares_rules.h +125 -0
  1262. data/third_party/cares/cares/ares_search.c +316 -0
  1263. data/third_party/cares/cares/ares_send.c +131 -0
  1264. data/third_party/cares/cares/ares_setup.h +217 -0
  1265. data/third_party/cares/cares/ares_strcasecmp.c +66 -0
  1266. data/third_party/cares/cares/ares_strcasecmp.h +30 -0
  1267. data/third_party/cares/cares/ares_strdup.c +49 -0
  1268. data/third_party/cares/cares/ares_strdup.h +24 -0
  1269. data/third_party/cares/cares/ares_strerror.c +56 -0
  1270. data/third_party/cares/cares/ares_timeout.c +88 -0
  1271. data/third_party/cares/cares/ares_version.c +11 -0
  1272. data/third_party/cares/cares/ares_version.h +24 -0
  1273. data/third_party/cares/cares/ares_writev.c +79 -0
  1274. data/third_party/cares/cares/bitncmp.c +59 -0
  1275. data/third_party/cares/cares/bitncmp.h +26 -0
  1276. data/third_party/cares/cares/config-win32.h +351 -0
  1277. data/third_party/cares/cares/inet_net_pton.c +450 -0
  1278. data/third_party/cares/cares/inet_ntop.c +208 -0
  1279. data/third_party/cares/cares/setup_once.h +554 -0
  1280. data/third_party/cares/cares/windows_port.c +22 -0
  1281. data/third_party/cares/config_darwin/ares_config.h +425 -0
  1282. data/third_party/cares/config_freebsd/ares_config.h +502 -0
  1283. data/third_party/cares/config_linux/ares_config.h +458 -0
  1284. data/third_party/cares/config_openbsd/ares_config.h +502 -0
  1285. data/third_party/nanopb/pb.h +579 -0
  1286. data/third_party/nanopb/pb_common.c +97 -0
  1287. data/third_party/nanopb/pb_common.h +42 -0
  1288. data/third_party/nanopb/pb_decode.c +1347 -0
  1289. data/third_party/nanopb/pb_decode.h +149 -0
  1290. data/third_party/nanopb/pb_encode.c +696 -0
  1291. data/third_party/nanopb/pb_encode.h +154 -0
  1292. data/third_party/zlib/adler32.c +186 -0
  1293. data/third_party/zlib/compress.c +86 -0
  1294. data/third_party/zlib/crc32.c +442 -0
  1295. data/third_party/zlib/crc32.h +441 -0
  1296. data/third_party/zlib/deflate.c +2163 -0
  1297. data/third_party/zlib/deflate.h +349 -0
  1298. data/third_party/zlib/gzclose.c +25 -0
  1299. data/third_party/zlib/gzguts.h +218 -0
  1300. data/third_party/zlib/gzlib.c +637 -0
  1301. data/third_party/zlib/gzread.c +654 -0
  1302. data/third_party/zlib/gzwrite.c +665 -0
  1303. data/third_party/zlib/infback.c +640 -0
  1304. data/third_party/zlib/inffast.c +323 -0
  1305. data/third_party/zlib/inffast.h +11 -0
  1306. data/third_party/zlib/inffixed.h +94 -0
  1307. data/third_party/zlib/inflate.c +1561 -0
  1308. data/third_party/zlib/inflate.h +125 -0
  1309. data/third_party/zlib/inftrees.c +304 -0
  1310. data/third_party/zlib/inftrees.h +62 -0
  1311. data/third_party/zlib/trees.c +1203 -0
  1312. data/third_party/zlib/trees.h +128 -0
  1313. data/third_party/zlib/uncompr.c +93 -0
  1314. data/third_party/zlib/zconf.h +534 -0
  1315. data/third_party/zlib/zlib.h +1912 -0
  1316. data/third_party/zlib/zutil.c +325 -0
  1317. data/third_party/zlib/zutil.h +271 -0
  1318. metadata +1586 -0
@@ -0,0 +1,1906 @@
1
+ /*
2
+ *
3
+ * Copyright 2016 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
+ /// Implementation of the gRPC LB policy.
20
+ ///
21
+ /// This policy takes as input a list of resolved addresses, which must
22
+ /// include at least one balancer address.
23
+ ///
24
+ /// An internal channel (\a lb_channel_) is created for the addresses
25
+ /// from that are balancers. This channel behaves just like a regular
26
+ /// channel that uses pick_first to select from the list of balancer
27
+ /// addresses.
28
+ ///
29
+ /// The first time the policy gets a request for a pick, a ping, or to exit
30
+ /// the idle state, \a StartPickingLocked() is called. This method is
31
+ /// responsible for instantiating the internal *streaming* call to the LB
32
+ /// server (whichever address pick_first chose). The call will be complete
33
+ /// when either the balancer sends status or when we cancel the call (e.g.,
34
+ /// because we are shutting down). In needed, we retry the call. If we
35
+ /// received at least one valid message from the server, a new call attempt
36
+ /// will be made immediately; otherwise, we apply back-off delays between
37
+ /// attempts.
38
+ ///
39
+ /// We maintain an internal round_robin policy instance for distributing
40
+ /// requests across backends. Whenever we receive a new serverlist from
41
+ /// the balancer, we update the round_robin policy with the new list of
42
+ /// addresses. If we cannot communicate with the balancer on startup,
43
+ /// however, we may enter fallback mode, in which case we will populate
44
+ /// the RR policy's addresses from the backend addresses returned by the
45
+ /// resolver.
46
+ ///
47
+ /// Once an RR policy instance is in place (and getting updated as described),
48
+ /// calls for a pick, a ping, or a cancellation will be serviced right
49
+ /// away by forwarding them to the RR instance. Any time there's no RR
50
+ /// policy available (i.e., right after the creation of the gRPCLB policy),
51
+ /// pick and ping requests are added to a list of pending picks and pings
52
+ /// to be flushed and serviced when the RR policy instance becomes available.
53
+ ///
54
+ /// \see https://github.com/grpc/grpc/blob/master/doc/load-balancing.md for the
55
+ /// high level design and details.
56
+
57
+ // With the addition of a libuv endpoint, sockaddr.h now includes uv.h when
58
+ // using that endpoint. Because of various transitive includes in uv.h,
59
+ // including windows.h on Windows, uv.h must be included before other system
60
+ // headers. Therefore, sockaddr.h must always be included first.
61
+ #include <grpc/support/port_platform.h>
62
+
63
+ #include "src/core/lib/iomgr/sockaddr.h"
64
+ #include "src/core/lib/iomgr/socket_utils.h"
65
+
66
+ #include <inttypes.h>
67
+ #include <limits.h>
68
+ #include <string.h>
69
+
70
+ #include <grpc/byte_buffer_reader.h>
71
+ #include <grpc/grpc.h>
72
+ #include <grpc/support/alloc.h>
73
+ #include <grpc/support/string_util.h>
74
+ #include <grpc/support/time.h>
75
+
76
+ #include "src/core/ext/filters/client_channel/client_channel.h"
77
+ #include "src/core/ext/filters/client_channel/client_channel_factory.h"
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_channel.h"
80
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
81
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h"
82
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
83
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
84
+ #include "src/core/ext/filters/client_channel/parse_address.h"
85
+ #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
86
+ #include "src/core/ext/filters/client_channel/subchannel_index.h"
87
+ #include "src/core/lib/backoff/backoff.h"
88
+ #include "src/core/lib/channel/channel_args.h"
89
+ #include "src/core/lib/channel/channel_stack.h"
90
+ #include "src/core/lib/gpr/host_port.h"
91
+ #include "src/core/lib/gpr/string.h"
92
+ #include "src/core/lib/gprpp/manual_constructor.h"
93
+ #include "src/core/lib/gprpp/memory.h"
94
+ #include "src/core/lib/gprpp/orphanable.h"
95
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
96
+ #include "src/core/lib/iomgr/combiner.h"
97
+ #include "src/core/lib/iomgr/sockaddr.h"
98
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
99
+ #include "src/core/lib/iomgr/timer.h"
100
+ #include "src/core/lib/slice/slice_hash_table.h"
101
+ #include "src/core/lib/slice/slice_internal.h"
102
+ #include "src/core/lib/slice/slice_string_helpers.h"
103
+ #include "src/core/lib/surface/call.h"
104
+ #include "src/core/lib/surface/channel.h"
105
+ #include "src/core/lib/surface/channel_init.h"
106
+ #include "src/core/lib/transport/static_metadata.h"
107
+
108
+ #define GRPC_GRPCLB_INITIAL_CONNECT_BACKOFF_SECONDS 1
109
+ #define GRPC_GRPCLB_RECONNECT_BACKOFF_MULTIPLIER 1.6
110
+ #define GRPC_GRPCLB_RECONNECT_MAX_BACKOFF_SECONDS 120
111
+ #define GRPC_GRPCLB_RECONNECT_JITTER 0.2
112
+ #define GRPC_GRPCLB_DEFAULT_FALLBACK_TIMEOUT_MS 10000
113
+
114
+ namespace grpc_core {
115
+
116
+ TraceFlag grpc_lb_glb_trace(false, "glb");
117
+
118
+ namespace {
119
+
120
+ class GrpcLb : public LoadBalancingPolicy {
121
+ public:
122
+ GrpcLb(const grpc_lb_addresses* addresses, const Args& args);
123
+
124
+ void UpdateLocked(const grpc_channel_args& args) override;
125
+ bool PickLocked(PickState* pick) override;
126
+ void CancelPickLocked(PickState* pick, grpc_error* error) override;
127
+ void CancelMatchingPicksLocked(uint32_t initial_metadata_flags_mask,
128
+ uint32_t initial_metadata_flags_eq,
129
+ grpc_error* error) override;
130
+ void NotifyOnStateChangeLocked(grpc_connectivity_state* state,
131
+ grpc_closure* closure) override;
132
+ grpc_connectivity_state CheckConnectivityLocked(
133
+ grpc_error** connectivity_error) override;
134
+ void HandOffPendingPicksLocked(LoadBalancingPolicy* new_policy) override;
135
+ void PingOneLocked(grpc_closure* on_initiate, grpc_closure* on_ack) override;
136
+ void ExitIdleLocked() override;
137
+
138
+ private:
139
+ /// Linked list of pending pick requests. It stores all information needed to
140
+ /// eventually call (Round Robin's) pick() on them. They mainly stay pending
141
+ /// waiting for the RR policy to be created.
142
+ ///
143
+ /// Note that when a pick is sent to the RR policy, we inject our own
144
+ /// on_complete callback, so that we can intercept the result before
145
+ /// invoking the original on_complete callback. This allows us to set the
146
+ /// LB token metadata and add client_stats to the call context.
147
+ /// See \a pending_pick_complete() for details.
148
+ struct PendingPick {
149
+ // The grpclb instance that created the wrapping. This instance is not
150
+ // owned; reference counts are untouched. It's used only for logging
151
+ // purposes.
152
+ GrpcLb* grpclb_policy;
153
+ // The original pick.
154
+ PickState* pick;
155
+ // Our on_complete closure and the original one.
156
+ grpc_closure on_complete;
157
+ grpc_closure* original_on_complete;
158
+ // The LB token associated with the pick. This is set via user_data in
159
+ // the pick.
160
+ 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;
164
+ // Next pending pick.
165
+ PendingPick* next = nullptr;
166
+ };
167
+
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
+ /// Contains a call to the LB server and all the data related to the call.
176
+ class BalancerCallState
177
+ : public InternallyRefCountedWithTracing<BalancerCallState> {
178
+ public:
179
+ explicit BalancerCallState(
180
+ RefCountedPtr<LoadBalancingPolicy> parent_grpclb_policy);
181
+
182
+ // It's the caller's responsibility to ensure that Orphan() is called from
183
+ // inside the combiner.
184
+ void Orphan() override;
185
+
186
+ void StartQuery();
187
+
188
+ grpc_grpclb_client_stats* client_stats() const { return client_stats_; }
189
+ bool seen_initial_response() const { return seen_initial_response_; }
190
+
191
+ private:
192
+ ~BalancerCallState();
193
+
194
+ GrpcLb* grpclb_policy() const {
195
+ return static_cast<GrpcLb*>(grpclb_policy_.get());
196
+ }
197
+
198
+ void ScheduleNextClientLoadReportLocked();
199
+ void SendClientLoadReportLocked();
200
+
201
+ static bool LoadReportCountersAreZero(grpc_grpclb_request* request);
202
+
203
+ static void MaybeSendClientLoadReportLocked(void* arg, grpc_error* error);
204
+ static void ClientLoadReportDoneLocked(void* arg, grpc_error* error);
205
+ static void OnInitialRequestSentLocked(void* arg, grpc_error* error);
206
+ static void OnBalancerMessageReceivedLocked(void* arg, grpc_error* error);
207
+ static void OnBalancerStatusReceivedLocked(void* arg, grpc_error* error);
208
+
209
+ // The owning LB policy.
210
+ RefCountedPtr<LoadBalancingPolicy> grpclb_policy_;
211
+
212
+ // The streaming call to the LB server. Always non-NULL.
213
+ grpc_call* lb_call_ = nullptr;
214
+
215
+ // recv_initial_metadata
216
+ grpc_metadata_array lb_initial_metadata_recv_;
217
+
218
+ // send_message
219
+ grpc_byte_buffer* send_message_payload_ = nullptr;
220
+ grpc_closure lb_on_initial_request_sent_;
221
+
222
+ // recv_message
223
+ grpc_byte_buffer* recv_message_payload_ = nullptr;
224
+ grpc_closure lb_on_balancer_message_received_;
225
+ bool seen_initial_response_ = false;
226
+
227
+ // recv_trailing_metadata
228
+ grpc_closure lb_on_balancer_status_received_;
229
+ grpc_metadata_array lb_trailing_metadata_recv_;
230
+ grpc_status_code lb_call_status_;
231
+ grpc_slice lb_call_status_details_;
232
+
233
+ // The stats for client-side load reporting associated with this LB call.
234
+ // Created after the first serverlist is received.
235
+ grpc_grpclb_client_stats* client_stats_ = nullptr;
236
+ grpc_millis client_stats_report_interval_ = 0;
237
+ grpc_timer client_load_report_timer_;
238
+ bool client_load_report_timer_callback_pending_ = false;
239
+ bool last_client_load_report_counters_were_zero_ = false;
240
+ bool client_load_report_is_due_ = false;
241
+ // The closure used for either the load report timer or the callback for
242
+ // completion of sending the load report.
243
+ grpc_closure client_load_report_closure_;
244
+ };
245
+
246
+ ~GrpcLb();
247
+
248
+ void ShutdownLocked() override;
249
+
250
+ // Helper function used in ctor and UpdateLocked().
251
+ void ProcessChannelArgsLocked(const grpc_channel_args& args);
252
+
253
+ // Methods for dealing with the balancer channel and call.
254
+ void StartPickingLocked();
255
+ void StartBalancerCallLocked();
256
+ static void OnFallbackTimerLocked(void* arg, grpc_error* error);
257
+ void StartBalancerCallRetryTimerLocked();
258
+ static void OnBalancerCallRetryTimerLocked(void* arg, grpc_error* error);
259
+ static void OnBalancerChannelConnectivityChangedLocked(void* arg,
260
+ grpc_error* error);
261
+
262
+ // Pending pick methods.
263
+ static void PendingPickSetMetadataAndContext(PendingPick* pp);
264
+ PendingPick* PendingPickCreate(PickState* pick);
265
+ void AddPendingPick(PendingPick* pp);
266
+ static void OnPendingPickComplete(void* arg, grpc_error* error);
267
+
268
+ // Pending ping methods.
269
+ void AddPendingPing(grpc_closure* on_initiate, grpc_closure* on_ack);
270
+
271
+ // Methods for dealing with the RR policy.
272
+ void CreateOrUpdateRoundRobinPolicyLocked();
273
+ grpc_channel_args* CreateRoundRobinPolicyArgsLocked();
274
+ void CreateRoundRobinPolicyLocked(const Args& args);
275
+ bool PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp);
276
+ void UpdateConnectivityStateFromRoundRobinPolicyLocked(
277
+ grpc_error* rr_state_error);
278
+ static void OnRoundRobinConnectivityChangedLocked(void* arg,
279
+ grpc_error* error);
280
+ static void OnRoundRobinRequestReresolutionLocked(void* arg,
281
+ grpc_error* error);
282
+
283
+ // Who the client is trying to communicate with.
284
+ const char* server_name_ = nullptr;
285
+
286
+ // Current channel args from the resolver.
287
+ grpc_channel_args* args_ = nullptr;
288
+
289
+ // Internal state.
290
+ bool started_picking_ = false;
291
+ bool shutting_down_ = false;
292
+ grpc_connectivity_state_tracker state_tracker_;
293
+
294
+ // The channel for communicating with the LB server.
295
+ grpc_channel* lb_channel_ = nullptr;
296
+ grpc_connectivity_state lb_channel_connectivity_;
297
+ grpc_closure lb_channel_on_connectivity_changed_;
298
+ // Are we already watching the LB channel's connectivity?
299
+ bool watching_lb_channel_ = false;
300
+ // Response generator to inject address updates into lb_channel_.
301
+ RefCountedPtr<FakeResolverResponseGenerator> response_generator_;
302
+
303
+ // The data associated with the current LB call. It holds a ref to this LB
304
+ // policy. It's initialized every time we query for backends. It's reset to
305
+ // NULL whenever the current LB call is no longer needed (e.g., the LB policy
306
+ // is shutting down, or the LB call has ended). A non-NULL lb_calld_ always
307
+ // contains a non-NULL lb_call_.
308
+ OrphanablePtr<BalancerCallState> lb_calld_;
309
+ // Timeout in milliseconds for the LB call. 0 means no deadline.
310
+ int lb_call_timeout_ms_ = 0;
311
+ // Balancer call retry state.
312
+ BackOff lb_call_backoff_;
313
+ bool retry_timer_callback_pending_ = false;
314
+ grpc_timer lb_call_retry_timer_;
315
+ grpc_closure lb_on_call_retry_;
316
+
317
+ // The deserialized response from the balancer. May be nullptr until one
318
+ // such response has arrived.
319
+ grpc_grpclb_serverlist* serverlist_ = nullptr;
320
+ // Index into serverlist for next pick.
321
+ // If the server at this index is a drop, we return a drop.
322
+ // Otherwise, we delegate to the RR policy.
323
+ size_t serverlist_index_ = 0;
324
+
325
+ // Timeout in milliseconds for before using fallback backend addresses.
326
+ // 0 means not using fallback.
327
+ int lb_fallback_timeout_ms_ = 0;
328
+ // The backend addresses from the resolver.
329
+ grpc_lb_addresses* fallback_backend_addresses_ = nullptr;
330
+ // Fallback timer.
331
+ bool fallback_timer_callback_pending_ = false;
332
+ grpc_timer lb_fallback_timer_;
333
+ grpc_closure lb_on_fallback_;
334
+
335
+ // Pending picks and pings that are waiting on the RR policy's connectivity.
336
+ PendingPick* pending_picks_ = nullptr;
337
+ PendingPing* pending_pings_ = nullptr;
338
+
339
+ // The RR policy to use for the backends.
340
+ OrphanablePtr<LoadBalancingPolicy> rr_policy_;
341
+ grpc_connectivity_state rr_connectivity_state_;
342
+ grpc_closure on_rr_connectivity_changed_;
343
+ grpc_closure on_rr_request_reresolution_;
344
+ };
345
+
346
+ //
347
+ // serverlist parsing code
348
+ //
349
+
350
+ // vtable for LB tokens in grpc_lb_addresses
351
+ void* lb_token_copy(void* token) {
352
+ return token == nullptr
353
+ ? nullptr
354
+ : (void*)GRPC_MDELEM_REF(grpc_mdelem{(uintptr_t)token}).payload;
355
+ }
356
+ void lb_token_destroy(void* token) {
357
+ if (token != nullptr) {
358
+ GRPC_MDELEM_UNREF(grpc_mdelem{(uintptr_t)token});
359
+ }
360
+ }
361
+ int lb_token_cmp(void* token1, void* token2) {
362
+ if (token1 > token2) return 1;
363
+ if (token1 < token2) return -1;
364
+ return 0;
365
+ }
366
+ const grpc_lb_user_data_vtable lb_token_vtable = {
367
+ lb_token_copy, lb_token_destroy, lb_token_cmp};
368
+
369
+ // Returns the backend addresses extracted from the given addresses.
370
+ grpc_lb_addresses* ExtractBackendAddresses(const grpc_lb_addresses* addresses) {
371
+ // First pass: count the number of backend addresses.
372
+ size_t num_backends = 0;
373
+ for (size_t i = 0; i < addresses->num_addresses; ++i) {
374
+ if (!addresses->addresses[i].is_balancer) {
375
+ ++num_backends;
376
+ }
377
+ }
378
+ // Second pass: actually populate the addresses and (empty) LB tokens.
379
+ grpc_lb_addresses* backend_addresses =
380
+ grpc_lb_addresses_create(num_backends, &lb_token_vtable);
381
+ size_t num_copied = 0;
382
+ for (size_t i = 0; i < addresses->num_addresses; ++i) {
383
+ if (addresses->addresses[i].is_balancer) continue;
384
+ const grpc_resolved_address* addr = &addresses->addresses[i].address;
385
+ grpc_lb_addresses_set_address(backend_addresses, num_copied, &addr->addr,
386
+ addr->len, false /* is_balancer */,
387
+ nullptr /* balancer_name */,
388
+ (void*)GRPC_MDELEM_LB_TOKEN_EMPTY.payload);
389
+ ++num_copied;
390
+ }
391
+ return backend_addresses;
392
+ }
393
+
394
+ bool IsServerValid(const grpc_grpclb_server* server, size_t idx, bool log) {
395
+ if (server->drop) return false;
396
+ const grpc_grpclb_ip_address* ip = &server->ip_address;
397
+ if (server->port >> 16 != 0) {
398
+ if (log) {
399
+ gpr_log(GPR_ERROR,
400
+ "Invalid port '%d' at index %lu of serverlist. Ignoring.",
401
+ server->port, (unsigned long)idx);
402
+ }
403
+ return false;
404
+ }
405
+ if (ip->size != 4 && ip->size != 16) {
406
+ if (log) {
407
+ gpr_log(GPR_ERROR,
408
+ "Expected IP to be 4 or 16 bytes, got %d at index %lu of "
409
+ "serverlist. Ignoring",
410
+ ip->size, (unsigned long)idx);
411
+ }
412
+ return false;
413
+ }
414
+ return true;
415
+ }
416
+
417
+ void ParseServer(const grpc_grpclb_server* server,
418
+ grpc_resolved_address* addr) {
419
+ memset(addr, 0, sizeof(*addr));
420
+ if (server->drop) return;
421
+ const uint16_t netorder_port = grpc_htons((uint16_t)server->port);
422
+ /* the addresses are given in binary format (a in(6)_addr struct) in
423
+ * server->ip_address.bytes. */
424
+ const grpc_grpclb_ip_address* ip = &server->ip_address;
425
+ if (ip->size == 4) {
426
+ addr->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in));
427
+ grpc_sockaddr_in* addr4 = reinterpret_cast<grpc_sockaddr_in*>(&addr->addr);
428
+ addr4->sin_family = GRPC_AF_INET;
429
+ memcpy(&addr4->sin_addr, ip->bytes, ip->size);
430
+ addr4->sin_port = netorder_port;
431
+ } else if (ip->size == 16) {
432
+ addr->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in6));
433
+ grpc_sockaddr_in6* addr6 = (grpc_sockaddr_in6*)&addr->addr;
434
+ addr6->sin6_family = GRPC_AF_INET6;
435
+ memcpy(&addr6->sin6_addr, ip->bytes, ip->size);
436
+ addr6->sin6_port = netorder_port;
437
+ }
438
+ }
439
+
440
+ // Returns addresses extracted from \a serverlist.
441
+ grpc_lb_addresses* ProcessServerlist(const grpc_grpclb_serverlist* serverlist) {
442
+ size_t num_valid = 0;
443
+ /* first pass: count how many are valid in order to allocate the necessary
444
+ * memory in a single block */
445
+ for (size_t i = 0; i < serverlist->num_servers; ++i) {
446
+ if (IsServerValid(serverlist->servers[i], i, true)) ++num_valid;
447
+ }
448
+ grpc_lb_addresses* lb_addresses =
449
+ grpc_lb_addresses_create(num_valid, &lb_token_vtable);
450
+ /* second pass: actually populate the addresses and LB tokens (aka user data
451
+ * to the outside world) to be read by the RR policy during its creation.
452
+ * Given that the validity tests are very cheap, they are performed again
453
+ * instead of marking the valid ones during the first pass, as this would
454
+ * incurr in an allocation due to the arbitrary number of server */
455
+ size_t addr_idx = 0;
456
+ for (size_t sl_idx = 0; sl_idx < serverlist->num_servers; ++sl_idx) {
457
+ const grpc_grpclb_server* server = serverlist->servers[sl_idx];
458
+ if (!IsServerValid(serverlist->servers[sl_idx], sl_idx, false)) continue;
459
+ GPR_ASSERT(addr_idx < num_valid);
460
+ /* address processing */
461
+ grpc_resolved_address addr;
462
+ ParseServer(server, &addr);
463
+ /* lb token processing */
464
+ void* user_data;
465
+ if (server->has_load_balance_token) {
466
+ const size_t lb_token_max_length =
467
+ GPR_ARRAY_SIZE(server->load_balance_token);
468
+ const size_t lb_token_length =
469
+ strnlen(server->load_balance_token, lb_token_max_length);
470
+ grpc_slice lb_token_mdstr = grpc_slice_from_copied_buffer(
471
+ server->load_balance_token, lb_token_length);
472
+ user_data =
473
+ (void*)grpc_mdelem_from_slices(GRPC_MDSTR_LB_TOKEN, lb_token_mdstr)
474
+ .payload;
475
+ } else {
476
+ char* uri = grpc_sockaddr_to_uri(&addr);
477
+ gpr_log(GPR_INFO,
478
+ "Missing LB token for backend address '%s'. The empty token will "
479
+ "be used instead",
480
+ uri);
481
+ gpr_free(uri);
482
+ user_data = (void*)GRPC_MDELEM_LB_TOKEN_EMPTY.payload;
483
+ }
484
+ grpc_lb_addresses_set_address(lb_addresses, addr_idx, &addr.addr, addr.len,
485
+ false /* is_balancer */,
486
+ nullptr /* balancer_name */, user_data);
487
+ ++addr_idx;
488
+ }
489
+ GPR_ASSERT(addr_idx == num_valid);
490
+ return lb_addresses;
491
+ }
492
+
493
+ //
494
+ // GrpcLb::BalancerCallState
495
+ //
496
+
497
+ GrpcLb::BalancerCallState::BalancerCallState(
498
+ RefCountedPtr<LoadBalancingPolicy> parent_grpclb_policy)
499
+ : InternallyRefCountedWithTracing<BalancerCallState>(&grpc_lb_glb_trace),
500
+ grpclb_policy_(std::move(parent_grpclb_policy)) {
501
+ GPR_ASSERT(grpclb_policy_ != nullptr);
502
+ GPR_ASSERT(!grpclb_policy()->shutting_down_);
503
+ // Init the LB call. Note that the LB call will progress every time there's
504
+ // activity in grpclb_policy_->interested_parties(), which is comprised of
505
+ // the polling entities from client_channel.
506
+ GPR_ASSERT(grpclb_policy()->server_name_ != nullptr);
507
+ GPR_ASSERT(grpclb_policy()->server_name_[0] != '\0');
508
+ const grpc_millis deadline =
509
+ grpclb_policy()->lb_call_timeout_ms_ == 0
510
+ ? GRPC_MILLIS_INF_FUTURE
511
+ : ExecCtx::Get()->Now() + grpclb_policy()->lb_call_timeout_ms_;
512
+ lb_call_ = grpc_channel_create_pollset_set_call(
513
+ grpclb_policy()->lb_channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
514
+ grpclb_policy_->interested_parties(),
515
+ GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD,
516
+ nullptr, deadline, nullptr);
517
+ // Init the LB call request payload.
518
+ grpc_grpclb_request* request =
519
+ grpc_grpclb_request_create(grpclb_policy()->server_name_);
520
+ grpc_slice request_payload_slice = grpc_grpclb_request_encode(request);
521
+ send_message_payload_ =
522
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
523
+ grpc_slice_unref_internal(request_payload_slice);
524
+ grpc_grpclb_request_destroy(request);
525
+ // Init other data associated with the LB call.
526
+ grpc_metadata_array_init(&lb_initial_metadata_recv_);
527
+ grpc_metadata_array_init(&lb_trailing_metadata_recv_);
528
+ GRPC_CLOSURE_INIT(&lb_on_initial_request_sent_, OnInitialRequestSentLocked,
529
+ this, grpc_combiner_scheduler(grpclb_policy()->combiner()));
530
+ GRPC_CLOSURE_INIT(&lb_on_balancer_message_received_,
531
+ OnBalancerMessageReceivedLocked, this,
532
+ grpc_combiner_scheduler(grpclb_policy()->combiner()));
533
+ GRPC_CLOSURE_INIT(&lb_on_balancer_status_received_,
534
+ OnBalancerStatusReceivedLocked, this,
535
+ grpc_combiner_scheduler(grpclb_policy()->combiner()));
536
+ }
537
+
538
+ GrpcLb::BalancerCallState::~BalancerCallState() {
539
+ GPR_ASSERT(lb_call_ != nullptr);
540
+ grpc_call_unref(lb_call_);
541
+ grpc_metadata_array_destroy(&lb_initial_metadata_recv_);
542
+ grpc_metadata_array_destroy(&lb_trailing_metadata_recv_);
543
+ grpc_byte_buffer_destroy(send_message_payload_);
544
+ grpc_byte_buffer_destroy(recv_message_payload_);
545
+ grpc_slice_unref_internal(lb_call_status_details_);
546
+ if (client_stats_ != nullptr) {
547
+ grpc_grpclb_client_stats_unref(client_stats_);
548
+ }
549
+ }
550
+
551
+ void GrpcLb::BalancerCallState::Orphan() {
552
+ GPR_ASSERT(lb_call_ != nullptr);
553
+ // If we are here because grpclb_policy wants to cancel the call,
554
+ // lb_on_balancer_status_received_ will complete the cancellation and clean
555
+ // up. Otherwise, we are here because grpclb_policy has to orphan a failed
556
+ // call, then the following cancellation will be a no-op.
557
+ grpc_call_cancel(lb_call_, nullptr);
558
+ if (client_load_report_timer_callback_pending_) {
559
+ grpc_timer_cancel(&client_load_report_timer_);
560
+ }
561
+ // Note that the initial ref is hold by lb_on_balancer_status_received_
562
+ // instead of the caller of this function. So the corresponding unref happens
563
+ // in lb_on_balancer_status_received_ instead of here.
564
+ }
565
+
566
+ void GrpcLb::BalancerCallState::StartQuery() {
567
+ GPR_ASSERT(lb_call_ != nullptr);
568
+ if (grpc_lb_glb_trace.enabled()) {
569
+ gpr_log(GPR_INFO,
570
+ "[grpclb %p] Starting LB call (lb_calld: %p, lb_call: %p)",
571
+ grpclb_policy_.get(), this, lb_call_);
572
+ }
573
+ // Create the ops.
574
+ grpc_call_error call_error;
575
+ grpc_op ops[3];
576
+ memset(ops, 0, sizeof(ops));
577
+ // Op: send initial metadata.
578
+ grpc_op* op = ops;
579
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
580
+ op->data.send_initial_metadata.count = 0;
581
+ op->flags = 0;
582
+ op->reserved = nullptr;
583
+ op++;
584
+ // Op: send request message.
585
+ GPR_ASSERT(send_message_payload_ != nullptr);
586
+ op->op = GRPC_OP_SEND_MESSAGE;
587
+ op->data.send_message.send_message = send_message_payload_;
588
+ op->flags = 0;
589
+ op->reserved = nullptr;
590
+ op++;
591
+ // TODO(roth): We currently track this ref manually. Once the
592
+ // ClosureRef API is ready, we should pass the RefCountedPtr<> along
593
+ // with the callback.
594
+ auto self = Ref(DEBUG_LOCATION, "on_initial_request_sent");
595
+ self.release();
596
+ call_error = grpc_call_start_batch_and_execute(
597
+ lb_call_, ops, (size_t)(op - ops), &lb_on_initial_request_sent_);
598
+ GPR_ASSERT(GRPC_CALL_OK == call_error);
599
+ // Op: recv initial metadata.
600
+ op = ops;
601
+ op->op = GRPC_OP_RECV_INITIAL_METADATA;
602
+ op->data.recv_initial_metadata.recv_initial_metadata =
603
+ &lb_initial_metadata_recv_;
604
+ op->flags = 0;
605
+ op->reserved = nullptr;
606
+ op++;
607
+ // Op: recv response.
608
+ op->op = GRPC_OP_RECV_MESSAGE;
609
+ op->data.recv_message.recv_message = &recv_message_payload_;
610
+ op->flags = 0;
611
+ op->reserved = nullptr;
612
+ op++;
613
+ // TODO(roth): We currently track this ref manually. Once the
614
+ // ClosureRef API is ready, we should pass the RefCountedPtr<> along
615
+ // with the callback.
616
+ self = Ref(DEBUG_LOCATION, "on_message_received");
617
+ self.release();
618
+ call_error = grpc_call_start_batch_and_execute(
619
+ lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_message_received_);
620
+ GPR_ASSERT(GRPC_CALL_OK == call_error);
621
+ // Op: recv server status.
622
+ op = ops;
623
+ op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
624
+ op->data.recv_status_on_client.trailing_metadata =
625
+ &lb_trailing_metadata_recv_;
626
+ op->data.recv_status_on_client.status = &lb_call_status_;
627
+ op->data.recv_status_on_client.status_details = &lb_call_status_details_;
628
+ op->flags = 0;
629
+ op->reserved = nullptr;
630
+ op++;
631
+ // This callback signals the end of the LB call, so it relies on the initial
632
+ // ref instead of a new ref. When it's invoked, it's the initial ref that is
633
+ // unreffed.
634
+ call_error = grpc_call_start_batch_and_execute(
635
+ lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_status_received_);
636
+ GPR_ASSERT(GRPC_CALL_OK == call_error);
637
+ };
638
+
639
+ void GrpcLb::BalancerCallState::ScheduleNextClientLoadReportLocked() {
640
+ const grpc_millis next_client_load_report_time =
641
+ ExecCtx::Get()->Now() + client_stats_report_interval_;
642
+ GRPC_CLOSURE_INIT(&client_load_report_closure_,
643
+ MaybeSendClientLoadReportLocked, this,
644
+ grpc_combiner_scheduler(grpclb_policy()->combiner()));
645
+ grpc_timer_init(&client_load_report_timer_, next_client_load_report_time,
646
+ &client_load_report_closure_);
647
+ client_load_report_timer_callback_pending_ = true;
648
+ }
649
+
650
+ void GrpcLb::BalancerCallState::MaybeSendClientLoadReportLocked(
651
+ void* arg, grpc_error* error) {
652
+ BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
653
+ GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
654
+ lb_calld->client_load_report_timer_callback_pending_ = false;
655
+ if (error != GRPC_ERROR_NONE || lb_calld != grpclb_policy->lb_calld_.get()) {
656
+ lb_calld->Unref(DEBUG_LOCATION, "client_load_report");
657
+ return;
658
+ }
659
+ // If we've already sent the initial request, then we can go ahead and send
660
+ // the load report. Otherwise, we need to wait until the initial request has
661
+ // been sent to send this (see OnInitialRequestSentLocked()).
662
+ if (lb_calld->send_message_payload_ == nullptr) {
663
+ lb_calld->SendClientLoadReportLocked();
664
+ } else {
665
+ lb_calld->client_load_report_is_due_ = true;
666
+ }
667
+ }
668
+
669
+ bool GrpcLb::BalancerCallState::LoadReportCountersAreZero(
670
+ grpc_grpclb_request* request) {
671
+ grpc_grpclb_dropped_call_counts* drop_entries =
672
+ static_cast<grpc_grpclb_dropped_call_counts*>(
673
+ request->client_stats.calls_finished_with_drop.arg);
674
+ return request->client_stats.num_calls_started == 0 &&
675
+ request->client_stats.num_calls_finished == 0 &&
676
+ request->client_stats.num_calls_finished_with_client_failed_to_send ==
677
+ 0 &&
678
+ request->client_stats.num_calls_finished_known_received == 0 &&
679
+ (drop_entries == nullptr || drop_entries->num_entries == 0);
680
+ }
681
+
682
+ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
683
+ // Construct message payload.
684
+ GPR_ASSERT(send_message_payload_ == nullptr);
685
+ grpc_grpclb_request* request =
686
+ grpc_grpclb_load_report_request_create_locked(client_stats_);
687
+ // Skip client load report if the counters were all zero in the last
688
+ // report and they are still zero in this one.
689
+ if (LoadReportCountersAreZero(request)) {
690
+ if (last_client_load_report_counters_were_zero_) {
691
+ grpc_grpclb_request_destroy(request);
692
+ ScheduleNextClientLoadReportLocked();
693
+ return;
694
+ }
695
+ last_client_load_report_counters_were_zero_ = true;
696
+ } else {
697
+ last_client_load_report_counters_were_zero_ = false;
698
+ }
699
+ grpc_slice request_payload_slice = grpc_grpclb_request_encode(request);
700
+ send_message_payload_ =
701
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
702
+ grpc_slice_unref_internal(request_payload_slice);
703
+ grpc_grpclb_request_destroy(request);
704
+ // Send the report.
705
+ grpc_op op;
706
+ memset(&op, 0, sizeof(op));
707
+ op.op = GRPC_OP_SEND_MESSAGE;
708
+ op.data.send_message.send_message = send_message_payload_;
709
+ GRPC_CLOSURE_INIT(&client_load_report_closure_, ClientLoadReportDoneLocked,
710
+ this, grpc_combiner_scheduler(grpclb_policy()->combiner()));
711
+ grpc_call_error call_error = grpc_call_start_batch_and_execute(
712
+ lb_call_, &op, 1, &client_load_report_closure_);
713
+ if (call_error != GRPC_CALL_OK) {
714
+ gpr_log(GPR_ERROR, "[grpclb %p] call_error=%d", grpclb_policy_.get(),
715
+ call_error);
716
+ GPR_ASSERT(GRPC_CALL_OK == call_error);
717
+ }
718
+ }
719
+
720
+ void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(void* arg,
721
+ grpc_error* error) {
722
+ BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
723
+ GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
724
+ grpc_byte_buffer_destroy(lb_calld->send_message_payload_);
725
+ lb_calld->send_message_payload_ = nullptr;
726
+ if (error != GRPC_ERROR_NONE || lb_calld != grpclb_policy->lb_calld_.get()) {
727
+ lb_calld->Unref(DEBUG_LOCATION, "client_load_report");
728
+ return;
729
+ }
730
+ lb_calld->ScheduleNextClientLoadReportLocked();
731
+ }
732
+
733
+ void GrpcLb::BalancerCallState::OnInitialRequestSentLocked(void* arg,
734
+ grpc_error* error) {
735
+ BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
736
+ grpc_byte_buffer_destroy(lb_calld->send_message_payload_);
737
+ lb_calld->send_message_payload_ = nullptr;
738
+ // If we attempted to send a client load report before the initial request was
739
+ // sent (and this lb_calld is still in use), send the load report now.
740
+ if (lb_calld->client_load_report_is_due_ &&
741
+ lb_calld == lb_calld->grpclb_policy()->lb_calld_.get()) {
742
+ lb_calld->SendClientLoadReportLocked();
743
+ lb_calld->client_load_report_is_due_ = false;
744
+ }
745
+ lb_calld->Unref(DEBUG_LOCATION, "on_initial_request_sent");
746
+ }
747
+
748
+ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked(
749
+ void* arg, grpc_error* error) {
750
+ BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
751
+ GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
752
+ // Empty payload means the LB call was cancelled.
753
+ if (lb_calld != grpclb_policy->lb_calld_.get() ||
754
+ lb_calld->recv_message_payload_ == nullptr) {
755
+ lb_calld->Unref(DEBUG_LOCATION, "on_message_received");
756
+ return;
757
+ }
758
+ grpc_byte_buffer_reader bbr;
759
+ grpc_byte_buffer_reader_init(&bbr, lb_calld->recv_message_payload_);
760
+ grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
761
+ grpc_byte_buffer_reader_destroy(&bbr);
762
+ grpc_byte_buffer_destroy(lb_calld->recv_message_payload_);
763
+ lb_calld->recv_message_payload_ = nullptr;
764
+ grpc_grpclb_initial_response* initial_response;
765
+ grpc_grpclb_serverlist* serverlist;
766
+ if (!lb_calld->seen_initial_response_ &&
767
+ (initial_response = grpc_grpclb_initial_response_parse(response_slice)) !=
768
+ nullptr) {
769
+ // Have NOT seen initial response, look for initial response.
770
+ if (initial_response->has_client_stats_report_interval) {
771
+ lb_calld->client_stats_report_interval_ = GPR_MAX(
772
+ GPR_MS_PER_SEC, grpc_grpclb_duration_to_millis(
773
+ &initial_response->client_stats_report_interval));
774
+ if (grpc_lb_glb_trace.enabled()) {
775
+ gpr_log(GPR_INFO,
776
+ "[grpclb %p] Received initial LB response message; "
777
+ "client load reporting interval = %" PRIdPTR " milliseconds",
778
+ grpclb_policy, lb_calld->client_stats_report_interval_);
779
+ }
780
+ } else if (grpc_lb_glb_trace.enabled()) {
781
+ gpr_log(GPR_INFO,
782
+ "[grpclb %p] Received initial LB response message; client load "
783
+ "reporting NOT enabled",
784
+ grpclb_policy);
785
+ }
786
+ grpc_grpclb_initial_response_destroy(initial_response);
787
+ lb_calld->seen_initial_response_ = true;
788
+ } else if ((serverlist = grpc_grpclb_response_parse_serverlist(
789
+ response_slice)) != nullptr) {
790
+ // Have seen initial response, look for serverlist.
791
+ GPR_ASSERT(lb_calld->lb_call_ != nullptr);
792
+ if (grpc_lb_glb_trace.enabled()) {
793
+ gpr_log(GPR_INFO,
794
+ "[grpclb %p] Serverlist with %" PRIuPTR " servers received",
795
+ grpclb_policy, serverlist->num_servers);
796
+ for (size_t i = 0; i < serverlist->num_servers; ++i) {
797
+ grpc_resolved_address addr;
798
+ ParseServer(serverlist->servers[i], &addr);
799
+ char* ipport;
800
+ grpc_sockaddr_to_string(&ipport, &addr, false);
801
+ gpr_log(GPR_INFO, "[grpclb %p] Serverlist[%" PRIuPTR "]: %s",
802
+ grpclb_policy, i, ipport);
803
+ gpr_free(ipport);
804
+ }
805
+ }
806
+ /* update serverlist */
807
+ if (serverlist->num_servers > 0) {
808
+ // Start sending client load report only after we start using the
809
+ // serverlist returned from the current LB call.
810
+ if (lb_calld->client_stats_report_interval_ > 0 &&
811
+ lb_calld->client_stats_ == nullptr) {
812
+ lb_calld->client_stats_ = grpc_grpclb_client_stats_create();
813
+ // TODO(roth): We currently track this ref manually. Once the
814
+ // ClosureRef API is ready, we should pass the RefCountedPtr<> along
815
+ // with the callback.
816
+ auto self = lb_calld->Ref(DEBUG_LOCATION, "client_load_report");
817
+ self.release();
818
+ lb_calld->ScheduleNextClientLoadReportLocked();
819
+ }
820
+ if (grpc_grpclb_serverlist_equals(grpclb_policy->serverlist_,
821
+ serverlist)) {
822
+ if (grpc_lb_glb_trace.enabled()) {
823
+ gpr_log(GPR_INFO,
824
+ "[grpclb %p] Incoming server list identical to current, "
825
+ "ignoring.",
826
+ grpclb_policy);
827
+ }
828
+ grpc_grpclb_destroy_serverlist(serverlist);
829
+ } else { /* new serverlist */
830
+ if (grpclb_policy->serverlist_ != nullptr) {
831
+ /* dispose of the old serverlist */
832
+ grpc_grpclb_destroy_serverlist(grpclb_policy->serverlist_);
833
+ } else {
834
+ /* or dispose of the fallback */
835
+ grpc_lb_addresses_destroy(grpclb_policy->fallback_backend_addresses_);
836
+ grpclb_policy->fallback_backend_addresses_ = nullptr;
837
+ if (grpclb_policy->fallback_timer_callback_pending_) {
838
+ grpc_timer_cancel(&grpclb_policy->lb_fallback_timer_);
839
+ }
840
+ }
841
+ // and update the copy in the GrpcLb instance. This
842
+ // serverlist instance will be destroyed either upon the next
843
+ // update or when the GrpcLb instance is destroyed.
844
+ grpclb_policy->serverlist_ = serverlist;
845
+ grpclb_policy->serverlist_index_ = 0;
846
+ grpclb_policy->CreateOrUpdateRoundRobinPolicyLocked();
847
+ }
848
+ } else {
849
+ if (grpc_lb_glb_trace.enabled()) {
850
+ gpr_log(GPR_INFO, "[grpclb %p] Received empty server list, ignoring.",
851
+ grpclb_policy);
852
+ }
853
+ grpc_grpclb_destroy_serverlist(serverlist);
854
+ }
855
+ } else {
856
+ // No valid initial response or serverlist found.
857
+ gpr_log(GPR_ERROR,
858
+ "[grpclb %p] Invalid LB response received: '%s'. Ignoring.",
859
+ grpclb_policy,
860
+ grpc_dump_slice(response_slice, GPR_DUMP_ASCII | GPR_DUMP_HEX));
861
+ }
862
+ grpc_slice_unref_internal(response_slice);
863
+ if (!grpclb_policy->shutting_down_) {
864
+ // Keep listening for serverlist updates.
865
+ grpc_op op;
866
+ memset(&op, 0, sizeof(op));
867
+ op.op = GRPC_OP_RECV_MESSAGE;
868
+ op.data.recv_message.recv_message = &lb_calld->recv_message_payload_;
869
+ op.flags = 0;
870
+ op.reserved = nullptr;
871
+ // Reuse the "OnBalancerMessageReceivedLocked" ref taken in StartQuery().
872
+ const grpc_call_error call_error = grpc_call_start_batch_and_execute(
873
+ lb_calld->lb_call_, &op, 1,
874
+ &lb_calld->lb_on_balancer_message_received_);
875
+ GPR_ASSERT(GRPC_CALL_OK == call_error);
876
+ } else {
877
+ lb_calld->Unref(DEBUG_LOCATION, "on_message_received+grpclb_shutdown");
878
+ }
879
+ }
880
+
881
+ void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked(
882
+ void* arg, grpc_error* error) {
883
+ BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
884
+ GrpcLb* grpclb_policy = lb_calld->grpclb_policy();
885
+ GPR_ASSERT(lb_calld->lb_call_ != nullptr);
886
+ if (grpc_lb_glb_trace.enabled()) {
887
+ char* status_details =
888
+ grpc_slice_to_c_string(lb_calld->lb_call_status_details_);
889
+ gpr_log(GPR_INFO,
890
+ "[grpclb %p] Status from LB server received. Status = %d, details "
891
+ "= '%s', (lb_calld: %p, lb_call: %p), error '%s'",
892
+ grpclb_policy, lb_calld->lb_call_status_, status_details, lb_calld,
893
+ lb_calld->lb_call_, grpc_error_string(error));
894
+ gpr_free(status_details);
895
+ }
896
+ grpclb_policy->TryReresolutionLocked(&grpc_lb_glb_trace, GRPC_ERROR_NONE);
897
+ // If this lb_calld is still in use, this call ended because of a failure so
898
+ // we want to retry connecting. Otherwise, we have deliberately ended this
899
+ // call and no further action is required.
900
+ if (lb_calld == grpclb_policy->lb_calld_.get()) {
901
+ grpclb_policy->lb_calld_.reset();
902
+ GPR_ASSERT(!grpclb_policy->shutting_down_);
903
+ if (lb_calld->seen_initial_response_) {
904
+ // If we lose connection to the LB server, reset the backoff and restart
905
+ // the LB call immediately.
906
+ grpclb_policy->lb_call_backoff_.Reset();
907
+ grpclb_policy->StartBalancerCallLocked();
908
+ } else {
909
+ // If this LB call fails establishing any connection to the LB server,
910
+ // retry later.
911
+ grpclb_policy->StartBalancerCallRetryTimerLocked();
912
+ }
913
+ }
914
+ lb_calld->Unref(DEBUG_LOCATION, "lb_call_ended");
915
+ }
916
+
917
+ //
918
+ // helper code for creating balancer channel
919
+ //
920
+
921
+ grpc_lb_addresses* ExtractBalancerAddresses(
922
+ const grpc_lb_addresses* addresses) {
923
+ size_t num_grpclb_addrs = 0;
924
+ for (size_t i = 0; i < addresses->num_addresses; ++i) {
925
+ if (addresses->addresses[i].is_balancer) ++num_grpclb_addrs;
926
+ }
927
+ // There must be at least one balancer address, or else the
928
+ // client_channel would not have chosen this LB policy.
929
+ GPR_ASSERT(num_grpclb_addrs > 0);
930
+ grpc_lb_addresses* lb_addresses =
931
+ grpc_lb_addresses_create(num_grpclb_addrs, nullptr);
932
+ size_t lb_addresses_idx = 0;
933
+ for (size_t i = 0; i < addresses->num_addresses; ++i) {
934
+ if (!addresses->addresses[i].is_balancer) continue;
935
+ if (addresses->addresses[i].user_data != nullptr) {
936
+ gpr_log(GPR_ERROR,
937
+ "This LB policy doesn't support user data. It will be ignored");
938
+ }
939
+ grpc_lb_addresses_set_address(
940
+ lb_addresses, lb_addresses_idx++, addresses->addresses[i].address.addr,
941
+ addresses->addresses[i].address.len, false /* is balancer */,
942
+ addresses->addresses[i].balancer_name, nullptr /* user data */);
943
+ }
944
+ GPR_ASSERT(num_grpclb_addrs == lb_addresses_idx);
945
+ return lb_addresses;
946
+ }
947
+
948
+ /* Returns the channel args for the LB channel, used to create a bidirectional
949
+ * stream for the reception of load balancing updates.
950
+ *
951
+ * Inputs:
952
+ * - \a addresses: corresponding to the balancers.
953
+ * - \a response_generator: in order to propagate updates from the resolver
954
+ * above the grpclb policy.
955
+ * - \a args: other args inherited from the grpclb policy. */
956
+ grpc_channel_args* BuildBalancerChannelArgs(
957
+ const grpc_lb_addresses* addresses,
958
+ FakeResolverResponseGenerator* response_generator,
959
+ const grpc_channel_args* args) {
960
+ grpc_lb_addresses* lb_addresses = ExtractBalancerAddresses(addresses);
961
+ // Channel args to remove.
962
+ static const char* args_to_remove[] = {
963
+ // LB policy name, since we want to use the default (pick_first) in
964
+ // the LB channel.
965
+ GRPC_ARG_LB_POLICY_NAME,
966
+ // The channel arg for the server URI, since that will be different for
967
+ // the LB channel than for the parent channel. The client channel
968
+ // factory will re-add this arg with the right value.
969
+ GRPC_ARG_SERVER_URI,
970
+ // The resolved addresses, which will be generated by the name resolver
971
+ // used in the LB channel. Note that the LB channel will use the fake
972
+ // resolver, so this won't actually generate a query to DNS (or some
973
+ // other name service). However, the addresses returned by the fake
974
+ // resolver will have is_balancer=false, whereas our own addresses have
975
+ // is_balancer=true. We need the LB channel to return addresses with
976
+ // is_balancer=false so that it does not wind up recursively using the
977
+ // grpclb LB policy, as per the special case logic in client_channel.c.
978
+ GRPC_ARG_LB_ADDRESSES,
979
+ // The fake resolver response generator, because we are replacing it
980
+ // with the one from the grpclb policy, used to propagate updates to
981
+ // the LB channel.
982
+ GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
983
+ // The LB channel should use the authority indicated by the target
984
+ // authority table (see \a grpc_lb_policy_grpclb_modify_lb_channel_args),
985
+ // as opposed to the authority from the parent channel.
986
+ GRPC_ARG_DEFAULT_AUTHORITY,
987
+ // Just as for \a GRPC_ARG_DEFAULT_AUTHORITY, the LB channel should be
988
+ // treated as a stand-alone channel and not inherit this argument from the
989
+ // args of the parent channel.
990
+ GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
991
+ };
992
+ // Channel args to add.
993
+ const grpc_arg args_to_add[] = {
994
+ // New LB addresses.
995
+ // Note that we pass these in both when creating the LB channel
996
+ // and via the fake resolver. The latter is what actually gets used.
997
+ grpc_lb_addresses_create_channel_arg(lb_addresses),
998
+ // The fake resolver response generator, which we use to inject
999
+ // address updates into the LB channel.
1000
+ grpc_core::FakeResolverResponseGenerator::MakeChannelArg(
1001
+ response_generator),
1002
+ };
1003
+ // Construct channel args.
1004
+ grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
1005
+ args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), args_to_add,
1006
+ GPR_ARRAY_SIZE(args_to_add));
1007
+ // Make any necessary modifications for security.
1008
+ new_args = grpc_lb_policy_grpclb_modify_lb_channel_args(new_args);
1009
+ // Clean up.
1010
+ grpc_lb_addresses_destroy(lb_addresses);
1011
+ return new_args;
1012
+ }
1013
+
1014
+ //
1015
+ // ctor and dtor
1016
+ //
1017
+
1018
+ GrpcLb::GrpcLb(const grpc_lb_addresses* addresses,
1019
+ const LoadBalancingPolicy::Args& args)
1020
+ : LoadBalancingPolicy(args),
1021
+ response_generator_(MakeRefCounted<FakeResolverResponseGenerator>()),
1022
+ lb_call_backoff_(
1023
+ BackOff::Options()
1024
+ .set_initial_backoff(GRPC_GRPCLB_INITIAL_CONNECT_BACKOFF_SECONDS *
1025
+ 1000)
1026
+ .set_multiplier(GRPC_GRPCLB_RECONNECT_BACKOFF_MULTIPLIER)
1027
+ .set_jitter(GRPC_GRPCLB_RECONNECT_JITTER)
1028
+ .set_max_backoff(GRPC_GRPCLB_RECONNECT_MAX_BACKOFF_SECONDS *
1029
+ 1000)) {
1030
+ // Initialization.
1031
+ grpc_subchannel_index_ref();
1032
+ GRPC_CLOSURE_INIT(&lb_channel_on_connectivity_changed_,
1033
+ &GrpcLb::OnBalancerChannelConnectivityChangedLocked, this,
1034
+ grpc_combiner_scheduler(args.combiner));
1035
+ GRPC_CLOSURE_INIT(&on_rr_connectivity_changed_,
1036
+ &GrpcLb::OnRoundRobinConnectivityChangedLocked, this,
1037
+ grpc_combiner_scheduler(args.combiner));
1038
+ GRPC_CLOSURE_INIT(&on_rr_request_reresolution_,
1039
+ &GrpcLb::OnRoundRobinRequestReresolutionLocked, this,
1040
+ grpc_combiner_scheduler(args.combiner));
1041
+ grpc_connectivity_state_init(&state_tracker_, GRPC_CHANNEL_IDLE, "grpclb");
1042
+ // Record server name.
1043
+ const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI);
1044
+ const char* server_uri = grpc_channel_arg_get_string(arg);
1045
+ GPR_ASSERT(server_uri != nullptr);
1046
+ grpc_uri* uri = grpc_uri_parse(server_uri, true);
1047
+ GPR_ASSERT(uri->path[0] != '\0');
1048
+ server_name_ = gpr_strdup(uri->path[0] == '/' ? uri->path + 1 : uri->path);
1049
+ if (grpc_lb_glb_trace.enabled()) {
1050
+ gpr_log(GPR_INFO,
1051
+ "[grpclb %p] Will use '%s' as the server name for LB request.",
1052
+ this, server_name_);
1053
+ }
1054
+ grpc_uri_destroy(uri);
1055
+ // Record LB call timeout.
1056
+ arg = grpc_channel_args_find(args.args, GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS);
1057
+ lb_call_timeout_ms_ = grpc_channel_arg_get_integer(arg, {0, 0, INT_MAX});
1058
+ // Record fallback timeout.
1059
+ arg = grpc_channel_args_find(args.args, GRPC_ARG_GRPCLB_FALLBACK_TIMEOUT_MS);
1060
+ lb_fallback_timeout_ms_ = grpc_channel_arg_get_integer(
1061
+ arg, {GRPC_GRPCLB_DEFAULT_FALLBACK_TIMEOUT_MS, 0, INT_MAX});
1062
+ // Process channel args.
1063
+ ProcessChannelArgsLocked(*args.args);
1064
+ }
1065
+
1066
+ GrpcLb::~GrpcLb() {
1067
+ GPR_ASSERT(pending_picks_ == nullptr);
1068
+ GPR_ASSERT(pending_pings_ == nullptr);
1069
+ gpr_free((void*)server_name_);
1070
+ grpc_channel_args_destroy(args_);
1071
+ grpc_connectivity_state_destroy(&state_tracker_);
1072
+ if (serverlist_ != nullptr) {
1073
+ grpc_grpclb_destroy_serverlist(serverlist_);
1074
+ }
1075
+ if (fallback_backend_addresses_ != nullptr) {
1076
+ grpc_lb_addresses_destroy(fallback_backend_addresses_);
1077
+ }
1078
+ grpc_subchannel_index_unref();
1079
+ }
1080
+
1081
+ void GrpcLb::ShutdownLocked() {
1082
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel shutdown");
1083
+ shutting_down_ = true;
1084
+ lb_calld_.reset();
1085
+ if (retry_timer_callback_pending_) {
1086
+ grpc_timer_cancel(&lb_call_retry_timer_);
1087
+ }
1088
+ if (fallback_timer_callback_pending_) {
1089
+ grpc_timer_cancel(&lb_fallback_timer_);
1090
+ }
1091
+ rr_policy_.reset();
1092
+ TryReresolutionLocked(&grpc_lb_glb_trace, GRPC_ERROR_CANCELLED);
1093
+ // We destroy the LB channel here instead of in our destructor because
1094
+ // destroying the channel triggers a last callback to
1095
+ // OnBalancerChannelConnectivityChangedLocked(), and we need to be
1096
+ // alive when that callback is invoked.
1097
+ if (lb_channel_ != nullptr) {
1098
+ grpc_channel_destroy(lb_channel_);
1099
+ lb_channel_ = nullptr;
1100
+ }
1101
+ grpc_connectivity_state_set(&state_tracker_, GRPC_CHANNEL_SHUTDOWN,
1102
+ GRPC_ERROR_REF(error), "grpclb_shutdown");
1103
+ // Clear pending picks.
1104
+ PendingPick* pp;
1105
+ while ((pp = pending_picks_) != nullptr) {
1106
+ pending_picks_ = pp->next;
1107
+ pp->pick->connected_subchannel.reset();
1108
+ // Note: pp is deleted in this callback.
1109
+ GRPC_CLOSURE_SCHED(&pp->on_complete, GRPC_ERROR_REF(error));
1110
+ }
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
+ GRPC_ERROR_UNREF(error);
1120
+ }
1121
+
1122
+ //
1123
+ // public methods
1124
+ //
1125
+
1126
+ void GrpcLb::HandOffPendingPicksLocked(LoadBalancingPolicy* new_policy) {
1127
+ PendingPick* pp;
1128
+ while ((pp = pending_picks_) != nullptr) {
1129
+ pending_picks_ = pp->next;
1130
+ pp->pick->on_complete = pp->original_on_complete;
1131
+ pp->pick->user_data = nullptr;
1132
+ if (new_policy->PickLocked(pp->pick)) {
1133
+ // Synchronous return; schedule closure.
1134
+ GRPC_CLOSURE_SCHED(pp->pick->on_complete, GRPC_ERROR_NONE);
1135
+ }
1136
+ Delete(pp);
1137
+ }
1138
+ }
1139
+
1140
+ // Cancel a specific pending pick.
1141
+ //
1142
+ // A grpclb pick progresses as follows:
1143
+ // - If there's a Round Robin policy (rr_policy_) available, it'll be
1144
+ // handed over to the RR policy (in CreateRoundRobinPolicyLocked()). From
1145
+ // that point onwards, it'll be RR's responsibility. For cancellations, that
1146
+ // implies the pick needs also be cancelled by the RR instance.
1147
+ // - Otherwise, without an RR instance, picks stay pending at this policy's
1148
+ // level (grpclb), inside the pending_picks_ list. To cancel these,
1149
+ // we invoke the completion closure and set the pick's connected
1150
+ // subchannel to nullptr right here.
1151
+ void GrpcLb::CancelPickLocked(PickState* pick, grpc_error* error) {
1152
+ PendingPick* pp = pending_picks_;
1153
+ pending_picks_ = nullptr;
1154
+ while (pp != nullptr) {
1155
+ PendingPick* next = pp->next;
1156
+ if (pp->pick == pick) {
1157
+ pick->connected_subchannel.reset();
1158
+ // Note: pp is deleted in this callback.
1159
+ GRPC_CLOSURE_SCHED(&pp->on_complete,
1160
+ GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
1161
+ "Pick Cancelled", &error, 1));
1162
+ } else {
1163
+ pp->next = pending_picks_;
1164
+ pending_picks_ = pp;
1165
+ }
1166
+ pp = next;
1167
+ }
1168
+ if (rr_policy_ != nullptr) {
1169
+ rr_policy_->CancelPickLocked(pick, GRPC_ERROR_REF(error));
1170
+ }
1171
+ GRPC_ERROR_UNREF(error);
1172
+ }
1173
+
1174
+ // Cancel all pending picks.
1175
+ //
1176
+ // A grpclb pick progresses as follows:
1177
+ // - If there's a Round Robin policy (rr_policy_) available, it'll be
1178
+ // handed over to the RR policy (in CreateRoundRobinPolicyLocked()). From
1179
+ // that point onwards, it'll be RR's responsibility. For cancellations, that
1180
+ // implies the pick needs also be cancelled by the RR instance.
1181
+ // - Otherwise, without an RR instance, picks stay pending at this policy's
1182
+ // level (grpclb), inside the pending_picks_ list. To cancel these,
1183
+ // we invoke the completion closure and set the pick's connected
1184
+ // subchannel to nullptr right here.
1185
+ void GrpcLb::CancelMatchingPicksLocked(uint32_t initial_metadata_flags_mask,
1186
+ uint32_t initial_metadata_flags_eq,
1187
+ grpc_error* error) {
1188
+ PendingPick* pp = pending_picks_;
1189
+ pending_picks_ = nullptr;
1190
+ while (pp != nullptr) {
1191
+ PendingPick* next = pp->next;
1192
+ if ((pp->pick->initial_metadata_flags & initial_metadata_flags_mask) ==
1193
+ initial_metadata_flags_eq) {
1194
+ // Note: pp is deleted in this callback.
1195
+ GRPC_CLOSURE_SCHED(&pp->on_complete,
1196
+ GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
1197
+ "Pick Cancelled", &error, 1));
1198
+ } else {
1199
+ pp->next = pending_picks_;
1200
+ pending_picks_ = pp;
1201
+ }
1202
+ pp = next;
1203
+ }
1204
+ if (rr_policy_ != nullptr) {
1205
+ rr_policy_->CancelMatchingPicksLocked(initial_metadata_flags_mask,
1206
+ initial_metadata_flags_eq,
1207
+ GRPC_ERROR_REF(error));
1208
+ }
1209
+ GRPC_ERROR_UNREF(error);
1210
+ }
1211
+
1212
+ void GrpcLb::ExitIdleLocked() {
1213
+ if (!started_picking_) {
1214
+ StartPickingLocked();
1215
+ }
1216
+ }
1217
+
1218
+ bool GrpcLb::PickLocked(PickState* pick) {
1219
+ PendingPick* pp = PendingPickCreate(pick);
1220
+ bool pick_done = false;
1221
+ 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) {
1229
+ if (grpc_lb_glb_trace.enabled()) {
1230
+ 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));
1234
+ }
1235
+ 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());
1241
+ }
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
+ }
1254
+ pick_done = false;
1255
+ }
1256
+ return pick_done;
1257
+ }
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();
1266
+ }
1267
+ }
1268
+ }
1269
+
1270
+ grpc_connectivity_state GrpcLb::CheckConnectivityLocked(
1271
+ grpc_error** connectivity_error) {
1272
+ return grpc_connectivity_state_get(&state_tracker_, connectivity_error);
1273
+ }
1274
+
1275
+ void GrpcLb::NotifyOnStateChangeLocked(grpc_connectivity_state* current,
1276
+ grpc_closure* notify) {
1277
+ grpc_connectivity_state_notify_on_state_change(&state_tracker_, current,
1278
+ notify);
1279
+ }
1280
+
1281
+ void GrpcLb::ProcessChannelArgsLocked(const grpc_channel_args& args) {
1282
+ const grpc_arg* arg = grpc_channel_args_find(&args, GRPC_ARG_LB_ADDRESSES);
1283
+ if (arg == nullptr || arg->type != GRPC_ARG_POINTER) {
1284
+ // Ignore this update.
1285
+ gpr_log(
1286
+ GPR_ERROR,
1287
+ "[grpclb %p] No valid LB addresses channel arg in update, ignoring.",
1288
+ this);
1289
+ return;
1290
+ }
1291
+ const grpc_lb_addresses* addresses =
1292
+ static_cast<const grpc_lb_addresses*>(arg->value.pointer.p);
1293
+ // Update fallback address list.
1294
+ if (fallback_backend_addresses_ != nullptr) {
1295
+ grpc_lb_addresses_destroy(fallback_backend_addresses_);
1296
+ }
1297
+ fallback_backend_addresses_ = ExtractBackendAddresses(addresses);
1298
+ // Make sure that GRPC_ARG_LB_POLICY_NAME is set in channel args,
1299
+ // since we use this to trigger the client_load_reporting filter.
1300
+ static const char* args_to_remove[] = {GRPC_ARG_LB_POLICY_NAME};
1301
+ grpc_arg new_arg = grpc_channel_arg_string_create(
1302
+ (char*)GRPC_ARG_LB_POLICY_NAME, (char*)"grpclb");
1303
+ grpc_channel_args_destroy(args_);
1304
+ args_ = grpc_channel_args_copy_and_add_and_remove(
1305
+ &args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &new_arg, 1);
1306
+ // Construct args for balancer channel.
1307
+ grpc_channel_args* lb_channel_args =
1308
+ BuildBalancerChannelArgs(addresses, response_generator_.get(), &args);
1309
+ // Create balancer channel if needed.
1310
+ if (lb_channel_ == nullptr) {
1311
+ char* uri_str;
1312
+ gpr_asprintf(&uri_str, "fake:///%s", server_name_);
1313
+ lb_channel_ = grpc_client_channel_factory_create_channel(
1314
+ client_channel_factory(), uri_str,
1315
+ GRPC_CLIENT_CHANNEL_TYPE_LOAD_BALANCING, lb_channel_args);
1316
+ GPR_ASSERT(lb_channel_ != nullptr);
1317
+ gpr_free(uri_str);
1318
+ }
1319
+ // Propagate updates to the LB channel (pick_first) through the fake
1320
+ // resolver.
1321
+ response_generator_->SetResponse(lb_channel_args);
1322
+ grpc_channel_args_destroy(lb_channel_args);
1323
+ }
1324
+
1325
+ void GrpcLb::UpdateLocked(const grpc_channel_args& args) {
1326
+ ProcessChannelArgsLocked(args);
1327
+ // If fallback is configured and the RR policy already exists, update
1328
+ // it with the new fallback addresses.
1329
+ if (lb_fallback_timeout_ms_ > 0 && rr_policy_ != nullptr) {
1330
+ CreateOrUpdateRoundRobinPolicyLocked();
1331
+ }
1332
+ // Start watching the LB channel connectivity for connection, if not
1333
+ // already doing so.
1334
+ if (!watching_lb_channel_) {
1335
+ lb_channel_connectivity_ = grpc_channel_check_connectivity_state(
1336
+ lb_channel_, true /* try to connect */);
1337
+ grpc_channel_element* client_channel_elem = grpc_channel_stack_last_element(
1338
+ grpc_channel_get_channel_stack(lb_channel_));
1339
+ GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
1340
+ watching_lb_channel_ = true;
1341
+ // TODO(roth): We currently track this ref manually. Once the
1342
+ // ClosureRef API is ready, we should pass the RefCountedPtr<> along
1343
+ // with the callback.
1344
+ auto self = Ref(DEBUG_LOCATION, "watch_lb_channel_connectivity");
1345
+ self.release();
1346
+ grpc_client_channel_watch_connectivity_state(
1347
+ client_channel_elem,
1348
+ grpc_polling_entity_create_from_pollset_set(interested_parties()),
1349
+ &lb_channel_connectivity_, &lb_channel_on_connectivity_changed_,
1350
+ nullptr);
1351
+ }
1352
+ }
1353
+
1354
+ //
1355
+ // code for balancer channel and call
1356
+ //
1357
+
1358
+ void GrpcLb::StartPickingLocked() {
1359
+ // Start a timer to fall back.
1360
+ if (lb_fallback_timeout_ms_ > 0 && serverlist_ == nullptr &&
1361
+ !fallback_timer_callback_pending_) {
1362
+ grpc_millis deadline = ExecCtx::Get()->Now() + lb_fallback_timeout_ms_;
1363
+ // TODO(roth): We currently track this ref manually. Once the
1364
+ // ClosureRef API is ready, we should pass the RefCountedPtr<> along
1365
+ // with the callback.
1366
+ auto self = Ref(DEBUG_LOCATION, "on_fallback_timer");
1367
+ self.release();
1368
+ GRPC_CLOSURE_INIT(&lb_on_fallback_, &GrpcLb::OnFallbackTimerLocked, this,
1369
+ grpc_combiner_scheduler(combiner()));
1370
+ fallback_timer_callback_pending_ = true;
1371
+ grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_);
1372
+ }
1373
+ started_picking_ = true;
1374
+ StartBalancerCallLocked();
1375
+ }
1376
+
1377
+ void GrpcLb::StartBalancerCallLocked() {
1378
+ GPR_ASSERT(lb_channel_ != nullptr);
1379
+ if (shutting_down_) return;
1380
+ // Init the LB call data.
1381
+ GPR_ASSERT(lb_calld_ == nullptr);
1382
+ lb_calld_ = MakeOrphanable<BalancerCallState>(Ref());
1383
+ if (grpc_lb_glb_trace.enabled()) {
1384
+ gpr_log(GPR_INFO,
1385
+ "[grpclb %p] Query for backends (lb_channel: %p, lb_calld: %p)",
1386
+ this, lb_channel_, lb_calld_.get());
1387
+ }
1388
+ lb_calld_->StartQuery();
1389
+ }
1390
+
1391
+ void GrpcLb::OnFallbackTimerLocked(void* arg, grpc_error* error) {
1392
+ GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1393
+ grpclb_policy->fallback_timer_callback_pending_ = false;
1394
+ // If we receive a serverlist after the timer fires but before this callback
1395
+ // actually runs, don't fall back.
1396
+ if (grpclb_policy->serverlist_ == nullptr && !grpclb_policy->shutting_down_ &&
1397
+ error == GRPC_ERROR_NONE) {
1398
+ if (grpc_lb_glb_trace.enabled()) {
1399
+ gpr_log(GPR_INFO,
1400
+ "[grpclb %p] Falling back to use backends from resolver",
1401
+ grpclb_policy);
1402
+ }
1403
+ GPR_ASSERT(grpclb_policy->fallback_backend_addresses_ != nullptr);
1404
+ grpclb_policy->CreateOrUpdateRoundRobinPolicyLocked();
1405
+ }
1406
+ grpclb_policy->Unref(DEBUG_LOCATION, "on_fallback_timer");
1407
+ }
1408
+
1409
+ void GrpcLb::StartBalancerCallRetryTimerLocked() {
1410
+ grpc_millis next_try = lb_call_backoff_.NextAttemptTime();
1411
+ if (grpc_lb_glb_trace.enabled()) {
1412
+ gpr_log(GPR_DEBUG, "[grpclb %p] Connection to LB server lost...", this);
1413
+ grpc_millis timeout = next_try - ExecCtx::Get()->Now();
1414
+ if (timeout > 0) {
1415
+ gpr_log(GPR_DEBUG,
1416
+ "[grpclb %p] ... retry_timer_active in %" PRIuPTR "ms.", this,
1417
+ timeout);
1418
+ } else {
1419
+ gpr_log(GPR_DEBUG, "[grpclb %p] ... retry_timer_active immediately.",
1420
+ this);
1421
+ }
1422
+ }
1423
+ // TODO(roth): We currently track this ref manually. Once the
1424
+ // ClosureRef API is ready, we should pass the RefCountedPtr<> along
1425
+ // with the callback.
1426
+ auto self = Ref(DEBUG_LOCATION, "on_balancer_call_retry_timer");
1427
+ self.release();
1428
+ GRPC_CLOSURE_INIT(&lb_on_call_retry_, &GrpcLb::OnBalancerCallRetryTimerLocked,
1429
+ this, grpc_combiner_scheduler(combiner()));
1430
+ retry_timer_callback_pending_ = true;
1431
+ grpc_timer_init(&lb_call_retry_timer_, next_try, &lb_on_call_retry_);
1432
+ }
1433
+
1434
+ void GrpcLb::OnBalancerCallRetryTimerLocked(void* arg, grpc_error* error) {
1435
+ GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1436
+ grpclb_policy->retry_timer_callback_pending_ = false;
1437
+ if (!grpclb_policy->shutting_down_ && error == GRPC_ERROR_NONE &&
1438
+ grpclb_policy->lb_calld_ == nullptr) {
1439
+ if (grpc_lb_glb_trace.enabled()) {
1440
+ gpr_log(GPR_INFO, "[grpclb %p] Restarting call to LB server",
1441
+ grpclb_policy);
1442
+ }
1443
+ grpclb_policy->StartBalancerCallLocked();
1444
+ }
1445
+ grpclb_policy->Unref(DEBUG_LOCATION, "on_balancer_call_retry_timer");
1446
+ }
1447
+
1448
+ // Invoked as part of the update process. It continues watching the LB channel
1449
+ // until it shuts down or becomes READY. It's invoked even if the LB channel
1450
+ // stayed READY throughout the update (for example if the update is identical).
1451
+ void GrpcLb::OnBalancerChannelConnectivityChangedLocked(void* arg,
1452
+ grpc_error* error) {
1453
+ GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1454
+ if (grpclb_policy->shutting_down_) goto done;
1455
+ // Re-initialize the lb_call. This should also take care of updating the
1456
+ // embedded RR policy. Note that the current RR policy, if any, will stay in
1457
+ // effect until an update from the new lb_call is received.
1458
+ switch (grpclb_policy->lb_channel_connectivity_) {
1459
+ case GRPC_CHANNEL_CONNECTING:
1460
+ case GRPC_CHANNEL_TRANSIENT_FAILURE: {
1461
+ // Keep watching the LB channel.
1462
+ grpc_channel_element* client_channel_elem =
1463
+ grpc_channel_stack_last_element(
1464
+ grpc_channel_get_channel_stack(grpclb_policy->lb_channel_));
1465
+ GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
1466
+ grpc_client_channel_watch_connectivity_state(
1467
+ client_channel_elem,
1468
+ grpc_polling_entity_create_from_pollset_set(
1469
+ grpclb_policy->interested_parties()),
1470
+ &grpclb_policy->lb_channel_connectivity_,
1471
+ &grpclb_policy->lb_channel_on_connectivity_changed_, nullptr);
1472
+ break;
1473
+ }
1474
+ // The LB channel may be IDLE because it's shut down before the update.
1475
+ // Restart the LB call to kick the LB channel into gear.
1476
+ case GRPC_CHANNEL_IDLE:
1477
+ case GRPC_CHANNEL_READY:
1478
+ grpclb_policy->lb_calld_.reset();
1479
+ if (grpclb_policy->started_picking_) {
1480
+ if (grpclb_policy->retry_timer_callback_pending_) {
1481
+ grpc_timer_cancel(&grpclb_policy->lb_call_retry_timer_);
1482
+ }
1483
+ grpclb_policy->lb_call_backoff_.Reset();
1484
+ grpclb_policy->StartBalancerCallLocked();
1485
+ }
1486
+ // Fall through.
1487
+ case GRPC_CHANNEL_SHUTDOWN:
1488
+ done:
1489
+ grpclb_policy->watching_lb_channel_ = false;
1490
+ grpclb_policy->Unref(DEBUG_LOCATION,
1491
+ "watch_lb_channel_connectivity_cb_shutdown");
1492
+ }
1493
+ }
1494
+
1495
+ //
1496
+ // PendingPick
1497
+ //
1498
+
1499
+ // Adds lb_token of selected subchannel (address) to the call's initial
1500
+ // metadata.
1501
+ grpc_error* AddLbTokenToInitialMetadata(
1502
+ grpc_mdelem lb_token, grpc_linked_mdelem* lb_token_mdelem_storage,
1503
+ grpc_metadata_batch* initial_metadata) {
1504
+ GPR_ASSERT(lb_token_mdelem_storage != nullptr);
1505
+ GPR_ASSERT(!GRPC_MDISNULL(lb_token));
1506
+ return grpc_metadata_batch_add_tail(initial_metadata, lb_token_mdelem_storage,
1507
+ lb_token);
1508
+ }
1509
+
1510
+ // Destroy function used when embedding client stats in call context.
1511
+ void DestroyClientStats(void* arg) {
1512
+ grpc_grpclb_client_stats_unref(static_cast<grpc_grpclb_client_stats*>(arg));
1513
+ }
1514
+
1515
+ void GrpcLb::PendingPickSetMetadataAndContext(PendingPick* pp) {
1516
+ /* if connected_subchannel is nullptr, no pick has been made by the RR
1517
+ * policy (e.g., all addresses failed to connect). There won't be any
1518
+ * user_data/token available */
1519
+ if (pp->pick->connected_subchannel != nullptr) {
1520
+ if (!GRPC_MDISNULL(pp->lb_token)) {
1521
+ AddLbTokenToInitialMetadata(GRPC_MDELEM_REF(pp->lb_token),
1522
+ &pp->pick->lb_token_mdelem_storage,
1523
+ pp->pick->initial_metadata);
1524
+ } else {
1525
+ gpr_log(GPR_ERROR,
1526
+ "[grpclb %p] No LB token for connected subchannel pick %p",
1527
+ pp->grpclb_policy, pp->pick);
1528
+ abort();
1529
+ }
1530
+ // Pass on client stats via context. Passes ownership of the reference.
1531
+ if (pp->client_stats != nullptr) {
1532
+ pp->pick->subchannel_call_context[GRPC_GRPCLB_CLIENT_STATS].value =
1533
+ pp->client_stats;
1534
+ pp->pick->subchannel_call_context[GRPC_GRPCLB_CLIENT_STATS].destroy =
1535
+ DestroyClientStats;
1536
+ }
1537
+ } else {
1538
+ if (pp->client_stats != nullptr) {
1539
+ grpc_grpclb_client_stats_unref(pp->client_stats);
1540
+ }
1541
+ }
1542
+ }
1543
+
1544
+ /* The \a on_complete closure passed as part of the pick requires keeping a
1545
+ * reference to its associated round robin instance. We wrap this closure in
1546
+ * order to unref the round robin instance upon its invocation */
1547
+ void GrpcLb::OnPendingPickComplete(void* arg, grpc_error* error) {
1548
+ PendingPick* pp = static_cast<PendingPick*>(arg);
1549
+ PendingPickSetMetadataAndContext(pp);
1550
+ GRPC_CLOSURE_SCHED(pp->original_on_complete, GRPC_ERROR_REF(error));
1551
+ Delete(pp);
1552
+ }
1553
+
1554
+ GrpcLb::PendingPick* GrpcLb::PendingPickCreate(PickState* pick) {
1555
+ PendingPick* pp = New<PendingPick>();
1556
+ pp->grpclb_policy = this;
1557
+ pp->pick = pick;
1558
+ GRPC_CLOSURE_INIT(&pp->on_complete, &GrpcLb::OnPendingPickComplete, pp,
1559
+ grpc_schedule_on_exec_ctx);
1560
+ pp->original_on_complete = pick->on_complete;
1561
+ pick->on_complete = &pp->on_complete;
1562
+ return pp;
1563
+ }
1564
+
1565
+ void GrpcLb::AddPendingPick(PendingPick* pp) {
1566
+ pp->next = pending_picks_;
1567
+ pending_picks_ = pp;
1568
+ }
1569
+
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
+ //
1583
+ // code for interacting with the RR policy
1584
+ //
1585
+
1586
+ // Performs a pick over \a rr_policy_. Given that a pick can return
1587
+ // immediately (ignoring its completion callback), we need to perform the
1588
+ // cleanups this callback would otherwise be responsible for.
1589
+ // If \a force_async is true, then we will manually schedule the
1590
+ // completion callback even if the pick is available immediately.
1591
+ bool GrpcLb::PickFromRoundRobinPolicyLocked(bool force_async, PendingPick* pp) {
1592
+ // Check for drops if we are not using fallback backend addresses.
1593
+ if (serverlist_ != nullptr) {
1594
+ // Look at the index into the serverlist to see if we should drop this call.
1595
+ grpc_grpclb_server* server = serverlist_->servers[serverlist_index_++];
1596
+ if (serverlist_index_ == serverlist_->num_servers) {
1597
+ serverlist_index_ = 0; // Wrap-around.
1598
+ }
1599
+ if (server->drop) {
1600
+ // Update client load reporting stats to indicate the number of
1601
+ // dropped calls. Note that we have to do this here instead of in
1602
+ // the client_load_reporting filter, because we do not create a
1603
+ // subchannel call (and therefore no client_load_reporting filter)
1604
+ // for dropped calls.
1605
+ 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());
1608
+ }
1609
+ if (force_async) {
1610
+ GRPC_CLOSURE_SCHED(pp->original_on_complete, GRPC_ERROR_NONE);
1611
+ Delete(pp);
1612
+ return false;
1613
+ }
1614
+ Delete(pp);
1615
+ return true;
1616
+ }
1617
+ }
1618
+ // Set client_stats and user_data.
1619
+ if (lb_calld_ != nullptr && lb_calld_->client_stats() != nullptr) {
1620
+ pp->client_stats = grpc_grpclb_client_stats_ref(lb_calld_->client_stats());
1621
+ }
1622
+ GPR_ASSERT(pp->pick->user_data == nullptr);
1623
+ pp->pick->user_data = (void**)&pp->lb_token;
1624
+ // Pick via the RR policy.
1625
+ bool pick_done = rr_policy_->PickLocked(pp->pick);
1626
+ if (pick_done) {
1627
+ PendingPickSetMetadataAndContext(pp);
1628
+ if (force_async) {
1629
+ GRPC_CLOSURE_SCHED(pp->original_on_complete, GRPC_ERROR_NONE);
1630
+ pick_done = false;
1631
+ }
1632
+ Delete(pp);
1633
+ }
1634
+ // else, the pending pick will be registered and taken care of by the
1635
+ // pending pick list inside the RR policy. Eventually,
1636
+ // OnPendingPickComplete() will be called, which will (among other
1637
+ // things) add the LB token to the call's initial metadata.
1638
+ return pick_done;
1639
+ }
1640
+
1641
+ void GrpcLb::CreateRoundRobinPolicyLocked(const Args& args) {
1642
+ GPR_ASSERT(rr_policy_ == nullptr);
1643
+ rr_policy_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
1644
+ "round_robin", args);
1645
+ if (rr_policy_ == nullptr) {
1646
+ gpr_log(GPR_ERROR, "[grpclb %p] Failure creating a RoundRobin policy",
1647
+ this);
1648
+ return;
1649
+ }
1650
+ // TODO(roth): We currently track this ref manually. Once the new
1651
+ // ClosureRef API is done, pass the RefCountedPtr<> along with the closure.
1652
+ auto self = Ref(DEBUG_LOCATION, "on_rr_reresolution_requested");
1653
+ self.release();
1654
+ rr_policy_->SetReresolutionClosureLocked(&on_rr_request_reresolution_);
1655
+ grpc_error* rr_state_error = nullptr;
1656
+ rr_connectivity_state_ = rr_policy_->CheckConnectivityLocked(&rr_state_error);
1657
+ // Connectivity state is a function of the RR policy updated/created.
1658
+ UpdateConnectivityStateFromRoundRobinPolicyLocked(rr_state_error);
1659
+ // Add the gRPC LB's interested_parties pollset_set to that of the newly
1660
+ // created RR policy. This will make the RR policy progress upon activity on
1661
+ // gRPC LB, which in turn is tied to the application's call.
1662
+ grpc_pollset_set_add_pollset_set(rr_policy_->interested_parties(),
1663
+ interested_parties());
1664
+ // Subscribe to changes to the connectivity of the new RR.
1665
+ // TODO(roth): We currently track this ref manually. Once the new
1666
+ // ClosureRef API is done, pass the RefCountedPtr<> along with the closure.
1667
+ self = Ref(DEBUG_LOCATION, "on_rr_connectivity_changed");
1668
+ self.release();
1669
+ rr_policy_->NotifyOnStateChangeLocked(&rr_connectivity_state_,
1670
+ &on_rr_connectivity_changed_);
1671
+ rr_policy_->ExitIdleLocked();
1672
+ // Send pending picks to RR policy.
1673
+ PendingPick* pp;
1674
+ while ((pp = pending_picks_)) {
1675
+ pending_picks_ = pp->next;
1676
+ if (grpc_lb_glb_trace.enabled()) {
1677
+ gpr_log(GPR_INFO,
1678
+ "[grpclb %p] Pending pick about to (async) PICK from RR %p", this,
1679
+ rr_policy_.get());
1680
+ }
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);
1693
+ }
1694
+ }
1695
+
1696
+ grpc_channel_args* GrpcLb::CreateRoundRobinPolicyArgsLocked() {
1697
+ grpc_lb_addresses* addresses;
1698
+ if (serverlist_ != nullptr) {
1699
+ GPR_ASSERT(serverlist_->num_servers > 0);
1700
+ addresses = ProcessServerlist(serverlist_);
1701
+ } else {
1702
+ // If CreateOrUpdateRoundRobinPolicyLocked() is invoked when we haven't
1703
+ // received any serverlist from the balancer, we use the fallback backends
1704
+ // returned by the resolver. Note that the fallback backend list may be
1705
+ // empty, in which case the new round_robin policy will keep the requested
1706
+ // picks pending.
1707
+ GPR_ASSERT(fallback_backend_addresses_ != nullptr);
1708
+ addresses = grpc_lb_addresses_copy(fallback_backend_addresses_);
1709
+ }
1710
+ GPR_ASSERT(addresses != nullptr);
1711
+ // Replace the LB addresses in the channel args that we pass down to
1712
+ // the subchannel.
1713
+ static const char* keys_to_remove[] = {GRPC_ARG_LB_ADDRESSES};
1714
+ const grpc_arg arg = grpc_lb_addresses_create_channel_arg(addresses);
1715
+ 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);
1717
+ grpc_lb_addresses_destroy(addresses);
1718
+ return args;
1719
+ }
1720
+
1721
+ void GrpcLb::CreateOrUpdateRoundRobinPolicyLocked() {
1722
+ if (shutting_down_) return;
1723
+ grpc_channel_args* args = CreateRoundRobinPolicyArgsLocked();
1724
+ GPR_ASSERT(args != nullptr);
1725
+ if (rr_policy_ != nullptr) {
1726
+ if (grpc_lb_glb_trace.enabled()) {
1727
+ gpr_log(GPR_DEBUG, "[grpclb %p] Updating RR policy %p", this,
1728
+ rr_policy_.get());
1729
+ }
1730
+ rr_policy_->UpdateLocked(*args);
1731
+ } else {
1732
+ LoadBalancingPolicy::Args lb_policy_args;
1733
+ lb_policy_args.combiner = combiner();
1734
+ lb_policy_args.client_channel_factory = client_channel_factory();
1735
+ lb_policy_args.args = args;
1736
+ CreateRoundRobinPolicyLocked(lb_policy_args);
1737
+ if (grpc_lb_glb_trace.enabled()) {
1738
+ gpr_log(GPR_DEBUG, "[grpclb %p] Created new RR policy %p", this,
1739
+ rr_policy_.get());
1740
+ }
1741
+ }
1742
+ grpc_channel_args_destroy(args);
1743
+ }
1744
+
1745
+ void GrpcLb::OnRoundRobinRequestReresolutionLocked(void* arg,
1746
+ grpc_error* error) {
1747
+ GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1748
+ if (grpclb_policy->shutting_down_ || error != GRPC_ERROR_NONE) {
1749
+ grpclb_policy->Unref(DEBUG_LOCATION, "on_rr_reresolution_requested");
1750
+ return;
1751
+ }
1752
+ if (grpc_lb_glb_trace.enabled()) {
1753
+ gpr_log(
1754
+ GPR_DEBUG,
1755
+ "[grpclb %p] Re-resolution requested from the internal RR policy (%p).",
1756
+ grpclb_policy, grpclb_policy->rr_policy_.get());
1757
+ }
1758
+ // If we are talking to a balancer, we expect to get updated addresses form
1759
+ // the balancer, so we can ignore the re-resolution request from the RR
1760
+ // policy. Otherwise, handle the re-resolution request using the
1761
+ // grpclb policy's original re-resolution closure.
1762
+ if (grpclb_policy->lb_calld_ == nullptr ||
1763
+ !grpclb_policy->lb_calld_->seen_initial_response()) {
1764
+ grpclb_policy->TryReresolutionLocked(&grpc_lb_glb_trace, GRPC_ERROR_NONE);
1765
+ }
1766
+ // Give back the wrapper closure to the RR policy.
1767
+ grpclb_policy->rr_policy_->SetReresolutionClosureLocked(
1768
+ &grpclb_policy->on_rr_request_reresolution_);
1769
+ }
1770
+
1771
+ void GrpcLb::UpdateConnectivityStateFromRoundRobinPolicyLocked(
1772
+ grpc_error* rr_state_error) {
1773
+ const grpc_connectivity_state curr_glb_state =
1774
+ grpc_connectivity_state_check(&state_tracker_);
1775
+ /* The new connectivity status is a function of the previous one and the new
1776
+ * input coming from the status of the RR policy.
1777
+ *
1778
+ * current state (grpclb's)
1779
+ * |
1780
+ * v || I | C | R | TF | SD | <- new state (RR's)
1781
+ * ===++====+=====+=====+======+======+
1782
+ * I || I | C | R | [I] | [I] |
1783
+ * ---++----+-----+-----+------+------+
1784
+ * C || I | C | R | [C] | [C] |
1785
+ * ---++----+-----+-----+------+------+
1786
+ * R || I | C | R | [R] | [R] |
1787
+ * ---++----+-----+-----+------+------+
1788
+ * TF || I | C | R | [TF] | [TF] |
1789
+ * ---++----+-----+-----+------+------+
1790
+ * SD || NA | NA | NA | NA | NA | (*)
1791
+ * ---++----+-----+-----+------+------+
1792
+ *
1793
+ * A [STATE] indicates that the old RR policy is kept. In those cases, STATE
1794
+ * is the current state of grpclb, which is left untouched.
1795
+ *
1796
+ * In summary, if the new state is TRANSIENT_FAILURE or SHUTDOWN, stick to
1797
+ * the previous RR instance.
1798
+ *
1799
+ * Note that the status is never updated to SHUTDOWN as a result of calling
1800
+ * this function. Only glb_shutdown() has the power to set that state.
1801
+ *
1802
+ * (*) This function mustn't be called during shutting down. */
1803
+ GPR_ASSERT(curr_glb_state != GRPC_CHANNEL_SHUTDOWN);
1804
+ switch (rr_connectivity_state_) {
1805
+ case GRPC_CHANNEL_TRANSIENT_FAILURE:
1806
+ case GRPC_CHANNEL_SHUTDOWN:
1807
+ GPR_ASSERT(rr_state_error != GRPC_ERROR_NONE);
1808
+ break;
1809
+ case GRPC_CHANNEL_IDLE:
1810
+ case GRPC_CHANNEL_CONNECTING:
1811
+ case GRPC_CHANNEL_READY:
1812
+ GPR_ASSERT(rr_state_error == GRPC_ERROR_NONE);
1813
+ }
1814
+ if (grpc_lb_glb_trace.enabled()) {
1815
+ gpr_log(
1816
+ GPR_INFO,
1817
+ "[grpclb %p] Setting grpclb's state to %s from new RR policy %p state.",
1818
+ this, grpc_connectivity_state_name(rr_connectivity_state_),
1819
+ rr_policy_.get());
1820
+ }
1821
+ grpc_connectivity_state_set(&state_tracker_, rr_connectivity_state_,
1822
+ rr_state_error,
1823
+ "update_lb_connectivity_status_locked");
1824
+ }
1825
+
1826
+ void GrpcLb::OnRoundRobinConnectivityChangedLocked(void* arg,
1827
+ grpc_error* error) {
1828
+ GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1829
+ if (grpclb_policy->shutting_down_) {
1830
+ grpclb_policy->Unref(DEBUG_LOCATION, "on_rr_connectivity_changed");
1831
+ return;
1832
+ }
1833
+ grpclb_policy->UpdateConnectivityStateFromRoundRobinPolicyLocked(
1834
+ GRPC_ERROR_REF(error));
1835
+ // Resubscribe. Reuse the "on_rr_connectivity_changed" ref.
1836
+ grpclb_policy->rr_policy_->NotifyOnStateChangeLocked(
1837
+ &grpclb_policy->rr_connectivity_state_,
1838
+ &grpclb_policy->on_rr_connectivity_changed_);
1839
+ }
1840
+
1841
+ //
1842
+ // factory
1843
+ //
1844
+
1845
+ class GrpcLbFactory : public LoadBalancingPolicyFactory {
1846
+ public:
1847
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1848
+ const LoadBalancingPolicy::Args& args) const override {
1849
+ /* Count the number of gRPC-LB addresses. There must be at least one. */
1850
+ const grpc_arg* arg =
1851
+ grpc_channel_args_find(args.args, GRPC_ARG_LB_ADDRESSES);
1852
+ if (arg == nullptr || arg->type != GRPC_ARG_POINTER) {
1853
+ return nullptr;
1854
+ }
1855
+ grpc_lb_addresses* addresses =
1856
+ static_cast<grpc_lb_addresses*>(arg->value.pointer.p);
1857
+ size_t num_grpclb_addrs = 0;
1858
+ for (size_t i = 0; i < addresses->num_addresses; ++i) {
1859
+ if (addresses->addresses[i].is_balancer) ++num_grpclb_addrs;
1860
+ }
1861
+ if (num_grpclb_addrs == 0) return nullptr;
1862
+ return OrphanablePtr<LoadBalancingPolicy>(New<GrpcLb>(addresses, args));
1863
+ }
1864
+
1865
+ const char* name() const override { return "grpclb"; }
1866
+ };
1867
+
1868
+ } // namespace
1869
+
1870
+ } // namespace grpc_core
1871
+
1872
+ //
1873
+ // Plugin registration
1874
+ //
1875
+
1876
+ namespace {
1877
+
1878
+ // Only add client_load_reporting filter if the grpclb LB policy is used.
1879
+ bool maybe_add_client_load_reporting_filter(grpc_channel_stack_builder* builder,
1880
+ void* arg) {
1881
+ const grpc_channel_args* args =
1882
+ grpc_channel_stack_builder_get_channel_arguments(builder);
1883
+ const grpc_arg* channel_arg =
1884
+ grpc_channel_args_find(args, GRPC_ARG_LB_POLICY_NAME);
1885
+ if (channel_arg != nullptr && channel_arg->type == GRPC_ARG_STRING &&
1886
+ strcmp(channel_arg->value.string, "grpclb") == 0) {
1887
+ return grpc_channel_stack_builder_append_filter(
1888
+ builder, (const grpc_channel_filter*)arg, nullptr, nullptr);
1889
+ }
1890
+ return true;
1891
+ }
1892
+
1893
+ } // namespace
1894
+
1895
+ void grpc_lb_policy_grpclb_init() {
1896
+ grpc_core::LoadBalancingPolicyRegistry::Builder::
1897
+ RegisterLoadBalancingPolicyFactory(
1898
+ grpc_core::UniquePtr<grpc_core::LoadBalancingPolicyFactory>(
1899
+ grpc_core::New<grpc_core::GrpcLbFactory>()));
1900
+ grpc_channel_init_register_stage(GRPC_CLIENT_SUBCHANNEL,
1901
+ GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
1902
+ maybe_add_client_load_reporting_filter,
1903
+ (void*)&grpc_client_load_reporting_filter);
1904
+ }
1905
+
1906
+ void grpc_lb_policy_grpclb_shutdown() {}