grpc 0.11.0 → 0.12.0

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 (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +29456 -0
  3. data/Rakefile +13 -8
  4. data/etc/roots.pem +5114 -0
  5. data/include/grpc/byte_buffer.h +120 -0
  6. data/include/grpc/byte_buffer_reader.h +58 -0
  7. data/include/grpc/census.h +488 -0
  8. data/include/grpc/compression.h +106 -0
  9. data/include/grpc/grpc.h +732 -0
  10. data/include/grpc/grpc_security.h +374 -0
  11. data/include/grpc/grpc_zookeeper.h +59 -0
  12. data/include/grpc/status.h +163 -0
  13. data/include/grpc/support/alloc.h +72 -0
  14. data/include/grpc/support/atm.h +92 -0
  15. data/include/grpc/support/atm_gcc_atomic.h +72 -0
  16. data/include/grpc/support/atm_gcc_sync.h +87 -0
  17. data/include/grpc/support/atm_win32.h +125 -0
  18. data/include/grpc/support/avl.h +91 -0
  19. data/include/grpc/support/cmdline.h +101 -0
  20. data/include/grpc/support/cpu.h +57 -0
  21. data/include/grpc/support/histogram.h +76 -0
  22. data/include/grpc/support/host_port.h +64 -0
  23. data/include/grpc/support/log.h +108 -0
  24. data/include/grpc/support/log_win32.h +51 -0
  25. data/include/grpc/support/port_platform.h +356 -0
  26. data/include/grpc/support/slice.h +182 -0
  27. data/include/grpc/support/slice_buffer.h +102 -0
  28. data/include/grpc/support/string_util.h +61 -0
  29. data/include/grpc/support/subprocess.h +57 -0
  30. data/include/grpc/support/sync.h +315 -0
  31. data/include/grpc/support/sync_generic.h +55 -0
  32. data/include/grpc/support/sync_posix.h +47 -0
  33. data/include/grpc/support/sync_win32.h +49 -0
  34. data/include/grpc/support/thd.h +91 -0
  35. data/include/grpc/support/time.h +128 -0
  36. data/include/grpc/support/tls.h +77 -0
  37. data/include/grpc/support/tls_gcc.h +56 -0
  38. data/include/grpc/support/tls_msvc.h +56 -0
  39. data/include/grpc/support/tls_pthread.h +60 -0
  40. data/include/grpc/support/useful.h +75 -0
  41. data/src/core/census/aggregation.h +66 -0
  42. data/src/core/census/context.c +46 -0
  43. data/src/core/census/context.h +47 -0
  44. data/src/core/census/grpc_context.c +53 -0
  45. data/src/core/census/grpc_filter.c +184 -0
  46. data/src/core/census/grpc_filter.h +44 -0
  47. data/src/core/census/initialize.c +57 -0
  48. data/src/core/census/operation.c +63 -0
  49. data/src/core/census/rpc_metric_id.h +51 -0
  50. data/src/core/census/tracing.c +45 -0
  51. data/src/core/channel/channel_args.c +209 -0
  52. data/src/core/channel/channel_args.h +88 -0
  53. data/src/core/channel/channel_stack.c +262 -0
  54. data/src/core/channel/channel_stack.h +260 -0
  55. data/src/core/channel/client_channel.c +524 -0
  56. data/src/core/channel/client_channel.h +63 -0
  57. data/src/core/channel/client_uchannel.c +243 -0
  58. data/src/core/channel/client_uchannel.h +60 -0
  59. data/src/core/channel/compress_filter.c +297 -0
  60. data/src/core/channel/compress_filter.h +65 -0
  61. data/src/core/channel/connected_channel.c +167 -0
  62. data/src/core/channel/connected_channel.h +51 -0
  63. data/src/core/channel/context.h +49 -0
  64. data/src/core/channel/http_client_filter.c +248 -0
  65. data/src/core/channel/http_client_filter.h +44 -0
  66. data/src/core/channel/http_server_filter.c +233 -0
  67. data/src/core/channel/http_server_filter.h +42 -0
  68. data/src/core/channel/subchannel_call_holder.c +259 -0
  69. data/src/core/channel/subchannel_call_holder.h +98 -0
  70. data/src/core/client_config/client_config.c +72 -0
  71. data/src/core/client_config/client_config.h +53 -0
  72. data/src/core/client_config/connector.c +54 -0
  73. data/src/core/client_config/connector.h +95 -0
  74. data/src/core/client_config/default_initial_connect_string.c +39 -0
  75. data/src/core/client_config/initial_connect_string.c +53 -0
  76. data/src/core/client_config/initial_connect_string.h +50 -0
  77. data/src/core/client_config/lb_policies/pick_first.c +398 -0
  78. data/src/core/client_config/lb_policies/pick_first.h +43 -0
  79. data/src/core/client_config/lb_policies/round_robin.c +537 -0
  80. data/src/core/client_config/lb_policies/round_robin.h +46 -0
  81. data/src/core/client_config/lb_policy.c +134 -0
  82. data/src/core/client_config/lb_policy.h +143 -0
  83. data/src/core/client_config/lb_policy_factory.c +48 -0
  84. data/src/core/client_config/lb_policy_factory.h +73 -0
  85. data/src/core/client_config/lb_policy_registry.c +88 -0
  86. data/src/core/client_config/lb_policy_registry.h +54 -0
  87. data/src/core/client_config/resolver.c +82 -0
  88. data/src/core/client_config/resolver.h +94 -0
  89. data/src/core/client_config/resolver_factory.c +55 -0
  90. data/src/core/client_config/resolver_factory.h +82 -0
  91. data/src/core/client_config/resolver_registry.c +137 -0
  92. data/src/core/client_config/resolver_registry.h +65 -0
  93. data/src/core/client_config/resolvers/dns_resolver.c +257 -0
  94. data/src/core/client_config/resolvers/dns_resolver.h +42 -0
  95. data/src/core/client_config/resolvers/sockaddr_resolver.c +391 -0
  96. data/src/core/client_config/resolvers/sockaddr_resolver.h +50 -0
  97. data/src/core/client_config/subchannel.c +697 -0
  98. data/src/core/client_config/subchannel.h +165 -0
  99. data/src/core/client_config/subchannel_factory.c +49 -0
  100. data/src/core/client_config/subchannel_factory.h +66 -0
  101. data/src/core/client_config/uri_parser.c +242 -0
  102. data/src/core/client_config/uri_parser.h +51 -0
  103. data/src/core/compression/algorithm.c +166 -0
  104. data/src/core/compression/algorithm_metadata.h +53 -0
  105. data/src/core/compression/message_compress.c +198 -0
  106. data/src/core/compression/message_compress.h +52 -0
  107. data/src/core/debug/trace.c +136 -0
  108. data/src/core/debug/trace.h +43 -0
  109. data/src/core/httpcli/format_request.c +120 -0
  110. data/src/core/httpcli/format_request.h +45 -0
  111. data/src/core/httpcli/httpcli.c +286 -0
  112. data/src/core/httpcli/httpcli.h +162 -0
  113. data/src/core/httpcli/httpcli_security_connector.c +189 -0
  114. data/src/core/httpcli/parser.c +211 -0
  115. data/src/core/httpcli/parser.h +64 -0
  116. data/src/core/iomgr/closure.c +98 -0
  117. data/src/core/iomgr/closure.h +97 -0
  118. data/src/core/iomgr/endpoint.c +67 -0
  119. data/src/core/iomgr/endpoint.h +102 -0
  120. data/src/core/iomgr/endpoint_pair.h +47 -0
  121. data/src/core/iomgr/endpoint_pair_posix.c +82 -0
  122. data/src/core/iomgr/endpoint_pair_windows.c +97 -0
  123. data/src/core/iomgr/exec_ctx.c +72 -0
  124. data/src/core/iomgr/exec_ctx.h +78 -0
  125. data/src/core/iomgr/executor.c +143 -0
  126. data/src/core/iomgr/executor.h +53 -0
  127. data/src/core/iomgr/fd_posix.c +438 -0
  128. data/src/core/iomgr/fd_posix.h +189 -0
  129. data/src/core/iomgr/iocp_windows.c +206 -0
  130. data/src/core/iomgr/iocp_windows.h +56 -0
  131. data/src/core/iomgr/iomgr.c +156 -0
  132. data/src/core/iomgr/iomgr.h +43 -0
  133. data/src/core/iomgr/iomgr_internal.h +58 -0
  134. data/src/core/iomgr/iomgr_posix.c +52 -0
  135. data/src/core/iomgr/iomgr_posix.h +39 -0
  136. data/src/core/iomgr/iomgr_windows.c +73 -0
  137. data/src/core/iomgr/pollset.h +95 -0
  138. data/src/core/iomgr/pollset_multipoller_with_epoll.c +258 -0
  139. data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +227 -0
  140. data/src/core/iomgr/pollset_posix.c +638 -0
  141. data/src/core/iomgr/pollset_posix.h +147 -0
  142. data/src/core/iomgr/pollset_set.h +67 -0
  143. data/src/core/iomgr/pollset_set_posix.c +182 -0
  144. data/src/core/iomgr/pollset_set_posix.h +61 -0
  145. data/src/core/iomgr/pollset_set_windows.c +60 -0
  146. data/src/core/iomgr/pollset_set_windows.h +39 -0
  147. data/src/core/iomgr/pollset_windows.c +248 -0
  148. data/src/core/iomgr/pollset_windows.h +79 -0
  149. data/src/core/iomgr/resolve_address.h +72 -0
  150. data/src/core/iomgr/resolve_address_posix.c +183 -0
  151. data/src/core/iomgr/resolve_address_windows.c +166 -0
  152. data/src/core/iomgr/sockaddr.h +47 -0
  153. data/src/core/iomgr/sockaddr_posix.h +44 -0
  154. data/src/core/iomgr/sockaddr_utils.c +234 -0
  155. data/src/core/iomgr/sockaddr_utils.h +89 -0
  156. data/src/core/iomgr/sockaddr_win32.h +46 -0
  157. data/src/core/iomgr/socket_utils_common_posix.c +208 -0
  158. data/src/core/iomgr/socket_utils_linux.c +51 -0
  159. data/src/core/iomgr/socket_utils_posix.c +70 -0
  160. data/src/core/iomgr/socket_utils_posix.h +113 -0
  161. data/src/core/iomgr/socket_windows.c +98 -0
  162. data/src/core/iomgr/socket_windows.h +111 -0
  163. data/src/core/iomgr/tcp_client.h +53 -0
  164. data/src/core/iomgr/tcp_client_posix.c +304 -0
  165. data/src/core/iomgr/tcp_client_windows.c +221 -0
  166. data/src/core/iomgr/tcp_posix.c +485 -0
  167. data/src/core/iomgr/tcp_posix.h +65 -0
  168. data/src/core/iomgr/tcp_server.h +83 -0
  169. data/src/core/iomgr/tcp_server_posix.c +562 -0
  170. data/src/core/iomgr/tcp_server_windows.c +509 -0
  171. data/src/core/iomgr/tcp_windows.c +406 -0
  172. data/src/core/iomgr/tcp_windows.h +57 -0
  173. data/src/core/iomgr/time_averaged_stats.c +77 -0
  174. data/src/core/iomgr/time_averaged_stats.h +88 -0
  175. data/src/core/iomgr/timer.c +345 -0
  176. data/src/core/iomgr/timer.h +89 -0
  177. data/src/core/iomgr/timer_heap.c +148 -0
  178. data/src/core/iomgr/timer_heap.h +57 -0
  179. data/src/core/iomgr/timer_internal.h +61 -0
  180. data/src/core/iomgr/udp_server.c +439 -0
  181. data/src/core/iomgr/udp_server.h +83 -0
  182. data/src/core/iomgr/wakeup_fd_eventfd.c +85 -0
  183. data/src/core/iomgr/wakeup_fd_nospecial.c +51 -0
  184. data/src/core/iomgr/wakeup_fd_pipe.c +97 -0
  185. data/src/core/iomgr/wakeup_fd_pipe.h +41 -0
  186. data/src/core/iomgr/wakeup_fd_posix.c +72 -0
  187. data/src/core/iomgr/wakeup_fd_posix.h +101 -0
  188. data/src/core/iomgr/workqueue.h +85 -0
  189. data/src/core/iomgr/workqueue_posix.c +143 -0
  190. data/src/core/iomgr/workqueue_posix.h +51 -0
  191. data/src/core/iomgr/workqueue_windows.c +40 -0
  192. data/src/core/iomgr/workqueue_windows.h +37 -0
  193. data/src/core/json/json.c +64 -0
  194. data/src/core/json/json.h +88 -0
  195. data/src/core/json/json_common.h +49 -0
  196. data/src/core/json/json_reader.c +660 -0
  197. data/src/core/json/json_reader.h +160 -0
  198. data/src/core/json/json_string.c +379 -0
  199. data/src/core/json/json_writer.c +260 -0
  200. data/src/core/json/json_writer.h +97 -0
  201. data/src/core/profiling/basic_timers.c +274 -0
  202. data/src/core/profiling/stap_timers.c +65 -0
  203. data/src/core/profiling/timers.h +119 -0
  204. data/src/core/security/auth_filters.h +42 -0
  205. data/src/core/security/base64.c +233 -0
  206. data/src/core/security/base64.h +52 -0
  207. data/src/core/security/client_auth_filter.c +337 -0
  208. data/src/core/security/credentials.c +1273 -0
  209. data/src/core/security/credentials.h +376 -0
  210. data/src/core/security/credentials_metadata.c +101 -0
  211. data/src/core/security/credentials_posix.c +61 -0
  212. data/src/core/security/credentials_win32.c +61 -0
  213. data/src/core/security/google_default_credentials.c +260 -0
  214. data/src/core/security/handshake.c +327 -0
  215. data/src/core/security/handshake.h +50 -0
  216. data/src/core/security/json_token.c +405 -0
  217. data/src/core/security/json_token.h +118 -0
  218. data/src/core/security/jwt_verifier.c +842 -0
  219. data/src/core/security/jwt_verifier.h +136 -0
  220. data/src/core/security/secure_endpoint.c +383 -0
  221. data/src/core/security/secure_endpoint.h +49 -0
  222. data/src/core/security/security_connector.c +756 -0
  223. data/src/core/security/security_connector.h +246 -0
  224. data/src/core/security/security_context.c +342 -0
  225. data/src/core/security/security_context.h +114 -0
  226. data/src/core/security/server_auth_filter.c +264 -0
  227. data/src/core/security/server_secure_chttp2.c +268 -0
  228. data/src/core/statistics/census_interface.h +76 -0
  229. data/src/core/statistics/census_rpc_stats.h +101 -0
  230. data/src/core/support/alloc.c +90 -0
  231. data/src/core/support/avl.c +288 -0
  232. data/src/core/support/block_annotate.h +48 -0
  233. data/src/core/support/cmdline.c +347 -0
  234. data/src/core/support/cpu_iphone.c +49 -0
  235. data/src/core/support/cpu_linux.c +78 -0
  236. data/src/core/support/cpu_posix.c +77 -0
  237. data/src/core/support/cpu_windows.c +47 -0
  238. data/src/core/support/env.h +60 -0
  239. data/src/core/support/env_linux.c +62 -0
  240. data/src/core/support/env_posix.c +57 -0
  241. data/src/core/support/env_win32.c +65 -0
  242. data/src/core/support/file.c +91 -0
  243. data/src/core/support/file.h +63 -0
  244. data/src/core/support/file_posix.c +85 -0
  245. data/src/core/support/file_win32.c +84 -0
  246. data/src/core/support/histogram.c +244 -0
  247. data/src/core/support/host_port.c +110 -0
  248. data/src/core/support/log.c +66 -0
  249. data/src/core/support/log_android.c +87 -0
  250. data/src/core/support/log_linux.c +105 -0
  251. data/src/core/support/log_posix.c +102 -0
  252. data/src/core/support/log_win32.c +125 -0
  253. data/src/core/support/murmur_hash.c +96 -0
  254. data/src/core/support/murmur_hash.h +44 -0
  255. data/src/core/support/slice.c +343 -0
  256. data/src/core/support/slice_buffer.c +282 -0
  257. data/src/core/support/stack_lockfree.c +175 -0
  258. data/src/core/support/stack_lockfree.h +53 -0
  259. data/src/core/support/string.c +296 -0
  260. data/src/core/support/string.h +121 -0
  261. data/src/core/support/string_posix.c +86 -0
  262. data/src/core/support/string_win32.c +109 -0
  263. data/src/core/support/string_win32.h +47 -0
  264. data/src/core/support/subprocess_posix.c +112 -0
  265. data/src/core/support/sync.c +122 -0
  266. data/src/core/support/sync_posix.c +104 -0
  267. data/src/core/support/sync_win32.c +128 -0
  268. data/src/core/support/thd.c +64 -0
  269. data/src/core/support/thd_internal.h +39 -0
  270. data/src/core/support/thd_posix.c +94 -0
  271. data/src/core/support/thd_win32.c +117 -0
  272. data/src/core/support/time.c +304 -0
  273. data/src/core/support/time_posix.c +161 -0
  274. data/src/core/support/time_precise.c +89 -0
  275. data/src/core/support/time_precise.h +42 -0
  276. data/src/core/support/time_win32.c +101 -0
  277. data/src/core/support/tls_pthread.c +45 -0
  278. data/src/core/surface/api_trace.c +36 -0
  279. data/src/core/surface/api_trace.h +65 -0
  280. data/src/core/surface/byte_buffer.c +97 -0
  281. data/src/core/surface/byte_buffer_reader.c +123 -0
  282. data/src/core/surface/call.c +1424 -0
  283. data/src/core/surface/call.h +109 -0
  284. data/src/core/surface/call_details.c +50 -0
  285. data/src/core/surface/call_log_batch.c +118 -0
  286. data/src/core/surface/call_test_only.h +64 -0
  287. data/src/core/surface/channel.c +327 -0
  288. data/src/core/surface/channel.h +74 -0
  289. data/src/core/surface/channel_connectivity.c +220 -0
  290. data/src/core/surface/channel_create.c +235 -0
  291. data/src/core/surface/channel_ping.c +79 -0
  292. data/src/core/surface/completion_queue.c +481 -0
  293. data/src/core/surface/completion_queue.h +91 -0
  294. data/src/core/surface/event_string.c +81 -0
  295. data/src/core/surface/event_string.h +42 -0
  296. data/src/core/surface/init.c +168 -0
  297. data/src/core/surface/init.h +40 -0
  298. data/src/core/surface/init_secure.c +42 -0
  299. data/src/core/surface/lame_client.c +149 -0
  300. data/src/core/surface/metadata_array.c +49 -0
  301. data/src/core/surface/secure_channel_create.c +336 -0
  302. data/src/core/surface/server.c +1343 -0
  303. data/src/core/surface/server.h +67 -0
  304. data/src/core/surface/server_chttp2.c +149 -0
  305. data/src/core/surface/server_create.c +51 -0
  306. data/src/core/surface/surface_trace.h +48 -0
  307. data/src/core/surface/validate_metadata.c +73 -0
  308. data/src/core/surface/version.c +39 -0
  309. data/src/core/transport/byte_stream.c +76 -0
  310. data/src/core/transport/byte_stream.h +88 -0
  311. data/src/core/transport/chttp2/alpn.c +56 -0
  312. data/src/core/transport/chttp2/alpn.h +49 -0
  313. data/src/core/transport/chttp2/bin_encoder.c +285 -0
  314. data/src/core/transport/chttp2/bin_encoder.h +54 -0
  315. data/src/core/transport/chttp2/frame.h +69 -0
  316. data/src/core/transport/chttp2/frame_data.c +245 -0
  317. data/src/core/transport/chttp2/frame_data.h +101 -0
  318. data/src/core/transport/chttp2/frame_goaway.c +193 -0
  319. data/src/core/transport/chttp2/frame_goaway.h +77 -0
  320. data/src/core/transport/chttp2/frame_ping.c +97 -0
  321. data/src/core/transport/chttp2/frame_ping.h +56 -0
  322. data/src/core/transport/chttp2/frame_rst_stream.c +100 -0
  323. data/src/core/transport/chttp2/frame_rst_stream.h +55 -0
  324. data/src/core/transport/chttp2/frame_settings.c +259 -0
  325. data/src/core/transport/chttp2/frame_settings.h +103 -0
  326. data/src/core/transport/chttp2/frame_window_update.c +114 -0
  327. data/src/core/transport/chttp2/frame_window_update.h +58 -0
  328. data/src/core/transport/chttp2/hpack_encoder.c +572 -0
  329. data/src/core/transport/chttp2/hpack_encoder.h +95 -0
  330. data/src/core/transport/chttp2/hpack_parser.c +1449 -0
  331. data/src/core/transport/chttp2/hpack_parser.h +116 -0
  332. data/src/core/transport/chttp2/hpack_table.c +361 -0
  333. data/src/core/transport/chttp2/hpack_table.h +108 -0
  334. data/src/core/transport/chttp2/http2_errors.h +56 -0
  335. data/src/core/transport/chttp2/huffsyms.c +297 -0
  336. data/src/core/transport/chttp2/huffsyms.h +48 -0
  337. data/src/core/transport/chttp2/incoming_metadata.c +96 -0
  338. data/src/core/transport/chttp2/incoming_metadata.h +60 -0
  339. data/src/core/transport/chttp2/internal.h +757 -0
  340. data/src/core/transport/chttp2/parsing.c +866 -0
  341. data/src/core/transport/chttp2/status_conversion.c +109 -0
  342. data/src/core/transport/chttp2/status_conversion.h +50 -0
  343. data/src/core/transport/chttp2/stream_lists.c +401 -0
  344. data/src/core/transport/chttp2/stream_map.c +198 -0
  345. data/src/core/transport/chttp2/stream_map.h +85 -0
  346. data/src/core/transport/chttp2/timeout_encoding.c +185 -0
  347. data/src/core/transport/chttp2/timeout_encoding.h +47 -0
  348. data/src/core/transport/chttp2/varint.c +66 -0
  349. data/src/core/transport/chttp2/varint.h +76 -0
  350. data/src/core/transport/chttp2/writing.c +356 -0
  351. data/src/core/transport/chttp2_transport.c +1692 -0
  352. data/src/core/transport/chttp2_transport.h +51 -0
  353. data/src/core/transport/connectivity_state.c +164 -0
  354. data/src/core/transport/connectivity_state.h +85 -0
  355. data/src/core/transport/metadata.c +690 -0
  356. data/src/core/transport/metadata.h +156 -0
  357. data/src/core/transport/metadata_batch.c +194 -0
  358. data/src/core/transport/metadata_batch.h +125 -0
  359. data/src/core/transport/static_metadata.c +90 -0
  360. data/src/core/transport/static_metadata.h +408 -0
  361. data/src/core/transport/transport.c +183 -0
  362. data/src/core/transport/transport.h +222 -0
  363. data/src/core/transport/transport_impl.h +78 -0
  364. data/src/core/transport/transport_op_string.c +140 -0
  365. data/src/core/tsi/fake_transport_security.c +525 -0
  366. data/src/core/tsi/fake_transport_security.h +61 -0
  367. data/src/core/tsi/ssl_transport_security.c +1467 -0
  368. data/src/core/tsi/ssl_transport_security.h +173 -0
  369. data/src/core/tsi/transport_security.c +284 -0
  370. data/src/core/tsi/transport_security.h +111 -0
  371. data/src/core/tsi/transport_security_interface.h +344 -0
  372. data/{bin → src/ruby/bin}/apis/google/protobuf/empty.rb +0 -0
  373. data/{bin → src/ruby/bin}/apis/pubsub_demo.rb +7 -15
  374. data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub.rb +0 -0
  375. data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub_services.rb +0 -0
  376. data/{bin → src/ruby/bin}/grpc_ruby_interop_client +0 -0
  377. data/{bin → src/ruby/bin}/grpc_ruby_interop_server +0 -0
  378. data/{bin → src/ruby/bin}/interop/interop_client.rb +0 -0
  379. data/{bin → src/ruby/bin}/interop/interop_server.rb +0 -0
  380. data/src/ruby/bin/math.rb +32 -0
  381. data/{bin → src/ruby/bin}/math_client.rb +1 -1
  382. data/{bin → src/ruby/bin}/math_server.rb +1 -1
  383. data/src/ruby/bin/math_services.rb +27 -0
  384. data/{bin → src/ruby/bin}/noproto_client.rb +1 -1
  385. data/{bin → src/ruby/bin}/noproto_server.rb +1 -1
  386. data/{ext → src/ruby/ext}/grpc/extconf.rb +24 -40
  387. data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.c +0 -0
  388. data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.h +0 -0
  389. data/{ext → src/ruby/ext}/grpc/rb_call.c +80 -18
  390. data/{ext → src/ruby/ext}/grpc/rb_call.h +6 -0
  391. data/src/ruby/ext/grpc/rb_call_credentials.c +315 -0
  392. data/src/ruby/ext/grpc/rb_call_credentials.h +46 -0
  393. data/{ext → src/ruby/ext}/grpc/rb_channel.c +19 -7
  394. data/{ext → src/ruby/ext}/grpc/rb_channel.h +0 -0
  395. data/{ext → src/ruby/ext}/grpc/rb_channel_args.c +2 -0
  396. data/{ext → src/ruby/ext}/grpc/rb_channel_args.h +0 -0
  397. data/src/ruby/ext/grpc/rb_channel_credentials.c +266 -0
  398. data/{ext/grpc/rb_credentials.h → src/ruby/ext/grpc/rb_channel_credentials.h} +3 -3
  399. data/{ext → src/ruby/ext}/grpc/rb_completion_queue.c +3 -1
  400. data/{ext → src/ruby/ext}/grpc/rb_completion_queue.h +0 -0
  401. data/src/ruby/ext/grpc/rb_event_thread.c +153 -0
  402. data/src/ruby/ext/grpc/rb_event_thread.h +37 -0
  403. data/{ext → src/ruby/ext}/grpc/rb_grpc.c +25 -5
  404. data/{ext → src/ruby/ext}/grpc/rb_grpc.h +0 -0
  405. data/{ext → src/ruby/ext}/grpc/rb_server.c +4 -1
  406. data/{ext → src/ruby/ext}/grpc/rb_server.h +0 -0
  407. data/{ext → src/ruby/ext}/grpc/rb_server_credentials.c +2 -0
  408. data/{ext → src/ruby/ext}/grpc/rb_server_credentials.h +0 -0
  409. data/{lib → src/ruby/lib}/grpc.rb +6 -1
  410. data/{lib → src/ruby/lib}/grpc/core/time_consts.rb +0 -0
  411. data/{lib → src/ruby/lib}/grpc/errors.rb +0 -0
  412. data/{lib → src/ruby/lib}/grpc/generic/active_call.rb +4 -6
  413. data/{lib → src/ruby/lib}/grpc/generic/bidi_call.rb +16 -4
  414. data/{lib → src/ruby/lib}/grpc/generic/client_stub.rb +42 -52
  415. data/{lib → src/ruby/lib}/grpc/generic/rpc_desc.rb +0 -0
  416. data/{lib → src/ruby/lib}/grpc/generic/rpc_server.rb +15 -8
  417. data/{lib → src/ruby/lib}/grpc/generic/service.rb +4 -2
  418. data/src/ruby/lib/grpc/grpc.so +0 -0
  419. data/{lib → src/ruby/lib}/grpc/logconfig.rb +0 -0
  420. data/{lib → src/ruby/lib}/grpc/notifier.rb +0 -0
  421. data/{lib → src/ruby/lib}/grpc/version.rb +2 -2
  422. data/src/ruby/pb/README.md +42 -0
  423. data/src/ruby/pb/generate_proto_ruby.sh +51 -0
  424. data/src/ruby/pb/grpc/health/checker.rb +75 -0
  425. data/src/ruby/pb/grpc/health/v1alpha/health.rb +29 -0
  426. data/src/ruby/pb/grpc/health/v1alpha/health_services.rb +28 -0
  427. data/src/ruby/pb/test/client.rb +469 -0
  428. data/src/ruby/pb/test/proto/empty.rb +15 -0
  429. data/src/ruby/pb/test/proto/messages.rb +80 -0
  430. data/src/ruby/pb/test/proto/test.rb +14 -0
  431. data/src/ruby/pb/test/proto/test_services.rb +64 -0
  432. data/src/ruby/pb/test/server.rb +253 -0
  433. data/{bin/math_services.rb → src/ruby/spec/call_credentials_spec.rb} +19 -18
  434. data/{spec → src/ruby/spec}/call_spec.rb +10 -1
  435. data/{spec/credentials_spec.rb → src/ruby/spec/channel_credentials_spec.rb} +38 -12
  436. data/{spec → src/ruby/spec}/channel_spec.rb +14 -9
  437. data/{spec → src/ruby/spec}/client_server_spec.rb +31 -2
  438. data/{spec → src/ruby/spec}/completion_queue_spec.rb +0 -0
  439. data/{spec → src/ruby/spec}/generic/active_call_spec.rb +2 -1
  440. data/{spec → src/ruby/spec}/generic/client_stub_spec.rb +27 -67
  441. data/{spec → src/ruby/spec}/generic/rpc_desc_spec.rb +0 -0
  442. data/{spec → src/ruby/spec}/generic/rpc_server_pool_spec.rb +0 -0
  443. data/{spec → src/ruby/spec}/generic/rpc_server_spec.rb +12 -46
  444. data/{spec → src/ruby/spec}/generic/service_spec.rb +6 -3
  445. data/{spec → src/ruby/spec}/pb/health/checker_spec.rb +8 -8
  446. data/{spec → src/ruby/spec}/server_credentials_spec.rb +0 -0
  447. data/{spec → src/ruby/spec}/server_spec.rb +0 -0
  448. data/{spec → src/ruby/spec}/spec_helper.rb +0 -0
  449. data/{spec → src/ruby/spec}/testdata/README +0 -0
  450. data/{spec → src/ruby/spec}/testdata/ca.pem +0 -0
  451. data/{spec → src/ruby/spec}/testdata/server1.key +0 -0
  452. data/src/ruby/spec/testdata/server1.pem +16 -0
  453. data/{spec → src/ruby/spec}/time_consts_spec.rb +0 -0
  454. metadata +496 -97
  455. data/bin/math.proto +0 -80
  456. data/bin/math.rb +0 -61
  457. data/ext/grpc/rb_credentials.c +0 -294
  458. data/lib/grpc/grpc.so +0 -0
  459. data/spec/testdata/server1.pem +0 -16
@@ -0,0 +1,537 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
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.
19
+ *
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.
31
+ *
32
+ */
33
+
34
+ #include "src/core/client_config/lb_policies/round_robin.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include <grpc/support/alloc.h>
39
+ #include "src/core/transport/connectivity_state.h"
40
+
41
+ typedef struct round_robin_lb_policy round_robin_lb_policy;
42
+
43
+ int grpc_lb_round_robin_trace = 0;
44
+
45
+ /** List of entities waiting for a pick.
46
+ *
47
+ * Once a pick is available, \a target is updated and \a on_complete called. */
48
+ typedef struct pending_pick {
49
+ struct pending_pick *next;
50
+ grpc_pollset *pollset;
51
+ grpc_connected_subchannel **target;
52
+ grpc_closure *on_complete;
53
+ } pending_pick;
54
+
55
+ /** List of subchannels in a connectivity READY state */
56
+ typedef struct ready_list {
57
+ grpc_subchannel *subchannel;
58
+ struct ready_list *next;
59
+ struct ready_list *prev;
60
+ } ready_list;
61
+
62
+ typedef struct {
63
+ /** index within policy->subchannels */
64
+ size_t index;
65
+ /** backpointer to owning policy */
66
+ round_robin_lb_policy *policy;
67
+ /** subchannel itself */
68
+ grpc_subchannel *subchannel;
69
+ /** notification that connectivity has changed on subchannel */
70
+ grpc_closure connectivity_changed_closure;
71
+ /** this subchannels current position in subchannel->ready_list */
72
+ ready_list *ready_list_node;
73
+ /** last observed connectivity */
74
+ grpc_connectivity_state connectivity_state;
75
+ } subchannel_data;
76
+
77
+ struct round_robin_lb_policy {
78
+ /** base policy: must be first */
79
+ grpc_lb_policy base;
80
+
81
+ /** all our subchannels */
82
+ size_t num_subchannels;
83
+ subchannel_data **subchannels;
84
+
85
+ /** mutex protecting remaining members */
86
+ gpr_mu mu;
87
+ /** have we started picking? */
88
+ int started_picking;
89
+ /** are we shutting down? */
90
+ int shutdown;
91
+ /** List of picks that are waiting on connectivity */
92
+ pending_pick *pending_picks;
93
+
94
+ /** our connectivity state tracker */
95
+ grpc_connectivity_state_tracker state_tracker;
96
+
97
+ /** (Dummy) root of the doubly linked list containing READY subchannels */
98
+ ready_list ready_list;
99
+ /** Last pick from the ready list. */
100
+ ready_list *ready_list_last_pick;
101
+ };
102
+
103
+ /** Returns the next subchannel from the connected list or NULL if the list is
104
+ * empty.
105
+ *
106
+ * Note that this function does *not* advance p->ready_list_last_pick. Use \a
107
+ * advance_last_picked_locked() for that. */
108
+ static ready_list *peek_next_connected_locked(const round_robin_lb_policy *p) {
109
+ ready_list *selected;
110
+ selected = p->ready_list_last_pick->next;
111
+
112
+ while (selected != NULL) {
113
+ if (selected == &p->ready_list) {
114
+ GPR_ASSERT(selected->subchannel == NULL);
115
+ /* skip dummy root */
116
+ selected = selected->next;
117
+ } else {
118
+ GPR_ASSERT(selected->subchannel != NULL);
119
+ return selected;
120
+ }
121
+ }
122
+ return NULL;
123
+ }
124
+
125
+ /** Advance the \a ready_list picking head. */
126
+ static void advance_last_picked_locked(round_robin_lb_policy *p) {
127
+ if (p->ready_list_last_pick->next != NULL) { /* non-empty list */
128
+ p->ready_list_last_pick = p->ready_list_last_pick->next;
129
+ if (p->ready_list_last_pick == &p->ready_list) {
130
+ /* skip dummy root */
131
+ p->ready_list_last_pick = p->ready_list_last_pick->next;
132
+ }
133
+ } else { /* should be an empty list */
134
+ GPR_ASSERT(p->ready_list_last_pick == &p->ready_list);
135
+ }
136
+
137
+ if (grpc_lb_round_robin_trace) {
138
+ gpr_log(GPR_DEBUG, "[READYLIST] ADVANCED LAST PICK. NOW AT NODE %p (SC %p)",
139
+ p->ready_list_last_pick, p->ready_list_last_pick->subchannel);
140
+ }
141
+ }
142
+
143
+ /** Prepends (relative to the root at p->ready_list) the connected subchannel \a
144
+ * csc to the list of ready subchannels. */
145
+ static ready_list *add_connected_sc_locked(round_robin_lb_policy *p,
146
+ grpc_subchannel *sc) {
147
+ ready_list *new_elem = gpr_malloc(sizeof(ready_list));
148
+ new_elem->subchannel = sc;
149
+ if (p->ready_list.prev == NULL) {
150
+ /* first element */
151
+ new_elem->next = &p->ready_list;
152
+ new_elem->prev = &p->ready_list;
153
+ p->ready_list.next = new_elem;
154
+ p->ready_list.prev = new_elem;
155
+ } else {
156
+ new_elem->next = &p->ready_list;
157
+ new_elem->prev = p->ready_list.prev;
158
+ p->ready_list.prev->next = new_elem;
159
+ p->ready_list.prev = new_elem;
160
+ }
161
+ if (grpc_lb_round_robin_trace) {
162
+ gpr_log(GPR_DEBUG, "[READYLIST] ADDING NODE %p (SC %p)", new_elem, sc);
163
+ }
164
+ return new_elem;
165
+ }
166
+
167
+ /** Removes \a node from the list of connected subchannels */
168
+ static void remove_disconnected_sc_locked(round_robin_lb_policy *p,
169
+ ready_list *node) {
170
+ if (node == NULL) {
171
+ return;
172
+ }
173
+ if (node == p->ready_list_last_pick) {
174
+ /* If removing the lastly picked node, reset the last pick pointer to the
175
+ * dummy root of the list */
176
+ p->ready_list_last_pick = &p->ready_list;
177
+ }
178
+
179
+ /* removing last item */
180
+ if (node->next == &p->ready_list && node->prev == &p->ready_list) {
181
+ GPR_ASSERT(p->ready_list.next == node);
182
+ GPR_ASSERT(p->ready_list.prev == node);
183
+ p->ready_list.next = NULL;
184
+ p->ready_list.prev = NULL;
185
+ } else {
186
+ node->prev->next = node->next;
187
+ node->next->prev = node->prev;
188
+ }
189
+
190
+ if (grpc_lb_round_robin_trace) {
191
+ gpr_log(GPR_DEBUG, "[READYLIST] REMOVED NODE %p (SC %p)", node,
192
+ node->subchannel);
193
+ }
194
+
195
+ node->next = NULL;
196
+ node->prev = NULL;
197
+ node->subchannel = NULL;
198
+
199
+ gpr_free(node);
200
+ }
201
+
202
+ void rr_destroy(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
203
+ round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
204
+ size_t i;
205
+ ready_list *elem;
206
+ for (i = 0; i < p->num_subchannels; i++) {
207
+ subchannel_data *sd = p->subchannels[i];
208
+ GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "round_robin");
209
+ gpr_free(sd);
210
+ }
211
+
212
+ grpc_connectivity_state_destroy(exec_ctx, &p->state_tracker);
213
+ gpr_free(p->subchannels);
214
+ gpr_mu_destroy(&p->mu);
215
+
216
+ elem = p->ready_list.next;
217
+ while (elem != NULL && elem != &p->ready_list) {
218
+ ready_list *tmp;
219
+ tmp = elem->next;
220
+ elem->next = NULL;
221
+ elem->prev = NULL;
222
+ elem->subchannel = NULL;
223
+ gpr_free(elem);
224
+ elem = tmp;
225
+ }
226
+ gpr_free(p);
227
+ }
228
+
229
+ void rr_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
230
+ round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
231
+ pending_pick *pp;
232
+ size_t i;
233
+
234
+ gpr_mu_lock(&p->mu);
235
+
236
+ p->shutdown = 1;
237
+ while ((pp = p->pending_picks)) {
238
+ p->pending_picks = pp->next;
239
+ *pp->target = NULL;
240
+ grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, 0);
241
+ gpr_free(pp);
242
+ }
243
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
244
+ GRPC_CHANNEL_FATAL_FAILURE, "shutdown");
245
+ for (i = 0; i < p->num_subchannels; i++) {
246
+ subchannel_data *sd = p->subchannels[i];
247
+ grpc_subchannel_notify_on_state_change(exec_ctx, sd->subchannel, NULL, NULL,
248
+ &sd->connectivity_changed_closure);
249
+ }
250
+ gpr_mu_unlock(&p->mu);
251
+ }
252
+
253
+ static void rr_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
254
+ grpc_connected_subchannel **target) {
255
+ round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
256
+ pending_pick *pp;
257
+ gpr_mu_lock(&p->mu);
258
+ pp = p->pending_picks;
259
+ p->pending_picks = NULL;
260
+ while (pp != NULL) {
261
+ pending_pick *next = pp->next;
262
+ if (pp->target == target) {
263
+ grpc_pollset_set_del_pollset(exec_ctx, &p->base.interested_parties,
264
+ pp->pollset);
265
+ *target = NULL;
266
+ grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, 0);
267
+ gpr_free(pp);
268
+ } else {
269
+ pp->next = p->pending_picks;
270
+ p->pending_picks = pp;
271
+ }
272
+ pp = next;
273
+ }
274
+ gpr_mu_unlock(&p->mu);
275
+ }
276
+
277
+ static void start_picking(grpc_exec_ctx *exec_ctx, round_robin_lb_policy *p) {
278
+ size_t i;
279
+ p->started_picking = 1;
280
+
281
+ gpr_log(GPR_DEBUG, "LB_POLICY: p=%p num_subchannels=%d", p,
282
+ p->num_subchannels);
283
+
284
+ for (i = 0; i < p->num_subchannels; i++) {
285
+ subchannel_data *sd = p->subchannels[i];
286
+ sd->connectivity_state = GRPC_CHANNEL_IDLE;
287
+ grpc_subchannel_notify_on_state_change(
288
+ exec_ctx, sd->subchannel, &p->base.interested_parties,
289
+ &sd->connectivity_state, &sd->connectivity_changed_closure);
290
+ GRPC_LB_POLICY_WEAK_REF(&p->base, "round_robin_connectivity");
291
+ }
292
+ }
293
+
294
+ void rr_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
295
+ round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
296
+ gpr_mu_lock(&p->mu);
297
+ if (!p->started_picking) {
298
+ start_picking(exec_ctx, p);
299
+ }
300
+ gpr_mu_unlock(&p->mu);
301
+ }
302
+
303
+ int rr_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, grpc_pollset *pollset,
304
+ grpc_metadata_batch *initial_metadata,
305
+ grpc_connected_subchannel **target, grpc_closure *on_complete) {
306
+ round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
307
+ pending_pick *pp;
308
+ ready_list *selected;
309
+ gpr_mu_lock(&p->mu);
310
+ if ((selected = peek_next_connected_locked(p))) {
311
+ gpr_mu_unlock(&p->mu);
312
+ *target = grpc_subchannel_get_connected_subchannel(selected->subchannel);
313
+ if (grpc_lb_round_robin_trace) {
314
+ gpr_log(GPR_DEBUG,
315
+ "[RR PICK] TARGET <-- CONNECTED SUBCHANNEL %p (NODE %p)",
316
+ selected->subchannel, selected);
317
+ }
318
+ /* only advance the last picked pointer if the selection was used */
319
+ advance_last_picked_locked(p);
320
+ return 1;
321
+ } else {
322
+ if (!p->started_picking) {
323
+ start_picking(exec_ctx, p);
324
+ }
325
+ grpc_pollset_set_add_pollset(exec_ctx, &p->base.interested_parties,
326
+ pollset);
327
+ pp = gpr_malloc(sizeof(*pp));
328
+ pp->next = p->pending_picks;
329
+ pp->pollset = pollset;
330
+ pp->target = target;
331
+ pp->on_complete = on_complete;
332
+ p->pending_picks = pp;
333
+ gpr_mu_unlock(&p->mu);
334
+ return 0;
335
+ }
336
+ }
337
+
338
+ static void rr_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
339
+ int iomgr_success) {
340
+ subchannel_data *sd = arg;
341
+ round_robin_lb_policy *p = sd->policy;
342
+ pending_pick *pp;
343
+ ready_list *selected;
344
+
345
+ int unref = 0;
346
+
347
+ gpr_mu_lock(&p->mu);
348
+
349
+ if (p->shutdown) {
350
+ unref = 1;
351
+ } else {
352
+ switch (sd->connectivity_state) {
353
+ case GRPC_CHANNEL_READY:
354
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
355
+ GRPC_CHANNEL_READY, "connecting_ready");
356
+ /* add the newly connected subchannel to the list of connected ones.
357
+ * Note that it goes to the "end of the line". */
358
+ sd->ready_list_node = add_connected_sc_locked(p, sd->subchannel);
359
+ /* at this point we know there's at least one suitable subchannel. Go
360
+ * ahead and pick one and notify the pending suitors in
361
+ * p->pending_picks. This preemtively replicates rr_pick()'s actions. */
362
+ selected = peek_next_connected_locked(p);
363
+ if (p->pending_picks != NULL) {
364
+ /* if the selected subchannel is going to be used for the pending
365
+ * picks, update the last picked pointer */
366
+ advance_last_picked_locked(p);
367
+ }
368
+ while ((pp = p->pending_picks)) {
369
+ p->pending_picks = pp->next;
370
+ *pp->target =
371
+ grpc_subchannel_get_connected_subchannel(selected->subchannel);
372
+ if (grpc_lb_round_robin_trace) {
373
+ gpr_log(GPR_DEBUG,
374
+ "[RR CONN CHANGED] TARGET <-- SUBCHANNEL %p (NODE %p)",
375
+ selected->subchannel, selected);
376
+ }
377
+ grpc_pollset_set_del_pollset(exec_ctx, &p->base.interested_parties,
378
+ pp->pollset);
379
+ grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, 1);
380
+ gpr_free(pp);
381
+ }
382
+ grpc_subchannel_notify_on_state_change(
383
+ exec_ctx, sd->subchannel, &p->base.interested_parties,
384
+ &sd->connectivity_state, &sd->connectivity_changed_closure);
385
+ break;
386
+ case GRPC_CHANNEL_CONNECTING:
387
+ case GRPC_CHANNEL_IDLE:
388
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
389
+ sd->connectivity_state,
390
+ "connecting_changed");
391
+ grpc_subchannel_notify_on_state_change(
392
+ exec_ctx, sd->subchannel, &p->base.interested_parties,
393
+ &sd->connectivity_state, &sd->connectivity_changed_closure);
394
+ break;
395
+ case GRPC_CHANNEL_TRANSIENT_FAILURE:
396
+ /* renew state notification */
397
+ grpc_subchannel_notify_on_state_change(
398
+ exec_ctx, sd->subchannel, &p->base.interested_parties,
399
+ &sd->connectivity_state, &sd->connectivity_changed_closure);
400
+
401
+ /* remove from ready list if still present */
402
+ if (sd->ready_list_node != NULL) {
403
+ remove_disconnected_sc_locked(p, sd->ready_list_node);
404
+ sd->ready_list_node = NULL;
405
+ }
406
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
407
+ GRPC_CHANNEL_TRANSIENT_FAILURE,
408
+ "connecting_transient_failure");
409
+ break;
410
+ case GRPC_CHANNEL_FATAL_FAILURE:
411
+ if (sd->ready_list_node != NULL) {
412
+ remove_disconnected_sc_locked(p, sd->ready_list_node);
413
+ sd->ready_list_node = NULL;
414
+ }
415
+
416
+ p->num_subchannels--;
417
+ GPR_SWAP(subchannel_data *, p->subchannels[sd->index],
418
+ p->subchannels[p->num_subchannels]);
419
+ GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "round_robin");
420
+ p->subchannels[sd->index]->index = sd->index;
421
+ gpr_free(sd);
422
+
423
+ unref = 1;
424
+ if (p->num_subchannels == 0) {
425
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
426
+ GRPC_CHANNEL_FATAL_FAILURE,
427
+ "no_more_channels");
428
+ while ((pp = p->pending_picks)) {
429
+ p->pending_picks = pp->next;
430
+ *pp->target = NULL;
431
+ grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, 1);
432
+ gpr_free(pp);
433
+ }
434
+ } else {
435
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
436
+ GRPC_CHANNEL_TRANSIENT_FAILURE,
437
+ "subchannel_failed");
438
+ }
439
+ } /* switch */
440
+ } /* !unref */
441
+
442
+ gpr_mu_unlock(&p->mu);
443
+
444
+ if (unref) {
445
+ GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "round_robin_connectivity");
446
+ }
447
+ }
448
+
449
+ static grpc_connectivity_state rr_check_connectivity(grpc_exec_ctx *exec_ctx,
450
+ grpc_lb_policy *pol) {
451
+ round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
452
+ grpc_connectivity_state st;
453
+ gpr_mu_lock(&p->mu);
454
+ st = grpc_connectivity_state_check(&p->state_tracker);
455
+ gpr_mu_unlock(&p->mu);
456
+ return st;
457
+ }
458
+
459
+ static void rr_notify_on_state_change(grpc_exec_ctx *exec_ctx,
460
+ grpc_lb_policy *pol,
461
+ grpc_connectivity_state *current,
462
+ grpc_closure *notify) {
463
+ round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
464
+ gpr_mu_lock(&p->mu);
465
+ grpc_connectivity_state_notify_on_state_change(exec_ctx, &p->state_tracker,
466
+ current, notify);
467
+ gpr_mu_unlock(&p->mu);
468
+ }
469
+
470
+ static void rr_ping_one(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
471
+ grpc_closure *closure) {
472
+ round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
473
+ ready_list *selected;
474
+ grpc_connected_subchannel *target;
475
+ gpr_mu_lock(&p->mu);
476
+ if ((selected = peek_next_connected_locked(p))) {
477
+ gpr_mu_unlock(&p->mu);
478
+ target = grpc_subchannel_get_connected_subchannel(selected->subchannel);
479
+ grpc_connected_subchannel_ping(exec_ctx, target, closure);
480
+ } else {
481
+ gpr_mu_unlock(&p->mu);
482
+ grpc_exec_ctx_enqueue(exec_ctx, closure, 0);
483
+ }
484
+ }
485
+
486
+ static const grpc_lb_policy_vtable round_robin_lb_policy_vtable = {
487
+ rr_destroy, rr_shutdown, rr_pick, rr_cancel_pick, rr_ping_one, rr_exit_idle,
488
+ rr_check_connectivity, rr_notify_on_state_change};
489
+
490
+ static void round_robin_factory_ref(grpc_lb_policy_factory *factory) {}
491
+
492
+ static void round_robin_factory_unref(grpc_lb_policy_factory *factory) {}
493
+
494
+ static grpc_lb_policy *create_round_robin(grpc_lb_policy_factory *factory,
495
+ grpc_lb_policy_args *args) {
496
+ size_t i;
497
+ round_robin_lb_policy *p = gpr_malloc(sizeof(*p));
498
+ GPR_ASSERT(args->num_subchannels > 0);
499
+ memset(p, 0, sizeof(*p));
500
+ grpc_lb_policy_init(&p->base, &round_robin_lb_policy_vtable);
501
+ p->num_subchannels = args->num_subchannels;
502
+ p->subchannels = gpr_malloc(sizeof(*p->subchannels) * p->num_subchannels);
503
+ memset(p->subchannels, 0, sizeof(*p->subchannels) * p->num_subchannels);
504
+ grpc_connectivity_state_init(&p->state_tracker, GRPC_CHANNEL_IDLE,
505
+ "round_robin");
506
+
507
+ gpr_mu_init(&p->mu);
508
+ for (i = 0; i < args->num_subchannels; i++) {
509
+ subchannel_data *sd = gpr_malloc(sizeof(*sd));
510
+ memset(sd, 0, sizeof(*sd));
511
+ p->subchannels[i] = sd;
512
+ sd->policy = p;
513
+ sd->index = i;
514
+ sd->subchannel = args->subchannels[i];
515
+ grpc_closure_init(&sd->connectivity_changed_closure,
516
+ rr_connectivity_changed, sd);
517
+ }
518
+
519
+ /* The (dummy node) root of the ready list */
520
+ p->ready_list.subchannel = NULL;
521
+ p->ready_list.prev = NULL;
522
+ p->ready_list.next = NULL;
523
+ p->ready_list_last_pick = &p->ready_list;
524
+
525
+ return &p->base;
526
+ }
527
+
528
+ static const grpc_lb_policy_factory_vtable round_robin_factory_vtable = {
529
+ round_robin_factory_ref, round_robin_factory_unref, create_round_robin,
530
+ "round_robin"};
531
+
532
+ static grpc_lb_policy_factory round_robin_lb_policy_factory = {
533
+ &round_robin_factory_vtable};
534
+
535
+ grpc_lb_policy_factory *grpc_round_robin_lb_factory_create() {
536
+ return &round_robin_lb_policy_factory;
537
+ }