grpc 1.4.5 → 1.6.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (928) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1235 -1100
  3. data/etc/roots.pem +0 -412
  4. data/include/grpc/byte_buffer.h +10 -25
  5. data/include/grpc/byte_buffer_reader.h +10 -25
  6. data/include/grpc/census.h +10 -25
  7. data/include/grpc/compression.h +10 -25
  8. data/include/grpc/grpc.h +15 -26
  9. data/include/grpc/grpc_cronet.h +10 -25
  10. data/include/grpc/grpc_posix.h +10 -25
  11. data/include/grpc/grpc_security.h +10 -25
  12. data/include/grpc/grpc_security_constants.h +10 -25
  13. data/include/grpc/impl/codegen/atm.h +11 -25
  14. data/include/grpc/impl/codegen/atm_gcc_atomic.h +10 -25
  15. data/include/grpc/impl/codegen/atm_gcc_sync.h +10 -25
  16. data/include/grpc/impl/codegen/atm_windows.h +10 -25
  17. data/include/grpc/impl/codegen/byte_buffer_reader.h +11 -26
  18. data/include/grpc/impl/codegen/compression_types.h +12 -27
  19. data/include/grpc/impl/codegen/connectivity_state.h +10 -25
  20. data/include/grpc/impl/codegen/exec_ctx_fwd.h +10 -25
  21. data/include/grpc/impl/codegen/gpr_slice.h +10 -25
  22. data/include/grpc/impl/codegen/gpr_types.h +10 -25
  23. data/include/grpc/impl/codegen/grpc_types.h +42 -43
  24. data/include/grpc/impl/codegen/port_platform.h +10 -25
  25. data/include/grpc/impl/codegen/propagation_bits.h +10 -25
  26. data/include/grpc/impl/codegen/slice.h +13 -28
  27. data/include/grpc/impl/codegen/status.h +10 -25
  28. data/include/grpc/impl/codegen/sync.h +10 -25
  29. data/include/grpc/impl/codegen/sync_generic.h +10 -25
  30. data/include/grpc/impl/codegen/sync_posix.h +10 -25
  31. data/include/grpc/impl/codegen/sync_windows.h +10 -25
  32. data/include/grpc/load_reporting.h +10 -25
  33. data/include/grpc/slice.h +10 -25
  34. data/include/grpc/slice_buffer.h +10 -25
  35. data/include/grpc/status.h +10 -25
  36. data/include/grpc/support/alloc.h +10 -25
  37. data/include/grpc/support/atm.h +10 -25
  38. data/include/grpc/support/atm_gcc_atomic.h +10 -25
  39. data/include/grpc/support/atm_gcc_sync.h +10 -25
  40. data/include/grpc/support/atm_windows.h +10 -25
  41. data/include/grpc/support/avl.h +46 -49
  42. data/include/grpc/support/cmdline.h +10 -25
  43. data/include/grpc/support/cpu.h +10 -25
  44. data/include/grpc/support/histogram.h +10 -25
  45. data/include/grpc/support/host_port.h +10 -25
  46. data/include/grpc/support/log.h +10 -25
  47. data/include/grpc/support/log_windows.h +10 -25
  48. data/include/grpc/support/port_platform.h +10 -25
  49. data/include/grpc/support/string_util.h +10 -25
  50. data/include/grpc/support/subprocess.h +10 -25
  51. data/include/grpc/support/sync.h +10 -25
  52. data/include/grpc/support/sync_generic.h +10 -25
  53. data/include/grpc/support/sync_posix.h +10 -25
  54. data/include/grpc/support/sync_windows.h +10 -25
  55. data/include/grpc/support/thd.h +10 -25
  56. data/include/grpc/support/time.h +10 -25
  57. data/include/grpc/support/tls.h +10 -25
  58. data/include/grpc/support/tls_gcc.h +10 -25
  59. data/include/grpc/support/tls_msvc.h +10 -25
  60. data/include/grpc/support/tls_pthread.h +10 -25
  61. data/include/grpc/support/useful.h +10 -25
  62. data/include/grpc/support/workaround_list.h +11 -26
  63. data/src/boringssl/err_data.c +277 -259
  64. data/src/core/ext/census/aggregation.h +10 -25
  65. data/src/core/ext/census/base_resources.c +10 -25
  66. data/src/core/ext/census/base_resources.h +10 -25
  67. data/src/core/ext/census/census_interface.h +10 -25
  68. data/src/core/ext/census/census_rpc_stats.h +10 -25
  69. data/src/core/ext/census/context.c +10 -25
  70. data/src/core/ext/census/gen/census.pb.c +10 -25
  71. data/src/core/ext/census/gen/census.pb.h +10 -25
  72. data/src/core/ext/census/gen/trace_context.pb.c +10 -25
  73. data/src/core/ext/census/gen/trace_context.pb.h +10 -25
  74. data/src/core/ext/census/grpc_context.c +10 -25
  75. data/src/core/ext/census/grpc_filter.c +11 -26
  76. data/src/core/ext/census/grpc_filter.h +10 -25
  77. data/src/core/ext/census/grpc_plugin.c +10 -25
  78. data/src/core/ext/census/initialize.c +10 -25
  79. data/src/core/ext/census/intrusive_hash_map.c +10 -25
  80. data/src/core/ext/census/intrusive_hash_map.h +10 -25
  81. data/src/core/ext/census/intrusive_hash_map_internal.h +10 -25
  82. data/src/core/ext/census/mlog.c +10 -25
  83. data/src/core/ext/census/mlog.h +10 -25
  84. data/src/core/ext/census/operation.c +10 -25
  85. data/src/core/ext/census/placeholders.c +10 -25
  86. data/src/core/ext/census/resource.c +10 -25
  87. data/src/core/ext/census/resource.h +10 -25
  88. data/src/core/ext/census/rpc_metric_id.h +10 -25
  89. data/src/core/ext/census/trace_context.c +10 -25
  90. data/src/core/ext/census/trace_context.h +10 -25
  91. data/src/core/ext/census/trace_label.h +10 -25
  92. data/src/core/ext/census/trace_propagation.h +10 -25
  93. data/src/core/ext/census/trace_status.h +10 -25
  94. data/src/core/ext/census/trace_string.h +10 -25
  95. data/src/core/ext/census/tracing.c +10 -26
  96. data/src/core/ext/census/tracing.h +10 -25
  97. data/src/core/ext/filters/client_channel/channel_connectivity.c +20 -33
  98. data/src/core/ext/filters/client_channel/client_channel.c +617 -520
  99. data/src/core/ext/filters/client_channel/client_channel.h +15 -28
  100. data/src/core/ext/filters/client_channel/client_channel_factory.c +13 -31
  101. data/src/core/ext/filters/client_channel/client_channel_factory.h +10 -25
  102. data/src/core/ext/filters/client_channel/client_channel_plugin.c +16 -29
  103. data/src/core/ext/filters/client_channel/connector.c +10 -25
  104. data/src/core/ext/filters/client_channel/connector.h +10 -25
  105. data/src/core/ext/filters/client_channel/http_connect_handshaker.c +15 -30
  106. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +10 -25
  107. data/src/core/ext/filters/client_channel/http_proxy.c +112 -38
  108. data/src/core/ext/filters/client_channel/http_proxy.h +10 -25
  109. data/src/core/ext/filters/client_channel/lb_policy.c +32 -36
  110. data/src/core/ext/filters/client_channel/lb_policy.h +24 -27
  111. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c +14 -30
  112. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +10 -25
  113. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +464 -279
  114. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +10 -25
  115. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +15 -28
  116. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.c +40 -48
  117. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c +65 -49
  118. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +31 -31
  119. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +47 -32
  120. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +11 -26
  121. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +13 -9
  122. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +27 -21
  123. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +373 -136
  124. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +504 -279
  125. data/src/core/ext/filters/client_channel/lb_policy_factory.c +12 -31
  126. data/src/core/ext/filters/client_channel/lb_policy_factory.h +12 -27
  127. data/src/core/ext/filters/client_channel/lb_policy_registry.c +10 -25
  128. data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -25
  129. data/src/core/ext/filters/client_channel/parse_address.c +10 -25
  130. data/src/core/ext/filters/client_channel/parse_address.h +10 -25
  131. data/src/core/ext/filters/client_channel/proxy_mapper.c +10 -25
  132. data/src/core/ext/filters/client_channel/proxy_mapper.h +10 -25
  133. data/src/core/ext/filters/client_channel/proxy_mapper_registry.c +10 -25
  134. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +10 -25
  135. data/src/core/ext/filters/client_channel/resolver.c +33 -38
  136. data/src/core/ext/filters/client_channel/resolver.h +19 -30
  137. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.c +153 -50
  138. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +14 -27
  139. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c +33 -30
  140. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c +326 -116
  141. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +35 -36
  142. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c +60 -0
  143. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.c +19 -34
  144. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.c +254 -0
  145. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +60 -0
  146. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +16 -28
  147. data/src/core/ext/filters/client_channel/resolver_factory.c +10 -25
  148. data/src/core/ext/filters/client_channel/resolver_factory.h +10 -25
  149. data/src/core/ext/filters/client_channel/resolver_registry.c +10 -25
  150. data/src/core/ext/filters/client_channel/resolver_registry.h +10 -25
  151. data/src/core/ext/filters/client_channel/retry_throttle.c +23 -34
  152. data/src/core/ext/filters/client_channel/retry_throttle.h +10 -25
  153. data/src/core/ext/filters/client_channel/subchannel.c +33 -55
  154. data/src/core/ext/filters/client_channel/subchannel.h +16 -26
  155. data/src/core/ext/filters/client_channel/subchannel_index.c +55 -92
  156. data/src/core/ext/filters/client_channel/subchannel_index.h +26 -29
  157. data/src/core/ext/filters/client_channel/uri_parser.c +10 -25
  158. data/src/core/ext/filters/client_channel/uri_parser.h +10 -25
  159. data/src/core/ext/filters/deadline/deadline_filter.c +30 -45
  160. data/src/core/ext/filters/deadline/deadline_filter.h +10 -25
  161. data/src/core/ext/filters/http/client/http_client_filter.c +255 -294
  162. data/src/core/ext/filters/http/client/http_client_filter.h +10 -25
  163. data/src/core/ext/filters/http/http_filters_plugin.c +11 -26
  164. data/src/core/ext/filters/http/message_compress/message_compress_filter.c +133 -105
  165. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +10 -25
  166. data/src/core/ext/filters/http/server/http_server_filter.c +17 -32
  167. data/src/core/ext/filters/http/server/http_server_filter.h +10 -25
  168. data/src/core/ext/filters/load_reporting/load_reporting.c +11 -30
  169. data/src/core/ext/filters/load_reporting/load_reporting.h +10 -25
  170. data/src/core/ext/filters/load_reporting/load_reporting_filter.c +11 -26
  171. data/src/core/ext/filters/load_reporting/load_reporting_filter.h +10 -25
  172. data/src/core/ext/filters/max_age/max_age_filter.c +28 -43
  173. data/src/core/ext/filters/max_age/max_age_filter.h +10 -25
  174. data/src/core/ext/filters/message_size/message_size_filter.c +24 -37
  175. data/src/core/ext/filters/message_size/message_size_filter.h +10 -25
  176. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.c +16 -31
  177. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +10 -25
  178. data/src/core/ext/filters/workarounds/workaround_utils.c +12 -26
  179. data/src/core/ext/filters/workarounds/workaround_utils.h +11 -26
  180. data/src/core/ext/transport/chttp2/alpn/alpn.c +10 -25
  181. data/src/core/ext/transport/chttp2/alpn/alpn.h +10 -25
  182. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +13 -28
  183. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +10 -25
  184. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +13 -30
  185. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +12 -29
  186. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +13 -30
  187. data/src/core/ext/transport/chttp2/server/chttp2_server.c +11 -26
  188. data/src/core/ext/transport/chttp2/server/chttp2_server.h +10 -25
  189. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +10 -25
  190. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +10 -25
  191. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +10 -25
  192. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +11 -25
  193. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +10 -25
  194. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +10 -25
  195. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +10 -25
  196. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +15 -27
  197. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +421 -443
  198. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +14 -25
  199. data/src/core/ext/transport/chttp2/transport/flow_control.c +500 -0
  200. data/src/core/ext/transport/chttp2/transport/frame.h +10 -25
  201. data/src/core/ext/transport/chttp2/transport/frame_data.c +20 -28
  202. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -25
  203. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +10 -25
  204. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +10 -25
  205. data/src/core/ext/transport/chttp2/transport/frame_ping.c +11 -26
  206. data/src/core/ext/transport/chttp2/transport/frame_ping.h +10 -25
  207. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +11 -26
  208. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +10 -25
  209. data/src/core/ext/transport/chttp2/transport/frame_settings.c +16 -29
  210. data/src/core/ext/transport/chttp2/transport/frame_settings.h +10 -25
  211. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +17 -33
  212. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +10 -25
  213. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +18 -31
  214. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +12 -25
  215. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +15 -30
  216. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -25
  217. data/src/core/ext/transport/chttp2/transport/hpack_table.c +10 -25
  218. data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -25
  219. data/src/core/ext/transport/chttp2/transport/http2_settings.c +10 -25
  220. data/src/core/ext/transport/chttp2/transport/http2_settings.h +10 -25
  221. data/src/core/ext/transport/chttp2/transport/huffsyms.c +10 -25
  222. data/src/core/ext/transport/chttp2/transport/huffsyms.h +10 -25
  223. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +10 -25
  224. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +10 -25
  225. data/src/core/ext/transport/chttp2/transport/internal.h +191 -179
  226. data/src/core/ext/transport/chttp2/transport/parsing.c +33 -102
  227. data/src/core/ext/transport/chttp2/transport/stream_lists.c +26 -28
  228. data/src/core/ext/transport/chttp2/transport/stream_map.c +10 -25
  229. data/src/core/ext/transport/chttp2/transport/stream_map.h +10 -25
  230. data/src/core/ext/transport/chttp2/transport/varint.c +14 -25
  231. data/src/core/ext/transport/chttp2/transport/varint.h +10 -25
  232. data/src/core/ext/transport/chttp2/transport/writing.c +164 -106
  233. data/src/core/ext/transport/inproc/inproc_plugin.c +29 -0
  234. data/src/core/ext/transport/inproc/inproc_transport.c +1303 -0
  235. data/src/core/ext/transport/inproc/inproc_transport.h +41 -0
  236. data/src/core/lib/channel/channel_args.c +52 -27
  237. data/src/core/lib/channel/channel_args.h +18 -27
  238. data/src/core/lib/channel/channel_stack.c +11 -26
  239. data/src/core/lib/channel/channel_stack.h +12 -27
  240. data/src/core/lib/channel/channel_stack_builder.c +11 -26
  241. data/src/core/lib/channel/channel_stack_builder.h +10 -25
  242. data/src/core/lib/channel/connected_channel.c +10 -25
  243. data/src/core/lib/channel/connected_channel.h +10 -25
  244. data/src/core/lib/channel/context.h +10 -25
  245. data/src/core/lib/channel/handshaker.c +14 -29
  246. data/src/core/lib/channel/handshaker.h +10 -25
  247. data/src/core/lib/channel/handshaker_factory.c +10 -25
  248. data/src/core/lib/channel/handshaker_factory.h +10 -25
  249. data/src/core/lib/channel/handshaker_registry.c +10 -25
  250. data/src/core/lib/channel/handshaker_registry.h +10 -25
  251. data/src/core/lib/compression/algorithm_metadata.h +10 -25
  252. data/src/core/lib/compression/compression.c +10 -25
  253. data/src/core/lib/compression/message_compress.c +10 -25
  254. data/src/core/lib/compression/message_compress.h +10 -25
  255. data/src/core/lib/compression/stream_compression.c +191 -0
  256. data/src/core/lib/compression/stream_compression.h +90 -0
  257. data/src/core/lib/debug/trace.c +28 -29
  258. data/src/core/lib/debug/trace.h +16 -30
  259. data/src/core/lib/http/format_request.c +10 -25
  260. data/src/core/lib/http/format_request.h +10 -25
  261. data/src/core/lib/http/httpcli.c +19 -35
  262. data/src/core/lib/http/httpcli.h +10 -25
  263. data/src/core/lib/http/httpcli_security_connector.c +17 -30
  264. data/src/core/lib/http/parser.c +11 -26
  265. data/src/core/lib/http/parser.h +10 -25
  266. data/src/core/lib/iomgr/closure.c +62 -25
  267. data/src/core/lib/iomgr/closure.h +81 -26
  268. data/src/core/lib/iomgr/combiner.c +103 -200
  269. data/src/core/lib/iomgr/combiner.h +14 -32
  270. data/src/core/lib/iomgr/endpoint.c +10 -29
  271. data/src/core/lib/iomgr/endpoint.h +10 -29
  272. data/src/core/lib/iomgr/endpoint_pair.h +10 -25
  273. data/src/core/lib/iomgr/endpoint_pair_posix.c +10 -25
  274. data/src/core/lib/iomgr/endpoint_pair_uv.c +10 -25
  275. data/src/core/lib/iomgr/endpoint_pair_windows.c +10 -25
  276. data/src/core/lib/iomgr/error.c +45 -46
  277. data/src/core/lib/iomgr/error.h +21 -34
  278. data/src/core/lib/iomgr/error_internal.h +10 -25
  279. data/src/core/lib/iomgr/ev_epoll1_linux.c +279 -179
  280. data/src/core/lib/iomgr/ev_epoll1_linux.h +10 -25
  281. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c +75 -264
  282. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.h +10 -25
  283. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c +44 -199
  284. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.h +10 -25
  285. data/src/core/lib/iomgr/ev_epollex_linux.c +184 -247
  286. data/src/core/lib/iomgr/ev_epollex_linux.h +10 -25
  287. data/src/core/lib/iomgr/ev_epollsig_linux.c +116 -323
  288. data/src/core/lib/iomgr/ev_epollsig_linux.h +10 -25
  289. data/src/core/lib/iomgr/ev_poll_posix.c +328 -184
  290. data/src/core/lib/iomgr/ev_poll_posix.h +10 -25
  291. data/src/core/lib/iomgr/ev_posix.c +25 -56
  292. data/src/core/lib/iomgr/ev_posix.h +15 -44
  293. data/src/core/lib/iomgr/ev_windows.c +11 -26
  294. data/src/core/lib/iomgr/exec_ctx.c +36 -45
  295. data/src/core/lib/iomgr/exec_ctx.h +10 -25
  296. data/src/core/lib/iomgr/executor.c +152 -127
  297. data/src/core/lib/iomgr/executor.h +18 -26
  298. data/src/core/lib/iomgr/gethostname.h +26 -0
  299. data/src/core/lib/iomgr/gethostname_fallback.c +27 -0
  300. data/src/core/lib/iomgr/gethostname_host_name_max.c +37 -0
  301. data/src/core/lib/iomgr/gethostname_sysconf.c +37 -0
  302. data/src/core/lib/iomgr/iocp_windows.c +10 -25
  303. data/src/core/lib/iomgr/iocp_windows.h +10 -25
  304. data/src/core/lib/iomgr/iomgr.c +17 -28
  305. data/src/core/lib/iomgr/iomgr.h +12 -27
  306. data/src/core/lib/iomgr/iomgr_internal.h +10 -25
  307. data/src/core/lib/iomgr/iomgr_posix.c +11 -26
  308. data/src/core/lib/iomgr/iomgr_posix.h +10 -25
  309. data/src/core/lib/iomgr/iomgr_uv.c +19 -26
  310. data/src/core/lib/iomgr/iomgr_uv.h +37 -0
  311. data/src/core/lib/iomgr/iomgr_windows.c +10 -25
  312. data/src/core/lib/iomgr/is_epollexclusive_available.c +10 -25
  313. data/src/core/lib/iomgr/is_epollexclusive_available.h +10 -25
  314. data/src/core/lib/iomgr/load_file.c +10 -25
  315. data/src/core/lib/iomgr/load_file.h +10 -25
  316. data/src/core/lib/iomgr/lockfree_event.c +22 -35
  317. data/src/core/lib/iomgr/lockfree_event.h +13 -27
  318. data/src/core/lib/iomgr/nameser.h +104 -0
  319. data/src/core/lib/iomgr/network_status_tracker.c +10 -25
  320. data/src/core/lib/iomgr/network_status_tracker.h +10 -25
  321. data/src/core/lib/iomgr/polling_entity.c +10 -25
  322. data/src/core/lib/iomgr/polling_entity.h +14 -34
  323. data/src/core/lib/iomgr/pollset.h +14 -25
  324. data/src/core/lib/iomgr/pollset_set.h +10 -25
  325. data/src/core/lib/iomgr/pollset_set_uv.c +10 -25
  326. data/src/core/lib/iomgr/pollset_set_windows.c +10 -25
  327. data/src/core/lib/iomgr/pollset_set_windows.h +10 -25
  328. data/src/core/lib/iomgr/pollset_uv.c +25 -26
  329. data/src/core/lib/iomgr/pollset_uv.h +10 -25
  330. data/src/core/lib/iomgr/pollset_windows.c +17 -27
  331. data/src/core/lib/iomgr/pollset_windows.h +10 -25
  332. data/src/core/lib/iomgr/port.h +24 -25
  333. data/src/core/lib/iomgr/resolve_address.h +10 -25
  334. data/src/core/lib/iomgr/resolve_address_posix.c +13 -28
  335. data/src/core/lib/iomgr/resolve_address_uv.c +31 -35
  336. data/src/core/lib/iomgr/resolve_address_windows.c +13 -28
  337. data/src/core/lib/iomgr/resource_quota.c +52 -67
  338. data/src/core/lib/iomgr/resource_quota.h +10 -25
  339. data/src/core/lib/iomgr/sockaddr.h +10 -25
  340. data/src/core/lib/iomgr/sockaddr_posix.h +10 -25
  341. data/src/core/lib/iomgr/sockaddr_utils.c +15 -25
  342. data/src/core/lib/iomgr/sockaddr_utils.h +12 -25
  343. data/src/core/lib/iomgr/sockaddr_windows.h +10 -25
  344. data/src/core/lib/iomgr/socket_factory_posix.c +13 -31
  345. data/src/core/lib/iomgr/socket_factory_posix.h +10 -25
  346. data/src/core/lib/iomgr/socket_mutator.c +14 -31
  347. data/src/core/lib/iomgr/socket_mutator.h +10 -25
  348. data/src/core/lib/iomgr/socket_utils.h +10 -25
  349. data/src/core/lib/iomgr/socket_utils_common_posix.c +10 -25
  350. data/src/core/lib/iomgr/socket_utils_linux.c +10 -25
  351. data/src/core/lib/iomgr/socket_utils_posix.c +10 -25
  352. data/src/core/lib/iomgr/socket_utils_posix.h +10 -25
  353. data/src/core/lib/iomgr/socket_utils_uv.c +10 -25
  354. data/src/core/lib/iomgr/socket_utils_windows.c +10 -25
  355. data/src/core/lib/iomgr/socket_windows.c +12 -27
  356. data/src/core/lib/iomgr/socket_windows.h +10 -25
  357. data/src/core/lib/iomgr/sys_epoll_wrapper.h +10 -25
  358. data/src/core/lib/iomgr/tcp_client.h +10 -25
  359. data/src/core/lib/iomgr/tcp_client_posix.c +21 -34
  360. data/src/core/lib/iomgr/tcp_client_posix.h +10 -25
  361. data/src/core/lib/iomgr/tcp_client_uv.c +18 -27
  362. data/src/core/lib/iomgr/tcp_client_windows.c +14 -29
  363. data/src/core/lib/iomgr/tcp_posix.c +36 -55
  364. data/src/core/lib/iomgr/tcp_posix.h +10 -25
  365. data/src/core/lib/iomgr/tcp_server.h +10 -25
  366. data/src/core/lib/iomgr/tcp_server_posix.c +16 -31
  367. data/src/core/lib/iomgr/tcp_server_utils_posix.h +10 -25
  368. data/src/core/lib/iomgr/tcp_server_utils_posix_common.c +11 -26
  369. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c +10 -25
  370. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c +10 -25
  371. data/src/core/lib/iomgr/tcp_server_uv.c +103 -64
  372. data/src/core/lib/iomgr/tcp_server_windows.c +14 -29
  373. data/src/core/lib/iomgr/tcp_uv.c +41 -45
  374. data/src/core/lib/iomgr/tcp_uv.h +10 -25
  375. data/src/core/lib/iomgr/tcp_windows.c +39 -53
  376. data/src/core/lib/iomgr/tcp_windows.h +10 -25
  377. data/src/core/lib/iomgr/time_averaged_stats.c +10 -25
  378. data/src/core/lib/iomgr/time_averaged_stats.h +10 -25
  379. data/src/core/lib/iomgr/timer.h +18 -27
  380. data/src/core/lib/iomgr/timer_generic.c +91 -87
  381. data/src/core/lib/iomgr/timer_generic.h +10 -25
  382. data/src/core/lib/iomgr/timer_heap.c +10 -25
  383. data/src/core/lib/iomgr/timer_heap.h +10 -25
  384. data/src/core/lib/iomgr/timer_manager.c +178 -100
  385. data/src/core/lib/iomgr/timer_manager.h +10 -25
  386. data/src/core/lib/iomgr/timer_uv.c +23 -33
  387. data/src/core/lib/iomgr/timer_uv.h +10 -25
  388. data/src/core/lib/iomgr/udp_server.c +17 -32
  389. data/src/core/lib/iomgr/udp_server.h +10 -25
  390. data/src/core/lib/iomgr/unix_sockets_posix.c +10 -25
  391. data/src/core/lib/iomgr/unix_sockets_posix.h +10 -25
  392. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +10 -25
  393. data/src/core/lib/iomgr/wakeup_fd_cv.c +10 -25
  394. data/src/core/lib/iomgr/wakeup_fd_cv.h +13 -28
  395. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +10 -25
  396. data/src/core/lib/iomgr/wakeup_fd_nospecial.c +10 -25
  397. data/src/core/lib/iomgr/wakeup_fd_pipe.c +10 -25
  398. data/src/core/lib/iomgr/wakeup_fd_pipe.h +10 -25
  399. data/src/core/lib/iomgr/wakeup_fd_posix.c +10 -25
  400. data/src/core/lib/iomgr/wakeup_fd_posix.h +10 -25
  401. data/src/core/lib/json/json.c +10 -25
  402. data/src/core/lib/json/json.h +10 -25
  403. data/src/core/lib/json/json_common.h +10 -25
  404. data/src/core/lib/json/json_reader.c +11 -25
  405. data/src/core/lib/json/json_reader.h +10 -25
  406. data/src/core/lib/json/json_string.c +10 -25
  407. data/src/core/lib/json/json_writer.c +10 -25
  408. data/src/core/lib/json/json_writer.h +10 -25
  409. data/src/core/lib/profiling/basic_timers.c +10 -25
  410. data/src/core/lib/profiling/stap_timers.c +10 -25
  411. data/src/core/lib/profiling/timers.h +10 -25
  412. data/src/core/lib/security/context/security_context.c +32 -40
  413. data/src/core/lib/security/context/security_context.h +15 -26
  414. data/src/core/lib/security/credentials/composite/composite_credentials.c +76 -81
  415. data/src/core/lib/security/credentials/composite/composite_credentials.h +10 -25
  416. data/src/core/lib/security/credentials/credentials.c +29 -49
  417. data/src/core/lib/security/credentials/credentials.h +48 -61
  418. data/src/core/lib/security/credentials/credentials_metadata.c +34 -78
  419. data/src/core/lib/security/credentials/fake/fake_credentials.c +33 -56
  420. data/src/core/lib/security/credentials/fake/fake_credentials.h +12 -27
  421. data/src/core/lib/security/credentials/google_default/credentials_generic.c +10 -25
  422. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +12 -27
  423. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -25
  424. data/src/core/lib/security/credentials/iam/iam_credentials.c +40 -40
  425. data/src/core/lib/security/credentials/iam/iam_credentials.h +11 -26
  426. data/src/core/lib/security/credentials/jwt/json_token.c +10 -25
  427. data/src/core/lib/security/credentials/jwt/json_token.h +10 -25
  428. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +45 -48
  429. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +11 -26
  430. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +53 -33
  431. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +10 -25
  432. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +155 -87
  433. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +24 -28
  434. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +118 -82
  435. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -27
  436. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -32
  437. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -25
  438. data/src/core/lib/security/transport/auth_filters.h +10 -25
  439. data/src/core/lib/security/transport/client_auth_filter.c +217 -112
  440. data/src/core/lib/security/transport/lb_targets_info.c +16 -32
  441. data/src/core/lib/security/transport/lb_targets_info.h +10 -25
  442. data/src/core/lib/security/transport/secure_endpoint.c +29 -43
  443. data/src/core/lib/security/transport/secure_endpoint.h +10 -25
  444. data/src/core/lib/security/transport/security_connector.c +80 -61
  445. data/src/core/lib/security/transport/security_connector.h +35 -35
  446. data/src/core/lib/security/transport/security_handshaker.c +18 -33
  447. data/src/core/lib/security/transport/security_handshaker.h +10 -25
  448. data/src/core/lib/security/transport/server_auth_filter.c +62 -116
  449. data/src/core/lib/security/transport/tsi_error.c +10 -25
  450. data/src/core/lib/security/transport/tsi_error.h +10 -25
  451. data/src/core/lib/security/util/json_util.c +10 -25
  452. data/src/core/lib/security/util/json_util.h +10 -25
  453. data/src/core/lib/slice/b64.c +10 -25
  454. data/src/core/lib/slice/b64.h +10 -25
  455. data/src/core/lib/slice/percent_encoding.c +10 -25
  456. data/src/core/lib/slice/percent_encoding.h +10 -25
  457. data/src/core/lib/slice/slice.c +10 -25
  458. data/src/core/lib/slice/slice_buffer.c +10 -25
  459. data/src/core/lib/slice/slice_hash_table.c +48 -26
  460. data/src/core/lib/slice/slice_hash_table.h +26 -28
  461. data/src/core/lib/slice/slice_intern.c +10 -25
  462. data/src/core/lib/slice/slice_internal.h +10 -25
  463. data/src/core/lib/slice/slice_string_helpers.c +10 -25
  464. data/src/core/lib/slice/slice_string_helpers.h +10 -25
  465. data/src/core/lib/support/alloc.c +10 -25
  466. data/src/core/lib/support/arena.c +12 -27
  467. data/src/core/lib/support/arena.h +10 -25
  468. data/src/core/lib/support/atm.c +17 -32
  469. data/src/core/lib/support/atomic.h +10 -25
  470. data/src/core/lib/support/atomic_with_atm.h +10 -25
  471. data/src/core/lib/support/atomic_with_std.h +10 -25
  472. data/src/core/lib/support/avl.c +101 -101
  473. data/src/core/lib/support/backoff.c +10 -25
  474. data/src/core/lib/support/backoff.h +10 -25
  475. data/src/core/lib/support/block_annotate.h +10 -25
  476. data/src/core/lib/support/cmdline.c +10 -25
  477. data/src/core/lib/support/cpu_iphone.c +10 -25
  478. data/src/core/lib/support/cpu_linux.c +10 -25
  479. data/src/core/lib/support/cpu_posix.c +10 -25
  480. data/src/core/lib/support/cpu_windows.c +10 -25
  481. data/src/core/lib/support/env.h +16 -25
  482. data/src/core/lib/support/env_linux.c +30 -37
  483. data/src/core/lib/support/env_posix.c +15 -25
  484. data/src/core/lib/support/env_windows.c +15 -25
  485. data/src/core/lib/support/histogram.c +10 -25
  486. data/src/core/lib/support/host_port.c +10 -25
  487. data/src/core/lib/support/log.c +20 -29
  488. data/src/core/lib/support/log_android.c +10 -25
  489. data/src/core/lib/support/log_linux.c +13 -26
  490. data/src/core/lib/support/log_posix.c +10 -25
  491. data/src/core/lib/support/log_windows.c +10 -25
  492. data/src/core/lib/support/memory.h +10 -25
  493. data/src/core/lib/support/mpscq.c +11 -49
  494. data/src/core/lib/support/mpscq.h +11 -50
  495. data/src/core/lib/support/murmur_hash.c +12 -25
  496. data/src/core/lib/support/murmur_hash.h +10 -25
  497. data/src/core/lib/support/spinlock.h +10 -25
  498. data/src/core/lib/support/stack_lockfree.c +10 -25
  499. data/src/core/lib/support/stack_lockfree.h +10 -25
  500. data/src/core/lib/support/string.c +10 -25
  501. data/src/core/lib/support/string.h +10 -25
  502. data/src/core/lib/support/string_posix.c +10 -25
  503. data/src/core/lib/support/string_util_windows.c +10 -25
  504. data/src/core/lib/support/string_windows.c +10 -25
  505. data/src/core/lib/support/string_windows.h +10 -25
  506. data/src/core/lib/support/subprocess_posix.c +10 -25
  507. data/src/core/lib/support/subprocess_windows.c +10 -25
  508. data/src/core/lib/support/sync.c +10 -25
  509. data/src/core/lib/support/sync_posix.c +10 -25
  510. data/src/core/lib/support/sync_windows.c +10 -25
  511. data/src/core/lib/support/thd.c +10 -25
  512. data/src/core/lib/support/thd_internal.h +10 -25
  513. data/src/core/lib/support/thd_posix.c +10 -25
  514. data/src/core/lib/support/thd_windows.c +10 -25
  515. data/src/core/lib/support/time.c +10 -25
  516. data/src/core/lib/support/time_posix.c +10 -25
  517. data/src/core/lib/support/time_precise.c +18 -33
  518. data/src/core/lib/support/time_precise.h +10 -25
  519. data/src/core/lib/support/time_windows.c +10 -25
  520. data/src/core/lib/support/tls_pthread.c +10 -25
  521. data/src/core/lib/support/tmpfile.h +10 -25
  522. data/src/core/lib/support/tmpfile_msys.c +10 -25
  523. data/src/core/lib/support/tmpfile_posix.c +10 -25
  524. data/src/core/lib/support/tmpfile_windows.c +10 -25
  525. data/src/core/lib/support/wrap_memcpy.c +10 -25
  526. data/src/core/lib/surface/alarm.c +78 -35
  527. data/src/core/lib/surface/alarm_internal.h +40 -0
  528. data/src/core/lib/surface/api_trace.c +11 -26
  529. data/src/core/lib/surface/api_trace.h +10 -25
  530. data/src/core/lib/surface/byte_buffer.c +10 -25
  531. data/src/core/lib/surface/byte_buffer_reader.c +10 -25
  532. data/src/core/lib/surface/call.c +64 -84
  533. data/src/core/lib/surface/call.h +11 -26
  534. data/src/core/lib/surface/call_details.c +10 -25
  535. data/src/core/lib/surface/call_log_batch.c +10 -25
  536. data/src/core/lib/surface/call_test_only.h +10 -25
  537. data/src/core/lib/surface/channel.c +11 -26
  538. data/src/core/lib/surface/channel.h +11 -26
  539. data/src/core/lib/surface/channel_init.c +10 -25
  540. data/src/core/lib/surface/channel_init.h +10 -25
  541. data/src/core/lib/surface/channel_ping.c +12 -27
  542. data/src/core/lib/surface/channel_stack_type.c +10 -25
  543. data/src/core/lib/surface/channel_stack_type.h +10 -25
  544. data/src/core/lib/surface/completion_queue.c +442 -331
  545. data/src/core/lib/surface/completion_queue.h +16 -33
  546. data/src/core/lib/surface/completion_queue_factory.c +10 -25
  547. data/src/core/lib/surface/completion_queue_factory.h +10 -25
  548. data/src/core/lib/surface/event_string.c +10 -25
  549. data/src/core/lib/surface/event_string.h +10 -25
  550. data/src/core/lib/surface/init.c +38 -47
  551. data/src/core/lib/surface/init.h +10 -25
  552. data/src/core/lib/surface/init_secure.c +20 -27
  553. data/src/core/lib/surface/lame_client.cc +14 -29
  554. data/src/core/lib/surface/lame_client.h +10 -25
  555. data/src/core/lib/surface/metadata_array.c +10 -25
  556. data/src/core/lib/surface/server.c +128 -81
  557. data/src/core/lib/surface/server.h +10 -25
  558. data/src/core/lib/surface/validate_metadata.c +10 -25
  559. data/src/core/lib/surface/validate_metadata.h +10 -25
  560. data/src/core/lib/surface/version.c +11 -26
  561. data/src/core/lib/transport/bdp_estimator.c +19 -29
  562. data/src/core/lib/transport/bdp_estimator.h +16 -29
  563. data/src/core/lib/transport/byte_stream.c +127 -36
  564. data/src/core/lib/transport/byte_stream.h +88 -46
  565. data/src/core/lib/transport/connectivity_state.c +17 -31
  566. data/src/core/lib/transport/connectivity_state.h +10 -25
  567. data/src/core/lib/transport/error_utils.c +10 -25
  568. data/src/core/lib/transport/error_utils.h +10 -25
  569. data/src/core/lib/transport/http2_errors.h +10 -25
  570. data/src/core/lib/transport/metadata.c +87 -85
  571. data/src/core/lib/transport/metadata.h +15 -28
  572. data/src/core/lib/transport/metadata_batch.c +10 -25
  573. data/src/core/lib/transport/metadata_batch.h +10 -25
  574. data/src/core/lib/transport/pid_controller.c +10 -25
  575. data/src/core/lib/transport/pid_controller.h +10 -25
  576. data/src/core/lib/transport/service_config.c +11 -26
  577. data/src/core/lib/transport/service_config.h +10 -25
  578. data/src/core/lib/transport/static_metadata.c +12 -26
  579. data/src/core/lib/transport/static_metadata.h +10 -25
  580. data/src/core/lib/transport/status_conversion.c +10 -25
  581. data/src/core/lib/transport/status_conversion.h +10 -25
  582. data/src/core/lib/transport/timeout_encoding.c +10 -25
  583. data/src/core/lib/transport/timeout_encoding.h +10 -25
  584. data/src/core/lib/transport/transport.c +60 -53
  585. data/src/core/lib/transport/transport.h +36 -34
  586. data/src/core/lib/transport/transport_impl.h +10 -25
  587. data/src/core/lib/transport/transport_op_string.c +10 -28
  588. data/src/core/plugin_registry/grpc_plugin_registry.c +22 -25
  589. data/src/core/tsi/fake_transport_security.c +199 -94
  590. data/src/core/tsi/fake_transport_security.h +11 -26
  591. data/src/core/tsi/gts_transport_security.c +40 -0
  592. data/src/core/tsi/gts_transport_security.h +37 -0
  593. data/src/core/tsi/ssl_transport_security.c +13 -32
  594. data/src/core/tsi/ssl_transport_security.h +10 -25
  595. data/src/core/tsi/ssl_types.h +10 -25
  596. data/src/core/tsi/transport_security.c +48 -78
  597. data/src/core/tsi/transport_security.h +18 -27
  598. data/src/core/tsi/transport_security_adapter.c +17 -29
  599. data/src/core/tsi/transport_security_adapter.h +10 -25
  600. data/src/core/tsi/transport_security_grpc.c +64 -0
  601. data/src/core/tsi/transport_security_grpc.h +80 -0
  602. data/src/core/tsi/transport_security_interface.h +21 -27
  603. data/src/ruby/bin/apis/google/protobuf/empty.rb +10 -25
  604. data/src/ruby/bin/apis/pubsub_demo.rb +10 -25
  605. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +10 -25
  606. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +10 -25
  607. data/src/ruby/bin/math_client.rb +10 -25
  608. data/src/ruby/bin/math_server.rb +10 -25
  609. data/src/ruby/bin/math_services_pb.rb +10 -25
  610. data/src/ruby/bin/noproto_client.rb +10 -25
  611. data/src/ruby/bin/noproto_server.rb +10 -25
  612. data/src/ruby/ext/grpc/extconf.rb +10 -25
  613. data/src/ruby/ext/grpc/rb_byte_buffer.c +10 -25
  614. data/src/ruby/ext/grpc/rb_byte_buffer.h +10 -25
  615. data/src/ruby/ext/grpc/rb_call.c +44 -25
  616. data/src/ruby/ext/grpc/rb_call.h +10 -25
  617. data/src/ruby/ext/grpc/rb_call_credentials.c +10 -25
  618. data/src/ruby/ext/grpc/rb_call_credentials.h +10 -25
  619. data/src/ruby/ext/grpc/rb_channel.c +10 -25
  620. data/src/ruby/ext/grpc/rb_channel.h +10 -25
  621. data/src/ruby/ext/grpc/rb_channel_args.c +10 -25
  622. data/src/ruby/ext/grpc/rb_channel_args.h +10 -25
  623. data/src/ruby/ext/grpc/rb_channel_credentials.c +10 -25
  624. data/src/ruby/ext/grpc/rb_channel_credentials.h +10 -25
  625. data/src/ruby/ext/grpc/rb_completion_queue.c +10 -25
  626. data/src/ruby/ext/grpc/rb_completion_queue.h +10 -25
  627. data/src/ruby/ext/grpc/rb_compression_options.c +10 -25
  628. data/src/ruby/ext/grpc/rb_compression_options.h +10 -25
  629. data/src/ruby/ext/grpc/rb_event_thread.c +10 -25
  630. data/src/ruby/ext/grpc/rb_event_thread.h +10 -25
  631. data/src/ruby/ext/grpc/rb_grpc.c +10 -25
  632. data/src/ruby/ext/grpc/rb_grpc.h +10 -25
  633. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +10 -25
  634. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +16 -31
  635. data/src/ruby/ext/grpc/rb_loader.c +10 -25
  636. data/src/ruby/ext/grpc/rb_loader.h +10 -25
  637. data/src/ruby/ext/grpc/rb_server.c +10 -25
  638. data/src/ruby/ext/grpc/rb_server.h +10 -25
  639. data/src/ruby/ext/grpc/rb_server_credentials.c +10 -25
  640. data/src/ruby/ext/grpc/rb_server_credentials.h +10 -25
  641. data/src/ruby/lib/grpc.rb +10 -25
  642. data/src/ruby/lib/grpc/core/time_consts.rb +10 -25
  643. data/src/ruby/lib/grpc/errors.rb +16 -30
  644. data/src/ruby/lib/grpc/generic/active_call.rb +25 -27
  645. data/src/ruby/lib/grpc/generic/bidi_call.rb +17 -27
  646. data/src/ruby/lib/grpc/generic/client_stub.rb +10 -25
  647. data/src/ruby/lib/grpc/generic/rpc_desc.rb +10 -25
  648. data/src/ruby/lib/grpc/generic/rpc_server.rb +10 -25
  649. data/src/ruby/lib/grpc/generic/service.rb +10 -25
  650. data/src/ruby/lib/grpc/grpc.rb +10 -25
  651. data/src/ruby/lib/grpc/logconfig.rb +10 -25
  652. data/src/ruby/lib/grpc/notifier.rb +10 -25
  653. data/src/ruby/lib/grpc/version.rb +11 -26
  654. data/src/ruby/pb/generate_proto_ruby.sh +10 -25
  655. data/src/ruby/pb/grpc/health/checker.rb +10 -25
  656. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +10 -25
  657. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +10 -25
  658. data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +10 -25
  659. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +10 -25
  660. data/src/ruby/pb/test/client.rb +10 -25
  661. data/src/ruby/pb/test/server.rb +10 -25
  662. data/src/ruby/spec/call_credentials_spec.rb +10 -25
  663. data/src/ruby/spec/call_spec.rb +43 -25
  664. data/src/ruby/spec/channel_connection_spec.rb +10 -25
  665. data/src/ruby/spec/channel_credentials_spec.rb +11 -26
  666. data/src/ruby/spec/channel_spec.rb +10 -25
  667. data/src/ruby/spec/client_auth_spec.rb +10 -25
  668. data/src/ruby/spec/client_server_spec.rb +66 -25
  669. data/src/ruby/spec/compression_options_spec.rb +10 -25
  670. data/src/ruby/spec/error_sanity_spec.rb +10 -25
  671. data/src/ruby/spec/generic/active_call_spec.rb +10 -25
  672. data/src/ruby/spec/generic/client_stub_spec.rb +146 -35
  673. data/src/ruby/spec/generic/rpc_desc_spec.rb +10 -25
  674. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +10 -25
  675. data/src/ruby/spec/generic/rpc_server_spec.rb +124 -34
  676. data/src/ruby/spec/generic/service_spec.rb +10 -25
  677. data/src/ruby/spec/pb/duplicate/codegen_spec.rb +10 -25
  678. data/src/ruby/spec/pb/health/checker_spec.rb +10 -25
  679. data/src/ruby/spec/server_credentials_spec.rb +10 -25
  680. data/src/ruby/spec/server_spec.rb +10 -25
  681. data/src/ruby/spec/spec_helper.rb +10 -25
  682. data/src/ruby/spec/time_consts_spec.rb +10 -25
  683. data/third_party/boringssl/crypto/aes/key_wrap.c +138 -0
  684. data/third_party/boringssl/crypto/asn1/a_bitstr.c +6 -3
  685. data/third_party/boringssl/crypto/asn1/a_enum.c +4 -1
  686. data/third_party/boringssl/crypto/asn1/a_gentm.c +20 -15
  687. data/third_party/boringssl/crypto/asn1/a_int.c +7 -4
  688. data/third_party/boringssl/crypto/asn1/a_object.c +5 -2
  689. data/third_party/boringssl/crypto/asn1/a_time.c +0 -1
  690. data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -2
  691. data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -2
  692. data/third_party/boringssl/crypto/asn1/asn1_locl.h +35 -0
  693. data/third_party/boringssl/crypto/asn1/tasn_dec.c +3 -1
  694. data/third_party/boringssl/crypto/asn1/tasn_enc.c +6 -3
  695. data/third_party/boringssl/crypto/asn1/tasn_new.c +12 -7
  696. data/third_party/boringssl/crypto/asn1/tasn_utl.c +22 -8
  697. data/third_party/boringssl/crypto/{time_support.c → asn1/time_support.c} +1 -1
  698. data/third_party/boringssl/crypto/asn1/x_long.c +5 -2
  699. data/third_party/boringssl/crypto/base64/base64.c +7 -5
  700. data/third_party/boringssl/crypto/bio/bio.c +24 -10
  701. data/third_party/boringssl/crypto/bio/bio_mem.c +12 -10
  702. data/third_party/boringssl/crypto/bio/connect.c +7 -18
  703. data/third_party/boringssl/crypto/bio/fd.c +3 -6
  704. data/third_party/boringssl/crypto/bio/file.c +6 -6
  705. data/third_party/boringssl/crypto/bio/hexdump.c +4 -2
  706. data/third_party/boringssl/crypto/bio/pair.c +30 -344
  707. data/third_party/boringssl/crypto/bio/socket.c +6 -7
  708. data/third_party/boringssl/crypto/bio/socket_helper.c +4 -3
  709. data/third_party/boringssl/crypto/bn/add.c +1 -1
  710. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +11 -10
  711. data/third_party/boringssl/crypto/bn/bn.c +6 -20
  712. data/third_party/boringssl/crypto/bn/cmp.c +14 -0
  713. data/third_party/boringssl/crypto/bn/convert.c +73 -2
  714. data/third_party/boringssl/crypto/bn/ctx.c +3 -1
  715. data/third_party/boringssl/crypto/bn/div.c +108 -51
  716. data/third_party/boringssl/crypto/bn/exponentiation.c +15 -33
  717. data/third_party/boringssl/crypto/bn/gcd.c +29 -22
  718. data/third_party/boringssl/crypto/bn/generic.c +71 -67
  719. data/third_party/boringssl/crypto/bn/internal.h +19 -6
  720. data/third_party/boringssl/crypto/bn/kronecker.c +1 -0
  721. data/third_party/boringssl/crypto/bn/montgomery.c +9 -10
  722. data/third_party/boringssl/crypto/bn/montgomery_inv.c +47 -0
  723. data/third_party/boringssl/crypto/bn/mul.c +11 -9
  724. data/third_party/boringssl/crypto/bn/random.c +6 -3
  725. data/third_party/boringssl/crypto/bn/rsaz_exp.c +0 -65
  726. data/third_party/boringssl/crypto/bn/rsaz_exp.h +0 -3
  727. data/third_party/boringssl/crypto/bn/shift.c +9 -1
  728. data/third_party/boringssl/crypto/bn/sqrt.c +3 -1
  729. data/third_party/boringssl/crypto/buf/buf.c +6 -4
  730. data/third_party/boringssl/crypto/bytestring/asn1_compat.c +2 -1
  731. data/third_party/boringssl/crypto/bytestring/ber.c +2 -1
  732. data/third_party/boringssl/crypto/bytestring/cbb.c +9 -7
  733. data/third_party/boringssl/crypto/bytestring/cbs.c +54 -2
  734. data/third_party/boringssl/crypto/chacha/chacha.c +1 -1
  735. data/third_party/boringssl/crypto/cipher/aead.c +3 -3
  736. data/third_party/boringssl/crypto/cipher/cipher.c +18 -13
  737. data/third_party/boringssl/crypto/cipher/e_aes.c +335 -281
  738. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +113 -137
  739. data/third_party/boringssl/crypto/cipher/e_null.c +2 -1
  740. data/third_party/boringssl/crypto/cipher/e_rc2.c +54 -49
  741. data/third_party/boringssl/crypto/cipher/e_ssl3.c +4 -3
  742. data/third_party/boringssl/crypto/cipher/e_tls.c +5 -5
  743. data/third_party/boringssl/crypto/cipher/tls_cbc.c +41 -112
  744. data/third_party/boringssl/crypto/cmac/cmac.c +6 -4
  745. data/third_party/boringssl/crypto/conf/conf.c +6 -3
  746. data/third_party/boringssl/crypto/cpu-arm-linux.c +2 -2
  747. data/third_party/boringssl/crypto/curve25519/curve25519.c +28 -34
  748. data/third_party/boringssl/crypto/curve25519/spake25519.c +7 -6
  749. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +2 -1
  750. data/third_party/boringssl/crypto/des/des.c +1 -1
  751. data/third_party/boringssl/crypto/des/internal.h +58 -46
  752. data/third_party/boringssl/crypto/dh/dh.c +4 -8
  753. data/third_party/boringssl/crypto/digest/digest.c +5 -2
  754. data/third_party/boringssl/crypto/digest/digests.c +70 -33
  755. data/third_party/boringssl/crypto/digest/md32_common.h +39 -27
  756. data/third_party/boringssl/crypto/dsa/dsa.c +11 -19
  757. data/third_party/boringssl/crypto/ec/ec.c +1 -1
  758. data/third_party/boringssl/crypto/ec/ec_asn1.c +3 -2
  759. data/third_party/boringssl/crypto/ec/ec_key.c +1 -1
  760. data/third_party/boringssl/crypto/ec/ec_montgomery.c +6 -11
  761. data/third_party/boringssl/crypto/ec/oct.c +2 -14
  762. data/third_party/boringssl/crypto/ec/p224-64.c +78 -122
  763. data/third_party/boringssl/crypto/ec/p256-64.c +93 -133
  764. data/third_party/boringssl/crypto/ec/p256-x86_64.c +48 -61
  765. data/third_party/boringssl/crypto/ec/p256-x86_64.h +113 -0
  766. data/third_party/boringssl/crypto/ec/simple.c +2 -1
  767. data/third_party/boringssl/crypto/ec/wnaf.c +52 -43
  768. data/third_party/boringssl/crypto/ecdh/ecdh.c +4 -2
  769. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +17 -16
  770. data/third_party/boringssl/crypto/engine/engine.c +3 -1
  771. data/third_party/boringssl/crypto/err/err.c +5 -5
  772. data/third_party/boringssl/crypto/evp/evp.c +1 -1
  773. data/third_party/boringssl/crypto/evp/evp_asn1.c +1 -1
  774. data/third_party/boringssl/crypto/evp/evp_ctx.c +23 -29
  775. data/third_party/boringssl/crypto/evp/p_ec.c +2 -1
  776. data/third_party/boringssl/crypto/evp/p_rsa.c +9 -3
  777. data/third_party/boringssl/crypto/evp/pbkdf.c +3 -1
  778. data/third_party/boringssl/crypto/hkdf/hkdf.c +3 -1
  779. data/third_party/boringssl/crypto/hmac/hmac.c +4 -2
  780. data/third_party/boringssl/crypto/internal.h +81 -0
  781. data/third_party/boringssl/crypto/lhash/lhash.c +7 -13
  782. data/third_party/boringssl/crypto/md4/md4.c +20 -18
  783. data/third_party/boringssl/crypto/md5/md5.c +31 -21
  784. data/third_party/boringssl/crypto/mem.c +4 -10
  785. data/third_party/boringssl/crypto/modes/cbc.c +2 -6
  786. data/third_party/boringssl/crypto/modes/cfb.c +2 -2
  787. data/third_party/boringssl/crypto/modes/ctr.c +1 -1
  788. data/third_party/boringssl/crypto/modes/gcm.c +117 -334
  789. data/third_party/boringssl/crypto/modes/internal.h +107 -84
  790. data/third_party/boringssl/crypto/modes/ofb.c +3 -3
  791. data/third_party/boringssl/crypto/modes/polyval.c +94 -0
  792. data/third_party/boringssl/crypto/obj/obj.c +13 -8
  793. data/third_party/boringssl/crypto/obj/obj_dat.h +6109 -5187
  794. data/third_party/boringssl/crypto/obj/obj_xref.c +55 -57
  795. data/third_party/boringssl/crypto/pem/pem_lib.c +6 -3
  796. data/third_party/boringssl/crypto/pkcs8/internal.h +27 -8
  797. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +137 -352
  798. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +371 -364
  799. data/third_party/boringssl/crypto/poly1305/poly1305.c +12 -18
  800. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +2 -2
  801. data/third_party/boringssl/crypto/{newhope/reduce.c → pool/internal.h} +24 -21
  802. data/third_party/boringssl/crypto/pool/pool.c +200 -0
  803. data/third_party/boringssl/crypto/rand/deterministic.c +6 -5
  804. data/third_party/boringssl/crypto/rand/fuchsia.c +43 -0
  805. data/third_party/boringssl/crypto/rand/rand.c +7 -7
  806. data/third_party/boringssl/crypto/rand/urandom.c +136 -22
  807. data/third_party/boringssl/crypto/rand/windows.c +2 -2
  808. data/third_party/boringssl/crypto/rsa/blinding.c +2 -1
  809. data/third_party/boringssl/crypto/rsa/padding.c +11 -11
  810. data/third_party/boringssl/crypto/rsa/rsa.c +4 -4
  811. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +7 -1
  812. data/third_party/boringssl/crypto/rsa/rsa_impl.c +41 -80
  813. data/third_party/boringssl/crypto/sha/sha1-altivec.c +346 -0
  814. data/third_party/boringssl/crypto/sha/sha1.c +60 -42
  815. data/third_party/boringssl/crypto/sha/sha256.c +4 -2
  816. data/third_party/boringssl/crypto/sha/sha512.c +9 -7
  817. data/third_party/boringssl/crypto/stack/stack.c +10 -7
  818. data/third_party/boringssl/crypto/thread_pthread.c +2 -2
  819. data/third_party/boringssl/crypto/thread_win.c +2 -2
  820. data/third_party/boringssl/crypto/x509/a_verify.c +1 -1
  821. data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -1
  822. data/third_party/boringssl/crypto/x509/by_dir.c +1 -1
  823. data/third_party/boringssl/crypto/x509/t_x509.c +78 -38
  824. data/third_party/boringssl/crypto/x509/x509_cmp.c +8 -5
  825. data/third_party/boringssl/crypto/x509/x509_lu.c +6 -1
  826. data/third_party/boringssl/crypto/x509/x509_obj.c +4 -1
  827. data/third_party/boringssl/crypto/x509/x509_vfy.c +42 -8
  828. data/third_party/boringssl/crypto/x509/x509_vpm.c +8 -6
  829. data/third_party/boringssl/crypto/x509/x509name.c +4 -1
  830. data/third_party/boringssl/crypto/x509/x_crl.c +4 -2
  831. data/third_party/boringssl/crypto/x509/x_name.c +23 -13
  832. data/third_party/boringssl/crypto/x509/x_pkey.c +4 -1
  833. data/third_party/boringssl/crypto/x509/x_x509.c +42 -3
  834. data/third_party/boringssl/crypto/x509v3/pcy_int.h +2 -2
  835. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
  836. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +1 -1
  837. data/third_party/boringssl/crypto/x509v3/v3_ia5.c +4 -1
  838. data/third_party/boringssl/crypto/x509v3/v3_ncons.c +4 -1
  839. data/third_party/boringssl/crypto/x509v3/v3_pci.c +6 -3
  840. data/third_party/boringssl/crypto/x509v3/v3_purp.c +13 -21
  841. data/third_party/boringssl/crypto/x509v3/v3_utl.c +19 -33
  842. data/third_party/boringssl/include/openssl/aead.h +9 -20
  843. data/third_party/boringssl/include/openssl/aes.h +21 -9
  844. data/third_party/boringssl/include/openssl/asn1.h +9 -1
  845. data/third_party/boringssl/include/openssl/base.h +33 -6
  846. data/third_party/boringssl/include/openssl/bio.h +10 -103
  847. data/third_party/boringssl/include/openssl/bn.h +58 -42
  848. data/third_party/boringssl/include/openssl/bytestring.h +17 -0
  849. data/third_party/boringssl/include/openssl/cipher.h +4 -3
  850. data/third_party/boringssl/include/openssl/conf.h +4 -1
  851. data/third_party/boringssl/include/openssl/curve25519.h +13 -0
  852. data/third_party/boringssl/include/openssl/digest.h +5 -3
  853. data/third_party/boringssl/include/openssl/dsa.h +5 -5
  854. data/third_party/boringssl/include/openssl/ec.h +2 -2
  855. data/third_party/boringssl/include/openssl/ecdh.h +3 -4
  856. data/third_party/boringssl/include/openssl/ecdsa.h +10 -10
  857. data/third_party/boringssl/include/openssl/err.h +5 -5
  858. data/third_party/boringssl/include/openssl/evp.h +11 -7
  859. data/third_party/boringssl/include/openssl/lhash.h +2 -3
  860. data/third_party/boringssl/include/openssl/lhash_macros.h +56 -14
  861. data/third_party/boringssl/include/openssl/nid.h +2949 -2916
  862. data/third_party/boringssl/include/openssl/obj.h +1 -1
  863. data/third_party/boringssl/include/openssl/pkcs8.h +21 -42
  864. data/third_party/boringssl/include/openssl/pool.h +87 -0
  865. data/third_party/boringssl/include/openssl/rand.h +1 -1
  866. data/third_party/boringssl/include/openssl/rsa.h +4 -2
  867. data/third_party/boringssl/include/openssl/sha.h +0 -4
  868. data/third_party/boringssl/include/openssl/ssl.h +327 -662
  869. data/third_party/boringssl/include/openssl/ssl3.h +1 -21
  870. data/third_party/boringssl/include/openssl/stack.h +1 -0
  871. data/third_party/boringssl/include/openssl/stack_macros.h +85 -0
  872. data/third_party/boringssl/include/openssl/tls1.h +23 -52
  873. data/third_party/boringssl/include/openssl/type_check.h +4 -0
  874. data/third_party/boringssl/include/openssl/x509.h +10 -59
  875. data/third_party/boringssl/include/openssl/x509_vfy.h +7 -1
  876. data/third_party/boringssl/include/openssl/x509v3.h +4 -4
  877. data/third_party/boringssl/ssl/bio_ssl.c +175 -0
  878. data/third_party/boringssl/ssl/custom_extensions.c +24 -21
  879. data/third_party/boringssl/ssl/d1_both.c +259 -289
  880. data/third_party/boringssl/ssl/d1_lib.c +8 -20
  881. data/third_party/boringssl/ssl/d1_pkt.c +6 -15
  882. data/third_party/boringssl/ssl/dtls_method.c +22 -8
  883. data/third_party/boringssl/ssl/dtls_record.c +27 -2
  884. data/third_party/boringssl/ssl/handshake_client.c +460 -579
  885. data/third_party/boringssl/ssl/handshake_server.c +662 -644
  886. data/third_party/boringssl/ssl/internal.h +1009 -375
  887. data/third_party/boringssl/ssl/s3_both.c +312 -162
  888. data/third_party/boringssl/ssl/s3_lib.c +12 -128
  889. data/third_party/boringssl/ssl/s3_pkt.c +22 -30
  890. data/third_party/boringssl/ssl/ssl_aead_ctx.c +28 -22
  891. data/third_party/boringssl/ssl/ssl_asn1.c +210 -114
  892. data/third_party/boringssl/ssl/ssl_buffer.c +2 -1
  893. data/third_party/boringssl/ssl/ssl_cert.c +417 -219
  894. data/third_party/boringssl/ssl/ssl_cipher.c +191 -393
  895. data/third_party/boringssl/ssl/ssl_ecdh.c +19 -164
  896. data/third_party/boringssl/ssl/ssl_file.c +0 -11
  897. data/third_party/boringssl/ssl/ssl_lib.c +325 -652
  898. data/third_party/boringssl/ssl/{ssl_rsa.c → ssl_privkey.c} +21 -131
  899. data/third_party/boringssl/ssl/ssl_privkey_cc.cc +76 -0
  900. data/third_party/boringssl/ssl/ssl_session.c +206 -95
  901. data/third_party/boringssl/ssl/ssl_stat.c +18 -84
  902. data/third_party/boringssl/ssl/{s3_enc.c → ssl_transcript.c} +150 -157
  903. data/third_party/boringssl/ssl/ssl_x509.c +815 -0
  904. data/third_party/boringssl/ssl/t1_enc.c +188 -174
  905. data/third_party/boringssl/ssl/t1_lib.c +1064 -764
  906. data/third_party/boringssl/ssl/tls13_both.c +290 -96
  907. data/third_party/boringssl/ssl/tls13_client.c +344 -314
  908. data/third_party/boringssl/ssl/tls13_enc.c +239 -200
  909. data/third_party/boringssl/ssl/tls13_server.c +374 -366
  910. data/third_party/boringssl/ssl/tls_method.c +40 -5
  911. data/third_party/boringssl/ssl/tls_record.c +166 -71
  912. metadata +39 -25
  913. data/src/core/lib/iomgr/workqueue.h +0 -87
  914. data/src/core/lib/iomgr/workqueue_uv.c +0 -65
  915. data/src/core/lib/iomgr/workqueue_uv.h +0 -37
  916. data/src/core/lib/iomgr/workqueue_windows.c +0 -63
  917. data/src/core/lib/iomgr/workqueue_windows.h +0 -37
  918. data/third_party/boringssl/crypto/bio/buffer.c +0 -496
  919. data/third_party/boringssl/crypto/newhope/error_correction.c +0 -131
  920. data/third_party/boringssl/crypto/newhope/internal.h +0 -71
  921. data/third_party/boringssl/crypto/newhope/newhope.c +0 -174
  922. data/third_party/boringssl/crypto/newhope/ntt.c +0 -148
  923. data/third_party/boringssl/crypto/newhope/poly.c +0 -183
  924. data/third_party/boringssl/crypto/newhope/precomp.c +0 -306
  925. data/third_party/boringssl/crypto/obj/obj_xref.h +0 -96
  926. data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +0 -151
  927. data/third_party/boringssl/include/openssl/newhope.h +0 -158
  928. data/third_party/boringssl/include/openssl/time_support.h +0 -91
