grpc 1.0.1 → 1.1.2

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 (705) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3696 -867
  3. data/etc/roots.pem +39 -111
  4. data/include/grpc/byte_buffer.h +64 -1
  5. data/include/grpc/census.h +40 -96
  6. data/include/grpc/compression.h +2 -1
  7. data/include/grpc/grpc.h +42 -7
  8. data/include/grpc/grpc_posix.h +8 -5
  9. data/include/grpc/impl/codegen/atm.h +3 -0
  10. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  11. data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
  12. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  13. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
  14. data/include/grpc/impl/codegen/compression_types.h +1 -1
  15. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  16. data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
  17. data/include/grpc/impl/codegen/gpr_slice.h +84 -0
  18. data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
  19. data/include/grpc/impl/codegen/grpc_types.h +91 -9
  20. data/include/grpc/impl/codegen/port_platform.h +25 -92
  21. data/include/grpc/impl/codegen/slice.h +54 -97
  22. data/include/grpc/impl/codegen/sync.h +0 -253
  23. data/include/grpc/module.modulemap +0 -2
  24. data/include/grpc/slice.h +132 -0
  25. data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
  26. data/include/grpc/support/alloc.h +40 -1
  27. data/include/grpc/support/log.h +80 -1
  28. data/include/grpc/support/log_windows.h +2 -0
  29. data/include/grpc/support/string_util.h +1 -1
  30. data/include/grpc/support/sync.h +252 -0
  31. data/include/grpc/support/time.h +67 -1
  32. data/src/boringssl/err_data.c +639 -627
  33. data/src/core/ext/census/base_resources.c +71 -0
  34. data/src/core/ext/census/base_resources.h +39 -0
  35. data/src/core/ext/census/gen/census.pb.c +26 -29
  36. data/src/core/ext/census/gen/census.pb.h +68 -67
  37. data/src/core/ext/census/gen/trace_context.pb.c +81 -0
  38. data/src/core/ext/census/gen/trace_context.pb.h +99 -0
  39. data/src/core/ext/census/grpc_filter.c +22 -16
  40. data/src/core/ext/census/grpc_plugin.c +2 -1
  41. data/src/core/ext/census/initialize.c +16 -4
  42. data/src/core/ext/census/mlog.h +1 -1
  43. data/src/core/ext/census/placeholders.c +0 -45
  44. data/src/core/ext/census/resource.c +312 -0
  45. data/src/core/ext/census/resource.h +63 -0
  46. data/src/core/ext/census/trace_context.c +86 -0
  47. data/src/core/ext/census/trace_context.h +68 -0
  48. data/src/core/ext/census/tracing.c +8 -2
  49. data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
  50. data/src/core/ext/client_channel/client_channel.c +1218 -0
  51. data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
  52. data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
  53. data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
  54. data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
  55. data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
  56. data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
  57. data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
  58. data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
  59. data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
  60. data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
  61. data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
  62. data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
  63. data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
  64. data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
  65. data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
  66. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
  67. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
  68. data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
  69. data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
  70. data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
  71. data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
  72. data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
  73. data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
  74. data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
  75. data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
  76. data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
  77. data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
  78. data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
  79. data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
  80. data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
  81. data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
  82. data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
  83. data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
  84. data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
  85. data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
  86. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
  87. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
  88. data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
  89. data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
  90. data/src/core/ext/load_reporting/load_reporting.c +7 -56
  91. data/src/core/ext/load_reporting/load_reporting.h +41 -28
  92. data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
  93. data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
  94. data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
  95. data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
  96. data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
  98. data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
  99. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
  100. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
  101. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
  102. data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
  104. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
  105. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
  106. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
  107. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
  108. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
  109. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
  110. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
  111. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
  112. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
  114. data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
  116. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
  118. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
  119. data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
  120. data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
  122. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
  123. data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
  124. data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
  125. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
  126. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
  128. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
  129. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
  130. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
  131. data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
  132. data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
  133. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
  134. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
  135. data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
  136. data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
  137. data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
  138. data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
  139. data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
  140. data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
  141. data/src/core/lib/channel/channel_args.c +70 -13
  142. data/src/core/lib/channel/channel_args.h +28 -2
  143. data/src/core/lib/channel/channel_stack.c +77 -28
  144. data/src/core/lib/channel/channel_stack.h +61 -23
  145. data/src/core/lib/channel/channel_stack_builder.c +33 -25
  146. data/src/core/lib/channel/channel_stack_builder.h +17 -8
  147. data/src/core/lib/channel/compress_filter.c +52 -36
  148. data/src/core/lib/channel/connected_channel.c +20 -12
  149. data/src/core/lib/channel/connected_channel.h +2 -1
  150. data/src/core/lib/channel/context.h +13 -1
  151. data/src/core/lib/channel/deadline_filter.c +344 -0
  152. data/src/core/lib/channel/deadline_filter.h +99 -0
  153. data/src/core/lib/channel/handshaker.c +240 -0
  154. data/src/core/lib/channel/handshaker.h +164 -0
  155. data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
  156. data/src/core/lib/channel/handshaker_factory.h +66 -0
  157. data/src/core/lib/channel/handshaker_registry.c +113 -0
  158. data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
  159. data/src/core/lib/channel/http_client_filter.c +248 -46
  160. data/src/core/lib/channel/http_client_filter.h +3 -0
  161. data/src/core/lib/channel/http_server_filter.c +136 -24
  162. data/src/core/lib/channel/message_size_filter.c +261 -0
  163. data/src/core/lib/channel/message_size_filter.h +39 -0
  164. data/src/core/lib/compression/message_compress.c +43 -37
  165. data/src/core/lib/compression/message_compress.h +7 -5
  166. data/src/core/lib/http/format_request.c +26 -11
  167. data/src/core/lib/http/format_request.h +7 -5
  168. data/src/core/lib/http/httpcli.c +45 -27
  169. data/src/core/lib/http/httpcli.h +4 -4
  170. data/src/core/lib/http/httpcli_security_connector.c +56 -46
  171. data/src/core/lib/http/parser.c +17 -14
  172. data/src/core/lib/http/parser.h +4 -2
  173. data/src/core/lib/iomgr/closure.c +49 -7
  174. data/src/core/lib/iomgr/closure.h +56 -14
  175. data/src/core/lib/iomgr/combiner.c +422 -0
  176. data/src/core/lib/iomgr/combiner.h +64 -0
  177. data/src/core/lib/iomgr/endpoint.c +8 -2
  178. data/src/core/lib/iomgr/endpoint.h +17 -7
  179. data/src/core/lib/iomgr/endpoint_pair.h +3 -2
  180. data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
  181. data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
  182. data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
  183. data/src/core/lib/iomgr/error.c +72 -6
  184. data/src/core/lib/iomgr/error.h +30 -3
  185. data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
  186. data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
  187. data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
  188. data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
  189. data/src/core/lib/iomgr/ev_posix.c +26 -5
  190. data/src/core/lib/iomgr/ev_posix.h +12 -1
  191. data/src/core/lib/iomgr/exec_ctx.c +27 -94
  192. data/src/core/lib/iomgr/exec_ctx.h +19 -22
  193. data/src/core/lib/iomgr/executor.c +29 -8
  194. data/src/core/lib/iomgr/executor.h +2 -4
  195. data/src/core/lib/iomgr/iocp_windows.c +3 -4
  196. data/src/core/lib/iomgr/iomgr.c +14 -10
  197. data/src/core/lib/iomgr/iomgr.h +6 -2
  198. data/src/core/lib/iomgr/iomgr_posix.c +2 -2
  199. data/src/core/lib/iomgr/iomgr_uv.c +49 -0
  200. data/src/core/lib/iomgr/iomgr_windows.c +2 -2
  201. data/src/core/lib/iomgr/load_file.c +3 -3
  202. data/src/core/lib/iomgr/load_file.h +2 -2
  203. data/src/core/lib/iomgr/network_status_tracker.c +1 -1
  204. data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
  205. data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
  206. data/src/core/lib/iomgr/pollset_uv.c +142 -0
  207. data/src/core/lib/iomgr/pollset_uv.h +42 -0
  208. data/src/core/lib/iomgr/pollset_windows.c +5 -6
  209. data/src/core/lib/iomgr/port.h +129 -0
  210. data/src/core/lib/iomgr/resolve_address.h +2 -1
  211. data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
  212. data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
  213. data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
  214. data/src/core/lib/iomgr/resource_quota.c +832 -0
  215. data/src/core/lib/iomgr/resource_quota.h +159 -0
  216. data/src/core/lib/iomgr/sockaddr.h +10 -2
  217. data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
  218. data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
  219. data/src/core/lib/iomgr/socket_mutator.c +98 -0
  220. data/src/core/lib/iomgr/socket_mutator.h +80 -0
  221. data/src/core/lib/iomgr/socket_utils.h +42 -0
  222. data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
  223. data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
  224. data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
  225. data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
  226. data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
  227. data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
  228. data/src/core/lib/iomgr/socket_windows.c +14 -6
  229. data/src/core/lib/iomgr/socket_windows.h +1 -0
  230. data/src/core/lib/iomgr/tcp_client.h +8 -2
  231. data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
  232. data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
  233. data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
  234. data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
  235. data/src/core/lib/iomgr/tcp_posix.c +135 -56
  236. data/src/core/lib/iomgr/tcp_posix.h +2 -2
  237. data/src/core/lib/iomgr/tcp_server.h +14 -6
  238. data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
  239. data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
  240. data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
  241. data/src/core/lib/iomgr/tcp_uv.c +367 -0
  242. data/src/core/lib/iomgr/tcp_uv.h +59 -0
  243. data/src/core/lib/iomgr/tcp_windows.c +65 -48
  244. data/src/core/lib/iomgr/tcp_windows.h +3 -1
  245. data/src/core/lib/iomgr/timer.h +21 -21
  246. data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
  247. data/src/core/lib/iomgr/timer_generic.h +49 -0
  248. data/src/core/lib/iomgr/timer_heap.c +6 -0
  249. data/src/core/lib/iomgr/timer_uv.c +99 -0
  250. data/src/core/lib/iomgr/timer_uv.h +47 -0
  251. data/src/core/lib/iomgr/udp_server.c +116 -98
  252. data/src/core/lib/iomgr/udp_server.h +5 -3
  253. data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
  254. data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
  256. data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
  257. data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
  258. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
  259. data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
  260. data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
  261. data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
  262. data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
  263. data/src/core/lib/iomgr/workqueue.h +12 -20
  264. data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
  265. data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
  266. data/src/core/lib/iomgr/workqueue_windows.c +9 -8
  267. data/src/core/lib/json/json.c +3 -3
  268. data/src/core/lib/json/json.h +11 -11
  269. data/src/core/lib/json/json_reader.c +9 -5
  270. data/src/core/lib/profiling/basic_timers.c +10 -1
  271. data/src/core/lib/profiling/timers.h +2 -0
  272. data/src/core/lib/security/context/security_context.c +13 -3
  273. data/src/core/lib/security/context/security_context.h +20 -0
  274. data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
  275. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  276. data/src/core/lib/security/credentials/credentials.c +48 -19
  277. data/src/core/lib/security/credentials/credentials.h +36 -19
  278. data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
  279. data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
  280. data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
  281. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
  282. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
  283. data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
  284. data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
  285. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  286. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
  287. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
  288. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
  289. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
  290. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
  291. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  292. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
  293. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
  294. data/src/core/lib/security/transport/client_auth_filter.c +33 -27
  295. data/src/core/lib/security/transport/secure_endpoint.c +93 -68
  296. data/src/core/lib/security/transport/secure_endpoint.h +2 -2
  297. data/src/core/lib/security/transport/security_connector.c +133 -168
  298. data/src/core/lib/security/transport/security_connector.h +31 -46
  299. data/src/core/lib/security/transport/security_handshaker.c +501 -0
  300. data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
  301. data/src/core/lib/security/transport/server_auth_filter.c +50 -38
  302. data/src/core/lib/security/util/b64.c +11 -8
  303. data/src/core/lib/security/util/b64.h +5 -4
  304. data/src/core/lib/slice/percent_encoding.c +182 -0
  305. data/src/core/lib/slice/percent_encoding.h +78 -0
  306. data/src/core/lib/{support → slice}/slice.c +81 -50
  307. data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
  308. data/src/core/lib/slice/slice_internal.h +49 -0
  309. data/src/core/lib/slice/slice_string_helpers.c +90 -0
  310. data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
  311. data/src/core/lib/support/backoff.c +24 -13
  312. data/src/core/lib/support/backoff.h +5 -2
  313. data/src/core/lib/support/env.h +0 -2
  314. data/src/core/lib/support/log.c +5 -4
  315. data/src/core/lib/support/log_linux.c +0 -1
  316. data/src/core/lib/support/log_posix.c +1 -1
  317. data/src/core/lib/support/mpscq.c +83 -0
  318. data/src/core/lib/support/mpscq.h +65 -0
  319. data/src/core/lib/support/string.c +58 -49
  320. data/src/core/lib/support/string.h +11 -8
  321. data/src/core/lib/support/subprocess_posix.c +5 -2
  322. data/src/core/lib/support/thd.c +1 -1
  323. data/src/core/lib/support/time.c +43 -79
  324. data/src/core/lib/support/time_posix.c +1 -1
  325. data/src/core/lib/support/tmpfile.h +0 -2
  326. data/src/core/lib/surface/alarm.c +4 -1
  327. data/src/core/lib/surface/byte_buffer.c +17 -11
  328. data/src/core/lib/surface/byte_buffer_reader.c +23 -15
  329. data/src/core/lib/surface/call.c +294 -276
  330. data/src/core/lib/surface/call.h +24 -9
  331. data/src/core/lib/surface/call_log_batch.c +5 -3
  332. data/src/core/lib/surface/channel.c +127 -111
  333. data/src/core/lib/surface/channel.h +14 -5
  334. data/src/core/lib/surface/channel_init.c +1 -1
  335. data/src/core/lib/surface/channel_init.h +10 -1
  336. data/src/core/lib/surface/channel_ping.c +7 -6
  337. data/src/core/lib/surface/completion_queue.c +154 -18
  338. data/src/core/lib/surface/completion_queue.h +5 -0
  339. data/src/core/lib/surface/init.c +40 -6
  340. data/src/core/lib/surface/init.h +1 -0
  341. data/src/core/lib/surface/init_secure.c +5 -2
  342. data/src/core/lib/surface/lame_client.c +28 -18
  343. data/src/core/lib/surface/server.c +134 -87
  344. data/src/core/lib/surface/server.h +8 -0
  345. data/src/core/lib/surface/validate_metadata.c +1 -1
  346. data/src/core/lib/surface/version.c +3 -1
  347. data/src/core/lib/transport/byte_stream.c +7 -4
  348. data/src/core/lib/transport/byte_stream.h +6 -10
  349. data/src/core/lib/transport/connectivity_state.c +21 -12
  350. data/src/core/lib/transport/connectivity_state.h +4 -1
  351. data/src/core/lib/transport/mdstr_hash_table.c +118 -0
  352. data/src/core/lib/transport/mdstr_hash_table.h +77 -0
  353. data/src/core/lib/transport/metadata.c +83 -60
  354. data/src/core/lib/transport/metadata.h +41 -23
  355. data/src/core/lib/transport/metadata_batch.c +17 -11
  356. data/src/core/lib/transport/metadata_batch.h +20 -6
  357. data/src/core/lib/transport/pid_controller.c +57 -0
  358. data/src/core/lib/transport/pid_controller.h +64 -0
  359. data/src/core/lib/transport/service_config.c +251 -0
  360. data/src/core/lib/transport/service_config.h +71 -0
  361. data/src/core/lib/transport/static_metadata.c +18 -16
  362. data/src/core/lib/transport/static_metadata.h +113 -107
  363. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
  364. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
  365. data/src/core/lib/transport/transport.c +84 -23
  366. data/src/core/lib/transport/transport.h +53 -8
  367. data/src/core/lib/transport/transport_impl.h +3 -0
  368. data/src/core/lib/transport/transport_op_string.c +92 -20
  369. data/src/core/lib/tsi/ssl_transport_security.c +3 -1
  370. data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
  371. data/src/ruby/ext/grpc/extconf.rb +0 -1
  372. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
  373. data/src/ruby/ext/grpc/rb_call.c +15 -5
  374. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  375. data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
  376. data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
  377. data/src/ruby/ext/grpc/rb_grpc.c +3 -1
  378. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
  379. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
  380. data/src/ruby/ext/grpc/rb_server.c +18 -12
  381. data/src/ruby/lib/grpc/errors.rb +154 -2
  382. data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
  383. data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
  384. data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
  385. data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
  386. data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
  387. data/src/ruby/lib/grpc/generic/service.rb +3 -2
  388. data/src/ruby/lib/grpc/version.rb +1 -1
  389. data/src/ruby/pb/grpc/health/checker.rb +3 -1
  390. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
  391. data/src/ruby/pb/test/client.rb +307 -7
  392. data/src/ruby/pb/test/server.rb +26 -1
  393. data/src/ruby/spec/compression_options_spec.rb +164 -0
  394. data/src/ruby/spec/error_sanity_spec.rb +64 -0
  395. data/src/ruby/spec/generic/active_call_spec.rb +290 -12
  396. data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
  397. data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
  398. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
  399. data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
  400. data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
  401. data/src/ruby/spec/spec_helper.rb +2 -0
  402. data/third_party/boringssl/crypto/aes/aes.c +12 -12
  403. data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
  404. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
  405. data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
  406. data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
  407. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  408. data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
  409. data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
  410. data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
  411. data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
  412. data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
  413. data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
  414. data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
  415. data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
  416. data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
  417. data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
  418. data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
  419. data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
  420. data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
  421. data/third_party/boringssl/crypto/base64/base64.c +249 -285
  422. data/third_party/boringssl/crypto/bio/bio.c +13 -23
  423. data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
  424. data/third_party/boringssl/crypto/bio/connect.c +12 -3
  425. data/third_party/boringssl/crypto/bio/fd.c +22 -15
  426. data/third_party/boringssl/crypto/bio/file.c +2 -38
  427. data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
  428. data/third_party/boringssl/crypto/bio/internal.h +3 -0
  429. data/third_party/boringssl/crypto/bio/pair.c +1 -1
  430. data/third_party/boringssl/crypto/bio/socket.c +10 -2
  431. data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
  432. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
  433. data/third_party/boringssl/crypto/bn/bn.c +38 -0
  434. data/third_party/boringssl/crypto/bn/cmp.c +25 -0
  435. data/third_party/boringssl/crypto/bn/convert.c +73 -76
  436. data/third_party/boringssl/crypto/bn/div.c +136 -70
  437. data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
  438. data/third_party/boringssl/crypto/bn/gcd.c +213 -296
  439. data/third_party/boringssl/crypto/bn/generic.c +0 -80
  440. data/third_party/boringssl/crypto/bn/internal.h +15 -3
  441. data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
  442. data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
  443. data/third_party/boringssl/crypto/bn/mul.c +2 -1
  444. data/third_party/boringssl/crypto/bn/prime.c +24 -8
  445. data/third_party/boringssl/crypto/bn/random.c +47 -33
  446. data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
  447. data/third_party/boringssl/crypto/buf/buf.c +25 -21
  448. data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
  449. data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
  450. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
  451. data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
  452. data/third_party/boringssl/crypto/cipher/aead.c +11 -22
  453. data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
  454. data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
  455. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
  456. data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
  457. data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
  458. data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
  459. data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
  460. data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
  461. data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
  462. data/third_party/boringssl/crypto/cipher/internal.h +8 -10
  463. data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
  464. data/third_party/boringssl/crypto/conf/conf.c +2 -1
  465. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
  466. data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
  467. data/third_party/boringssl/crypto/cpu-arm.c +0 -161
  468. data/third_party/boringssl/crypto/cpu-intel.c +5 -3
  469. data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
  470. data/third_party/boringssl/crypto/crypto.c +29 -7
  471. data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
  472. data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
  473. data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
  474. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
  475. data/third_party/boringssl/crypto/dh/check.c +22 -6
  476. data/third_party/boringssl/crypto/dh/dh.c +45 -21
  477. data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
  478. data/third_party/boringssl/crypto/dh/params.c +30 -78
  479. data/third_party/boringssl/crypto/digest/digest.c +3 -3
  480. data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
  481. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
  482. data/third_party/boringssl/crypto/ec/ec.c +84 -140
  483. data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
  484. data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
  485. data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
  486. data/third_party/boringssl/crypto/ec/internal.h +12 -36
  487. data/third_party/boringssl/crypto/ec/oct.c +11 -11
  488. data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
  489. data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
  490. data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
  491. data/third_party/boringssl/crypto/ec/simple.c +81 -201
  492. data/third_party/boringssl/crypto/ec/util-64.c +0 -74
  493. data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
  494. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
  495. data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
  496. data/third_party/boringssl/crypto/engine/engine.c +1 -1
  497. data/third_party/boringssl/crypto/err/err.c +3 -3
  498. data/third_party/boringssl/crypto/evp/evp.c +14 -59
  499. data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
  500. data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
  501. data/third_party/boringssl/crypto/evp/internal.h +4 -46
  502. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
  503. data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
  504. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
  505. data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
  506. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
  507. data/third_party/boringssl/crypto/evp/print.c +520 -0
  508. data/third_party/boringssl/crypto/ex_data.c +4 -6
  509. data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
  510. data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
  511. data/third_party/boringssl/crypto/internal.h +57 -77
  512. data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
  513. data/third_party/boringssl/crypto/md4/md4.c +9 -0
  514. data/third_party/boringssl/crypto/mem.c +19 -19
  515. data/third_party/boringssl/crypto/modes/cfb.c +5 -6
  516. data/third_party/boringssl/crypto/modes/ctr.c +10 -18
  517. data/third_party/boringssl/crypto/modes/gcm.c +100 -66
  518. data/third_party/boringssl/crypto/modes/internal.h +15 -27
  519. data/third_party/boringssl/crypto/modes/ofb.c +9 -22
  520. data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
  521. data/third_party/boringssl/crypto/newhope/internal.h +71 -0
  522. data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
  523. data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
  524. data/third_party/boringssl/crypto/newhope/poly.c +183 -0
  525. data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
  526. data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
  527. data/third_party/boringssl/crypto/obj/obj.c +111 -135
  528. data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
  529. data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
  530. data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
  531. data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
  532. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
  533. data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
  534. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
  535. data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
  536. data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
  537. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
  538. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
  539. data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
  540. data/third_party/boringssl/crypto/rand/rand.c +4 -1
  541. data/third_party/boringssl/crypto/rand/urandom.c +5 -7
  542. data/third_party/boringssl/crypto/rand/windows.c +5 -8
  543. data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
  544. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  545. data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
  546. data/third_party/boringssl/crypto/rsa/internal.h +5 -13
  547. data/third_party/boringssl/crypto/rsa/padding.c +64 -63
  548. data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
  549. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
  550. data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
  551. data/third_party/boringssl/crypto/sha/sha256.c +2 -2
  552. data/third_party/boringssl/crypto/sha/sha512.c +7 -7
  553. data/third_party/boringssl/crypto/stack/stack.c +13 -22
  554. data/third_party/boringssl/crypto/thread.c +21 -12
  555. data/third_party/boringssl/crypto/thread_none.c +6 -2
  556. data/third_party/boringssl/crypto/thread_pthread.c +16 -7
  557. data/third_party/boringssl/crypto/thread_win.c +38 -85
  558. data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
  559. data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
  560. data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
  561. data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
  562. data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
  563. data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
  564. data/third_party/boringssl/crypto/x509/internal.h +66 -0
  565. data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
  566. data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
  567. data/third_party/boringssl/crypto/x509/x509.c +5 -0
  568. data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
  569. data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
  570. data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
  571. data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
  572. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  573. data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
  574. data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
  575. data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
  576. data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
  577. data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
  578. data/third_party/boringssl/crypto/x509/x_name.c +14 -17
  579. data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
  580. data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
  581. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
  582. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
  583. data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
  584. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
  585. data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
  586. data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
  587. data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
  588. data/third_party/boringssl/include/openssl/aead.h +72 -73
  589. data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
  590. data/third_party/boringssl/include/openssl/asn1.h +103 -235
  591. data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
  592. data/third_party/boringssl/include/openssl/asn1t.h +1 -11
  593. data/third_party/boringssl/include/openssl/base.h +145 -3
  594. data/third_party/boringssl/include/openssl/base64.h +20 -17
  595. data/third_party/boringssl/include/openssl/bio.h +59 -34
  596. data/third_party/boringssl/include/openssl/bn.h +118 -51
  597. data/third_party/boringssl/include/openssl/buf.h +15 -0
  598. data/third_party/boringssl/include/openssl/bytestring.h +52 -4
  599. data/third_party/boringssl/include/openssl/chacha.h +2 -2
  600. data/third_party/boringssl/include/openssl/cipher.h +18 -1
  601. data/third_party/boringssl/include/openssl/cmac.h +11 -0
  602. data/third_party/boringssl/include/openssl/conf.h +13 -2
  603. data/third_party/boringssl/include/openssl/cpu.h +20 -23
  604. data/third_party/boringssl/include/openssl/crypto.h +22 -1
  605. data/third_party/boringssl/include/openssl/curve25519.h +96 -4
  606. data/third_party/boringssl/include/openssl/dh.h +71 -16
  607. data/third_party/boringssl/include/openssl/digest.h +38 -11
  608. data/third_party/boringssl/include/openssl/dsa.h +40 -4
  609. data/third_party/boringssl/include/openssl/ec.h +44 -18
  610. data/third_party/boringssl/include/openssl/ec_key.h +27 -6
  611. data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
  612. data/third_party/boringssl/include/openssl/engine.h +11 -0
  613. data/third_party/boringssl/include/openssl/evp.h +52 -88
  614. data/third_party/boringssl/include/openssl/hkdf.h +24 -4
  615. data/third_party/boringssl/include/openssl/hmac.h +20 -6
  616. data/third_party/boringssl/include/openssl/md4.h +4 -0
  617. data/third_party/boringssl/include/openssl/mem.h +19 -0
  618. data/third_party/boringssl/include/openssl/newhope.h +158 -0
  619. data/third_party/boringssl/include/openssl/nid.h +4166 -0
  620. data/third_party/boringssl/include/openssl/obj.h +31 -3
  621. data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
  622. data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
  623. data/third_party/boringssl/include/openssl/pem.h +5 -0
  624. data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
  625. data/third_party/boringssl/include/openssl/rand.h +6 -0
  626. data/third_party/boringssl/include/openssl/rc4.h +6 -0
  627. data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
  628. data/third_party/boringssl/include/openssl/rsa.h +127 -65
  629. data/third_party/boringssl/include/openssl/sha.h +14 -10
  630. data/third_party/boringssl/include/openssl/ssl.h +561 -275
  631. data/third_party/boringssl/include/openssl/ssl3.h +18 -25
  632. data/third_party/boringssl/include/openssl/stack.h +2 -4
  633. data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
  634. data/third_party/boringssl/include/openssl/thread.h +31 -13
  635. data/third_party/boringssl/include/openssl/time_support.h +1 -0
  636. data/third_party/boringssl/include/openssl/tls1.h +37 -33
  637. data/third_party/boringssl/include/openssl/x509.h +69 -26
  638. data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
  639. data/third_party/boringssl/include/openssl/x509v3.h +23 -2
  640. data/third_party/boringssl/ssl/custom_extensions.c +3 -5
  641. data/third_party/boringssl/ssl/d1_both.c +463 -499
  642. data/third_party/boringssl/ssl/d1_lib.c +38 -109
  643. data/third_party/boringssl/ssl/d1_pkt.c +173 -334
  644. data/third_party/boringssl/ssl/d1_srtp.c +20 -18
  645. data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
  646. data/third_party/boringssl/ssl/dtls_record.c +27 -26
  647. data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
  648. data/third_party/boringssl/ssl/handshake_server.c +1932 -0
  649. data/third_party/boringssl/ssl/internal.h +712 -439
  650. data/third_party/boringssl/ssl/s3_both.c +445 -257
  651. data/third_party/boringssl/ssl/s3_enc.c +53 -36
  652. data/third_party/boringssl/ssl/s3_lib.c +23 -268
  653. data/third_party/boringssl/ssl/s3_pkt.c +168 -364
  654. data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
  655. data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
  656. data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
  657. data/third_party/boringssl/ssl/ssl_cert.c +324 -49
  658. data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
  659. data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
  660. data/third_party/boringssl/ssl/ssl_file.c +21 -68
  661. data/third_party/boringssl/ssl/ssl_lib.c +881 -510
  662. data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
  663. data/third_party/boringssl/ssl/ssl_session.c +324 -103
  664. data/third_party/boringssl/ssl/ssl_stat.c +6 -88
  665. data/third_party/boringssl/ssl/t1_enc.c +23 -39
  666. data/third_party/boringssl/ssl/t1_lib.c +1120 -622
  667. data/third_party/boringssl/ssl/tls13_both.c +440 -0
  668. data/third_party/boringssl/ssl/tls13_client.c +682 -0
  669. data/third_party/boringssl/ssl/tls13_enc.c +391 -0
  670. data/third_party/boringssl/ssl/tls13_server.c +672 -0
  671. data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
  672. data/third_party/boringssl/ssl/tls_record.c +159 -77
  673. data/third_party/nanopb/pb.h +60 -28
  674. data/third_party/nanopb/pb_decode.c +120 -92
  675. data/third_party/nanopb/pb_decode.h +3 -3
  676. data/third_party/nanopb/pb_encode.c +73 -67
  677. data/third_party/nanopb/pb_encode.h +4 -4
  678. metadata +155 -89
  679. data/include/grpc/impl/codegen/byte_buffer.h +0 -122
  680. data/include/grpc/impl/codegen/log.h +0 -118
  681. data/include/grpc/impl/codegen/time.h +0 -130
  682. data/src/core/ext/client_config/client_channel.c +0 -593
  683. data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
  684. data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
  685. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
  686. data/src/core/lib/iomgr/workqueue_posix.c +0 -151
  687. data/src/core/lib/security/transport/handshake.c +0 -368
  688. data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
  689. data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
  690. data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
  691. data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
  692. data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
  693. data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
  694. data/third_party/boringssl/crypto/directory.h +0 -66
  695. data/third_party/boringssl/crypto/directory_posix.c +0 -108
  696. data/third_party/boringssl/crypto/directory_win.c +0 -144
  697. data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
  698. data/third_party/boringssl/include/openssl/pqueue.h +0 -146
  699. data/third_party/boringssl/ssl/d1_clnt.c +0 -561
  700. data/third_party/boringssl/ssl/d1_srvr.c +0 -476
  701. data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
  702. data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
  703. data/third_party/boringssl/ssl/test/async_bio.h +0 -45
  704. data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
  705. data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -34,12 +34,15 @@
