grpc-z 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.cc +59 -0
  76. data/src/core/ext/filters/client_channel/lb_policy.h +201 -0
  77. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +138 -0
  78. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +29 -0
  79. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1906 -0
  80. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +36 -0
  81. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +108 -0
  82. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +152 -0
  83. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +67 -0
  84. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +304 -0
  85. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +88 -0
  86. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +102 -0
  87. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +190 -0
  88. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +591 -0
  89. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +687 -0
  90. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +253 -0
  91. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +136 -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.cc +35 -0
  105. data/src/core/ext/filters/client_channel/resolver.h +134 -0
  106. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +493 -0
  107. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +53 -0
  108. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +351 -0
  109. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +593 -0
  110. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +74 -0
  111. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +59 -0
  112. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +340 -0
  113. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +297 -0
  114. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +83 -0
  115. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +214 -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.rb +35 -0
  718. data/src/ruby/lib/grpc/core/time_consts.rb +56 -0
  719. data/src/ruby/lib/grpc/errors.rb +201 -0
  720. data/src/ruby/lib/grpc/generic/active_call.rb +674 -0
  721. data/src/ruby/lib/grpc/generic/bidi_call.rb +233 -0
  722. data/src/ruby/lib/grpc/generic/client_stub.rb +501 -0
  723. data/src/ruby/lib/grpc/generic/interceptor_registry.rb +53 -0
  724. data/src/ruby/lib/grpc/generic/interceptors.rb +186 -0
  725. data/src/ruby/lib/grpc/generic/rpc_desc.rb +204 -0
  726. data/src/ruby/lib/grpc/generic/rpc_server.rb +490 -0
  727. data/src/ruby/lib/grpc/generic/service.rb +210 -0
  728. data/src/ruby/lib/grpc/google_rpc_status_utils.rb +35 -0
  729. data/src/ruby/lib/grpc/grpc.rb +24 -0
  730. data/src/ruby/lib/grpc/logconfig.rb +44 -0
  731. data/src/ruby/lib/grpc/notifier.rb +45 -0
  732. data/src/ruby/lib/grpc/version.rb +18 -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 +469 -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,138 @@