@@ -1,63 +1,28 @@
1
1
  /*
2
2
  *
3
- * Copyright 2015, Google Inc.
4
- * All rights reserved.
3
+ * Copyright 2015 gRPC authors.
5
4
  *
6
- * Redistribution and use in source and binary forms, with or without
7
- * modification, are permitted provided that the following conditions are
8
- * met:
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
9
8
  *
10
- * * Redistributions of source code must retain the above copyright
11
- * notice, this list of conditions and the following disclaimer.
12
- * * Redistributions in binary form must reproduce the above
13
- * copyright notice, this list of conditions and the following disclaimer
14
- * in the documentation and/or other materials provided with the
15
- * distribution.
16
- * * Neither the name of Google Inc. nor the names of its
17
- * contributors may be used to endorse or promote products derived from
18
- * this software without specific prior written permission.
9
+ * http://www.apache.org/licenses/LICENSE-2.0
19
10
  *
20
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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.
31
16
  *
32
17
  */
33
18
 
34
19
  /** Round Robin Policy.
35
20
  *
36
- * This policy keeps:
37
- * - A circular list of ready (connected) subchannels, the *readylist*. An empty
38
- * readylist consists solely of its root (dummy) node.
39
- * - A pointer to the last element picked from the readylist, the *lastpick*.
40
- * Initially set to point to the readylist's root.
41
- *
42
- * Behavior:
43
- * - When a subchannel connects, it's *prepended* to the readylist's root node.
44
- * Ie, if readylist = A <-> B <-> ROOT <-> C
45
- * ^ ^
46
- * |____________________|
47
- * and subchannel D becomes connected, the addition of D to the readylist
48
- * results in readylist = A <-> B <-> D <-> ROOT <-> C
49
- * ^ ^
50
- * |__________________________|
51
- * - When a subchannel disconnects, it's removed from the readylist. If the
52
- * subchannel being removed was the most recently picked, the *lastpick*
53
- * pointer moves to the removed node's previous element. Note that if the
54
- * readylist only had one element, this is still legal, as the lastpick would
55
- * point to the dummy root node, for an empty readylist.
56
- * - Upon picking, *lastpick* is updated to point to the returned (connected)
57
- * subchannel. Note that it's possible that the selected subchannel becomes
58
- * disconnected in the interim between the selection and the actual usage of
59
- * the subchannel by the caller.
60
- */
21
+ * Before every pick, the \a get_next_ready_subchannel_index_locked function
22
+ * returns the p->subchannel_list->subchannels index for next subchannel,
23
+ * respecting the relative
24
+ * order of the addresses provided upon creation or updates. Note however that
25
+ * updates will start picking from the beginning of the updated list. */
61
26
 