34
34
  #include <string.h>
35
35
 
36
36
  #include <grpc/support/alloc.h>
37
- #include "src/core/ext/client_config/lb_policy_registry.h"
37
+
38
+ #include "src/core/ext/client_channel/lb_policy_registry.h"
39
+ #include "src/core/ext/client_channel/subchannel.h"
40
+ #include "src/core/lib/channel/channel_args.h"
41
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
38
42
  #include "src/core/lib/transport/connectivity_state.h"
39
43
 
40
44
  typedef struct pending_pick {
41
45
  struct pending_pick *next;
42
- grpc_polling_entity *pollent;
43
46
  uint32_t initial_metadata_flags;
44
47
  grpc_connected_subchannel **target;
45
48
  grpc_closure *on_complete;
@@ -119,16 +122,15 @@ static void pf_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
119
122
  while (pp != NULL) {
120
123
  pending_pick *next = pp->next;
121
124
  *pp->target = NULL;
122
- grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
123
- p->base.interested_parties);
124
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE, NULL);
125
+ grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
125
126
  gpr_free(pp);
126
127
  pp = next;
127
128
  }
128
129
  }
129
130
 
130
131
  static void pf_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
131
- grpc_connected_subchannel **target) {
132
+ grpc_connected_subchannel **target,
133
+ grpc_error *error) {
132
134
  pick_first_lb_policy *p = (pick_first_lb_policy *)pol;
133
135
  pending_pick *pp;
134
136
  gpr_mu_lock(&p->mu);
@@ -137,11 +139,10 @@ static void pf_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
137
139
  while (pp != NULL) {
138
140
  pending_pick *next = pp->next;
139
141
  if (pp->target == target) {
140
- grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
141
- p->base.interested_parties);
142
142
  *target = NULL;
143
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete,
144
- GRPC_ERROR_CREATE("Pick Cancelled"), NULL);
143
+ grpc_closure_sched(
144
+ exec_ctx, pp->on_complete,
145
+ GRPC_ERROR_CREATE_REFERENCING("Pick Cancelled", &error, 1));
145
146
  gpr_free(pp);
146
147
  } else {
147
148
  pp->next = p->pending_picks;
@@ -150,11 +151,13 @@ static void pf_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
150
151
  pp = next;
151
152
  }