1
+ /*
2
+ *
3
+ * Copyright 2017 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h"
22
+
23
+ #include <grpc/support/atm.h>
24
+ #include <grpc/support/log.h>
25
+
26
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
27
+ #include "src/core/lib/iomgr/error.h"
28
+ #include "src/core/lib/profiling/timers.h"
29
+
30
+ static grpc_error* init_channel_elem(grpc_channel_element* elem,
31
+ grpc_channel_element_args* args) {
32
+ return GRPC_ERROR_NONE;
33
+ }
34
+
35
+ static void destroy_channel_elem(grpc_channel_element* elem) {}
36
+
37
+ namespace {
38
+ struct call_data {
39
+ // Stats object to update.
40
+ grpc_grpclb_client_stats* client_stats;
41
+ // State for intercepting send_initial_metadata.
42
+ grpc_closure on_complete_for_send;
43
+ grpc_closure* original_on_complete_for_send;
44
+ bool send_initial_metadata_succeeded;
45
+ // State for intercepting recv_initial_metadata.
46
+ grpc_closure recv_initial_metadata_ready;
47
+ grpc_closure* original_recv_initial_metadata_ready;
48
+ bool recv_initial_metadata_succeeded;
49
+ };
50
+ } // namespace
51
+
52
+ static void on_complete_for_send(void* arg, grpc_error* error) {
53
+ call_data* calld = static_cast<call_data*>(arg);
54
+ if (error == GRPC_ERROR_NONE) {
55
+ calld->send_initial_metadata_succeeded = true;
56
+ }
57
+ GRPC_CLOSURE_RUN(calld->original_on_complete_for_send, GRPC_ERROR_REF(error));
58
+ }
59
+
60
+ static void recv_initial_metadata_ready(void* arg, grpc_error* error) {
61
+ call_data* calld = static_cast<call_data*>(arg);
62
+ if (error == GRPC_ERROR_NONE) {
63
+ calld->recv_initial_metadata_succeeded = true;
64
+ }
65
+ GRPC_CLOSURE_RUN(calld->original_recv_initial_metadata_ready,
66
+ GRPC_ERROR_REF(error));
67
+ }
68
+
69
+ static grpc_error* init_call_elem(grpc_call_element* elem,
70
+ const grpc_call_element_args* args) {
71
+ call_data* calld = static_cast<call_data*>(elem->call_data);
72
+ // Get stats object from context and take a ref.
73
+ GPR_ASSERT(args->context != nullptr);
74
+ if (args->context[GRPC_GRPCLB_CLIENT_STATS].value != nullptr) {
75
+ calld->client_stats =
76
+ grpc_grpclb_client_stats_ref(static_cast<grpc_grpclb_client_stats*>(
77
+ args->context[GRPC_GRPCLB_CLIENT_STATS].value));
78
+ // Record call started.
79
+ grpc_grpclb_client_stats_add_call_started(calld->client_stats);
80
+ }
81
+ return GRPC_ERROR_NONE;
82
+ }
83
+
84
+ static void destroy_call_elem(grpc_call_element* elem,
85
+ const grpc_call_final_info* final_info,
86
+ grpc_closure* ignored) {
87
+ call_data* calld = static_cast<call_data*>(elem->call_data);
88
+ if (calld->client_stats != nullptr) {
89
+ // Record call finished, optionally setting client_failed_to_send and
90
+ // received.
91
+ grpc_grpclb_client_stats_add_call_finished(
92
+ !calld->send_initial_metadata_succeeded /* client_failed_to_send */,
93
+ calld->recv_initial_metadata_succeeded /* known_received */,
94
+ calld->client_stats);
95
+ // All done, so unref the stats object.
96
+ grpc_grpclb_client_stats_unref(calld->client_stats);
97
+ }
98
+ }
99
+
100
+ static void start_transport_stream_op_batch(
101
+ grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
102
+ call_data* calld = static_cast<call_data*>(elem->call_data);
103
+ GPR_TIMER_SCOPE("clr_start_transport_stream_op_batch", 0);
104
+ if (calld->client_stats != nullptr) {
105
+ // Intercept send_initial_metadata.
106
+ if (batch->send_initial_metadata) {
107
+ calld->original_on_complete_for_send = batch->on_complete;
108
+ GRPC_CLOSURE_INIT(&calld->on_complete_for_send, on_complete_for_send,
109
+ calld, grpc_schedule_on_exec_ctx);
110
+ batch->on_complete = &calld->on_complete_for_send;
111
+ }
112
+ // Intercept recv_initial_metadata.
113
+ if (batch->recv_initial_metadata) {
114
+ calld->original_recv_initial_metadata_ready =
115
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
116
+ GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
117
+ recv_initial_metadata_ready, calld,
118
+ grpc_schedule_on_exec_ctx);
119
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
120
+ &calld->recv_initial_metadata_ready;
121
+ }
122
+ }
123
+ // Chain to next filter.
124
+ grpc_call_next_op(elem, batch);
125
+ }
126
+
127
+ const grpc_channel_filter grpc_client_load_reporting_filter = {
128
+ start_transport_stream_op_batch,
129
+ grpc_channel_next_op,
130
+ sizeof(call_data),
131
+ init_call_elem,
132
+ grpc_call_stack_ignore_set_pollset_or_pollset_set,
133
+ destroy_call_elem,
134
+ 0, // sizeof(channel_data)
135
+ init_channel_elem,
136
+ destroy_channel_elem,
137
+ grpc_channel_next_get_info,
138
+ "client_load_reporting"};
@@ -0,0 +1,29 @@
1
+ /*
2
+ *
3
+ * Copyright 2017 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_CLIENT_LOAD_REPORTING_FILTER_H
20
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_CLIENT_LOAD_REPORTING_FILTER_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include "src/core/lib/channel/channel_stack.h"
25
+
26
+ extern const grpc_channel_filter grpc_client_load_reporting_filter;
27
+
28
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_CLIENT_LOAD_REPORTING_FILTER_H \
29
+ */
@@ -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() {}