62
27
  #include <string.h>
63
28
 
@@ -72,9 +37,8 @@
72
37
  #include "src/core/lib/transport/connectivity_state.h"
73
38
  #include "src/core/lib/transport/static_metadata.h"
74
39
 
75
- typedef struct round_robin_lb_policy round_robin_lb_policy;
76
-
77
- grpc_tracer_flag grpc_lb_round_robin_trace = GRPC_TRACER_INITIALIZER(false);
40
+ grpc_tracer_flag grpc_lb_round_robin_trace =
41
+ GRPC_TRACER_INITIALIZER(false, "round_robin");
78
42
 
79
43
  /** List of entities waiting for a pick.
80
44
  *
@@ -99,9 +63,40 @@ typedef struct pending_pick {
99
63
  grpc_closure *on_complete;
100
64
  } pending_pick;
101
65
 
66
+ typedef struct rr_subchannel_list rr_subchannel_list;
67
+ typedef struct round_robin_lb_policy {
68
+ /** base policy: must be first */
69
+ grpc_lb_policy base;
70
+
71
+ rr_subchannel_list *subchannel_list;
72
+
73
+ /** have we started picking? */
74
+ bool started_picking;
75
+ /** are we shutting down? */
76
+ bool shutdown;
77
+ /** has the policy gotten into the GRPC_CHANNEL_SHUTDOWN? No picks can be
78
+ * service after this point, the policy will never transition out. */
79
+ bool in_connectivity_shutdown;
80
+ /** List of picks that are waiting on connectivity */
81
+ pending_pick *pending_picks;
82
+
83
+ /** our connectivity state tracker */
84
+ grpc_connectivity_state_tracker state_tracker;
85
+
86
+ /** Index into subchannels for last pick. */
87
+ size_t last_ready_subchannel_index;
88
+
89
+ /** Latest version of the subchannel list.
90
+ * Subchannel connectivity callbacks will only promote updated subchannel
91
+ * lists if they equal \a latest_pending_subchannel_list. In other words,
92
+ * racing callbacks that reference outdated subchannel lists won't perform any
93
+ * update. */
94
+ rr_subchannel_list *latest_pending_subchannel_list;
95
+ } round_robin_lb_policy;
96
+
102
97
  typedef struct {
103
- /** backpointer to owning policy */
104
- round_robin_lb_policy *policy;
98
+ /** backpointer to owning subchannel list */
99
+ rr_subchannel_list *subchannel_list;
105
100
  /** subchannel itself */
106
101
  grpc_subchannel *subchannel;
107
102
  /** notification that connectivity has changed on subchannel */
@@ -123,12 +118,9 @@ typedef struct {
123
118
  const grpc_lb_user_data_vtable *user_data_vtable;
124
119
  } subchannel_data;
125
120
 
126
- struct round_robin_lb_policy {
127
- /** base policy: must be first */
128
- grpc_lb_policy base;
129
-
130
- /** total number of addresses received at creation time */
131
- size_t num_addresses;
121
+ struct rr_subchannel_list {
122
+ /** backpointer to owning policy */
123
+ round_robin_lb_policy *policy;
132
124
 
133
125
  /** all our subchannels */
134
126
  size_t num_subchannels;
@@ -143,101 +135,198 @@ struct round_robin_lb_policy {
143
135
  /** how many subchannels are in state IDLE */
144
136
  size_t num_idle;
145
137
 
146
- /** have we started picking? */
147
- bool started_picking;
148
- /** are we shutting down? */
149
- bool shutdown;
150
- /** List of picks that are waiting on connectivity */
151
- pending_pick *pending_picks;
152
-
153
- /** our connectivity state tracker */
154
- grpc_connectivity_state_tracker state_tracker;
138
+ /** There will be one ref for each entry in subchannels for which there is a
139
+ * pending connectivity state watcher callback. */
140
+ gpr_refcount refcount;
155
141
 
156
- // Index into subchannels for last pick.
157
- size_t last_ready_subchannel_index;
142
+ /** Is this list shutting down? This may be true due to the shutdown of the
143
+ * policy itself or because a newer update has arrived while this one hadn't
144
+ * finished processing. */
145
+ bool shutting_down;
158
146
  };
159
147
 
160
- /** Returns the index into p->subchannels of the next subchannel in
161
- * READY state, or p->num_subchannels if no subchannel is READY.
148
+ static rr_subchannel_list *rr_subchannel_list_create(round_robin_lb_policy *p,
149
+ size_t num_subchannels) {
150
+ rr_subchannel_list *subchannel_list = gpr_zalloc(sizeof(*subchannel_list));
151
+ subchannel_list->policy = p;
152
+ subchannel_list->subchannels =
153
+ gpr_zalloc(sizeof(subchannel_data) * num_subchannels);
154
+ subchannel_list->num_subchannels = num_subchannels;
155
+ gpr_ref_init(&subchannel_list->refcount, 1);
156
+ if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
157
+ gpr_log(GPR_INFO, "[RR %p] Created subchannel list %p for %lu subchannels",
158
+ (void *)p, (void *)subchannel_list, (unsigned long)num_subchannels);
159
+ }
160
+ return subchannel_list;
161
+ }
162
+
163
+ static void rr_subchannel_list_destroy(grpc_exec_ctx *exec_ctx,
164
+ rr_subchannel_list *subchannel_list) {
165
+ GPR_ASSERT(subchannel_list->shutting_down);
166
+ if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
167
+ gpr_log(GPR_INFO, "[RR %p] Destroying subchannel_list %p",
168
+ (void *)subchannel_list->policy, (void *)subchannel_list);
169
+ }
170
+ for (size_t i = 0; i < subchannel_list->num_subchannels; i++) {
171
+ subchannel_data *sd = &subchannel_list->subchannels[i];
172
+ if (sd->subchannel != NULL) {
173
+ GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel,
174
+ "rr_subchannel_list_destroy");
175
+ }
176
+ sd->subchannel = NULL;
177
+ if (sd->user_data != NULL) {
178
+ GPR_ASSERT(sd->user_data_vtable != NULL);
179
+ sd->user_data_vtable->destroy(exec_ctx, sd->user_data);
180
+ sd->user_data = NULL;
181
+ }
182
+ }
183
+ gpr_free(subchannel_list->subchannels);
184
+ gpr_free(subchannel_list);
185
+ }
186
+
187
+ static void rr_subchannel_list_ref(rr_subchannel_list *subchannel_list,
188
+ const char *reason) {
189
+ gpr_ref_non_zero(&subchannel_list->refcount);
190
+ if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
191
+ const gpr_atm count = gpr_atm_acq_load(&subchannel_list->refcount.count);
192
+ gpr_log(GPR_INFO, "[RR %p] subchannel_list %p REF %lu->%lu (%s)",
193
+ (void *)subchannel_list->policy, (void *)subchannel_list,
194
+ (unsigned long)(count - 1), (unsigned long)count, reason);
195
+ }
196
+ }
197
+
198
+ static void rr_subchannel_list_unref(grpc_exec_ctx *exec_ctx,
199
+ rr_subchannel_list *subchannel_list,
200
+ const char *reason) {
201
+ const bool done = gpr_unref(&subchannel_list->refcount);
202
+ if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
203
+ const gpr_atm count = gpr_atm_acq_load(&subchannel_list->refcount.count);
204
+ gpr_log(GPR_INFO, "[RR %p] subchannel_list %p UNREF %lu->%lu (%s)",
205
+ (void *)subchannel_list->policy, (void *)subchannel_list,
206
+ (unsigned long)(count + 1), (unsigned long)count, reason);
207
+ }
208
+ if (done) {
209
+ rr_subchannel_list_destroy(exec_ctx, subchannel_list);
210
+ }
211
+ }
212
+
213
+ /** Mark \a subchannel_list as discarded. Unsubscribes all its subchannels. The
214
+ * watcher's callback will ultimately unref \a subchannel_list. */
215
+ static void rr_subchannel_list_shutdown_and_unref(
216
+ grpc_exec_ctx *exec_ctx, rr_subchannel_list *subchannel_list,
217
+ const char *reason) {
218
+ GPR_ASSERT(!subchannel_list->shutting_down);
219
+ if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
220
+ gpr_log(GPR_DEBUG, "[RR %p] Shutting down subchannel_list %p (%s)",
221
+ (void *)subchannel_list->policy, (void *)subchannel_list, reason);
222
+ }
223
+ GPR_ASSERT(!subchannel_list->shutting_down);
224
+ subchannel_list->shutting_down = true;
225
+ for (size_t i = 0; i < subchannel_list->num_subchannels; i++) {
226
+ subchannel_data *sd = &subchannel_list->subchannels[i];
227
+ if (sd->subchannel != NULL) { // if subchannel isn't shutdown, unsubscribe.
228
+ if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
229
+ gpr_log(
230
+ GPR_DEBUG,
231
+ "[RR %p] Unsubscribing from subchannel %p as part of shutting down "
232
+ "subchannel_list %p",
233
+ (void *)subchannel_list->policy, (void *)sd->subchannel,
234
+ (void *)subchannel_list);
235
+ }
236
+ grpc_subchannel_notify_on_state_change(exec_ctx, sd->subchannel, NULL,
237
+ NULL,
238
+ &sd->connectivity_changed_closure);
239
+ }
240
+ }
241
+ rr_subchannel_list_unref(exec_ctx, subchannel_list, reason);
242
+ }
243
+
244
+ /** Returns the index into p->subchannel_list->subchannels of the next
245
+ * subchannel in READY state, or p->subchannel_list->num_subchannels if no
246
+ * subchannel is READY.
162
247
  *
163
248
  * Note that this function does *not* update p->last_ready_subchannel_index.
164
249
  * The caller must do that if it returns a pick. */
165
250
  static size_t get_next_ready_subchannel_index_locked(
166
251
  const round_robin_lb_policy *p) {
252
+ GPR_ASSERT(p->subchannel_list != NULL);
167
253
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
168
254
  gpr_log(GPR_INFO,
169
- "[RR: %p] getting next ready subchannel, "
255
+ "[RR %p] getting next ready subchannel (out of %lu), "
170
256
  "last_ready_subchannel_index=%lu",
171
- p, (unsigned long)p->last_ready_subchannel_index);
257
+ (void *)p, (unsigned long)p->subchannel_list->num_subchannels,
258
+ (unsigned long)p->last_ready_subchannel_index);
172
259
  }