152
153
  gpr_mu_unlock(&p->mu);
154
+ GRPC_ERROR_UNREF(error);
153
155
  }
154
156
 
155
157
  static void pf_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
156
158
  uint32_t initial_metadata_flags_mask,
157
- uint32_t initial_metadata_flags_eq) {
159
+ uint32_t initial_metadata_flags_eq,
160
+ grpc_error *error) {
158
161
  pick_first_lb_policy *p = (pick_first_lb_policy *)pol;
159
162
  pending_pick *pp;
160
163
  gpr_mu_lock(&p->mu);
@@ -164,10 +167,9 @@ static void pf_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
164
167
  pending_pick *next = pp->next;
165
168
  if ((pp->initial_metadata_flags & initial_metadata_flags_mask) ==
166
169
  initial_metadata_flags_eq) {
167
- grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
168
- p->base.interested_parties);
169
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete,
170
- GRPC_ERROR_CREATE("Pick Cancelled"), NULL);
170
+ grpc_closure_sched(
171
+ exec_ctx, pp->on_complete,
172
+ GRPC_ERROR_CREATE_REFERENCING("Pick Cancelled", &error, 1));
171
173
  gpr_free(pp);
172
174
  } else {
173
175
  pp->next = p->pending_picks;
@@ -176,6 +178,7 @@ static void pf_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
176
178
  pp = next;
177
179
  }
