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,63 @@
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
+ #ifndef GRPC_INTERNAL_CORE_CHANNEL_CLIENT_CHANNEL_H
35
+ #define GRPC_INTERNAL_CORE_CHANNEL_CLIENT_CHANNEL_H
36
+
37
+ #include "src/core/channel/channel_stack.h"
38
+ #include "src/core/client_config/resolver.h"
39
+
40
+ /* A client channel is a channel that begins disconnected, and can connect
41
+ to some endpoint on demand. If that endpoint disconnects, it will be
42
+ connected to again later.
43
+
44
+ Calls on a disconnected client channel are queued until a connection is
45
+ established. */
46
+
47
+ extern const grpc_channel_filter grpc_client_channel_filter;
48
+
49
+ /* post-construction initializer to let the client channel know which
50
+ transport setup it should cancel upon destruction, or initiate when it needs
51
+ a connection */
52
+ void grpc_client_channel_set_resolver(grpc_exec_ctx *exec_ctx,
53
+ grpc_channel_stack *channel_stack,
54
+ grpc_resolver *resolver);
55
+
56
+ grpc_connectivity_state grpc_client_channel_check_connectivity_state(
57
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, int try_to_connect);
58
+
59
+ void grpc_client_channel_watch_connectivity_state(
60
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, grpc_pollset *pollset,
61
+ grpc_connectivity_state *state, grpc_closure *on_complete);
62
+
63
+ #endif /* GRPC_INTERNAL_CORE_CHANNEL_CLIENT_CHANNEL_H */
@@ -0,0 +1,243 @@
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/channel/client_uchannel.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include "src/core/census/grpc_filter.h"
39
+ #include "src/core/channel/channel_args.h"
40
+ #include "src/core/channel/client_channel.h"
41
+ #include "src/core/channel/compress_filter.h"
42
+ #include "src/core/channel/subchannel_call_holder.h"
43
+ #include "src/core/iomgr/iomgr.h"
44
+ #include "src/core/support/string.h"
45
+ #include "src/core/surface/channel.h"
46
+ #include "src/core/transport/connectivity_state.h"
47
+
48
+ #include <grpc/support/alloc.h>
49
+ #include <grpc/support/log.h>
50
+ #include <grpc/support/sync.h>
51
+ #include <grpc/support/useful.h>
52
+
53
+ /** Microchannel (uchannel) implementation: a lightweight channel without any
54
+ * load-balancing mechanisms meant for communication from within the core. */
55
+
56
+ typedef struct client_uchannel_channel_data {
57
+ /** master channel - the grpc_channel instance that ultimately owns
58
+ this channel_data via its channel stack.
59
+ We occasionally use this to bump the refcount on the master channel
60
+ to keep ourselves alive through an asynchronous operation. */
61
+ grpc_channel_stack *owning_stack;
62
+
63
+ /** connectivity state being tracked */
64
+ grpc_connectivity_state_tracker state_tracker;
65
+
66
+ /** the subchannel wrapped by the microchannel */
67
+ grpc_connected_subchannel *connected_subchannel;
68
+
69
+ /** the callback used to stay subscribed to subchannel connectivity
70
+ * notifications */
71
+ grpc_closure connectivity_cb;
72
+
73
+ /** the current connectivity state of the wrapped subchannel */
74
+ grpc_connectivity_state subchannel_connectivity;
75
+
76
+ gpr_mu mu_state;
77
+ } channel_data;
78
+
79
+ typedef grpc_subchannel_call_holder call_data;
80
+
81
+ static void monitor_subchannel(grpc_exec_ctx *exec_ctx, void *arg,
82
+ int iomgr_success) {
83
+ channel_data *chand = arg;
84
+ grpc_connectivity_state_set(exec_ctx, &chand->state_tracker,
85
+ chand->subchannel_connectivity,
86
+ "uchannel_monitor_subchannel");
87
+ grpc_connected_subchannel_notify_on_state_change(
88
+ exec_ctx, chand->connected_subchannel, NULL,
89
+ &chand->subchannel_connectivity, &chand->connectivity_cb);
90
+ }
91
+
92
+ static char *cuc_get_peer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) {
93
+ return grpc_subchannel_call_holder_get_peer(exec_ctx, elem->call_data);
94
+ }
95
+
96
+ static void cuc_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
97
+ grpc_call_element *elem,
98
+ grpc_transport_stream_op *op) {
99
+ GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
100
+ grpc_subchannel_call_holder_perform_op(exec_ctx, elem->call_data, op);
101
+ }
102
+
103
+ static void cuc_start_transport_op(grpc_exec_ctx *exec_ctx,
104
+ grpc_channel_element *elem,
105
+ grpc_transport_op *op) {
106
+ channel_data *chand = elem->channel_data;
107
+
108
+ grpc_exec_ctx_enqueue(exec_ctx, op->on_consumed, 1);
109
+
110
+ GPR_ASSERT(op->set_accept_stream == NULL);
111
+ GPR_ASSERT(op->bind_pollset == NULL);
112
+
113
+ if (op->on_connectivity_state_change != NULL) {
114
+ grpc_connectivity_state_notify_on_state_change(
115
+ exec_ctx, &chand->state_tracker, op->connectivity_state,
116
+ op->on_connectivity_state_change);
117
+ op->on_connectivity_state_change = NULL;
118
+ op->connectivity_state = NULL;
119
+ }
120
+
121
+ if (op->disconnect) {
122
+ grpc_connectivity_state_set(exec_ctx, &chand->state_tracker,
123
+ GRPC_CHANNEL_FATAL_FAILURE, "disconnect");
124
+ }
125
+ }
126
+
127
+ static int cuc_pick_subchannel(grpc_exec_ctx *exec_ctx, void *arg,
128
+ grpc_metadata_batch *initial_metadata,
129
+ grpc_connected_subchannel **connected_subchannel,
130
+ grpc_closure *on_ready) {
131
+ channel_data *chand = arg;
132
+ GPR_ASSERT(initial_metadata != NULL);
133
+ *connected_subchannel = chand->connected_subchannel;
134
+ return 1;
135
+ }
136
+
137
+ /* Constructor for call_data */
138
+ static void cuc_init_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
139
+ grpc_call_element_args *args) {
140
+ grpc_subchannel_call_holder_init(elem->call_data, cuc_pick_subchannel,
141
+ elem->channel_data, args->call_stack);
142
+ }
143
+
144
+ /* Destructor for call_data */
145
+ static void cuc_destroy_call_elem(grpc_exec_ctx *exec_ctx,
146
+ grpc_call_element *elem) {
147
+ grpc_subchannel_call_holder_destroy(exec_ctx, elem->call_data);
148
+ }
149
+
150
+ /* Constructor for channel_data */
151
+ static void cuc_init_channel_elem(grpc_exec_ctx *exec_ctx,
152
+ grpc_channel_element *elem,
153
+ grpc_channel_element_args *args) {
154
+ channel_data *chand = elem->channel_data;
155
+ memset(chand, 0, sizeof(*chand));
156
+ grpc_closure_init(&chand->connectivity_cb, monitor_subchannel, chand);
157
+ GPR_ASSERT(args->is_last);
158
+ GPR_ASSERT(elem->filter == &grpc_client_uchannel_filter);
159
+ chand->owning_stack = args->channel_stack;
160
+ grpc_connectivity_state_init(&chand->state_tracker, GRPC_CHANNEL_IDLE,
161
+ "client_uchannel");
162
+ gpr_mu_init(&chand->mu_state);
163
+ }
164
+
165
+ /* Destructor for channel_data */
166
+ static void cuc_destroy_channel_elem(grpc_exec_ctx *exec_ctx,
167
+ grpc_channel_element *elem) {
168
+ channel_data *chand = elem->channel_data;
169
+ /* cancel subscription */
170
+ grpc_connected_subchannel_notify_on_state_change(
171
+ exec_ctx, chand->connected_subchannel, NULL, NULL,
172
+ &chand->connectivity_cb);
173
+ grpc_connectivity_state_destroy(exec_ctx, &chand->state_tracker);
174
+ gpr_mu_destroy(&chand->mu_state);
175
+ GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, chand->connected_subchannel,
176
+ "uchannel");
177
+ }
178
+
179
+ static void cuc_set_pollset(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
180
+ grpc_pollset *pollset) {
181
+ call_data *calld = elem->call_data;
182
+ calld->pollset = pollset;
183
+ }
184
+
185
+ const grpc_channel_filter grpc_client_uchannel_filter = {
186
+ cuc_start_transport_stream_op, cuc_start_transport_op, sizeof(call_data),
187
+ cuc_init_call_elem, cuc_set_pollset, cuc_destroy_call_elem,
188
+ sizeof(channel_data), cuc_init_channel_elem, cuc_destroy_channel_elem,
189
+ cuc_get_peer, "client-uchannel",
190
+ };
191
+
192
+ grpc_connectivity_state grpc_client_uchannel_check_connectivity_state(
193
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, int try_to_connect) {
194
+ channel_data *chand = elem->channel_data;
195
+ grpc_connectivity_state out;
196
+ gpr_mu_lock(&chand->mu_state);
197
+ out = grpc_connectivity_state_check(&chand->state_tracker);
198
+ gpr_mu_unlock(&chand->mu_state);
199
+ return out;
200
+ }
201
+
202
+ void grpc_client_uchannel_watch_connectivity_state(
203
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, grpc_pollset *pollset,
204
+ grpc_connectivity_state *state, grpc_closure *on_complete) {
205
+ channel_data *chand = elem->channel_data;
206
+ gpr_mu_lock(&chand->mu_state);
207
+ grpc_connectivity_state_notify_on_state_change(
208
+ exec_ctx, &chand->state_tracker, state, on_complete);
209
+ gpr_mu_unlock(&chand->mu_state);
210
+ }
211
+
212
+ grpc_channel *grpc_client_uchannel_create(grpc_subchannel *subchannel,
213
+ grpc_channel_args *args) {
214
+ grpc_channel *channel = NULL;
215
+ #define MAX_FILTERS 3
216
+ const grpc_channel_filter *filters[MAX_FILTERS];
217
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
218
+ size_t n = 0;
219
+
220
+ if (grpc_channel_args_is_census_enabled(args)) {
221
+ filters[n++] = &grpc_client_census_filter;
222
+ }
223
+ filters[n++] = &grpc_compress_filter;
224
+ filters[n++] = &grpc_client_uchannel_filter;
225
+ GPR_ASSERT(n <= MAX_FILTERS);
226
+
227
+ channel =
228
+ grpc_channel_create_from_filters(&exec_ctx, NULL, filters, n, args, 1);
229
+
230
+ return channel;
231
+ }
232
+
233
+ void grpc_client_uchannel_set_connected_subchannel(
234
+ grpc_channel *uchannel, grpc_connected_subchannel *connected_subchannel) {
235
+ grpc_channel_element *elem =
236
+ grpc_channel_stack_last_element(grpc_channel_get_channel_stack(uchannel));
237
+ channel_data *chand = elem->channel_data;
238
+ GPR_ASSERT(elem->filter == &grpc_client_uchannel_filter);
239
+ gpr_mu_lock(&chand->mu_state);
240
+ chand->connected_subchannel = connected_subchannel;
241
+ GRPC_CONNECTED_SUBCHANNEL_REF(connected_subchannel, "uchannel");
242
+ gpr_mu_unlock(&chand->mu_state);
243
+ }
@@ -0,0 +1,60 @@
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
+ #ifndef GRPC_INTERNAL_CORE_CHANNEL_CLIENT_MICROCHANNEL_H
35
+ #define GRPC_INTERNAL_CORE_CHANNEL_CLIENT_MICROCHANNEL_H
36
+
37
+ #include "src/core/channel/channel_stack.h"
38
+ #include "src/core/client_config/resolver.h"
39
+
40
+ #define GRPC_MICROCHANNEL_SUBCHANNEL_ARG "grpc.microchannel_subchannel_key"
41
+
42
+ /* A client microchannel (aka uchannel) is a channel wrapping a subchannel, for
43
+ * the purposes of lightweight RPC communications from within the core.*/
44
+
45
+ extern const grpc_channel_filter grpc_client_uchannel_filter;
46
+
47
+ grpc_connectivity_state grpc_client_uchannel_check_connectivity_state(
48
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, int try_to_connect);
49
+
50
+ void grpc_client_uchannel_watch_connectivity_state(
51
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, grpc_pollset *pollset,
52
+ grpc_connectivity_state *state, grpc_closure *on_complete);
53
+
54
+ grpc_channel *grpc_client_uchannel_create(grpc_subchannel *subchannel,
55
+ grpc_channel_args *args);
56
+
57
+ void grpc_client_uchannel_set_connected_subchannel(
58
+ grpc_channel *uchannel, grpc_connected_subchannel *connected_subchannel);
59
+
60
+ #endif /* GRPC_INTERNAL_CORE_CHANNEL_CLIENT_MICROCHANNEL_H */
@@ -0,0 +1,297 @@
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 <assert.h>
35
+ #include <string.h>
36
+
37
+ #include <grpc/compression.h>
38
+ #include <grpc/support/alloc.h>
39
+ #include <grpc/support/log.h>
40
+ #include <grpc/support/slice_buffer.h>
41
+
42
+ #include "src/core/channel/channel_args.h"
43
+ #include "src/core/channel/compress_filter.h"
44
+ #include "src/core/compression/algorithm_metadata.h"
45
+ #include "src/core/compression/message_compress.h"
46
+ #include "src/core/profiling/timers.h"
47
+ #include "src/core/support/string.h"
48
+ #include "src/core/transport/static_metadata.h"
49
+
50
+ typedef struct call_data {
51
+ gpr_slice_buffer slices; /**< Buffers up input slices to be compressed */
52
+ grpc_linked_mdelem compression_algorithm_storage;
53
+ grpc_linked_mdelem accept_encoding_storage;
54
+ gpr_uint32 remaining_slice_bytes;
55
+ /** Compression algorithm we'll try to use. It may be given by incoming
56
+ * metadata, or by the channel's default compression settings. */
57
+ grpc_compression_algorithm compression_algorithm;
58
+ /** If true, contents of \a compression_algorithm are authoritative */
59
+ int has_compression_algorithm;
60
+
61
+ grpc_transport_stream_op send_op;
62
+ gpr_uint32 send_length;
63
+ gpr_uint32 send_flags;
64
+ gpr_slice incoming_slice;
65
+ grpc_slice_buffer_stream replacement_stream;
66
+ grpc_closure *post_send;
67
+ grpc_closure send_done;
68
+ grpc_closure got_slice;
69
+ } call_data;
70
+
71
+ typedef struct channel_data {
72
+ /** The default, channel-level, compression algorithm */
73
+ grpc_compression_algorithm default_compression_algorithm;
74
+ /** Compression options for the channel */
75
+ grpc_compression_options compression_options;
76
+ /** Supported compression algorithms */
77
+ gpr_uint32 supported_compression_algorithms;
78
+ } channel_data;
79
+
80
+ /** For each \a md element from the incoming metadata, filter out the entry for
81
+ * "grpc-encoding", using its value to populate the call data's
82
+ * compression_algorithm field. */
83
+ static grpc_mdelem *compression_md_filter(void *user_data, grpc_mdelem *md) {
84
+ grpc_call_element *elem = user_data;
85
+ call_data *calld = elem->call_data;
86
+ channel_data *channeld = elem->channel_data;
87
+
88
+ if (md->key == GRPC_MDSTR_GRPC_INTERNAL_ENCODING_REQUEST) {
89
+ const char *md_c_str = grpc_mdstr_as_c_string(md->value);
90
+ if (!grpc_compression_algorithm_parse(md_c_str, strlen(md_c_str),
91
+ &calld->compression_algorithm)) {
92
+ gpr_log(GPR_ERROR,
93
+ "Invalid compression algorithm: '%s' (unknown). Ignoring.",
94
+ md_c_str);
95
+ calld->compression_algorithm = GRPC_COMPRESS_NONE;
96
+ }
97
+ if (grpc_compression_options_is_algorithm_enabled(
98
+ &channeld->compression_options, calld->compression_algorithm) ==
99
+ 0) {
100
+ gpr_log(GPR_ERROR,
101
+ "Invalid compression algorithm: '%s' (previously disabled). "
102
+ "Ignoring.",
103
+ md_c_str);
104
+ calld->compression_algorithm = GRPC_COMPRESS_NONE;
105
+ }
106
+ calld->has_compression_algorithm = 1;
107
+ return NULL;
108
+ }
109
+
110
+ return md;
111
+ }
112
+
113
+ static int skip_compression(grpc_call_element *elem) {
114
+ call_data *calld = elem->call_data;
115
+ channel_data *channeld = elem->channel_data;
116
+ if (calld->has_compression_algorithm) {
117
+ if (calld->compression_algorithm == GRPC_COMPRESS_NONE) {
118
+ return 1;
119
+ }
120
+ return 0; /* we have an actual call-specific algorithm */
121
+ }
122
+ /* no per-call compression override */
123
+ return channeld->default_compression_algorithm == GRPC_COMPRESS_NONE;
124
+ }
125
+
126
+ /** Filter initial metadata */
127
+ static void process_send_initial_metadata(
128
+ grpc_call_element *elem, grpc_metadata_batch *initial_metadata) {
129
+ call_data *calld = elem->call_data;
130
+ channel_data *channeld = elem->channel_data;
131
+ /* Parse incoming request for compression. If any, it'll be available
132
+ * at calld->compression_algorithm */
133
+ grpc_metadata_batch_filter(initial_metadata, compression_md_filter, elem);
134
+ if (!calld->has_compression_algorithm) {
135
+ /* If no algorithm was found in the metadata and we aren't
136
+ * exceptionally skipping compression, fall back to the channel
137
+ * default */
138
+ calld->compression_algorithm = channeld->default_compression_algorithm;
139
+ calld->has_compression_algorithm = 1; /* GPR_TRUE */
140
+ }
141
+ /* hint compression algorithm */
142
+ grpc_metadata_batch_add_tail(
143
+ initial_metadata, &calld->compression_algorithm_storage,
144
+ grpc_compression_encoding_mdelem(calld->compression_algorithm));
145
+
146
+ /* convey supported compression algorithms */
147
+ grpc_metadata_batch_add_tail(initial_metadata,
148
+ &calld->accept_encoding_storage,
149
+ GRPC_MDELEM_ACCEPT_ENCODING_FOR_ALGORITHMS(
150
+ channeld->supported_compression_algorithms));
151
+ }
152
+
153
+ static void continue_send_message(grpc_exec_ctx *exec_ctx,
154
+ grpc_call_element *elem);
155
+
156
+ static void send_done(grpc_exec_ctx *exec_ctx, void *elemp, int success) {
157
+ grpc_call_element *elem = elemp;
158
+ call_data *calld = elem->call_data;
159
+ gpr_slice_buffer_reset_and_unref(&calld->slices);
160
+ calld->post_send->cb(exec_ctx, calld->post_send->cb_arg, success);
161
+ }
162
+
163
+ static void finish_send_message(grpc_exec_ctx *exec_ctx,
164
+ grpc_call_element *elem) {
165
+ call_data *calld = elem->call_data;
166
+ int did_compress;
167
+ gpr_slice_buffer tmp;
168
+ gpr_slice_buffer_init(&tmp);
169
+ did_compress =
170
+ grpc_msg_compress(calld->compression_algorithm, &calld->slices, &tmp);
171
+ if (did_compress) {
172
+ gpr_slice_buffer_swap(&calld->slices, &tmp);
173
+ calld->send_flags |= GRPC_WRITE_INTERNAL_COMPRESS;
174
+ }
175
+ gpr_slice_buffer_destroy(&tmp);
176
+
177
+ grpc_slice_buffer_stream_init(&calld->replacement_stream, &calld->slices,
178
+ calld->send_flags);
179
+ calld->send_op.send_message = &calld->replacement_stream.base;
180
+ calld->post_send = calld->send_op.on_complete;
181
+ calld->send_op.on_complete = &calld->send_done;
182
+
183
+ grpc_call_next_op(exec_ctx, elem, &calld->send_op);
184
+ }
185
+
186
+ static void got_slice(grpc_exec_ctx *exec_ctx, void *elemp, int success) {
187
+ grpc_call_element *elem = elemp;
188
+ call_data *calld = elem->call_data;
189
+ gpr_slice_buffer_add(&calld->slices, calld->incoming_slice);
190
+ if (calld->send_length == calld->slices.length) {
191
+ finish_send_message(exec_ctx, elem);
192
+ } else {
193
+ continue_send_message(exec_ctx, elem);
194
+ }
195
+ }
196
+
197
+ static void continue_send_message(grpc_exec_ctx *exec_ctx,
198
+ grpc_call_element *elem) {
199
+ call_data *calld = elem->call_data;
200
+ while (grpc_byte_stream_next(exec_ctx, calld->send_op.send_message,
201
+ &calld->incoming_slice, ~(size_t)0,
202
+ &calld->got_slice)) {
203
+ gpr_slice_buffer_add(&calld->slices, calld->incoming_slice);
204
+ if (calld->send_length == calld->slices.length) {
205
+ finish_send_message(exec_ctx, elem);
206
+ break;
207
+ }
208
+ }
209
+ }
210
+
211
+ static void compress_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
212
+ grpc_call_element *elem,
213
+ grpc_transport_stream_op *op) {
214
+ call_data *calld = elem->call_data;
215
+
216
+ GPR_TIMER_BEGIN("compress_start_transport_stream_op", 0);
217
+
218
+ if (op->send_initial_metadata) {
219
+ process_send_initial_metadata(elem, op->send_initial_metadata);
220
+ }
221
+ if (op->send_message != NULL && !skip_compression(elem) &&
222
+ 0 == (op->send_message->flags & GRPC_WRITE_NO_COMPRESS)) {
223
+ calld->send_op = *op;
224
+ calld->send_length = op->send_message->length;
225
+ calld->send_flags = op->send_message->flags;
226
+ continue_send_message(exec_ctx, elem);
227
+ } else {
228
+ /* pass control down the stack */
229
+ grpc_call_next_op(exec_ctx, elem, op);
230
+ }
231
+
232
+ GPR_TIMER_END("compress_start_transport_stream_op", 0);
233
+ }
234
+
235
+ /* Constructor for call_data */
236
+ static void init_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
237
+ grpc_call_element_args *args) {
238
+ /* grab pointers to our data from the call element */
239
+ call_data *calld = elem->call_data;
240
+
241
+ /* initialize members */
242
+ gpr_slice_buffer_init(&calld->slices);
243
+ calld->has_compression_algorithm = 0;
244
+ grpc_closure_init(&calld->got_slice, got_slice, elem);
245
+ grpc_closure_init(&calld->send_done, send_done, elem);
246
+ }
247
+
248
+ /* Destructor for call_data */
249
+ static void destroy_call_elem(grpc_exec_ctx *exec_ctx,
250
+ grpc_call_element *elem) {
251
+ /* grab pointers to our data from the call element */
252
+ call_data *calld = elem->call_data;
253
+ gpr_slice_buffer_destroy(&calld->slices);
254
+ }
255
+
256
+ /* Constructor for channel_data */
257
+ static void init_channel_elem(grpc_exec_ctx *exec_ctx,
258
+ grpc_channel_element *elem,
259
+ grpc_channel_element_args *args) {
260
+ channel_data *channeld = elem->channel_data;
261
+ grpc_compression_algorithm algo_idx;
262
+
263
+ grpc_compression_options_init(&channeld->compression_options);
264
+ channeld->compression_options.enabled_algorithms_bitset =
265
+ (gpr_uint32)grpc_channel_args_compression_algorithm_get_states(
266
+ args->channel_args);
267
+
268
+ channeld->default_compression_algorithm =
269
+ grpc_channel_args_get_compression_algorithm(args->channel_args);
270
+ /* Make sure the default isn't disabled. */
271
+ GPR_ASSERT(grpc_compression_options_is_algorithm_enabled(
272
+ &channeld->compression_options, channeld->default_compression_algorithm));
273
+ channeld->compression_options.default_compression_algorithm =
274
+ channeld->default_compression_algorithm;
275
+
276
+ channeld->supported_compression_algorithms = 0;
277
+ for (algo_idx = 0; algo_idx < GRPC_COMPRESS_ALGORITHMS_COUNT; ++algo_idx) {
278
+ /* skip disabled algorithms */
279
+ if (grpc_compression_options_is_algorithm_enabled(
280
+ &channeld->compression_options, algo_idx) == 0) {
281
+ continue;
282
+ }
283
+ channeld->supported_compression_algorithms |= 1u << algo_idx;
284
+ }
285
+
286
+ GPR_ASSERT(!args->is_last);
287
+ }
288
+
289
+ /* Destructor for channel data */
290
+ static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
291
+ grpc_channel_element *elem) {}
292
+
293
+ const grpc_channel_filter grpc_compress_filter = {
294
+ compress_start_transport_stream_op, grpc_channel_next_op, sizeof(call_data),
295
+ init_call_elem, grpc_call_stack_ignore_set_pollset, destroy_call_elem,
296
+ sizeof(channel_data), init_channel_elem, destroy_channel_elem,
297
+ grpc_call_next_get_peer, "compress"};