173
- for (size_t i = 0; i < p->num_subchannels; ++i) {
174
- const size_t index =
175
- (i + p->last_ready_subchannel_index + 1) % p->num_subchannels;
260
+ for (size_t i = 0; i < p->subchannel_list->num_subchannels; ++i) {
261
+ const size_t index = (i + p->last_ready_subchannel_index + 1) %
262
+ p->subchannel_list->num_subchannels;
176
263
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
177
- gpr_log(GPR_DEBUG, "[RR %p] checking index %lu: state=%d", p,
178
- (unsigned long)index,
179
- p->subchannels[index].curr_connectivity_state);
264
+ gpr_log(
265
+ GPR_DEBUG,
266
+ "[RR %p] checking subchannel %p, subchannel_list %p, index %lu: "
267
+ "state=%s",
268
+ (void *)p, (void *)p->subchannel_list->subchannels[index].subchannel,
269
+ (void *)p->subchannel_list, (unsigned long)index,
270
+ grpc_connectivity_state_name(
271
+ p->subchannel_list->subchannels[index].curr_connectivity_state));
180
272
  }
181
- if (p->subchannels[index].curr_connectivity_state == GRPC_CHANNEL_READY) {
273
+ if (p->subchannel_list->subchannels[index].curr_connectivity_state ==
274
+ GRPC_CHANNEL_READY) {
182
275
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
183
- gpr_log(GPR_DEBUG, "[RR %p] found next ready subchannel at index %lu",
184
- p, (unsigned long)index);
276
+ gpr_log(GPR_DEBUG,
277
+ "[RR %p] found next ready subchannel (%p) at index %lu of "
278
+ "subchannel_list %p",
279
+ (void *)p,
280
+ (void *)p->subchannel_list->subchannels[index].subchannel,
281
+ (unsigned long)index, (void *)p->subchannel_list);
185
282
  }
186
283
  return index;
187
284
  }
188
285
  }