178
180
  gpr_mu_unlock(&p->mu);
181
+ GRPC_ERROR_UNREF(error);
179
182
  }
180
183
 
181
184
  static void start_picking(grpc_exec_ctx *exec_ctx, pick_first_lb_policy *p) {
@@ -199,10 +202,8 @@ static void pf_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
199
202
  }
200
203
 
201
204
  static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
202
- grpc_polling_entity *pollent,
203
- grpc_metadata_batch *initial_metadata,
204
- uint32_t initial_metadata_flags,
205
- grpc_connected_subchannel **target,
205
+ const grpc_lb_policy_pick_args *pick_args,
206
+ grpc_connected_subchannel **target, void **user_data,
206
207
  grpc_closure *on_complete) {
207
208
  pick_first_lb_policy *p = (pick_first_lb_policy *)pol;
208
209
  pending_pick *pp;
@@ -210,7 +211,7 @@ static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
210
211
  /* Check atomically for a selected channel */
211
212
  grpc_connected_subchannel *selected = GET_SELECTED(p);
212
213
  if (selected != NULL) {
213
- *target = selected;
214
+ *target = GRPC_CONNECTED_SUBCHANNEL_REF(selected, "picked");
214
215
  return 1;
215
216
  }
216
217
 
@@ -219,19 +220,16 @@ static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
219
220
  selected = GET_SELECTED(p);
220
221
  if (selected) {
221
222
  gpr_mu_unlock(&p->mu);
222
- *target = selected;
223
+ *target = GRPC_CONNECTED_SUBCHANNEL_REF(selected, "picked");
223
224
  return 1;
224
225
  } else {
225
226
  if (!p->started_picking) {
226
227
  start_picking(exec_ctx, p);
227
228
  }
228
- grpc_polling_entity_add_to_pollset_set(exec_ctx, pollent,
229
- p->base.interested_parties);
230
229
  pp = gpr_malloc(sizeof(*pp));
231
230
  pp->next = p->pending_picks;
232
- pp->pollent = pollent;
233
231
  pp->target = target;
234
- pp->initial_metadata_flags = initial_metadata_flags;
232
+ pp->initial_metadata_flags = pick_args->initial_metadata_flags;
235
233
  pp->on_complete = on_complete;
236
234
  p->pending_picks = pp;
237
235
  gpr_mu_unlock(&p->mu);
@@ -296,6 +294,8 @@ static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
296
294
  } else {
297
295
  loop:
298
296
  switch (p->checking_connectivity) {
297
+ case GRPC_CHANNEL_INIT:
298
+ GPR_UNREACHABLE_CODE(return );
299
299
  case GRPC_CHANNEL_READY:
300
300
  grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
301
301
  GRPC_CHANNEL_READY, GRPC_ERROR_NONE,
@@ -308,16 +308,15 @@ static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
308
308
  /* drop the pick list: we are connected now */
309
309
  GRPC_LB_POLICY_WEAK_REF(&p->base, "destroy_subchannels");
310
310
  gpr_atm_rel_store(&p->selected, (gpr_atm)selected);
311
- grpc_exec_ctx_sched(exec_ctx,
312
- grpc_closure_create(destroy_subchannels, p),
313
- GRPC_ERROR_NONE, NULL);
311
+ grpc_closure_sched(exec_ctx,
312
+ grpc_closure_create(destroy_subchannels, p,
313
+ grpc_schedule_on_exec_ctx),
314
+ GRPC_ERROR_NONE);
314
315
  /* update any calls that were waiting for a pick */
315
316
  while ((pp = p->pending_picks)) {
316
317
  p->pending_picks = pp->next;
317
- *pp->target = selected;
318
- grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
319
- p->base.interested_parties);
320
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE, NULL);
318
+ *pp->target = GRPC_CONNECTED_SUBCHANNEL_REF(selected, "picked");
319
+ grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
321
320
  gpr_free(pp);
322
321
  }
323
322
  grpc_connected_subchannel_notify_on_state_change(
@@ -370,8 +369,7 @@ static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
370
369
  while ((pp = p->pending_picks)) {
371
370
  p->pending_picks = pp->next;
372
371
  *pp->target = NULL;
373
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE,
374
- NULL);
372
+ grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
375
373
  gpr_free(pp);
376
374
  }
377
375
  GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base,
@@ -423,8 +421,7 @@ static void pf_ping_one(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
423
421
  if (selected) {
424
422
  grpc_connected_subchannel_ping(exec_ctx, selected, closure);
425
423
  } else {
426
- grpc_exec_ctx_sched(exec_ctx, closure, GRPC_ERROR_CREATE("Not connected"),
427
- NULL);
424
+ grpc_closure_sched(exec_ctx, closure, GRPC_ERROR_CREATE("Not connected"));
428
425
  }
429
426
  }
430
427
 
@@ -440,26 +437,46 @@ static void pick_first_factory_unref(grpc_lb_policy_factory *factory) {}
440
437
  static grpc_lb_policy *create_pick_first(grpc_exec_ctx *exec_ctx,
441
438
  grpc_lb_policy_factory *factory,
442
439
  grpc_lb_policy_args *args) {
443
- GPR_ASSERT(args->addresses != NULL);
444
440
  GPR_ASSERT(args->client_channel_factory != NULL);
445
441
 
446
- if (args->addresses->naddrs == 0) return NULL;
442
+ /* Find the number of backend addresses. We ignore balancer
443
+ * addresses, since we don't know how to handle them. */
444
+ const grpc_arg *arg =
445
+ grpc_channel_args_find(args->args, GRPC_ARG_LB_ADDRESSES);
446
+ GPR_ASSERT(arg != NULL && arg->type == GRPC_ARG_POINTER);
447
+ grpc_lb_addresses *addresses = arg->value.pointer.p;
448
+ size_t num_addrs = 0;
449
+ for (size_t i = 0; i < addresses->num_addresses; i++) {
450
+ if (!addresses->addresses[i].is_balancer) ++num_addrs;
451
+ }
452
+ if (num_addrs == 0) return NULL;
447
453
 
448
454
  pick_first_lb_policy *p = gpr_malloc(sizeof(*p));
449
455
  memset(p, 0, sizeof(*p));
450
456
 
451
- p->subchannels =
452
- gpr_malloc(sizeof(grpc_subchannel *) * args->addresses->naddrs);
453
- memset(p->subchannels, 0, sizeof(*p->subchannels) * args->addresses->naddrs);
457
+ p->subchannels = gpr_malloc(sizeof(grpc_subchannel *) * num_addrs);
458
+ memset(p->subchannels, 0, sizeof(*p->subchannels) * num_addrs);
454
459
  grpc_subchannel_args sc_args;
455
460
  size_t subchannel_idx = 0;
456
- for (size_t i = 0; i < args->addresses->naddrs; i++) {
457
- memset(&sc_args, 0, sizeof(grpc_subchannel_args));
458
- sc_args.addr = (struct sockaddr *)(args->addresses->addrs[i].addr);
459
- sc_args.addr_len = (size_t)args->addresses->addrs[i].len;
461
+ for (size_t i = 0; i < addresses->num_addresses; i++) {
462
+ /* Skip balancer addresses, since we only know how to handle backends. */
463
+ if (addresses->addresses[i].is_balancer) continue;
464
+
465
+ if (addresses->addresses[i].user_data != NULL) {
466
+ gpr_log(GPR_ERROR,
467
+ "This LB policy doesn't support user data. It will be ignored");
468
+ }
460
469
 
470
+ memset(&sc_args, 0, sizeof(grpc_subchannel_args));
471
+ grpc_arg addr_arg =
472
+ grpc_create_subchannel_address_arg(&addresses->addresses[i].address);
473
+ grpc_channel_args *new_args =
474
+ grpc_channel_args_copy_and_add(args->args, &addr_arg, 1);
475
+ gpr_free(addr_arg.value.string);
476
+ sc_args.args = new_args;
461
477
  grpc_subchannel *subchannel = grpc_client_channel_factory_create_subchannel(
462
478
  exec_ctx, args->client_channel_factory, &sc_args);
479
+ grpc_channel_args_destroy(exec_ctx, new_args);
463
480
 
464
481
  if (subchannel != NULL) {
465
482
  p->subchannels[subchannel_idx++] = subchannel;
@@ -473,7 +490,8 @@ static grpc_lb_policy *create_pick_first(grpc_exec_ctx *exec_ctx,
473
490
  p->num_subchannels = subchannel_idx;
474
491
 
475
492
  grpc_lb_policy_init(&p->base, &pick_first_lb_policy_vtable);
476
- grpc_closure_init(&p->connectivity_changed, pf_connectivity_changed, p);
493
+ grpc_closure_init(&p->connectivity_changed, pf_connectivity_changed, p,
494
+ grpc_schedule_on_exec_ctx);
477
495
  gpr_mu_init(&p->mu);
478
496
  return &p->base;
479
497
  }
@@ -63,9 +63,13 @@
63
63
 
64
64
  #include <grpc/support/alloc.h>
65
65
 
66
- #include "src/core/ext/client_config/lb_policy_registry.h"
66
+ #include "src/core/ext/client_channel/lb_policy_registry.h"
67
+ #include "src/core/ext/client_channel/subchannel.h"
68
+ #include "src/core/lib/channel/channel_args.h"
67
69
  #include "src/core/lib/debug/trace.h"
70
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
68
71
  #include "src/core/lib/transport/connectivity_state.h"
72
+ #include "src/core/lib/transport/static_metadata.h"
69
73
 
70
74
  typedef struct round_robin_lb_policy round_robin_lb_policy;
71
75
 
@@ -76,15 +80,29 @@ int grpc_lb_round_robin_trace = 0;
76
80
  * Once a pick is available, \a target is updated and \a on_complete called. */
77
81
  typedef struct pending_pick {
78
82
  struct pending_pick *next;
79
- grpc_polling_entity *pollent;
83
+
84
+ /* output argument where to store the pick()ed user_data. It'll be NULL if no
85
+ * such data is present or there's an error (the definite test for errors is
86
+ * \a target being NULL). */
87
+ void **user_data;
88
+
89
+ /* bitmask passed to pick() and used for selective cancelling. See
90
+ * grpc_lb_policy_cancel_picks() */
80
91
  uint32_t initial_metadata_flags;
92
+
93
+ /* output argument where to store the pick()ed connected subchannel, or NULL
94
+ * upon error. */
81
95
  grpc_connected_subchannel **target;
96
+
97
+ /* to be invoked once the pick() has completed (regardless of success) */
82
98
  grpc_closure *on_complete;
83
99
  } pending_pick;
84
100
 
85
101
  /** List of subchannels in a connectivity READY state */
86
102
  typedef struct ready_list {
87
103
  grpc_subchannel *subchannel;
104
+ /* references namesake entry in subchannel_data */
105
+ void *user_data;
88
106
  struct ready_list *next;
89
107
  struct ready_list *prev;
90
108
  } ready_list;
@@ -100,20 +118,36 @@ typedef struct {
100
118
  grpc_closure connectivity_changed_closure;
101
119
  /** this subchannels current position in subchannel->ready_list */
102
120
  ready_list *ready_list_node;
103
- /** last observed connectivity */
104
- grpc_connectivity_state connectivity_state;
121
+ /** last observed connectivity. Not updated by
122
+ * \a grpc_subchannel_notify_on_state_change. Used to determine the previous
123
+ * state while processing the new state in \a rr_connectivity_changed */
124
+ grpc_connectivity_state prev_connectivity_state;
125
+ /** current connectivity state. Updated by \a
126
+ * grpc_subchannel_notify_on_state_change */
127
+ grpc_connectivity_state curr_connectivity_state;
128
+ /** the subchannel's target user data */
129
+ void *user_data;
130
+ /** vtable to operate over \a user_data */
131
+ const grpc_lb_user_data_vtable *user_data_vtable;
105
132
  } subchannel_data;
106
133
 
107
134
  struct round_robin_lb_policy {
108
135
  /** base policy: must be first */
109
136
  grpc_lb_policy base;
137
+ gpr_mu mu;
138
+
139
+ /** total number of addresses received at creation time */
140
+ size_t num_addresses;
110
141
 
111
142
  /** all our subchannels */
112
143
  size_t num_subchannels;
113
144
  subchannel_data **subchannels;
114
145
 
115
- /** mutex protecting remaining members */
116
- gpr_mu mu;
146
+ /** how many subchannels are in TRANSIENT_FAILURE */
147
+ size_t num_transient_failures;
148
+ /** how many subchannels are IDLE */
149
+ size_t num_idle;
150
+
117
151
  /** have we started picking? */
118
152
  int started_picking;
119
153
  /** are we shutting down? */
@@ -165,17 +199,24 @@ static void advance_last_picked_locked(round_robin_lb_policy *p) {
165
199
  }
166
200
 
167
201
  if (grpc_lb_round_robin_trace) {
168
- gpr_log(GPR_DEBUG, "[READYLIST] ADVANCED LAST PICK. NOW AT NODE %p (SC %p)",
169
- p->ready_list_last_pick, p->ready_list_last_pick->subchannel);
202
+ gpr_log(GPR_DEBUG,
203
+ "[READYLIST, RR: %p] ADVANCED LAST PICK. NOW AT NODE %p (SC %p, "
204
+ "CSC %p)",
205
+ (void *)p, (void *)p->ready_list_last_pick,
206
+ (void *)p->ready_list_last_pick->subchannel,
207
+ (void *)grpc_subchannel_get_connected_subchannel(
208
+ p->ready_list_last_pick->subchannel));
170
209
  }
171
210
  }
172
211
 
173
212
  /** Prepends (relative to the root at p->ready_list) the connected subchannel \a
174
213
  * csc to the list of ready subchannels. */
175
214
  static ready_list *add_connected_sc_locked(round_robin_lb_policy *p,
176
- grpc_subchannel *sc) {
215
+ subchannel_data *sd) {
177
216
  ready_list *new_elem = gpr_malloc(sizeof(ready_list));
178
- new_elem->subchannel = sc;
217
+ memset(new_elem, 0, sizeof(ready_list));
218
+ new_elem->subchannel = sd->subchannel;
219
+ new_elem->user_data = sd->user_data;
179
220
  if (p->ready_list.prev == NULL) {
180
221
  /* first element */
181
222
  new_elem->next = &p->ready_list;
@@ -189,7 +230,8 @@ static ready_list *add_connected_sc_locked(round_robin_lb_policy *p,
189
230
  p->ready_list.prev = new_elem;
190
231
  }
191
232
  if (grpc_lb_round_robin_trace) {
192
- gpr_log(GPR_DEBUG, "[READYLIST] ADDING NODE %p (SC %p)", new_elem, sc);
233
+ gpr_log(GPR_DEBUG, "[READYLIST] ADDING NODE %p (Conn. SC %p)",
234
+ (void *)new_elem, (void *)sd->subchannel);
193
235
  }
194
236
  return new_elem;
195
237
  }
@@ -216,8 +258,8 @@ static void remove_disconnected_sc_locked(round_robin_lb_policy *p,
216
258
  }
217
259
 
218
260
  if (grpc_lb_round_robin_trace) {
219
- gpr_log(GPR_DEBUG, "[READYLIST] REMOVED NODE %p (SC %p)", node,
220
- node->subchannel);
261
+ gpr_log(GPR_DEBUG, "[READYLIST] REMOVED NODE %p (SC %p)", (void *)node,
262
+ (void *)node->subchannel);
221
263
  }
222
264
 
223
265
  node->next = NULL;
@@ -227,13 +269,25 @@ static void remove_disconnected_sc_locked(round_robin_lb_policy *p,
227
269
  gpr_free(node);
228
270
  }
229
271
 
272
+ static bool is_ready_list_empty(round_robin_lb_policy *p) {
273
+ return p->ready_list.prev == NULL;
274
+ }
275
+
230
276
  static void rr_destroy(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
231
277
  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
232
- size_t i;
233
278
  ready_list *elem;
234
- for (i = 0; i < p->num_subchannels; i++) {
279
+
280
+ if (grpc_lb_round_robin_trace) {
281
+ gpr_log(GPR_DEBUG, "Destroying Round Robin policy at %p", (void *)pol);
282
+ }
283
+
284
+ for (size_t i = 0; i < p->num_subchannels; i++) {
235
285
  subchannel_data *sd = p->subchannels[i];
236
- GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "round_robin");
286
+ GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "rr_destroy");
287
+ if (sd->user_data != NULL) {
288
+ GPR_ASSERT(sd->user_data_vtable != NULL);
289
+ sd->user_data_vtable->destroy(exec_ctx, sd->user_data);
290
+ }
237
291
  gpr_free(sd);
238
292
  }
239
293
 
@@ -251,6 +305,7 @@ static void rr_destroy(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
251
305
  gpr_free(elem);
252
306
  elem = tmp;
253
307
  }
308
+
254
309
  gpr_free(p);
255
310
  }
256
311
 
@@ -260,18 +315,21 @@ static void rr_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
260
315
  size_t i;
261
316
 
262
317
  gpr_mu_lock(&p->mu);
318
+ if (grpc_lb_round_robin_trace) {
319
+ gpr_log(GPR_DEBUG, "Shutting down Round Robin policy at %p", (void *)pol);
320
+ }
263
321
 
264
322
  p->shutdown = 1;
265
323
  while ((pp = p->pending_picks)) {
266
324
  p->pending_picks = pp->next;
267
325
  *pp->target = NULL;
268
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete,
269
- GRPC_ERROR_CREATE("Channel Shutdown"), NULL);
326
+ grpc_closure_sched(exec_ctx, pp->on_complete,
327
+ GRPC_ERROR_CREATE("Channel Shutdown"));
270
328
  gpr_free(pp);
271
329
  }
272
330
  grpc_connectivity_state_set(
273
331
  exec_ctx, &p->state_tracker, GRPC_CHANNEL_SHUTDOWN,
274
- GRPC_ERROR_CREATE("Channel Shutdown"), "shutdown");
332
+ GRPC_ERROR_CREATE("Channel Shutdown"), "rr_shutdown");
275
333
  for (i = 0; i < p->num_subchannels; i++) {
276
334
  subchannel_data *sd = p->subchannels[i];
277
335
  grpc_subchannel_notify_on_state_change(exec_ctx, sd->subchannel, NULL, NULL,
@@ -281,7 +339,8 @@ static void rr_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
281
339
  }
282
340
 
283
341
  static void rr_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
284
- grpc_connected_subchannel **target) {
342
+ grpc_connected_subchannel **target,
343
+ grpc_error *error) {
285
344
  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
286
345
  pending_pick *pp;
287
346
  gpr_mu_lock(&p->mu);
@@ -290,11 +349,10 @@ static void rr_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
290
349
  while (pp != NULL) {
291
350
  pending_pick *next = pp->next;
292
351
  if (pp->target == target) {
293
- grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
294
- p->base.interested_parties);
295
352
  *target = NULL;
296
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_CANCELLED,
297
- NULL);
353
+ grpc_closure_sched(
354
+ exec_ctx, pp->on_complete,
355
+ GRPC_ERROR_CREATE_REFERENCING("Pick cancelled", &error, 1));
298
356
  gpr_free(pp);
299
357
  } else {
300
358
  pp->next = p->pending_picks;
@@ -303,11 +361,13 @@ static void rr_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
303
361
  pp = next;
304
362
  }
305
363
  gpr_mu_unlock(&p->mu);
364
+ GRPC_ERROR_UNREF(error);
306
365
  }
307
366
 
308
367
  static void rr_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
309
368
  uint32_t initial_metadata_flags_mask,
310
- uint32_t initial_metadata_flags_eq) {
369
+ uint32_t initial_metadata_flags_eq,
370
+ grpc_error *error) {
311
371
  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
312
372
  pending_pick *pp;
313
373
  gpr_mu_lock(&p->mu);
@@ -317,11 +377,10 @@ static void rr_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
317
377
  pending_pick *next = pp->next;
318
378
  if ((pp->initial_metadata_flags & initial_metadata_flags_mask) ==
319
379
  initial_metadata_flags_eq) {
320
- grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
321
- p->base.interested_parties);
322
380
  *pp->target = NULL;
323
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_CANCELLED,
324
- NULL);
381
+ grpc_closure_sched(
382
+ exec_ctx, pp->on_complete,
383
+ GRPC_ERROR_CREATE_REFERENCING("Pick cancelled", &error, 1));
325
384
  gpr_free(pp);
326
385
  } else {
327
386
  pp->next = p->pending_picks;
@@ -330,24 +389,25 @@ static void rr_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
330
389
  pp = next;
331
390
  }
332
391
  gpr_mu_unlock(&p->mu);
392
+ GRPC_ERROR_UNREF(error);
333
393
  }
334
394
 
335
395
  static void start_picking(grpc_exec_ctx *exec_ctx, round_robin_lb_policy *p) {
336
396
  size_t i;
337
397
  p->started_picking = 1;
338
398
 
339
- if (grpc_lb_round_robin_trace) {
340
- gpr_log(GPR_DEBUG, "LB_POLICY: p=%p num_subchannels=%" PRIuPTR, p,
341
- p->num_subchannels);
342
- }
343
-
344
399
  for (i = 0; i < p->num_subchannels; i++) {
345
400
  subchannel_data *sd = p->subchannels[i];
346
- sd->connectivity_state = GRPC_CHANNEL_IDLE;
401
+ /* use some sentinel value outside of the range of grpc_connectivity_state
402
+ * to signal an undefined previous state. We won't be referring to this
403
+ * value again and it'll be overwritten after the first call to
404
+ * rr_connectivity_changed */
405
+ sd->prev_connectivity_state = GRPC_CHANNEL_INIT;
406
+ sd->curr_connectivity_state = GRPC_CHANNEL_IDLE;
407
+ GRPC_LB_POLICY_WEAK_REF(&p->base, "rr_connectivity");
347
408
  grpc_subchannel_notify_on_state_change(
348
409
  exec_ctx, sd->subchannel, p->base.interested_parties,
349
- &sd->connectivity_state, &sd->connectivity_changed_closure);
350
- GRPC_LB_POLICY_WEAK_REF(&p->base, "round_robin_connectivity");
410
+ &sd->curr_connectivity_state, &sd->connectivity_changed_closure);
351
411
  }