189
286
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
190
- gpr_log(GPR_DEBUG, "[RR %p] no subchannels in ready state", p);
287
+ gpr_log(GPR_DEBUG, "[RR %p] no subchannels in ready state", (void *)p);
191
288
  }
192
- return p->num_subchannels;
289
+ return p->subchannel_list->num_subchannels;
193
290
  }
194
291
 
195
292
  // Sets p->last_ready_subchannel_index to last_ready_index.
196
293
  static void update_last_ready_subchannel_index_locked(round_robin_lb_policy *p,
197
294
  size_t last_ready_index) {
198
- GPR_ASSERT(last_ready_index < p->num_subchannels);
295
+ GPR_ASSERT(last_ready_index < p->subchannel_list->num_subchannels);
199
296
  p->last_ready_subchannel_index = last_ready_index;
200
297
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
201
- gpr_log(GPR_DEBUG,
202
- "[RR: %p] setting last_ready_subchannel_index=%lu (SC %p, CSC %p)",
203
- (void *)p, (unsigned long)last_ready_index,
204
- (void *)p->subchannels[last_ready_index].subchannel,
205
- (void *)grpc_subchannel_get_connected_subchannel(
206
- p->subchannels[last_ready_index].subchannel));
298
+ gpr_log(
299
+ GPR_DEBUG,
300
+ "[RR %p] setting last_ready_subchannel_index=%lu (SC %p, CSC %p)",
301
+ (void *)p, (unsigned long)last_ready_index,
302
+ (void *)p->subchannel_list->subchannels[last_ready_index].subchannel,
303
+ (void *)grpc_subchannel_get_connected_subchannel(
304
+ p->subchannel_list->subchannels[last_ready_index].subchannel));
207
305
  }