352
412
  }
353
413
 
@@ -361,159 +421,231 @@ static void rr_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
361
421
  }
362
422
 
363
423
  static int rr_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
364
- grpc_polling_entity *pollent,
365
- grpc_metadata_batch *initial_metadata,
366
- uint32_t initial_metadata_flags,
367
- grpc_connected_subchannel **target,
424
+ const grpc_lb_policy_pick_args *pick_args,
425
+ grpc_connected_subchannel **target, void **user_data,
368
426
  grpc_closure *on_complete) {
369
427
  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
370
428
  pending_pick *pp;
371
429
  ready_list *selected;
372
430
  gpr_mu_lock(&p->mu);
431
+
432
+ if (grpc_lb_round_robin_trace) {
433
+ gpr_log(GPR_INFO, "Round Robin %p trying to pick", (void *)pol);
434
+ }
435
+
373
436
  if ((selected = peek_next_connected_locked(p))) {
374
- gpr_mu_unlock(&p->mu);
375
- *target = grpc_subchannel_get_connected_subchannel(selected->subchannel);
437
+ /* readily available, report right away */
438
+ *target = GRPC_CONNECTED_SUBCHANNEL_REF(
439
+ grpc_subchannel_get_connected_subchannel(selected->subchannel),
440
+ "rr_picked");
441
+
442
+ if (user_data != NULL) {
443
+ *user_data = selected->user_data;
444
+ }
376
445
  if (grpc_lb_round_robin_trace) {
377
446
  gpr_log(GPR_DEBUG,
378
- "[RR PICK] TARGET <-- CONNECTED SUBCHANNEL %p (NODE %p)", *target,
379
- selected);
447
+ "[RR PICK] TARGET <-- CONNECTED SUBCHANNEL %p (NODE %p)",
448
+ (void *)*target, (void *)selected);
380
449
  }
381
450
  /* only advance the last picked pointer if the selection was used */
382
451
  advance_last_picked_locked(p);
452
+ gpr_mu_unlock(&p->mu);
383
453
  return 1;
384
454
  } else {
455
+ /* no pick currently available. Save for later in list of pending picks */
385
456
  if (!p->started_picking) {
386
457
  start_picking(exec_ctx, p);
387
458
  }
388
- grpc_polling_entity_add_to_pollset_set(exec_ctx, pollent,
389
- p->base.interested_parties);
390
459
  pp = gpr_malloc(sizeof(*pp));
391
460
  pp->next = p->pending_picks;
392
- pp->pollent = pollent;
393
461
  pp->target = target;
394
462
  pp->on_complete = on_complete;
395
- pp->initial_metadata_flags = initial_metadata_flags;
463
+ pp->initial_metadata_flags = pick_args->initial_metadata_flags;
464
+ pp->user_data = user_data;
396
465
  p->pending_picks = pp;
397
466
  gpr_mu_unlock(&p->mu);
398
467
  return 0;
399
468
  }
400
469
  }
401
470
 
471
+ static void update_state_counters(subchannel_data *sd) {
472
+ round_robin_lb_policy *p = sd->policy;
473
+
474
+ /* update p->num_transient_failures (resp. p->num_idle): if the previous
475
+ * state was TRANSIENT_FAILURE (resp. IDLE), decrement
476
+ * p->num_transient_failures (resp. p->num_idle). */
477
+ if (sd->prev_connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
478
+ GPR_ASSERT(p->num_transient_failures > 0);
479
+ --p->num_transient_failures;
480
+ } else if (sd->prev_connectivity_state == GRPC_CHANNEL_IDLE) {
481
+ GPR_ASSERT(p->num_idle > 0);
482
+ --p->num_idle;
483
+ }
484
+ }
485
+
486
+ /* sd is the subchannel_data associted with the updated subchannel.
487
+ * shutdown_error will only be used upon policy transition to TRANSIENT_FAILURE
488
+ * or SHUTDOWN */
489
+ static grpc_connectivity_state update_lb_connectivity_status(
490
+ grpc_exec_ctx *exec_ctx, subchannel_data *sd, grpc_error *error) {
491
+ /* In priority order. The first rule to match terminates the search (ie, if we
492
+ * are on rule n, all previous rules were unfulfilled).
493
+ *
494
+ * 1) RULE: ANY subchannel is READY => policy is READY.
495
+ * CHECK: At least one subchannel is ready iff p->ready_list is NOT empty.
496
+ *
497
+ * 2) RULE: ANY subchannel is CONNECTING => policy is CONNECTING.
498
+ * CHECK: sd->curr_connectivity_state == CONNECTING.
499
+ *
500
+ * 3) RULE: ALL subchannels are SHUTDOWN => policy is SHUTDOWN.
501
+ * CHECK: p->num_subchannels = 0.
502
+ *
503
+ * 4) RULE: ALL subchannels are TRANSIENT_FAILURE => policy is
504
+ * TRANSIENT_FAILURE.
505
+ * CHECK: p->num_transient_failures == p->num_subchannels.
506
+ *
507
+ * 5) RULE: ALL subchannels are IDLE => policy is IDLE.
508
+ * CHECK: p->num_idle == p->num_subchannels.
509
+ */
510
+ round_robin_lb_policy *p = sd->policy;
511
+ if (!is_ready_list_empty(p)) { /* 1) READY */
512
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker, GRPC_CHANNEL_READY,
513
+ GRPC_ERROR_NONE, "rr_ready");
514
+ return GRPC_CHANNEL_READY;
515
+ } else if (sd->curr_connectivity_state ==
516
+ GRPC_CHANNEL_CONNECTING) { /* 2) CONNECTING */
517
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
518
+ GRPC_CHANNEL_CONNECTING, GRPC_ERROR_NONE,
519
+ "rr_connecting");
520
+ return GRPC_CHANNEL_CONNECTING;
521
+ } else if (p->num_subchannels == 0) { /* 3) SHUTDOWN */
522
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
523
+ GRPC_CHANNEL_SHUTDOWN, GRPC_ERROR_REF(error),
524
+ "rr_shutdown");
525
+ return GRPC_CHANNEL_SHUTDOWN;
526
+ } else if (p->num_transient_failures ==
527
+ p->num_subchannels) { /* 4) TRANSIENT_FAILURE */
528
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
529
+ GRPC_CHANNEL_TRANSIENT_FAILURE,
530
+ GRPC_ERROR_REF(error), "rr_transient_failure");
531
+ return GRPC_CHANNEL_TRANSIENT_FAILURE;
532
+ } else if (p->num_idle == p->num_subchannels) { /* 5) IDLE */
533
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker, GRPC_CHANNEL_IDLE,
534
+ GRPC_ERROR_NONE, "rr_idle");
535
+ return GRPC_CHANNEL_IDLE;
536
+ }
537
+ /* no change */
538
+ return sd->curr_connectivity_state;
539
+ }
540
+
402
541
  static void rr_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
403
542
  grpc_error *error) {
404
543
  subchannel_data *sd = arg;
405
544
  round_robin_lb_policy *p = sd->policy;
406
545
  pending_pick *pp;
407
- ready_list *selected;
408
-
409
- int unref = 0;
410
546
 
411
547
  GRPC_ERROR_REF(error);
412
548
  gpr_mu_lock(&p->mu);
413
549
 
414
550
  if (p->shutdown) {
415
- unref = 1;
416
- } else {
417
- switch (sd->connectivity_state) {
418
- case GRPC_CHANNEL_READY:
419
- grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
420
- GRPC_CHANNEL_READY, GRPC_ERROR_REF(error),
421
- "connecting_ready");
422
- /* add the newly connected subchannel to the list of connected ones.
423
- * Note that it goes to the "end of the line". */
424
- sd->ready_list_node = add_connected_sc_locked(p, sd->subchannel);
425
- /* at this point we know there's at least one suitable subchannel. Go
426
- * ahead and pick one and notify the pending suitors in
427
- * p->pending_picks. This preemtively replicates rr_pick()'s actions. */
428
- selected = peek_next_connected_locked(p);
429
- if (p->pending_picks != NULL) {
430
- /* if the selected subchannel is going to be used for the pending
431
- * picks, update the last picked pointer */
432
- advance_last_picked_locked(p);
551
+ gpr_mu_unlock(&p->mu);
552
+ GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "rr_connectivity");
553
+ GRPC_ERROR_UNREF(error);
554
+ return;
555
+ }
556
+ switch (sd->curr_connectivity_state) {
557
+ case GRPC_CHANNEL_INIT:
558
+ GPR_UNREACHABLE_CODE(return );
559
+ case GRPC_CHANNEL_READY:
560
+ /* add the newly connected subchannel to the list of connected ones.
561
+ * Note that it goes to the "end of the line". */
562
+ sd->ready_list_node = add_connected_sc_locked(p, sd);
563
+ /* at this point we know there's at least one suitable subchannel. Go
564
+ * ahead and pick one and notify the pending suitors in
565
+ * p->pending_picks. This preemtively replicates rr_pick()'s actions. */
566
+ ready_list *selected = peek_next_connected_locked(p);
567
+ GPR_ASSERT(selected != NULL);
568
+ if (p->pending_picks != NULL) {
569
+ /* if the selected subchannel is going to be used for the pending
570
+ * picks, update the last picked pointer */
571
+ advance_last_picked_locked(p);
572
+ }
573
+ while ((pp = p->pending_picks)) {
574
+ p->pending_picks = pp->next;
575
+ *pp->target = GRPC_CONNECTED_SUBCHANNEL_REF(
576
+ grpc_subchannel_get_connected_subchannel(selected->subchannel),
577
+ "rr_picked");
578
+ if (pp->user_data != NULL) {
579
+ *pp->user_data = selected->user_data;
580
+ }
581
+ if (grpc_lb_round_robin_trace) {
582
+ gpr_log(GPR_DEBUG,
583
+ "[RR CONN CHANGED] TARGET <-- SUBCHANNEL %p (NODE %p)",
584
+ (void *)selected->subchannel, (void *)selected);
433
585
  }
586
+ grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
587
+ gpr_free(pp);
588
+ }
589
+ update_lb_connectivity_status(exec_ctx, sd, error);
590
+ sd->prev_connectivity_state = sd->curr_connectivity_state;
591
+ /* renew notification: reuses the "rr_connectivity" weak ref */
592
+ grpc_subchannel_notify_on_state_change(
593
+ exec_ctx, sd->subchannel, p->base.interested_parties,
594
+ &sd->curr_connectivity_state, &sd->connectivity_changed_closure);
595
+ break;
596
+ case GRPC_CHANNEL_IDLE:
597
+ ++p->num_idle;
598
+ /* fallthrough */
599
+ case GRPC_CHANNEL_CONNECTING:
600
+ update_state_counters(sd);
601
+ update_lb_connectivity_status(exec_ctx, sd, error);
602
+ sd->prev_connectivity_state = sd->curr_connectivity_state;
603
+ /* renew notification: reuses the "rr_connectivity" weak ref */
604
+ grpc_subchannel_notify_on_state_change(
605
+ exec_ctx, sd->subchannel, p->base.interested_parties,
606
+ &sd->curr_connectivity_state, &sd->connectivity_changed_closure);
607
+ break;
608
+ case GRPC_CHANNEL_TRANSIENT_FAILURE:
609
+ ++p->num_transient_failures;
610
+ /* remove from ready list if still present */
611
+ if (sd->ready_list_node != NULL) {
612
+ remove_disconnected_sc_locked(p, sd->ready_list_node);
613
+ sd->ready_list_node = NULL;
614
+ }
615
+ update_lb_connectivity_status(exec_ctx, sd, error);
616
+ sd->prev_connectivity_state = sd->curr_connectivity_state;
617
+ /* renew notification: reuses the "rr_connectivity" weak ref */
618
+ grpc_subchannel_notify_on_state_change(
619
+ exec_ctx, sd->subchannel, p->base.interested_parties,
620
+ &sd->curr_connectivity_state, &sd->connectivity_changed_closure);
621
+ break;
622
+ case GRPC_CHANNEL_SHUTDOWN:
623
+ update_state_counters(sd);
624
+ if (sd->ready_list_node != NULL) {
625
+ remove_disconnected_sc_locked(p, sd->ready_list_node);
626
+ sd->ready_list_node = NULL;
627
+ }
628
+ --p->num_subchannels;
629
+ GPR_SWAP(subchannel_data *, p->subchannels[sd->index],
630
+ p->subchannels[p->num_subchannels]);
631
+ GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "rr_subchannel_shutdown");
632
+ p->subchannels[sd->index]->index = sd->index;
633
+ if (update_lb_connectivity_status(exec_ctx, sd, error) ==
634
+ GRPC_CHANNEL_SHUTDOWN) {
635
+ /* the policy is shutting down. Flush all the pending picks... */
434
636
  while ((pp = p->pending_picks)) {
435
637
  p->pending_picks = pp->next;
436
- *pp->target =
437
- grpc_subchannel_get_connected_subchannel(selected->subchannel);
438
- if (grpc_lb_round_robin_trace) {
439
- gpr_log(GPR_DEBUG,
440
- "[RR CONN CHANGED] TARGET <-- SUBCHANNEL %p (NODE %p)",
441
- selected->subchannel, selected);
442
- }
443
- grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
444
- p->base.interested_parties);
445
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE, NULL);
638
+ *pp->target = NULL;
639
+ grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
446
640
  gpr_free(pp);
447
641
  }