208
306
  }
209
307
 
210
308
  static void rr_destroy(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
211
309
  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
212
310
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
213
- gpr_log(GPR_DEBUG, "Destroying Round Robin policy at %p", (void *)pol);
214
- }
215
- for (size_t i = 0; i < p->num_subchannels; i++) {
216
- subchannel_data *sd = &p->subchannels[i];
217
- if (sd->subchannel != NULL) {
218
- GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "rr_destroy");
219
- if (sd->user_data != NULL) {
220
- GPR_ASSERT(sd->user_data_vtable != NULL);
221
- sd->user_data_vtable->destroy(exec_ctx, sd->user_data);
222
- }
223
- }
311
+ gpr_log(GPR_DEBUG, "[RR %p] Destroying Round Robin policy at %p",
312
+ (void *)pol, (void *)pol);
224
313
  }
225
314
  grpc_connectivity_state_destroy(exec_ctx, &p->state_tracker);
226
- gpr_free(p->subchannels);
227
315
  gpr_free(p);
228
316
  }
229
317
 
230
318
  static void rr_shutdown_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
231
319
  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
232
320
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
233
- gpr_log(GPR_DEBUG, "Shutting down Round Robin policy at %p", (void *)pol);
321
+ gpr_log(GPR_DEBUG, "[RR %p] Shutting down Round Robin policy at %p",
322
+ (void *)pol, (void *)pol);
234
323
  }
235
324
  p->shutdown = true;
236
325
  pending_pick *pp;
237
326
  while ((pp = p->pending_picks)) {
238
327
  p->pending_picks = pp->next;
239
328
  *pp->target = NULL;
240
- grpc_closure_sched(
329
+ GRPC_CLOSURE_SCHED(
241
330
  exec_ctx, pp->on_complete,
242
331
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel Shutdown"));
243
332
  gpr_free(pp);
@@ -245,13 +334,17 @@ static void rr_shutdown_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
245
334
  grpc_connectivity_state_set(
246
335
  exec_ctx, &p->state_tracker, GRPC_CHANNEL_SHUTDOWN,
247
336
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel Shutdown"), "rr_shutdown");
248
- for (size_t i = 0; i < p->num_subchannels; i++) {
249
- subchannel_data *sd = &p->subchannels[i];
250
- if (sd->subchannel != NULL) {
251
- grpc_subchannel_notify_on_state_change(exec_ctx, sd->subchannel, NULL,
252
- NULL,
253
- &sd->connectivity_changed_closure);
254
- }
337
+ const bool latest_is_current =
338
+ p->subchannel_list == p->latest_pending_subchannel_list;
339
+ rr_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
340
+ "sl_shutdown_rr_shutdown");
341
+ p->subchannel_list = NULL;
342
+ if (!latest_is_current && p->latest_pending_subchannel_list != NULL &&
343
+ !p->latest_pending_subchannel_list->shutting_down) {
344
+ rr_subchannel_list_shutdown_and_unref(exec_ctx,
345
+ p->latest_pending_subchannel_list,
346
+ "sl_shutdown_pending_rr_shutdown");
347
+ p->latest_pending_subchannel_list = NULL;
255
348
  }
256
349
  }
257
350
 
@@ -265,7 +358,7 @@ static void rr_cancel_pick_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
265
358
  pending_pick *next = pp->next;
266
359
  if (pp->target == target) {
267
360
  *target = NULL;
268
- grpc_closure_sched(exec_ctx, pp->on_complete,
361
+ GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete,
269
362
  GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
270
363
  "Pick cancelled", &error, 1));
271
364
  gpr_free(pp);
@@ -290,7 +383,7 @@ static void rr_cancel_picks_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
290
383
  if ((pp->initial_metadata_flags & initial_metadata_flags_mask) ==
291
384
  initial_metadata_flags_eq) {
292
385
  *pp->target = NULL;
293
- grpc_closure_sched(exec_ctx, pp->on_complete,
386
+ GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete,
294
387
  GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
295
388
  "Pick cancelled", &error, 1));
296
389
  gpr_free(pp);
@@ -306,15 +399,14 @@ static void rr_cancel_picks_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
306
399
  static void start_picking_locked(grpc_exec_ctx *exec_ctx,
307
400
  round_robin_lb_policy *p) {
308
401
  p->started_picking = true;
309
- for (size_t i = 0; i < p->num_subchannels; i++) {
310
- subchannel_data *sd = &p->subchannels[i];
311
- if (sd->subchannel != NULL) {
312
- GRPC_LB_POLICY_WEAK_REF(&p->base, "rr_connectivity");
313
- grpc_subchannel_notify_on_state_change(
314
- exec_ctx, sd->subchannel, p->base.interested_parties,
315
- &sd->pending_connectivity_state_unsafe,
316
- &sd->connectivity_changed_closure);
317
- }
402
+ for (size_t i = 0; i < p->subchannel_list->num_subchannels; i++) {
403
+ subchannel_data *sd = &p->subchannel_list->subchannels[i];
404
+ GRPC_LB_POLICY_WEAK_REF(&p->base, "start_picking_locked");
405
+ rr_subchannel_list_ref(sd->subchannel_list, "started_picking");
406
+ grpc_subchannel_notify_on_state_change(
407
+ exec_ctx, sd->subchannel, p->base.interested_parties,
408
+ &sd->pending_connectivity_state_unsafe,
409
+ &sd->connectivity_changed_closure);
318
410
  }
319
411
  }
320
412
 
@@ -331,68 +423,80 @@ static int rr_pick_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
331
423
  grpc_call_context_element *context, void **user_data,
332
424
  grpc_closure *on_complete) {
333
425
  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
426
+ GPR_ASSERT(!p->shutdown);
427
+ GPR_ASSERT(!p->in_connectivity_shutdown);
334
428
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
335
- gpr_log(GPR_INFO, "Round Robin %p trying to pick", (void *)pol);
429
+ gpr_log(GPR_INFO, "[RR %p] Trying to pick", (void *)pol);
336
430
  }
337
- const size_t next_ready_index = get_next_ready_subchannel_index_locked(p);
338
- if (next_ready_index < p->num_subchannels) {
339
- /* readily available, report right away */
340
- subchannel_data *sd = &p->subchannels[next_ready_index];
341
- *target = GRPC_CONNECTED_SUBCHANNEL_REF(
342
- grpc_subchannel_get_connected_subchannel(sd->subchannel), "rr_picked");
343
- if (user_data != NULL) {
344
- *user_data = sd->user_data;
345
- }
346
- if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
347
- gpr_log(GPR_DEBUG,
348
- "[RR PICK] TARGET <-- CONNECTED SUBCHANNEL %p (INDEX %lu)",
349
- (void *)*target, (unsigned long)next_ready_index);
350
- }
351
- /* only advance the last picked pointer if the selection was used */
352
- update_last_ready_subchannel_index_locked(p, next_ready_index);
353
- return 1;
354
- } else {
355
- /* no pick currently available. Save for later in list of pending picks */
356
- if (!p->started_picking) {
357
- start_picking_locked(exec_ctx, p);
431
+ if (p->subchannel_list != NULL) {
432
+ const size_t next_ready_index = get_next_ready_subchannel_index_locked(p);
433
+ if (next_ready_index < p->subchannel_list->num_subchannels) {
434
+ /* readily available, report right away */
435
+ subchannel_data *sd = &p->subchannel_list->subchannels[next_ready_index];
436
+ *target = GRPC_CONNECTED_SUBCHANNEL_REF(
437
+ grpc_subchannel_get_connected_subchannel(sd->subchannel),
438
+ "rr_picked");
439
+ if (user_data != NULL) {
440
+ *user_data = sd->user_data;
441
+ }
442
+ if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
443
+ gpr_log(
444
+ GPR_DEBUG,
445
+ "[RR %p] Picked target <-- Subchannel %p (connected %p) (sl %p, "
446
+ "index %lu)",
447
+ (void *)p, (void *)sd->subchannel, (void *)*target,
448
+ (void *)sd->subchannel_list, (unsigned long)next_ready_index);
449
+ }
450
+ /* only advance the last picked pointer if the selection was used */
451
+ update_last_ready_subchannel_index_locked(p, next_ready_index);
452
+ return 1;
358
453
  }
359
- pending_pick *pp = gpr_malloc(sizeof(*pp));
360
- pp->next = p->pending_picks;
361
- pp->target = target;
362
- pp->on_complete = on_complete;
363
- pp->initial_metadata_flags = pick_args->initial_metadata_flags;
364
- pp->user_data = user_data;
365
- p->pending_picks = pp;
366
- return 0;
367
454
  }
455
+ /* no pick currently available. Save for later in list of pending picks */
456
+ if (!p->started_picking) {
457
+ start_picking_locked(exec_ctx, p);
458
+ }
459
+ pending_pick *pp = gpr_malloc(sizeof(*pp));
460
+ pp->next = p->pending_picks;
461
+ pp->target = target;
462
+ pp->on_complete = on_complete;
463
+ pp->initial_metadata_flags = pick_args->initial_metadata_flags;
464
+ pp->user_data = user_data;
465
+ p->pending_picks = pp;
466
+ return 0;
368
467
  }
369
468
 
370
469
  static void update_state_counters_locked(subchannel_data *sd) {
371
- round_robin_lb_policy *p = sd->policy;
470
+ rr_subchannel_list *subchannel_list = sd->subchannel_list;
372
471
  if (sd->prev_connectivity_state == GRPC_CHANNEL_READY) {
373
- GPR_ASSERT(p->num_ready > 0);
374
- --p->num_ready;
472
+ GPR_ASSERT(subchannel_list->num_ready > 0);
473
+ --subchannel_list->num_ready;
375
474
  } else if (sd->prev_connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
376
- GPR_ASSERT(p->num_transient_failures > 0);
377
- --p->num_transient_failures;
475
+ GPR_ASSERT(subchannel_list->num_transient_failures > 0);
476
+ --subchannel_list->num_transient_failures;
477
+ } else if (sd->prev_connectivity_state == GRPC_CHANNEL_SHUTDOWN) {
478
+ GPR_ASSERT(subchannel_list->num_shutdown > 0);
479
+ --subchannel_list->num_shutdown;
378
480
  } else if (sd->prev_connectivity_state == GRPC_CHANNEL_IDLE) {
379
- GPR_ASSERT(p->num_idle > 0);
380
- --p->num_idle;
481
+ GPR_ASSERT(subchannel_list->num_idle > 0);
482
+ --subchannel_list->num_idle;
381
483
  }
382
484
  if (sd->curr_connectivity_state == GRPC_CHANNEL_READY) {
383
- ++p->num_ready;
485
+ ++subchannel_list->num_ready;
384
486
  } else if (sd->curr_connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
385
- ++p->num_transient_failures;
487
+ ++subchannel_list->num_transient_failures;
386
488
  } else if (sd->curr_connectivity_state == GRPC_CHANNEL_SHUTDOWN) {
387
- ++p->num_shutdown;
489
+ ++subchannel_list->num_shutdown;
388
490
  } else if (sd->curr_connectivity_state == GRPC_CHANNEL_IDLE) {
389
- ++p->num_idle;
491
+ ++subchannel_list->num_idle;
390
492
  }
391
493
  }
392
494
 
393
- /* sd is the subchannel_data associted with the updated subchannel.
394
- * shutdown_error will only be used upon policy transition to TRANSIENT_FAILURE
395
- * or SHUTDOWN */
495
+ /** Sets the policy's connectivity status based on that of the passed-in \a sd
496
+ * (the subchannel_data associted with the updated subchannel) and the
497
+ * subchannel list \a sd belongs to (sd->subchannel_list). \a error will only be
498
+ * used upon policy transition to TRANSIENT_FAILURE or SHUTDOWN. Returns the
499
+ * connectivity status set. */
396
500
  static grpc_connectivity_state update_lb_connectivity_status_locked(
397
501
  grpc_exec_ctx *exec_ctx, subchannel_data *sd, grpc_error *error) {
398
502
  /* In priority order. The first rule to match terminates the search (ie, if we
@@ -405,18 +509,20 @@ static grpc_connectivity_state update_lb_connectivity_status_locked(
405
509
  * CHECK: sd->curr_connectivity_state == CONNECTING.
406
510
  *
407
511
  * 3) RULE: ALL subchannels are SHUTDOWN => policy is SHUTDOWN.
408
- * CHECK: p->num_shutdown == p->num_subchannels.
512
+ * CHECK: p->subchannel_list->num_shutdown ==
513
+ * p->subchannel_list->num_subchannels.
409
514
  *
410
515
  * 4) RULE: ALL subchannels are TRANSIENT_FAILURE => policy is
411
516
  * TRANSIENT_FAILURE.
412
- * CHECK: p->num_transient_failures == p->num_subchannels.
517
+ * CHECK: p->num_transient_failures == p->subchannel_list->num_subchannels.
413
518
  *
414
519
  * 5) RULE: ALL subchannels are IDLE => policy is IDLE.
415
- * CHECK: p->num_idle == p->num_subchannels.
520
+ * CHECK: p->num_idle == p->subchannel_list->num_subchannels.
416
521
  */
417
- round_robin_lb_policy *p = sd->policy;
418
522
  grpc_connectivity_state new_state = sd->curr_connectivity_state;
419
- if (p->num_ready > 0) { /* 1) READY */
523
+ rr_subchannel_list *subchannel_list = sd->subchannel_list;
524
+ round_robin_lb_policy *p = subchannel_list->policy;
525
+ if (subchannel_list->num_ready > 0) { /* 1) READY */
420
526
  grpc_connectivity_state_set(exec_ctx, &p->state_tracker, GRPC_CHANNEL_READY,
421
527
  GRPC_ERROR_NONE, "rr_ready");
422
528
  new_state = GRPC_CHANNEL_READY;
@@ -426,18 +532,21 @@ static grpc_connectivity_state update_lb_connectivity_status_locked(
426
532
  GRPC_CHANNEL_CONNECTING, GRPC_ERROR_NONE,
427
533
  "rr_connecting");
428
534
  new_state = GRPC_CHANNEL_CONNECTING;
429
- } else if (p->num_shutdown == p->num_subchannels) { /* 3) SHUTDOWN */
535
+ } else if (p->subchannel_list->num_shutdown ==
536
+ p->subchannel_list->num_subchannels) { /* 3) SHUTDOWN */
430
537
  grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
431
538
  GRPC_CHANNEL_SHUTDOWN, GRPC_ERROR_REF(error),
432
539
  "rr_shutdown");
540
+ p->in_connectivity_shutdown = true;
433
541
  new_state = GRPC_CHANNEL_SHUTDOWN;
434
- } else if (p->num_transient_failures ==
435
- p->num_subchannels) { /* 4) TRANSIENT_FAILURE */
542
+ } else if (subchannel_list->num_transient_failures ==
543
+ p->subchannel_list->num_subchannels) { /* 4) TRANSIENT_FAILURE */
436
544
  grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
437
545
  GRPC_CHANNEL_TRANSIENT_FAILURE,
438
546
  GRPC_ERROR_REF(error), "rr_transient_failure");
439
547
  new_state = GRPC_CHANNEL_TRANSIENT_FAILURE;
440
- } else if (p->num_idle == p->num_subchannels) { /* 5) IDLE */
548
+ } else if (subchannel_list->num_idle ==
549
+ p->subchannel_list->num_subchannels) { /* 5) IDLE */
441
550
  grpc_connectivity_state_set(exec_ctx, &p->state_tracker, GRPC_CHANNEL_IDLE,
442
551
  GRPC_ERROR_NONE, "rr_idle");
443
552
  new_state = GRPC_CHANNEL_IDLE;
@@ -449,60 +558,122 @@ static grpc_connectivity_state update_lb_connectivity_status_locked(
449
558
  static void rr_connectivity_changed_locked(grpc_exec_ctx *exec_ctx, void *arg,
450
559
  grpc_error *error) {
451
560
  subchannel_data *sd = arg;
452
- round_robin_lb_policy *p = sd->policy;
453
- // Now that we're inside the combiner, copy the pending connectivity
454
- // state (which was set by the connectivity state watcher) to
455
- // curr_connectivity_state, which is what we use inside of the combiner.
456
- sd->curr_connectivity_state = sd->pending_connectivity_state_unsafe;
561
+ round_robin_lb_policy *p = sd->subchannel_list->policy;
457
562
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
458
- gpr_log(GPR_DEBUG,
459
- "[RR %p] connectivity changed for subchannel %p: "
460
- "prev_state=%d new_state=%d",
461
- p, sd->subchannel, sd->prev_connectivity_state,
462
- sd->curr_connectivity_state);
563
+ gpr_log(
564
+ GPR_DEBUG,
565
+ "[RR %p] connectivity changed for subchannel %p, subchannel_list %p: "
566
+ "prev_state=%s new_state=%s p->shutdown=%d "
567
+ "sd->subchannel_list->shutting_down=%d error=%s",
568
+ (void *)p, (void *)sd->subchannel, (void *)sd->subchannel_list,
569
+ grpc_connectivity_state_name(sd->prev_connectivity_state),
570
+ grpc_connectivity_state_name(sd->pending_connectivity_state_unsafe),
571
+ p->shutdown, sd->subchannel_list->shutting_down,
572
+ grpc_error_string(error));
463
573
  }
464
- // If we're shutting down, unref and return.
574
+ // If the policy is shutting down, unref and return.
465
575
  if (p->shutdown) {
466
- GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "rr_connectivity");
576
+ rr_subchannel_list_unref(exec_ctx, sd->subchannel_list,
577
+ "pol_shutdown+started_picking");
578
+ GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "pol_shutdown");
579
+ return;
580
+ }
581
+ if (sd->subchannel_list->shutting_down && error == GRPC_ERROR_CANCELLED) {
582
+ // the subchannel list associated with sd has been discarded. This callback
583
+ // corresponds to the unsubscription. The unrefs correspond to the picking
584
+ // ref (start_picking_locked or update_started_picking).
585
+ rr_subchannel_list_unref(exec_ctx, sd->subchannel_list,
586
+ "sl_shutdown+started_picking");
587
+ GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "sl_shutdown+picking");
588
+ return;
589
+ }
590
+ // Dispose of outdated subchannel lists.
591
+ if (sd->subchannel_list != p->subchannel_list &&
592
+ sd->subchannel_list != p->latest_pending_subchannel_list) {
593
+ char *reason = NULL;
594
+ if (sd->subchannel_list->shutting_down) {
595
+ reason = "sl_outdated_straggler";
596
+ rr_subchannel_list_unref(exec_ctx, sd->subchannel_list, reason);
597
+ } else {
598
+ reason = "sl_outdated";
599
+ rr_subchannel_list_shutdown_and_unref(exec_ctx, sd->subchannel_list,
600
+ reason);
601
+ }
602
+ GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, reason);
467
603
  return;
468
604
  }
605
+ // Now that we're inside the combiner, copy the pending connectivity
606
+ // state (which was set by the connectivity state watcher) to
607
+ // curr_connectivity_state, which is what we use inside of the combiner.
608
+ sd->curr_connectivity_state = sd->pending_connectivity_state_unsafe;
469
609
  // Update state counters and determine new overall state.
470
610
  update_state_counters_locked(sd);
471
611
  sd->prev_connectivity_state = sd->curr_connectivity_state;
472
- grpc_connectivity_state new_connectivity_state =
612
+ const grpc_connectivity_state new_policy_connectivity_state =
473
613
  update_lb_connectivity_status_locked(exec_ctx, sd, GRPC_ERROR_REF(error));
474
- // If the new state is SHUTDOWN, unref the subchannel, and if the new
475
- // overall state is SHUTDOWN, clean up.
614
+ // If the sd's new state is SHUTDOWN, unref the subchannel, and if the new
615
+ // policy's state is SHUTDOWN, clean up.
476
616
  if (sd->curr_connectivity_state == GRPC_CHANNEL_SHUTDOWN) {
477
617
  GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "rr_subchannel_shutdown");
478
618
  sd->subchannel = NULL;
479
619
  if (sd->user_data != NULL) {
480
620
  GPR_ASSERT(sd->user_data_vtable != NULL);
481
621
  sd->user_data_vtable->destroy(exec_ctx, sd->user_data);
622
+ sd->user_data = NULL;
482
623
  }
483
- if (new_connectivity_state == GRPC_CHANNEL_SHUTDOWN) {
484
- /* the policy is shutting down. Flush all the pending picks... */
624
+ if (new_policy_connectivity_state == GRPC_CHANNEL_SHUTDOWN) {
625
+ // the policy is shutting down. Flush all the pending picks...
485
626
  pending_pick *pp;
486
627
  while ((pp = p->pending_picks)) {
487
628
  p->pending_picks = pp->next;
488
629
  *pp->target = NULL;
489
- grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
630
+ GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
490
631
  gpr_free(pp);
491
632
  }
492
633
  }
493
- /* unref the "rr_connectivity" weak ref from start_picking */
494
- GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "rr_connectivity");
495
- } else {
634
+ rr_subchannel_list_unref(exec_ctx, sd->subchannel_list,
635
+ "sd_shutdown+started_picking");
636
+ // unref the "rr_connectivity_update" weak ref from start_picking.
637
+ GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base,
638
+ "rr_connectivity_sd_shutdown");
639
+ } else { // sd not in SHUTDOWN
496
640
  if (sd->curr_connectivity_state == GRPC_CHANNEL_READY) {
641
+ if (sd->subchannel_list != p->subchannel_list) {
642
+ // promote sd->subchannel_list to p->subchannel_list.
643
+ // sd->subchannel_list must be equal to
644
+ // p->latest_pending_subchannel_list because we have already filtered
645
+ // for sds belonging to outdated subchannel lists.
646
+ GPR_ASSERT(sd->subchannel_list == p->latest_pending_subchannel_list);
647
+ GPR_ASSERT(!sd->subchannel_list->shutting_down);
648
+ if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
649
+ const unsigned long num_subchannels =
650
+ p->subchannel_list != NULL
651
+ ? (unsigned long)p->subchannel_list->num_subchannels
652
+ : 0;
653
+ gpr_log(GPR_DEBUG,
654
+ "[RR %p] phasing out subchannel list %p (size %lu) in favor "
655
+ "of %p (size %lu)",
656
+ (void *)p, (void *)p->subchannel_list, num_subchannels,
657
+ (void *)sd->subchannel_list, num_subchannels);
658
+ }
659
+ if (p->subchannel_list != NULL) {
660
+ // dispose of the current subchannel_list
661
+ rr_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
662
+ "sl_phase_out_shutdown");
663
+ }
664
+ p->subchannel_list = p->latest_pending_subchannel_list;
665
+ p->latest_pending_subchannel_list = NULL;
666
+ }
497
667
  /* at this point we know there's at least one suitable subchannel. Go
498
668
  * ahead and pick one and notify the pending suitors in
499
669
  * p->pending_picks. This preemtively replicates rr_pick()'s actions. */