448
- grpc_subchannel_notify_on_state_change(
449
- exec_ctx, sd->subchannel, p->base.interested_parties,
450
- &sd->connectivity_state, &sd->connectivity_changed_closure);
451
- break;
452
- case GRPC_CHANNEL_CONNECTING:
453
- case GRPC_CHANNEL_IDLE:
454
- grpc_connectivity_state_set(
455
- exec_ctx, &p->state_tracker, sd->connectivity_state,
456
- GRPC_ERROR_REF(error), "connecting_changed");
457
- grpc_subchannel_notify_on_state_change(
458
- exec_ctx, sd->subchannel, p->base.interested_parties,
459
- &sd->connectivity_state, &sd->connectivity_changed_closure);
460
- break;
461
- case GRPC_CHANNEL_TRANSIENT_FAILURE:
462
- /* renew state notification */
463
- grpc_subchannel_notify_on_state_change(
464
- exec_ctx, sd->subchannel, p->base.interested_parties,
465
- &sd->connectivity_state, &sd->connectivity_changed_closure);
466
-
467
- /* remove from ready list if still present */
468
- if (sd->ready_list_node != NULL) {
469
- remove_disconnected_sc_locked(p, sd->ready_list_node);
470
- sd->ready_list_node = NULL;
471
- }
472
- grpc_connectivity_state_set(
473
- exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
474
- GRPC_ERROR_REF(error), "connecting_transient_failure");
475
- break;
476
- case GRPC_CHANNEL_SHUTDOWN:
477
- if (sd->ready_list_node != NULL) {
478
- remove_disconnected_sc_locked(p, sd->ready_list_node);
479
- sd->ready_list_node = NULL;
480
- }
481
-
482
- p->num_subchannels--;
483
- GPR_SWAP(subchannel_data *, p->subchannels[sd->index],
484
- p->subchannels[p->num_subchannels]);
485
- GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "round_robin");
486
- p->subchannels[sd->index]->index = sd->index;
487
- gpr_free(sd);
488
-
489
- unref = 1;
490
- if (p->num_subchannels == 0) {
491
- grpc_connectivity_state_set(
492
- exec_ctx, &p->state_tracker, GRPC_CHANNEL_SHUTDOWN,
493
- GRPC_ERROR_CREATE_REFERENCING("Round Robin Channels Exhausted",
494
- &error, 1),
495
- "no_more_channels");
496
- while ((pp = p->pending_picks)) {
497
- p->pending_picks = pp->next;
498
- *pp->target = NULL;
499
- grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE,
500
- NULL);
501
- gpr_free(pp);
502
- }
503
- } else {
504
- grpc_connectivity_state_set(
505
- exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
506
- GRPC_ERROR_REF(error), "subchannel_failed");
507
- }
508
- } /* switch */
509
- } /* !unref */
510
-
511
- gpr_mu_unlock(&p->mu);
512
-
513
- if (unref) {
514
- GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "round_robin_connectivity");
642
+ }
643
+ gpr_free(sd);
644
+ /* unref the "rr_connectivity" weak ref from start_picking */
645
+ GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "rr_connectivity");
646
+ break;
515
647
  }
516
-
648
+ gpr_mu_unlock(&p->mu);
517
649
  GRPC_ERROR_UNREF(error);
518
650
  }
519
651
 
@@ -547,12 +679,15 @@ static void rr_ping_one(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
547
679
  gpr_mu_lock(&p->mu);
548
680
  if ((selected = peek_next_connected_locked(p))) {
549
681
  gpr_mu_unlock(&p->mu);
550
- target = grpc_subchannel_get_connected_subchannel(selected->subchannel);
682
+ target = GRPC_CONNECTED_SUBCHANNEL_REF(
683
+ grpc_subchannel_get_connected_subchannel(selected->subchannel),
684
+ "rr_picked");
551
685
  grpc_connected_subchannel_ping(exec_ctx, target, closure);
686
+ GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, target, "rr_picked");
552
687
  } else {
553
688
  gpr_mu_unlock(&p->mu);
554
- grpc_exec_ctx_sched(exec_ctx, closure,
555
- GRPC_ERROR_CREATE("Round Robin not connected"), NULL);
689
+ grpc_closure_sched(exec_ctx, closure,
690
+ GRPC_ERROR_CREATE("Round Robin not connected"));
556
691
  }
557
692
  }
558
693
 
@@ -568,25 +703,43 @@ static void round_robin_factory_unref(grpc_lb_policy_factory *factory) {}
568
703
  static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx,
569
704
  grpc_lb_policy_factory *factory,
570
705
  grpc_lb_policy_args *args) {
571
- GPR_ASSERT(args->addresses != NULL);
572
706
  GPR_ASSERT(args->client_channel_factory != NULL);
573
707
 
708
+ /* Find the number of backend addresses. We ignore balancer
709
+ * addresses, since we don't know how to handle them. */
710
+ const grpc_arg *arg =
711
+ grpc_channel_args_find(args->args, GRPC_ARG_LB_ADDRESSES);
712
+ GPR_ASSERT(arg != NULL && arg->type == GRPC_ARG_POINTER);
713
+ grpc_lb_addresses *addresses = arg->value.pointer.p;
714
+ size_t num_addrs = 0;
715
+ for (size_t i = 0; i < addresses->num_addresses; i++) {
716
+ if (!addresses->addresses[i].is_balancer) ++num_addrs;
717
+ }
718
+ if (num_addrs == 0) return NULL;
719
+
574
720
  round_robin_lb_policy *p = gpr_malloc(sizeof(*p));
575
721
  memset(p, 0, sizeof(*p));
576
722
 
577
- p->subchannels =
578
- gpr_malloc(sizeof(*p->subchannels) * args->addresses->naddrs);
579
- memset(p->subchannels, 0, sizeof(*p->subchannels) * args->addresses->naddrs);
723
+ p->num_addresses = num_addrs;
724
+ p->subchannels = gpr_malloc(sizeof(*p->subchannels) * num_addrs);
725
+ memset(p->subchannels, 0, sizeof(*p->subchannels) * num_addrs);
580
726
 
581
727
  grpc_subchannel_args sc_args;
582
728
  size_t subchannel_idx = 0;
583
- for (size_t i = 0; i < args->addresses->naddrs; i++) {
584
- memset(&sc_args, 0, sizeof(grpc_subchannel_args));
585
- sc_args.addr = (struct sockaddr *)(args->addresses->addrs[i].addr);
586
- sc_args.addr_len = (size_t)args->addresses->addrs[i].len;
729
+ for (size_t i = 0; i < addresses->num_addresses; i++) {
730
+ /* Skip balancer addresses, since we only know how to handle backends. */
731
+ if (addresses->addresses[i].is_balancer) continue;
587
732
 
733
+ memset(&sc_args, 0, sizeof(grpc_subchannel_args));
734
+ grpc_arg addr_arg =
735
+ grpc_create_subchannel_address_arg(&addresses->addresses[i].address);
736
+ grpc_channel_args *new_args =
737
+ grpc_channel_args_copy_and_add(args->args, &addr_arg, 1);
738
+ gpr_free(addr_arg.value.string);
739
+ sc_args.args = new_args;
588
740
  grpc_subchannel *subchannel = grpc_client_channel_factory_create_subchannel(
589
741
  exec_ctx, args->client_channel_factory, &sc_args);
742
+ grpc_channel_args_destroy(exec_ctx, new_args);
590
743
 
591
744
  if (subchannel != NULL) {
592
745
  subchannel_data *sd = gpr_malloc(sizeof(*sd));
@@ -595,12 +748,18 @@ static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx,
595
748
  sd->policy = p;
596
749
  sd->index = subchannel_idx;
597
750
  sd->subchannel = subchannel;
751
+ sd->user_data_vtable = addresses->user_data_vtable;
752
+ if (sd->user_data_vtable != NULL) {
753
+ sd->user_data =
754
+ sd->user_data_vtable->copy(addresses->addresses[i].user_data);
755
+ }
598
756
  ++subchannel_idx;
599
757
  grpc_closure_init(&sd->connectivity_changed_closure,
600
- rr_connectivity_changed, sd);
758
+ rr_connectivity_changed, sd, grpc_schedule_on_exec_ctx);
601
759
  }
602
760
  }
603
761
  if (subchannel_idx == 0) {
762
+ /* couldn't create any subchannel. Bail out */
604
763
  gpr_free(p->subchannels);
605
764
  gpr_free(p);
606
765
  return NULL;
@@ -616,6 +775,11 @@ static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx,
616
775
  grpc_lb_policy_init(&p->base, &round_robin_lb_policy_vtable);
617
776
  grpc_connectivity_state_init(&p->state_tracker, GRPC_CHANNEL_IDLE,
618
777
  "round_robin");
778
+
779
+ if (grpc_lb_round_robin_trace) {
780
+ gpr_log(GPR_DEBUG, "Created RR policy at %p with %lu subchannels",
781
+ (void *)p, (unsigned long)p->num_subchannels);
782
+ }
619
783
  gpr_mu_init(&p->mu);
620
784
  return &p->base;
621
785
  }