500
670
  const size_t next_ready_index = get_next_ready_subchannel_index_locked(p);
501
- GPR_ASSERT(next_ready_index < p->num_subchannels);
502
- subchannel_data *selected = &p->subchannels[next_ready_index];
671
+ GPR_ASSERT(next_ready_index < p->subchannel_list->num_subchannels);
672
+ subchannel_data *selected =
673
+ &p->subchannel_list->subchannels[next_ready_index];
503
674
  if (p->pending_picks != NULL) {
504
- /* if the selected subchannel is going to be used for the pending
505
- * picks, update the last picked pointer */
675
+ // if the selected subchannel is going to be used for the pending
676
+ // picks, update the last picked pointer
506
677
  update_last_ready_subchannel_index_locked(p, next_ready_index);
507
678
  }
508
679
  pending_pick *pp;
@@ -516,15 +687,17 @@ static void rr_connectivity_changed_locked(grpc_exec_ctx *exec_ctx, void *arg,
516
687
  }
517
688
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
518
689
  gpr_log(GPR_DEBUG,
519
- "[RR CONN CHANGED] TARGET <-- SUBCHANNEL %p (INDEX %lu)",
520
- (void *)selected->subchannel,
521
- (unsigned long)next_ready_index);
690
+ "[RR %p] Fulfilling pending pick. Target <-- subchannel %p "
691
+ "(subchannel_list %p, index %lu)",
692
+ (void *)p, (void *)selected->subchannel,
693
+ (void *)p->subchannel_list, (unsigned long)next_ready_index);
522
694
  }
523
- grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
695
+ GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
524
696
  gpr_free(pp);
525
697
  }
526
698
  }
527
- /* renew notification: reuses the "rr_connectivity" weak ref */
699
+ /* renew notification: reuses the "rr_connectivity_update" weak ref on the
700
+ * policy as well as the sd->subchannel_list ref. */
528
701
  grpc_subchannel_notify_on_state_change(
529
702
  exec_ctx, sd->subchannel, p->base.interested_parties,
530
703
  &sd->pending_connectivity_state_unsafe,
@@ -551,65 +724,83 @@ static void rr_ping_one_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
551
724
  grpc_closure *closure) {
552
725
  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
553
726
  const size_t next_ready_index = get_next_ready_subchannel_index_locked(p);
554
- if (next_ready_index < p->num_subchannels) {
555
- subchannel_data *selected = &p->subchannels[next_ready_index];
727
+ if (next_ready_index < p->subchannel_list->num_subchannels) {
728
+ subchannel_data *selected =
729
+ &p->subchannel_list->subchannels[next_ready_index];
556
730
  grpc_connected_subchannel *target = GRPC_CONNECTED_SUBCHANNEL_REF(
557
731
  grpc_subchannel_get_connected_subchannel(selected->subchannel),
558
732
  "rr_picked");
559
733
  grpc_connected_subchannel_ping(exec_ctx, target, closure);
560
734
  GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, target, "rr_picked");
561
735
  } else {
562
- grpc_closure_sched(exec_ctx, closure, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
736
+ GRPC_CLOSURE_SCHED(exec_ctx, closure, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
563
737
  "Round Robin not connected"));
564
738
  }
565
739
  }
566
740
 
567
- static const grpc_lb_policy_vtable round_robin_lb_policy_vtable = {
568
- rr_destroy,
569
- rr_shutdown_locked,
570
- rr_pick_locked,
571
- rr_cancel_pick_locked,
572
- rr_cancel_picks_locked,
573
- rr_ping_one_locked,
574
- rr_exit_idle_locked,
575
- rr_check_connectivity_locked,
576
- rr_notify_on_state_change_locked};
577
-
578
- static void round_robin_factory_ref(grpc_lb_policy_factory *factory) {}
579
-
580
- static void round_robin_factory_unref(grpc_lb_policy_factory *factory) {}
581
-
582
- static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx,
583
- grpc_lb_policy_factory *factory,
584
- grpc_lb_policy_args *args) {
585
- GPR_ASSERT(args->client_channel_factory != NULL);
586
-
587
- /* Find the number of backend addresses. We ignore balancer
588
- * addresses, since we don't know how to handle them. */
741
+ static void rr_update_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy,
742
+ const grpc_lb_policy_args *args) {
743
+ round_robin_lb_policy *p = (round_robin_lb_policy *)policy;
744
+ /* Find the number of backend addresses. We ignore balancer addresses, since
745
+ * we don't know how to handle them. */
589
746
  const grpc_arg *arg =
590
747
  grpc_channel_args_find(args->args, GRPC_ARG_LB_ADDRESSES);
591
748
  if (arg == NULL || arg->type != GRPC_ARG_POINTER) {
592
- return NULL;
749
+ if (p->subchannel_list == NULL) {
750
+ // If we don't have a current subchannel list, go into TRANSIENT FAILURE.
751
+ grpc_connectivity_state_set(
752
+ exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
753
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing update in args"),
754
+ "rr_update_missing");
755
+ } else {
756
+ // otherwise, keep using the current subchannel list (ignore this update).
757
+ gpr_log(GPR_ERROR,
758
+ "[RR %p] No valid LB addresses channel arg for update, ignoring.",
759
+ (void *)p);
760
+ }
761
+ return;
593
762
  }
594
763
  grpc_lb_addresses *addresses = arg->value.pointer.p;
595
764
  size_t num_addrs = 0;
596
765
  for (size_t i = 0; i < addresses->num_addresses; i++) {
597
766
  if (!addresses->addresses[i].is_balancer) ++num_addrs;
598
767
  }
599
- if (num_addrs == 0) return NULL;
600
-
601
- round_robin_lb_policy *p = gpr_zalloc(sizeof(*p));
602
-
603
- p->num_addresses = num_addrs;
604
- p->subchannels = gpr_zalloc(sizeof(*p->subchannels) * num_addrs);
605
-
606
- grpc_subchannel_args sc_args;
768
+ rr_subchannel_list *subchannel_list = rr_subchannel_list_create(p, num_addrs);
769
+ if (num_addrs == 0) {
770
+ grpc_connectivity_state_set(
771
+ exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
772
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty update"),
773
+ "rr_update_empty");
774
+ if (p->subchannel_list != NULL) {
775
+ rr_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
776
+ "sl_shutdown_empty_update");
777
+ }
778
+ p->subchannel_list = subchannel_list; // empty list
779
+ return;
780
+ }
607
781
  size_t subchannel_index = 0;
782
+ if (p->latest_pending_subchannel_list != NULL && p->started_picking) {
783
+ if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
784
+ gpr_log(GPR_DEBUG,
785
+ "[RR %p] Shutting down latest pending subchannel list %p, about "
786
+ "to be replaced by newer latest %p",
787
+ (void *)p, (void *)p->latest_pending_subchannel_list,
788
+ (void *)subchannel_list);
789
+ }
790
+ rr_subchannel_list_shutdown_and_unref(
791
+ exec_ctx, p->latest_pending_subchannel_list, "sl_outdated_dont_smash");
792
+ }
793
+ p->latest_pending_subchannel_list = subchannel_list;
794
+ grpc_subchannel_args sc_args;
795
+ /* We need to remove the LB addresses in order to be able to compare the
796
+ * subchannel keys of subchannels from a different batch of addresses. */
797
+ static const char *keys_to_remove[] = {GRPC_ARG_SUBCHANNEL_ADDRESS,
798
+ GRPC_ARG_LB_ADDRESSES};
799
+ /* Create subchannels for addresses in the update. */
608
800
  for (size_t i = 0; i < addresses->num_addresses; i++) {
609
801
  /* Skip balancer addresses, since we only know how to handle backends. */
610
802
  if (addresses->addresses[i].is_balancer) continue;
611
-
612
- static const char *keys_to_remove[] = {GRPC_ARG_SUBCHANNEL_ADDRESS};
803
+ GPR_ASSERT(i < num_addrs);
613
804
  memset(&sc_args, 0, sizeof(grpc_subchannel_args));
614
805
  grpc_arg addr_arg =
615
806
  grpc_create_subchannel_address_arg(&addresses->addresses[i].address);
@@ -623,52 +814,86 @@ static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx,
623
814
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
624
815
  char *address_uri =
625
816
  grpc_sockaddr_to_uri(&addresses->addresses[i].address);
626
- gpr_log(GPR_DEBUG, "index %lu: Created subchannel %p for address uri %s",
627
- (unsigned long)subchannel_index, (void *)subchannel, address_uri);
817
+ gpr_log(
818
+ GPR_DEBUG,
819
+ "[RR %p] index %lu: Created subchannel %p for address uri %s into "
820
+ "subchannel_list %p",
821
+ (void *)p, (unsigned long)subchannel_index, (void *)subchannel,
822
+ address_uri, (void *)subchannel_list);
628
823
  gpr_free(address_uri);
629
824
  }
630
825
  grpc_channel_args_destroy(exec_ctx, new_args);
631
826
 
632
- if (subchannel != NULL) {
633
- subchannel_data *sd = &p->subchannels[subchannel_index];
634
- sd->policy = p;
635
- sd->subchannel = subchannel;
636
- /* use some sentinel value outside of the range of grpc_connectivity_state
637
- * to signal an undefined previous state. We won't be referring to this
638
- * value again and it'll be overwritten after the first call to
639
- * rr_connectivity_changed */
640
- sd->prev_connectivity_state = GRPC_CHANNEL_INIT;
641
- sd->curr_connectivity_state = GRPC_CHANNEL_IDLE;
642
- sd->user_data_vtable = addresses->user_data_vtable;
643
- if (sd->user_data_vtable != NULL) {
644
- sd->user_data =
645
- sd->user_data_vtable->copy(addresses->addresses[i].user_data);
646
- }
647
- grpc_closure_init(&sd->connectivity_changed_closure,
648
- rr_connectivity_changed_locked, sd,
649
- grpc_combiner_scheduler(args->combiner, false));
650
- ++subchannel_index;
827
+ subchannel_data *sd = &subchannel_list->subchannels[subchannel_index++];
828
+ sd->subchannel_list = subchannel_list;
829
+ sd->subchannel = subchannel;
830
+ GRPC_CLOSURE_INIT(&sd->connectivity_changed_closure,
831
+ rr_connectivity_changed_locked, sd,
832
+ grpc_combiner_scheduler(args->combiner));
833
+ /* use some sentinel value outside of the range of
834
+ * grpc_connectivity_state to signal an undefined previous state. We
835
+ * won't be referring to this value again and it'll be overwritten after
836
+ * the first call to rr_connectivity_changed_locked */
837
+ sd->prev_connectivity_state = GRPC_CHANNEL_INIT;
838
+ sd->curr_connectivity_state = GRPC_CHANNEL_IDLE;
839
+ sd->user_data_vtable = addresses->user_data_vtable;
840
+ if (sd->user_data_vtable != NULL) {
841
+ sd->user_data =
842
+ sd->user_data_vtable->copy(addresses->addresses[i].user_data);
843
+ }
844
+ if (p->started_picking) {
845
+ rr_subchannel_list_ref(sd->subchannel_list, "update_started_picking");
846
+ GRPC_LB_POLICY_WEAK_REF(&p->base, "rr_connectivity_update");
847
+ /* 2. Watch every new subchannel. A subchannel list becomes active the
848
+ * moment one of its subchannels is READY. At that moment, we swap
849
+ * p->subchannel_list for sd->subchannel_list, provided the subchannel
850
+ * list is still valid (ie, isn't shutting down) */
851
+ grpc_subchannel_notify_on_state_change(
852
+ exec_ctx, sd->subchannel, p->base.interested_parties,
853
+ &sd->pending_connectivity_state_unsafe,
854
+ &sd->connectivity_changed_closure);
651
855
  }
652
856
  }
653
- if (subchannel_index == 0) {
654
- /* couldn't create any subchannel. Bail out */
655
- gpr_free(p->subchannels);
656
- gpr_free(p);
657
- return NULL;
857
+ if (!p->started_picking) {
858
+ // The policy isn't picking yet. Save the update for later, disposing of
859
+ // previous version if any.
860
+ if (p->subchannel_list != NULL) {
861
+ rr_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
862
+ "rr_update_before_started_picking");
863
+ }
864
+ p->subchannel_list = subchannel_list;
865
+ p->latest_pending_subchannel_list = NULL;
658
866
  }
659
- p->num_subchannels = subchannel_index;
867
+ }
660
868
 
661
- // Initialize the last pick index to the last subchannel, so that the
662
- // first pick will start at the beginning of the list.
663
- p->last_ready_subchannel_index = subchannel_index - 1;
869
+ static const grpc_lb_policy_vtable round_robin_lb_policy_vtable = {
870
+ rr_destroy,
871
+ rr_shutdown_locked,
872
+ rr_pick_locked,
873
+ rr_cancel_pick_locked,
874
+ rr_cancel_picks_locked,
875
+ rr_ping_one_locked,
876
+ rr_exit_idle_locked,
877
+ rr_check_connectivity_locked,
878
+ rr_notify_on_state_change_locked,
879
+ rr_update_locked};
880
+
881
+ static void round_robin_factory_ref(grpc_lb_policy_factory *factory) {}
664
882
 
883
+ static void round_robin_factory_unref(grpc_lb_policy_factory *factory) {}
884
+
885
+ static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx,
886
+ grpc_lb_policy_factory *factory,
887
+ grpc_lb_policy_args *args) {
888
+ GPR_ASSERT(args->client_channel_factory != NULL);
889
+ round_robin_lb_policy *p = gpr_zalloc(sizeof(*p));
665
890
  grpc_lb_policy_init(&p->base, &round_robin_lb_policy_vtable, args->combiner);
666
891
  grpc_connectivity_state_init(&p->state_tracker, GRPC_CHANNEL_IDLE,
667
892
  "round_robin");
668
-
893
+ rr_update_locked(exec_ctx, &p->base, args);
669
894
  if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
670
- gpr_log(GPR_DEBUG, "Created RR policy at %p with %lu subchannels",
671
- (void *)p, (unsigned long)p->num_subchannels);
895
+ gpr_log(GPR_DEBUG, "[RR %p] Created with %lu subchannels", (void *)p,
896
+ (unsigned long)p->subchannel_list->num_subchannels);
672
897
  }
673
898
  return &p->base;
674
899
  }
@@ -688,7 +913,7 @@ static grpc_lb_policy_factory *round_robin_lb_factory_create() {
688
913
 
689
914
  void grpc_lb_policy_round_robin_init() {
690
915
  grpc_register_lb_policy(round_robin_lb_factory_create());
691
- grpc_register_tracer("round_robin", &grpc_lb_round_robin_trace);
916
+ grpc_register_tracer(&grpc_lb_round_robin_trace);
692
917
  }
693
918
 
694
919
  void grpc_lb_policy_round_robin_shutdown() {}