grpc 1.0.1 → 1.1.2

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

Potentially problematic release.


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

Files changed (705) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3696 -867
  3. data/etc/roots.pem +39 -111
  4. data/include/grpc/byte_buffer.h +64 -1
  5. data/include/grpc/census.h +40 -96
  6. data/include/grpc/compression.h +2 -1
  7. data/include/grpc/grpc.h +42 -7
  8. data/include/grpc/grpc_posix.h +8 -5
  9. data/include/grpc/impl/codegen/atm.h +3 -0
  10. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  11. data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
  12. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  13. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
  14. data/include/grpc/impl/codegen/compression_types.h +1 -1
  15. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  16. data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
  17. data/include/grpc/impl/codegen/gpr_slice.h +84 -0
  18. data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
  19. data/include/grpc/impl/codegen/grpc_types.h +91 -9
  20. data/include/grpc/impl/codegen/port_platform.h +25 -92
  21. data/include/grpc/impl/codegen/slice.h +54 -97
  22. data/include/grpc/impl/codegen/sync.h +0 -253
  23. data/include/grpc/module.modulemap +0 -2
  24. data/include/grpc/slice.h +132 -0
  25. data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
  26. data/include/grpc/support/alloc.h +40 -1
  27. data/include/grpc/support/log.h +80 -1
  28. data/include/grpc/support/log_windows.h +2 -0
  29. data/include/grpc/support/string_util.h +1 -1
  30. data/include/grpc/support/sync.h +252 -0
  31. data/include/grpc/support/time.h +67 -1
  32. data/src/boringssl/err_data.c +639 -627
  33. data/src/core/ext/census/base_resources.c +71 -0
  34. data/src/core/ext/census/base_resources.h +39 -0
  35. data/src/core/ext/census/gen/census.pb.c +26 -29
  36. data/src/core/ext/census/gen/census.pb.h +68 -67
  37. data/src/core/ext/census/gen/trace_context.pb.c +81 -0
  38. data/src/core/ext/census/gen/trace_context.pb.h +99 -0
  39. data/src/core/ext/census/grpc_filter.c +22 -16
  40. data/src/core/ext/census/grpc_plugin.c +2 -1
  41. data/src/core/ext/census/initialize.c +16 -4
  42. data/src/core/ext/census/mlog.h +1 -1
  43. data/src/core/ext/census/placeholders.c +0 -45
  44. data/src/core/ext/census/resource.c +312 -0
  45. data/src/core/ext/census/resource.h +63 -0
  46. data/src/core/ext/census/trace_context.c +86 -0
  47. data/src/core/ext/census/trace_context.h +68 -0
  48. data/src/core/ext/census/tracing.c +8 -2
  49. data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
  50. data/src/core/ext/client_channel/client_channel.c +1218 -0
  51. data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
  52. data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
  53. data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
  54. data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
  55. data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
  56. data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
  57. data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
  58. data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
  59. data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
  60. data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
  61. data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
  62. data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
  63. data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
  64. data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
  65. data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
  66. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
  67. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
  68. data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
  69. data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
  70. data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
  71. data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
  72. data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
  73. data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
  74. data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
  75. data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
  76. data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
  77. data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
  78. data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
  79. data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
  80. data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
  81. data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
  82. data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
  83. data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
  84. data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
  85. data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
  86. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
  87. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
  88. data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
  89. data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
  90. data/src/core/ext/load_reporting/load_reporting.c +7 -56
  91. data/src/core/ext/load_reporting/load_reporting.h +41 -28
  92. data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
  93. data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
  94. data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
  95. data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
  96. data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
  98. data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
  99. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
  100. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
  101. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
  102. data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
  104. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
  105. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
  106. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
  107. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
  108. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
  109. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
  110. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
  111. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
  112. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
  114. data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
  116. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
  118. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
  119. data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
  120. data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
  122. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
  123. data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
  124. data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
  125. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
  126. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
  128. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
  129. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
  130. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
  131. data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
  132. data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
  133. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
  134. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
  135. data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
  136. data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
  137. data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
  138. data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
  139. data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
  140. data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
  141. data/src/core/lib/channel/channel_args.c +70 -13
  142. data/src/core/lib/channel/channel_args.h +28 -2
  143. data/src/core/lib/channel/channel_stack.c +77 -28
  144. data/src/core/lib/channel/channel_stack.h +61 -23
  145. data/src/core/lib/channel/channel_stack_builder.c +33 -25
  146. data/src/core/lib/channel/channel_stack_builder.h +17 -8
  147. data/src/core/lib/channel/compress_filter.c +52 -36
  148. data/src/core/lib/channel/connected_channel.c +20 -12
  149. data/src/core/lib/channel/connected_channel.h +2 -1
  150. data/src/core/lib/channel/context.h +13 -1
  151. data/src/core/lib/channel/deadline_filter.c +344 -0
  152. data/src/core/lib/channel/deadline_filter.h +99 -0
  153. data/src/core/lib/channel/handshaker.c +240 -0
  154. data/src/core/lib/channel/handshaker.h +164 -0
  155. data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
  156. data/src/core/lib/channel/handshaker_factory.h +66 -0
  157. data/src/core/lib/channel/handshaker_registry.c +113 -0
  158. data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
  159. data/src/core/lib/channel/http_client_filter.c +248 -46
  160. data/src/core/lib/channel/http_client_filter.h +3 -0
  161. data/src/core/lib/channel/http_server_filter.c +136 -24
  162. data/src/core/lib/channel/message_size_filter.c +261 -0
  163. data/src/core/lib/channel/message_size_filter.h +39 -0
  164. data/src/core/lib/compression/message_compress.c +43 -37
  165. data/src/core/lib/compression/message_compress.h +7 -5
  166. data/src/core/lib/http/format_request.c +26 -11
  167. data/src/core/lib/http/format_request.h +7 -5
  168. data/src/core/lib/http/httpcli.c +45 -27
  169. data/src/core/lib/http/httpcli.h +4 -4
  170. data/src/core/lib/http/httpcli_security_connector.c +56 -46
  171. data/src/core/lib/http/parser.c +17 -14
  172. data/src/core/lib/http/parser.h +4 -2
  173. data/src/core/lib/iomgr/closure.c +49 -7
  174. data/src/core/lib/iomgr/closure.h +56 -14
  175. data/src/core/lib/iomgr/combiner.c +422 -0
  176. data/src/core/lib/iomgr/combiner.h +64 -0
  177. data/src/core/lib/iomgr/endpoint.c +8 -2
  178. data/src/core/lib/iomgr/endpoint.h +17 -7
  179. data/src/core/lib/iomgr/endpoint_pair.h +3 -2
  180. data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
  181. data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
  182. data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
  183. data/src/core/lib/iomgr/error.c +72 -6
  184. data/src/core/lib/iomgr/error.h +30 -3
  185. data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
  186. data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
  187. data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
  188. data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
  189. data/src/core/lib/iomgr/ev_posix.c +26 -5
  190. data/src/core/lib/iomgr/ev_posix.h +12 -1
  191. data/src/core/lib/iomgr/exec_ctx.c +27 -94
  192. data/src/core/lib/iomgr/exec_ctx.h +19 -22
  193. data/src/core/lib/iomgr/executor.c +29 -8
  194. data/src/core/lib/iomgr/executor.h +2 -4
  195. data/src/core/lib/iomgr/iocp_windows.c +3 -4
  196. data/src/core/lib/iomgr/iomgr.c +14 -10
  197. data/src/core/lib/iomgr/iomgr.h +6 -2
  198. data/src/core/lib/iomgr/iomgr_posix.c +2 -2
  199. data/src/core/lib/iomgr/iomgr_uv.c +49 -0
  200. data/src/core/lib/iomgr/iomgr_windows.c +2 -2
  201. data/src/core/lib/iomgr/load_file.c +3 -3
  202. data/src/core/lib/iomgr/load_file.h +2 -2
  203. data/src/core/lib/iomgr/network_status_tracker.c +1 -1
  204. data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
  205. data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
  206. data/src/core/lib/iomgr/pollset_uv.c +142 -0
  207. data/src/core/lib/iomgr/pollset_uv.h +42 -0
  208. data/src/core/lib/iomgr/pollset_windows.c +5 -6
  209. data/src/core/lib/iomgr/port.h +129 -0
  210. data/src/core/lib/iomgr/resolve_address.h +2 -1
  211. data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
  212. data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
  213. data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
  214. data/src/core/lib/iomgr/resource_quota.c +832 -0
  215. data/src/core/lib/iomgr/resource_quota.h +159 -0
  216. data/src/core/lib/iomgr/sockaddr.h +10 -2
  217. data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
  218. data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
  219. data/src/core/lib/iomgr/socket_mutator.c +98 -0
  220. data/src/core/lib/iomgr/socket_mutator.h +80 -0
  221. data/src/core/lib/iomgr/socket_utils.h +42 -0
  222. data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
  223. data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
  224. data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
  225. data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
  226. data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
  227. data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
  228. data/src/core/lib/iomgr/socket_windows.c +14 -6
  229. data/src/core/lib/iomgr/socket_windows.h +1 -0
  230. data/src/core/lib/iomgr/tcp_client.h +8 -2
  231. data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
  232. data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
  233. data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
  234. data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
  235. data/src/core/lib/iomgr/tcp_posix.c +135 -56
  236. data/src/core/lib/iomgr/tcp_posix.h +2 -2
  237. data/src/core/lib/iomgr/tcp_server.h +14 -6
  238. data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
  239. data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
  240. data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
  241. data/src/core/lib/iomgr/tcp_uv.c +367 -0
  242. data/src/core/lib/iomgr/tcp_uv.h +59 -0
  243. data/src/core/lib/iomgr/tcp_windows.c +65 -48
  244. data/src/core/lib/iomgr/tcp_windows.h +3 -1
  245. data/src/core/lib/iomgr/timer.h +21 -21
  246. data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
  247. data/src/core/lib/iomgr/timer_generic.h +49 -0
  248. data/src/core/lib/iomgr/timer_heap.c +6 -0
  249. data/src/core/lib/iomgr/timer_uv.c +99 -0
  250. data/src/core/lib/iomgr/timer_uv.h +47 -0
  251. data/src/core/lib/iomgr/udp_server.c +116 -98
  252. data/src/core/lib/iomgr/udp_server.h +5 -3
  253. data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
  254. data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
  256. data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
  257. data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
  258. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
  259. data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
  260. data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
  261. data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
  262. data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
  263. data/src/core/lib/iomgr/workqueue.h +12 -20
  264. data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
  265. data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
  266. data/src/core/lib/iomgr/workqueue_windows.c +9 -8
  267. data/src/core/lib/json/json.c +3 -3
  268. data/src/core/lib/json/json.h +11 -11
  269. data/src/core/lib/json/json_reader.c +9 -5
  270. data/src/core/lib/profiling/basic_timers.c +10 -1
  271. data/src/core/lib/profiling/timers.h +2 -0
  272. data/src/core/lib/security/context/security_context.c +13 -3
  273. data/src/core/lib/security/context/security_context.h +20 -0
  274. data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
  275. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  276. data/src/core/lib/security/credentials/credentials.c +48 -19
  277. data/src/core/lib/security/credentials/credentials.h +36 -19
  278. data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
  279. data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
  280. data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
  281. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
  282. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
  283. data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
  284. data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
  285. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  286. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
  287. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
  288. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
  289. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
  290. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
  291. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  292. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
  293. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
  294. data/src/core/lib/security/transport/client_auth_filter.c +33 -27
  295. data/src/core/lib/security/transport/secure_endpoint.c +93 -68
  296. data/src/core/lib/security/transport/secure_endpoint.h +2 -2
  297. data/src/core/lib/security/transport/security_connector.c +133 -168
  298. data/src/core/lib/security/transport/security_connector.h +31 -46
  299. data/src/core/lib/security/transport/security_handshaker.c +501 -0
  300. data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
  301. data/src/core/lib/security/transport/server_auth_filter.c +50 -38
  302. data/src/core/lib/security/util/b64.c +11 -8
  303. data/src/core/lib/security/util/b64.h +5 -4
  304. data/src/core/lib/slice/percent_encoding.c +182 -0
  305. data/src/core/lib/slice/percent_encoding.h +78 -0
  306. data/src/core/lib/{support → slice}/slice.c +81 -50
  307. data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
  308. data/src/core/lib/slice/slice_internal.h +49 -0
  309. data/src/core/lib/slice/slice_string_helpers.c +90 -0
  310. data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
  311. data/src/core/lib/support/backoff.c +24 -13
  312. data/src/core/lib/support/backoff.h +5 -2
  313. data/src/core/lib/support/env.h +0 -2
  314. data/src/core/lib/support/log.c +5 -4
  315. data/src/core/lib/support/log_linux.c +0 -1
  316. data/src/core/lib/support/log_posix.c +1 -1
  317. data/src/core/lib/support/mpscq.c +83 -0
  318. data/src/core/lib/support/mpscq.h +65 -0
  319. data/src/core/lib/support/string.c +58 -49
  320. data/src/core/lib/support/string.h +11 -8
  321. data/src/core/lib/support/subprocess_posix.c +5 -2
  322. data/src/core/lib/support/thd.c +1 -1
  323. data/src/core/lib/support/time.c +43 -79
  324. data/src/core/lib/support/time_posix.c +1 -1
  325. data/src/core/lib/support/tmpfile.h +0 -2
  326. data/src/core/lib/surface/alarm.c +4 -1
  327. data/src/core/lib/surface/byte_buffer.c +17 -11
  328. data/src/core/lib/surface/byte_buffer_reader.c +23 -15
  329. data/src/core/lib/surface/call.c +294 -276
  330. data/src/core/lib/surface/call.h +24 -9
  331. data/src/core/lib/surface/call_log_batch.c +5 -3
  332. data/src/core/lib/surface/channel.c +127 -111
  333. data/src/core/lib/surface/channel.h +14 -5
  334. data/src/core/lib/surface/channel_init.c +1 -1
  335. data/src/core/lib/surface/channel_init.h +10 -1
  336. data/src/core/lib/surface/channel_ping.c +7 -6
  337. data/src/core/lib/surface/completion_queue.c +154 -18
  338. data/src/core/lib/surface/completion_queue.h +5 -0
  339. data/src/core/lib/surface/init.c +40 -6
  340. data/src/core/lib/surface/init.h +1 -0
  341. data/src/core/lib/surface/init_secure.c +5 -2
  342. data/src/core/lib/surface/lame_client.c +28 -18
  343. data/src/core/lib/surface/server.c +134 -87
  344. data/src/core/lib/surface/server.h +8 -0
  345. data/src/core/lib/surface/validate_metadata.c +1 -1
  346. data/src/core/lib/surface/version.c +3 -1
  347. data/src/core/lib/transport/byte_stream.c +7 -4
  348. data/src/core/lib/transport/byte_stream.h +6 -10
  349. data/src/core/lib/transport/connectivity_state.c +21 -12
  350. data/src/core/lib/transport/connectivity_state.h +4 -1
  351. data/src/core/lib/transport/mdstr_hash_table.c +118 -0
  352. data/src/core/lib/transport/mdstr_hash_table.h +77 -0
  353. data/src/core/lib/transport/metadata.c +83 -60
  354. data/src/core/lib/transport/metadata.h +41 -23
  355. data/src/core/lib/transport/metadata_batch.c +17 -11
  356. data/src/core/lib/transport/metadata_batch.h +20 -6
  357. data/src/core/lib/transport/pid_controller.c +57 -0
  358. data/src/core/lib/transport/pid_controller.h +64 -0
  359. data/src/core/lib/transport/service_config.c +251 -0
  360. data/src/core/lib/transport/service_config.h +71 -0
  361. data/src/core/lib/transport/static_metadata.c +18 -16
  362. data/src/core/lib/transport/static_metadata.h +113 -107
  363. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
  364. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
  365. data/src/core/lib/transport/transport.c +84 -23
  366. data/src/core/lib/transport/transport.h +53 -8
  367. data/src/core/lib/transport/transport_impl.h +3 -0
  368. data/src/core/lib/transport/transport_op_string.c +92 -20
  369. data/src/core/lib/tsi/ssl_transport_security.c +3 -1
  370. data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
  371. data/src/ruby/ext/grpc/extconf.rb +0 -1
  372. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
  373. data/src/ruby/ext/grpc/rb_call.c +15 -5
  374. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  375. data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
  376. data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
  377. data/src/ruby/ext/grpc/rb_grpc.c +3 -1
  378. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
  379. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
  380. data/src/ruby/ext/grpc/rb_server.c +18 -12
  381. data/src/ruby/lib/grpc/errors.rb +154 -2
  382. data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
  383. data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
  384. data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
  385. data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
  386. data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
  387. data/src/ruby/lib/grpc/generic/service.rb +3 -2
  388. data/src/ruby/lib/grpc/version.rb +1 -1
  389. data/src/ruby/pb/grpc/health/checker.rb +3 -1
  390. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
  391. data/src/ruby/pb/test/client.rb +307 -7
  392. data/src/ruby/pb/test/server.rb +26 -1
  393. data/src/ruby/spec/compression_options_spec.rb +164 -0
  394. data/src/ruby/spec/error_sanity_spec.rb +64 -0
  395. data/src/ruby/spec/generic/active_call_spec.rb +290 -12
  396. data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
  397. data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
  398. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
  399. data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
  400. data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
  401. data/src/ruby/spec/spec_helper.rb +2 -0
  402. data/third_party/boringssl/crypto/aes/aes.c +12 -12
  403. data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
  404. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
  405. data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
  406. data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
  407. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  408. data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
  409. data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
  410. data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
  411. data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
  412. data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
  413. data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
  414. data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
  415. data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
  416. data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
  417. data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
  418. data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
  419. data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
  420. data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
  421. data/third_party/boringssl/crypto/base64/base64.c +249 -285
  422. data/third_party/boringssl/crypto/bio/bio.c +13 -23
  423. data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
  424. data/third_party/boringssl/crypto/bio/connect.c +12 -3
  425. data/third_party/boringssl/crypto/bio/fd.c +22 -15
  426. data/third_party/boringssl/crypto/bio/file.c +2 -38
  427. data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
  428. data/third_party/boringssl/crypto/bio/internal.h +3 -0
  429. data/third_party/boringssl/crypto/bio/pair.c +1 -1
  430. data/third_party/boringssl/crypto/bio/socket.c +10 -2
  431. data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
  432. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
  433. data/third_party/boringssl/crypto/bn/bn.c +38 -0
  434. data/third_party/boringssl/crypto/bn/cmp.c +25 -0
  435. data/third_party/boringssl/crypto/bn/convert.c +73 -76
  436. data/third_party/boringssl/crypto/bn/div.c +136 -70
  437. data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
  438. data/third_party/boringssl/crypto/bn/gcd.c +213 -296
  439. data/third_party/boringssl/crypto/bn/generic.c +0 -80
  440. data/third_party/boringssl/crypto/bn/internal.h +15 -3
  441. data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
  442. data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
  443. data/third_party/boringssl/crypto/bn/mul.c +2 -1
  444. data/third_party/boringssl/crypto/bn/prime.c +24 -8
  445. data/third_party/boringssl/crypto/bn/random.c +47 -33
  446. data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
  447. data/third_party/boringssl/crypto/buf/buf.c +25 -21
  448. data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
  449. data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
  450. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
  451. data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
  452. data/third_party/boringssl/crypto/cipher/aead.c +11 -22
  453. data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
  454. data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
  455. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
  456. data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
  457. data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
  458. data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
  459. data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
  460. data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
  461. data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
  462. data/third_party/boringssl/crypto/cipher/internal.h +8 -10
  463. data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
  464. data/third_party/boringssl/crypto/conf/conf.c +2 -1
  465. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
  466. data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
  467. data/third_party/boringssl/crypto/cpu-arm.c +0 -161
  468. data/third_party/boringssl/crypto/cpu-intel.c +5 -3
  469. data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
  470. data/third_party/boringssl/crypto/crypto.c +29 -7
  471. data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
  472. data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
  473. data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
  474. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
  475. data/third_party/boringssl/crypto/dh/check.c +22 -6
  476. data/third_party/boringssl/crypto/dh/dh.c +45 -21
  477. data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
  478. data/third_party/boringssl/crypto/dh/params.c +30 -78
  479. data/third_party/boringssl/crypto/digest/digest.c +3 -3
  480. data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
  481. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
  482. data/third_party/boringssl/crypto/ec/ec.c +84 -140
  483. data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
  484. data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
  485. data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
  486. data/third_party/boringssl/crypto/ec/internal.h +12 -36
  487. data/third_party/boringssl/crypto/ec/oct.c +11 -11
  488. data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
  489. data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
  490. data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
  491. data/third_party/boringssl/crypto/ec/simple.c +81 -201
  492. data/third_party/boringssl/crypto/ec/util-64.c +0 -74
  493. data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
  494. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
  495. data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
  496. data/third_party/boringssl/crypto/engine/engine.c +1 -1
  497. data/third_party/boringssl/crypto/err/err.c +3 -3
  498. data/third_party/boringssl/crypto/evp/evp.c +14 -59
  499. data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
  500. data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
  501. data/third_party/boringssl/crypto/evp/internal.h +4 -46
  502. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
  503. data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
  504. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
  505. data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
  506. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
  507. data/third_party/boringssl/crypto/evp/print.c +520 -0
  508. data/third_party/boringssl/crypto/ex_data.c +4 -6
  509. data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
  510. data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
  511. data/third_party/boringssl/crypto/internal.h +57 -77
  512. data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
  513. data/third_party/boringssl/crypto/md4/md4.c +9 -0
  514. data/third_party/boringssl/crypto/mem.c +19 -19
  515. data/third_party/boringssl/crypto/modes/cfb.c +5 -6
  516. data/third_party/boringssl/crypto/modes/ctr.c +10 -18
  517. data/third_party/boringssl/crypto/modes/gcm.c +100 -66
  518. data/third_party/boringssl/crypto/modes/internal.h +15 -27
  519. data/third_party/boringssl/crypto/modes/ofb.c +9 -22
  520. data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
  521. data/third_party/boringssl/crypto/newhope/internal.h +71 -0
  522. data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
  523. data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
  524. data/third_party/boringssl/crypto/newhope/poly.c +183 -0
  525. data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
  526. data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
  527. data/third_party/boringssl/crypto/obj/obj.c +111 -135
  528. data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
  529. data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
  530. data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
  531. data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
  532. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
  533. data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
  534. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
  535. data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
  536. data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
  537. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
  538. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
  539. data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
  540. data/third_party/boringssl/crypto/rand/rand.c +4 -1
  541. data/third_party/boringssl/crypto/rand/urandom.c +5 -7
  542. data/third_party/boringssl/crypto/rand/windows.c +5 -8
  543. data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
  544. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  545. data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
  546. data/third_party/boringssl/crypto/rsa/internal.h +5 -13
  547. data/third_party/boringssl/crypto/rsa/padding.c +64 -63
  548. data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
  549. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
  550. data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
  551. data/third_party/boringssl/crypto/sha/sha256.c +2 -2
  552. data/third_party/boringssl/crypto/sha/sha512.c +7 -7
  553. data/third_party/boringssl/crypto/stack/stack.c +13 -22
  554. data/third_party/boringssl/crypto/thread.c +21 -12
  555. data/third_party/boringssl/crypto/thread_none.c +6 -2
  556. data/third_party/boringssl/crypto/thread_pthread.c +16 -7
  557. data/third_party/boringssl/crypto/thread_win.c +38 -85
  558. data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
  559. data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
  560. data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
  561. data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
  562. data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
  563. data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
  564. data/third_party/boringssl/crypto/x509/internal.h +66 -0
  565. data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
  566. data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
  567. data/third_party/boringssl/crypto/x509/x509.c +5 -0
  568. data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
  569. data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
  570. data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
  571. data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
  572. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  573. data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
  574. data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
  575. data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
  576. data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
  577. data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
  578. data/third_party/boringssl/crypto/x509/x_name.c +14 -17
  579. data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
  580. data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
  581. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
  582. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
  583. data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
  584. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
  585. data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
  586. data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
  587. data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
  588. data/third_party/boringssl/include/openssl/aead.h +72 -73
  589. data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
  590. data/third_party/boringssl/include/openssl/asn1.h +103 -235
  591. data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
  592. data/third_party/boringssl/include/openssl/asn1t.h +1 -11
  593. data/third_party/boringssl/include/openssl/base.h +145 -3
  594. data/third_party/boringssl/include/openssl/base64.h +20 -17
  595. data/third_party/boringssl/include/openssl/bio.h +59 -34
  596. data/third_party/boringssl/include/openssl/bn.h +118 -51
  597. data/third_party/boringssl/include/openssl/buf.h +15 -0
  598. data/third_party/boringssl/include/openssl/bytestring.h +52 -4
  599. data/third_party/boringssl/include/openssl/chacha.h +2 -2
  600. data/third_party/boringssl/include/openssl/cipher.h +18 -1
  601. data/third_party/boringssl/include/openssl/cmac.h +11 -0
  602. data/third_party/boringssl/include/openssl/conf.h +13 -2
  603. data/third_party/boringssl/include/openssl/cpu.h +20 -23
  604. data/third_party/boringssl/include/openssl/crypto.h +22 -1
  605. data/third_party/boringssl/include/openssl/curve25519.h +96 -4
  606. data/third_party/boringssl/include/openssl/dh.h +71 -16
  607. data/third_party/boringssl/include/openssl/digest.h +38 -11
  608. data/third_party/boringssl/include/openssl/dsa.h +40 -4
  609. data/third_party/boringssl/include/openssl/ec.h +44 -18
  610. data/third_party/boringssl/include/openssl/ec_key.h +27 -6
  611. data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
  612. data/third_party/boringssl/include/openssl/engine.h +11 -0
  613. data/third_party/boringssl/include/openssl/evp.h +52 -88
  614. data/third_party/boringssl/include/openssl/hkdf.h +24 -4
  615. data/third_party/boringssl/include/openssl/hmac.h +20 -6
  616. data/third_party/boringssl/include/openssl/md4.h +4 -0
  617. data/third_party/boringssl/include/openssl/mem.h +19 -0
  618. data/third_party/boringssl/include/openssl/newhope.h +158 -0
  619. data/third_party/boringssl/include/openssl/nid.h +4166 -0
  620. data/third_party/boringssl/include/openssl/obj.h +31 -3
  621. data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
  622. data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
  623. data/third_party/boringssl/include/openssl/pem.h +5 -0
  624. data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
  625. data/third_party/boringssl/include/openssl/rand.h +6 -0
  626. data/third_party/boringssl/include/openssl/rc4.h +6 -0
  627. data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
  628. data/third_party/boringssl/include/openssl/rsa.h +127 -65
  629. data/third_party/boringssl/include/openssl/sha.h +14 -10
  630. data/third_party/boringssl/include/openssl/ssl.h +561 -275
  631. data/third_party/boringssl/include/openssl/ssl3.h +18 -25
  632. data/third_party/boringssl/include/openssl/stack.h +2 -4
  633. data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
  634. data/third_party/boringssl/include/openssl/thread.h +31 -13
  635. data/third_party/boringssl/include/openssl/time_support.h +1 -0
  636. data/third_party/boringssl/include/openssl/tls1.h +37 -33
  637. data/third_party/boringssl/include/openssl/x509.h +69 -26
  638. data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
  639. data/third_party/boringssl/include/openssl/x509v3.h +23 -2
  640. data/third_party/boringssl/ssl/custom_extensions.c +3 -5
  641. data/third_party/boringssl/ssl/d1_both.c +463 -499
  642. data/third_party/boringssl/ssl/d1_lib.c +38 -109
  643. data/third_party/boringssl/ssl/d1_pkt.c +173 -334
  644. data/third_party/boringssl/ssl/d1_srtp.c +20 -18
  645. data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
  646. data/third_party/boringssl/ssl/dtls_record.c +27 -26
  647. data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
  648. data/third_party/boringssl/ssl/handshake_server.c +1932 -0
  649. data/third_party/boringssl/ssl/internal.h +712 -439
  650. data/third_party/boringssl/ssl/s3_both.c +445 -257
  651. data/third_party/boringssl/ssl/s3_enc.c +53 -36
  652. data/third_party/boringssl/ssl/s3_lib.c +23 -268
  653. data/third_party/boringssl/ssl/s3_pkt.c +168 -364
  654. data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
  655. data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
  656. data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
  657. data/third_party/boringssl/ssl/ssl_cert.c +324 -49
  658. data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
  659. data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
  660. data/third_party/boringssl/ssl/ssl_file.c +21 -68
  661. data/third_party/boringssl/ssl/ssl_lib.c +881 -510
  662. data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
  663. data/third_party/boringssl/ssl/ssl_session.c +324 -103
  664. data/third_party/boringssl/ssl/ssl_stat.c +6 -88
  665. data/third_party/boringssl/ssl/t1_enc.c +23 -39
  666. data/third_party/boringssl/ssl/t1_lib.c +1120 -622
  667. data/third_party/boringssl/ssl/tls13_both.c +440 -0
  668. data/third_party/boringssl/ssl/tls13_client.c +682 -0
  669. data/third_party/boringssl/ssl/tls13_enc.c +391 -0
  670. data/third_party/boringssl/ssl/tls13_server.c +672 -0
  671. data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
  672. data/third_party/boringssl/ssl/tls_record.c +159 -77
  673. data/third_party/nanopb/pb.h +60 -28
  674. data/third_party/nanopb/pb_decode.c +120 -92
  675. data/third_party/nanopb/pb_decode.h +3 -3
  676. data/third_party/nanopb/pb_encode.c +73 -67
  677. data/third_party/nanopb/pb_encode.h +4 -4
  678. metadata +155 -89
  679. data/include/grpc/impl/codegen/byte_buffer.h +0 -122
  680. data/include/grpc/impl/codegen/log.h +0 -118
  681. data/include/grpc/impl/codegen/time.h +0 -130
  682. data/src/core/ext/client_config/client_channel.c +0 -593
  683. data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
  684. data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
  685. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
  686. data/src/core/lib/iomgr/workqueue_posix.c +0 -151
  687. data/src/core/lib/security/transport/handshake.c +0 -368
  688. data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
  689. data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
  690. data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
  691. data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
  692. data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
  693. data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
  694. data/third_party/boringssl/crypto/directory.h +0 -66
  695. data/third_party/boringssl/crypto/directory_posix.c +0 -108
  696. data/third_party/boringssl/crypto/directory_win.c +0 -144
  697. data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
  698. data/third_party/boringssl/include/openssl/pqueue.h +0 -146
  699. data/third_party/boringssl/ssl/d1_clnt.c +0 -561
  700. data/third_party/boringssl/ssl/d1_srvr.c +0 -476
  701. data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
  702. data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
  703. data/third_party/boringssl/ssl/test/async_bio.h +0 -45
  704. data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
  705. data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -0,0 +1,63 @@
1
+ /*
2
+ *
3
+ * Copyright 2016, 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
+ /* Census-internal resource definition and manipluation functions. */
35
+ #ifndef GRPC_CORE_EXT_CENSUS_RESOURCE_H
36
+ #define GRPC_CORE_EXT_CENSUS_RESOURCE_H
37
+
38
+ #include <grpc/grpc.h>
39
+ #include "src/core/ext/census/gen/census.pb.h"
40
+
41
+ /* Internal representation of a resource. */
42
+ typedef struct {
43
+ char *name;
44
+ char *description;
45
+ int32_t prefix;
46
+ int n_numerators;
47
+ google_census_Resource_BasicUnit *numerators;
48
+ int n_denominators;
49
+ google_census_Resource_BasicUnit *denominators;
50
+ } resource;
51
+
52
+ /* Initialize and shutdown the resources subsystem. */
53
+ void initialize_resources(void);
54
+ void shutdown_resources(void);
55
+
56
+ /* Add a new resource, given a proposed resource structure. Returns the
57
+ resource ID, or -ve on failure.
58
+ TODO(aveitch): this function exists to support addition of the base
59
+ resources. It should be removed when we have the ability to add resources
60
+ from configuration files. */
61
+ int32_t define_resource(const resource *base);
62
+
63
+ #endif /* GRPC_CORE_EXT_CENSUS_RESOURCE_H */
@@ -0,0 +1,86 @@
1
+ /*
2
+ *
3
+ * Copyright 2016, 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/ext/census/trace_context.h"
35
+
36
+ #include <grpc/census.h>
37
+ #include <grpc/support/log.h>
38
+ #include <stdbool.h>
39
+
40
+ #include "third_party/nanopb/pb_decode.h"
41
+ #include "third_party/nanopb/pb_encode.h"
42
+
43
+ // This function assumes the TraceContext is valid.
44
+ size_t encode_trace_context(google_trace_TraceContext *ctxt, uint8_t *buffer,
45
+ const size_t buf_size) {
46
+ // Create a stream that will write to our buffer.
47
+ pb_ostream_t stream = pb_ostream_from_buffer(buffer, buf_size);
48
+
49
+ // encode message
50
+ bool status = pb_encode(&stream, google_trace_TraceContext_fields, ctxt);
51
+
52
+ if (!status) {
53
+ gpr_log(GPR_DEBUG, "TraceContext encoding failed: %s",
54
+ PB_GET_ERROR(&stream));
55
+ return 0;
56
+ }
57
+
58
+ return stream.bytes_written;
59
+ }
60
+
61
+ bool decode_trace_context(google_trace_TraceContext *ctxt, uint8_t *buffer,
62
+ const size_t nbytes) {
63
+ // Create a stream that reads nbytes from the buffer.
64
+ pb_istream_t stream = pb_istream_from_buffer(buffer, nbytes);
65
+
66
+ // decode message
67
+ bool status = pb_decode(&stream, google_trace_TraceContext_fields, ctxt);
68
+
69
+ if (!status) {
70
+ gpr_log(GPR_DEBUG, "TraceContext decoding failed: %s",
71
+ PB_GET_ERROR(&stream));
72
+ return false;
73
+ }
74
+
75
+ // check fields
76
+ if (!ctxt->has_trace_id) {
77
+ gpr_log(GPR_DEBUG, "Invalid TraceContext: missing trace_id");
78
+ return false;
79
+ }
80
+ if (!ctxt->has_span_id) {
81
+ gpr_log(GPR_DEBUG, "Invalid TraceContext: missing span_id");
82
+ return false;
83
+ }
84
+
85
+ return true;
86
+ }
@@ -0,0 +1,68 @@
1
+ /*
2
+ *
3
+ * Copyright 2016, 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
+ /* Functions for manipulating trace contexts as defined in
35
+ src/proto/census/trace.proto */
36
+ #ifndef GRPC_CORE_EXT_CENSUS_TRACE_CONTEXT_H
37
+ #define GRPC_CORE_EXT_CENSUS_TRACE_CONTEXT_H
38
+
39
+ #include "src/core/ext/census/gen/trace_context.pb.h"
40
+
41
+ /* Maximum number of bytes required to encode a TraceContext (31)
42
+ 1 byte for trace_id field
43
+ 1 byte for trace_id length
44
+ 1 byte for trace_id.hi field
45
+ 8 bytes for trace_id.hi (uint64_t)
46
+ 1 byte for trace_id.lo field
47
+ 8 bytes for trace_id.lo (uint64_t)
48
+ 1 byte for span_id field
49
+ 8 bytes for span_id (uint64_t)
50
+ 1 byte for is_sampled field
51
+ 1 byte for is_sampled (bool) */
52
+ #define TRACE_MAX_CONTEXT_SIZE 31
53
+
54
+ /* Encode a trace context (ctxt) into proto format to the buffer provided. The
55
+ size of buffer must be at least TRACE_MAX_CONTEXT_SIZE. On success, returns the
56
+ number of bytes successfully encoded into buffer. On failure, returns 0. */
57
+ size_t encode_trace_context(google_trace_TraceContext *ctxt, uint8_t *buffer,
58
+ const size_t buf_size);
59
+
60
+ /* Decode a proto-encoded TraceContext from the provided buffer into the
61
+ TraceContext structure (ctxt). The function expects to be supplied the number
62
+ of bytes to be read from buffer (nbytes). This function will also validate that
63
+ the TraceContext has a span_id and a trace_id, and will return false if either
64
+ of these do not exist. On success, returns true and false otherwise. */
65
+ bool decode_trace_context(google_trace_TraceContext *ctxt, uint8_t *buffer,
66
+ const size_t nbytes);
67
+
68
+ #endif /* GRPC_CORE_EXT_CENSUS_TRACE_CONTEXT_H */
@@ -31,15 +31,21 @@
31
31
  *
32
32
  */
33
33
 
34
+ //#include "src/core/ext/census/tracing.h"
35
+
34
36
  #include <grpc/census.h>
37
+ #include <stdlib.h>
35
38
 
36
39
  /* TODO(aveitch): These are all placeholder implementations. */
37
40
 
38
41
  int census_trace_mask(const census_context *context) {
42
+ abort();
39
43
  return CENSUS_TRACE_MASK_NONE;
40
44
  }
41
45
 
42
- void census_set_trace_mask(int trace_mask) {}
46
+ void census_set_trace_mask(int trace_mask) { abort(); }
43
47
 
44
48
  void census_trace_print(census_context *context, uint32_t type,
45
- const char *buffer, size_t n) {}
49
+ const char *buffer, size_t n) {
50
+ abort();
51
+ }
@@ -36,7 +36,7 @@
36
36
  #include <grpc/support/alloc.h>
37
37
  #include <grpc/support/log.h>
38
38
 
39
- #include "src/core/ext/client_config/client_channel.h"
39
+ #include "src/core/ext/client_channel/client_channel.h"
40
40
  #include "src/core/lib/iomgr/timer.h"
41
41
  #include "src/core/lib/surface/api_trace.h"
42
42
  #include "src/core/lib/surface/completion_queue.h"
@@ -59,7 +59,7 @@ grpc_connectivity_state grpc_channel_check_connectivity_state(
59
59
  }
60
60
  gpr_log(GPR_ERROR,
61
61
  "grpc_channel_check_connectivity_state called on something that is "
62
- "not a (u)client channel, but '%s'",
62
+ "not a client channel, but '%s'",
63
63
  client_channel_elem->filter->name);
64
64
  grpc_exec_ctx_finish(&exec_ctx);
65
65
  return GRPC_CHANNEL_SHUTDOWN;
@@ -76,6 +76,7 @@ typedef struct {
76
76
  gpr_mu mu;
77
77
  callback_phase phase;
78
78
  grpc_closure on_complete;
79
+ grpc_closure on_timeout;
79
80
  grpc_timer alarm;
80
81
  grpc_connectivity_state state;
81
82
  grpc_completion_queue *cq;
@@ -198,7 +199,10 @@ void grpc_channel_watch_connectivity_state(
198
199
  grpc_cq_begin_op(cq, tag);
199
200
 
200
201
  gpr_mu_init(&w->mu);
201
- grpc_closure_init(&w->on_complete, watch_complete, w);
202
+ grpc_closure_init(&w->on_complete, watch_complete, w,
203
+ grpc_schedule_on_exec_ctx);
204
+ grpc_closure_init(&w->on_timeout, timeout_complete, w,
205
+ grpc_schedule_on_exec_ctx);
202
206
  w->phase = WAITING;
203
207
  w->state = last_observed_state;
204
208
  w->cq = cq;
@@ -207,7 +211,7 @@ void grpc_channel_watch_connectivity_state(
207
211
 
208
212
  grpc_timer_init(&exec_ctx, &w->alarm,
209
213
  gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC),
210
- timeout_complete, w, gpr_now(GPR_CLOCK_MONOTONIC));
214
+ &w->on_timeout, gpr_now(GPR_CLOCK_MONOTONIC));
211
215
 
212
216
  if (client_channel_elem->filter == &grpc_client_channel_filter) {
213
217
  GRPC_CHANNEL_INTERNAL_REF(channel, "watch_channel_connectivity");
@@ -0,0 +1,1218 @@
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/ext/client_channel/client_channel.h"
35
+
36
+ #include <stdbool.h>
37
+ #include <stdio.h>
38
+ #include <string.h>
39
+
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+ #include <grpc/support/string_util.h>
43
+ #include <grpc/support/sync.h>
44
+ #include <grpc/support/useful.h>
45
+
46
+ #include "src/core/ext/client_channel/lb_policy_registry.h"
47
+ #include "src/core/ext/client_channel/resolver_registry.h"
48
+ #include "src/core/ext/client_channel/subchannel.h"
49
+ #include "src/core/lib/channel/channel_args.h"
50
+ #include "src/core/lib/channel/connected_channel.h"
51
+ #include "src/core/lib/channel/deadline_filter.h"
52
+ #include "src/core/lib/iomgr/iomgr.h"
53
+ #include "src/core/lib/iomgr/polling_entity.h"
54
+ #include "src/core/lib/profiling/timers.h"
55
+ #include "src/core/lib/support/string.h"
56
+ #include "src/core/lib/surface/channel.h"
57
+ #include "src/core/lib/transport/connectivity_state.h"
58
+ #include "src/core/lib/transport/metadata.h"
59
+ #include "src/core/lib/transport/metadata_batch.h"
60
+ #include "src/core/lib/transport/service_config.h"
61
+ #include "src/core/lib/transport/static_metadata.h"
62
+
63
+ /* Client channel implementation */
64
+
65
+ /*************************************************************************
66
+ * METHOD-CONFIG TABLE
67
+ */
68
+
69
+ typedef enum {
70
+ WAIT_FOR_READY_UNSET,
71
+ WAIT_FOR_READY_FALSE,
72
+ WAIT_FOR_READY_TRUE
73
+ } wait_for_ready_value;
74
+
75
+ typedef struct method_parameters {
76
+ gpr_timespec timeout;
77
+ wait_for_ready_value wait_for_ready;
78
+ } method_parameters;
79
+
80
+ static void *method_parameters_copy(void *value) {
81
+ void *new_value = gpr_malloc(sizeof(method_parameters));
82
+ memcpy(new_value, value, sizeof(method_parameters));
83
+ return new_value;
84
+ }
85
+
86
+ static void method_parameters_free(grpc_exec_ctx *exec_ctx, void *p) {
87
+ gpr_free(p);
88
+ }
89
+
90
+ static const grpc_mdstr_hash_table_vtable method_parameters_vtable = {
91
+ method_parameters_free, method_parameters_copy};
92
+
93
+ static void *method_parameters_create_from_json(const grpc_json *json) {
94
+ wait_for_ready_value wait_for_ready = WAIT_FOR_READY_UNSET;
95
+ gpr_timespec timeout = {0, 0, GPR_TIMESPAN};
96
+ for (grpc_json *field = json->child; field != NULL; field = field->next) {
97
+ if (field->key == NULL) continue;
98
+ if (strcmp(field->key, "waitForReady") == 0) {
99
+ if (wait_for_ready != WAIT_FOR_READY_UNSET) return NULL; // Duplicate.
100
+ if (field->type != GRPC_JSON_TRUE && field->type != GRPC_JSON_FALSE) {
101
+ return NULL;
102
+ }
103
+ wait_for_ready = field->type == GRPC_JSON_TRUE ? WAIT_FOR_READY_TRUE
104
+ : WAIT_FOR_READY_FALSE;
105
+ } else if (strcmp(field->key, "timeout") == 0) {
106
+ if (timeout.tv_sec > 0 || timeout.tv_nsec > 0) return NULL; // Duplicate.
107
+ if (field->type != GRPC_JSON_STRING) return NULL;
108
+ size_t len = strlen(field->value);
109
+ if (field->value[len - 1] != 's') return NULL;
110
+ char *buf = gpr_strdup(field->value);
111
+ buf[len - 1] = '\0'; // Remove trailing 's'.
112
+ char *decimal_point = strchr(buf, '.');
113
+ if (decimal_point != NULL) {
114
+ *decimal_point = '\0';
115
+ timeout.tv_nsec = gpr_parse_nonnegative_int(decimal_point + 1);
116
+ if (timeout.tv_nsec == -1) {
117
+ gpr_free(buf);
118
+ return NULL;
119
+ }
120
+ // There should always be exactly 3, 6, or 9 fractional digits.
121
+ int multiplier = 1;
122
+ switch (strlen(decimal_point + 1)) {
123
+ case 9:
124
+ break;
125
+ case 6:
126
+ multiplier *= 1000;
127
+ break;
128
+ case 3:
129
+ multiplier *= 1000000;
130
+ break;
131
+ default: // Unsupported number of digits.
132
+ gpr_free(buf);
133
+ return NULL;
134
+ }
135
+ timeout.tv_nsec *= multiplier;
136
+ }
137
+ timeout.tv_sec = gpr_parse_nonnegative_int(buf);
138
+ if (timeout.tv_sec == -1) return NULL;
139
+ gpr_free(buf);
140
+ }
141
+ }
142
+ method_parameters *value = gpr_malloc(sizeof(method_parameters));
143
+ value->timeout = timeout;
144
+ value->wait_for_ready = wait_for_ready;
145
+ return value;
146
+ }
147
+
148
+ /*************************************************************************
149
+ * CHANNEL-WIDE FUNCTIONS
150
+ */
151
+
152
+ typedef struct client_channel_channel_data {
153
+ /** resolver for this channel */
154
+ grpc_resolver *resolver;
155
+ /** have we started resolving this channel */
156
+ bool started_resolving;
157
+ /** client channel factory */
158
+ grpc_client_channel_factory *client_channel_factory;
159
+
160
+ /** mutex protecting all variables below in this data structure */
161
+ gpr_mu mu;
162
+ /** currently active load balancer */
163
+ char *lb_policy_name;
164
+ grpc_lb_policy *lb_policy;
165
+ /** service config in JSON form */
166
+ char *service_config_json;
167
+ /** maps method names to method_parameters structs */
168
+ grpc_mdstr_hash_table *method_params_table;
169
+ /** incoming resolver result - set by resolver.next() */
170
+ grpc_channel_args *resolver_result;
171
+ /** a list of closures that are all waiting for config to come in */
172
+ grpc_closure_list waiting_for_config_closures;
173
+ /** resolver callback */
174
+ grpc_closure on_resolver_result_changed;
175
+ /** connectivity state being tracked */
176
+ grpc_connectivity_state_tracker state_tracker;
177
+ /** when an lb_policy arrives, should we try to exit idle */
178
+ bool exit_idle_when_lb_policy_arrives;
179
+ /** owning stack */
180
+ grpc_channel_stack *owning_stack;
181
+ /** interested parties (owned) */
182
+ grpc_pollset_set *interested_parties;
183
+ } channel_data;
184
+
185
+ /** We create one watcher for each new lb_policy that is returned from a
186
+ resolver, to watch for state changes from the lb_policy. When a state
187
+ change is seen, we update the channel, and create a new watcher. */
188
+ typedef struct {
189
+ channel_data *chand;
190
+ grpc_closure on_changed;
191
+ grpc_connectivity_state state;
192
+ grpc_lb_policy *lb_policy;
193
+ } lb_policy_connectivity_watcher;
194
+
195
+ static void watch_lb_policy(grpc_exec_ctx *exec_ctx, channel_data *chand,
196
+ grpc_lb_policy *lb_policy,
197
+ grpc_connectivity_state current_state);
198
+
199
+ static void set_channel_connectivity_state_locked(grpc_exec_ctx *exec_ctx,
200
+ channel_data *chand,
201
+ grpc_connectivity_state state,
202
+ grpc_error *error,
203
+ const char *reason) {
204
+ if ((state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
205
+ state == GRPC_CHANNEL_SHUTDOWN) &&
206
+ chand->lb_policy != NULL) {
207
+ /* cancel picks with wait_for_ready=false */
208
+ grpc_lb_policy_cancel_picks(
209
+ exec_ctx, chand->lb_policy,
210
+ /* mask= */ GRPC_INITIAL_METADATA_WAIT_FOR_READY,
211
+ /* check= */ 0, GRPC_ERROR_REF(error));
212
+ }
213
+ grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, state, error,
214
+ reason);
215
+ }
216
+
217
+ static void on_lb_policy_state_changed_locked(grpc_exec_ctx *exec_ctx,
218
+ lb_policy_connectivity_watcher *w,
219
+ grpc_error *error) {
220
+ grpc_connectivity_state publish_state = w->state;
221
+ /* check if the notification is for a stale policy */
222
+ if (w->lb_policy != w->chand->lb_policy) return;
223
+
224
+ if (publish_state == GRPC_CHANNEL_SHUTDOWN && w->chand->resolver != NULL) {
225
+ publish_state = GRPC_CHANNEL_TRANSIENT_FAILURE;
226
+ grpc_resolver_channel_saw_error(exec_ctx, w->chand->resolver);
227
+ GRPC_LB_POLICY_UNREF(exec_ctx, w->chand->lb_policy, "channel");
228
+ w->chand->lb_policy = NULL;
229
+ }
230
+ set_channel_connectivity_state_locked(exec_ctx, w->chand, publish_state,
231
+ GRPC_ERROR_REF(error), "lb_changed");
232
+ if (w->state != GRPC_CHANNEL_SHUTDOWN) {
233
+ watch_lb_policy(exec_ctx, w->chand, w->lb_policy, w->state);
234
+ }
235
+ }
236
+
237
+ static void on_lb_policy_state_changed(grpc_exec_ctx *exec_ctx, void *arg,
238
+ grpc_error *error) {
239
+ lb_policy_connectivity_watcher *w = arg;
240
+
241
+ gpr_mu_lock(&w->chand->mu);
242
+ on_lb_policy_state_changed_locked(exec_ctx, w, error);
243
+ gpr_mu_unlock(&w->chand->mu);
244
+
245
+ GRPC_CHANNEL_STACK_UNREF(exec_ctx, w->chand->owning_stack, "watch_lb_policy");
246
+ gpr_free(w);
247
+ }
248
+
249
+ static void watch_lb_policy(grpc_exec_ctx *exec_ctx, channel_data *chand,
250
+ grpc_lb_policy *lb_policy,
251
+ grpc_connectivity_state current_state) {
252
+ lb_policy_connectivity_watcher *w = gpr_malloc(sizeof(*w));
253
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack, "watch_lb_policy");
254
+
255
+ w->chand = chand;
256
+ grpc_closure_init(&w->on_changed, on_lb_policy_state_changed, w,
257
+ grpc_schedule_on_exec_ctx);
258
+ w->state = current_state;
259
+ w->lb_policy = lb_policy;
260
+ grpc_lb_policy_notify_on_state_change(exec_ctx, lb_policy, &w->state,
261
+ &w->on_changed);
262
+ }
263
+
264
+ static void on_resolver_result_changed(grpc_exec_ctx *exec_ctx, void *arg,
265
+ grpc_error *error) {
266
+ channel_data *chand = arg;
267
+ char *lb_policy_name = NULL;
268
+ grpc_lb_policy *lb_policy = NULL;
269
+ grpc_lb_policy *old_lb_policy;
270
+ grpc_mdstr_hash_table *method_params_table = NULL;
271
+ grpc_connectivity_state state = GRPC_CHANNEL_TRANSIENT_FAILURE;
272
+ bool exit_idle = false;
273
+ grpc_error *state_error = GRPC_ERROR_CREATE("No load balancing policy");
274
+ char *service_config_json = NULL;
275
+
276
+ if (chand->resolver_result != NULL) {
277
+ // Find LB policy name.
278
+ const grpc_arg *channel_arg =
279
+ grpc_channel_args_find(chand->resolver_result, GRPC_ARG_LB_POLICY_NAME);
280
+ if (channel_arg != NULL) {
281
+ GPR_ASSERT(channel_arg->type == GRPC_ARG_STRING);
282
+ lb_policy_name = channel_arg->value.string;
283
+ }
284
+ // Special case: If all of the addresses are balancer addresses,
285
+ // assume that we should use the grpclb policy, regardless of what the
286
+ // resolver actually specified.
287
+ channel_arg =
288
+ grpc_channel_args_find(chand->resolver_result, GRPC_ARG_LB_ADDRESSES);
289
+ if (channel_arg != NULL) {
290
+ GPR_ASSERT(channel_arg->type == GRPC_ARG_POINTER);
291
+ grpc_lb_addresses *addresses = channel_arg->value.pointer.p;
292
+ bool found_backend_address = false;
293
+ for (size_t i = 0; i < addresses->num_addresses; ++i) {
294
+ if (!addresses->addresses[i].is_balancer) {
295
+ found_backend_address = true;
296
+ break;
297
+ }
298
+ }
299
+ if (!found_backend_address) {
300
+ if (lb_policy_name != NULL && strcmp(lb_policy_name, "grpclb") != 0) {
301
+ gpr_log(GPR_INFO,
302
+ "resolver requested LB policy %s but provided only balancer "
303
+ "addresses, no backend addresses -- forcing use of grpclb LB "
304
+ "policy",
305
+ lb_policy_name);
306
+ }
307
+ lb_policy_name = "grpclb";
308
+ }
309
+ }
310
+ // Use pick_first if nothing was specified and we didn't select grpclb
311
+ // above.
312
+ if (lb_policy_name == NULL) lb_policy_name = "pick_first";
313
+ // Instantiate LB policy.
314
+ grpc_lb_policy_args lb_policy_args;
315
+ lb_policy_args.args = chand->resolver_result;
316
+ lb_policy_args.client_channel_factory = chand->client_channel_factory;
317
+ lb_policy =
318
+ grpc_lb_policy_create(exec_ctx, lb_policy_name, &lb_policy_args);
319
+ if (lb_policy != NULL) {
320
+ GRPC_LB_POLICY_REF(lb_policy, "config_change");
321
+ GRPC_ERROR_UNREF(state_error);
322
+ state =
323
+ grpc_lb_policy_check_connectivity(exec_ctx, lb_policy, &state_error);
324
+ }
325
+ // Find service config.
326
+ channel_arg =
327
+ grpc_channel_args_find(chand->resolver_result, GRPC_ARG_SERVICE_CONFIG);
328
+ if (channel_arg != NULL) {
329
+ GPR_ASSERT(channel_arg->type == GRPC_ARG_STRING);
330
+ service_config_json = gpr_strdup(channel_arg->value.string);
331
+ grpc_service_config *service_config =
332
+ grpc_service_config_create(service_config_json);
333
+ if (service_config != NULL) {
334
+ method_params_table = grpc_service_config_create_method_config_table(
335
+ exec_ctx, service_config, method_parameters_create_from_json,
336
+ &method_parameters_vtable);
337
+ grpc_service_config_destroy(service_config);
338
+ }
339
+ }
340
+ // Before we clean up, save a copy of lb_policy_name, since it might
341
+ // be pointing to data inside chand->resolver_result.
342
+ // The copy will be saved in chand->lb_policy_name below.
343
+ lb_policy_name = gpr_strdup(lb_policy_name);
344
+ grpc_channel_args_destroy(exec_ctx, chand->resolver_result);
345
+ chand->resolver_result = NULL;
346
+ }
347
+
348
+ if (lb_policy != NULL) {
349
+ grpc_pollset_set_add_pollset_set(exec_ctx, lb_policy->interested_parties,
350
+ chand->interested_parties);
351
+ }
352
+
353
+ gpr_mu_lock(&chand->mu);
354
+ if (lb_policy_name != NULL) {
355
+ gpr_free(chand->lb_policy_name);
356
+ chand->lb_policy_name = lb_policy_name;
357
+ }
358
+ old_lb_policy = chand->lb_policy;
359
+ chand->lb_policy = lb_policy;
360
+ if (service_config_json != NULL) {
361
+ gpr_free(chand->service_config_json);
362
+ chand->service_config_json = service_config_json;
363
+ }
364
+ if (chand->method_params_table != NULL) {
365
+ grpc_mdstr_hash_table_unref(exec_ctx, chand->method_params_table);
366
+ }
367
+ chand->method_params_table = method_params_table;
368
+ if (lb_policy != NULL) {
369
+ grpc_closure_list_sched(exec_ctx, &chand->waiting_for_config_closures);
370
+ } else if (chand->resolver == NULL /* disconnected */) {
371
+ grpc_closure_list_fail_all(
372
+ &chand->waiting_for_config_closures,
373
+ GRPC_ERROR_CREATE_REFERENCING("Channel disconnected", &error, 1));
374
+ grpc_closure_list_sched(exec_ctx, &chand->waiting_for_config_closures);
375
+ }
376
+ if (lb_policy != NULL && chand->exit_idle_when_lb_policy_arrives) {
377
+ GRPC_LB_POLICY_REF(lb_policy, "exit_idle");
378
+ exit_idle = true;
379
+ chand->exit_idle_when_lb_policy_arrives = false;
380
+ }
381
+
382
+ if (error == GRPC_ERROR_NONE && chand->resolver) {
383
+ set_channel_connectivity_state_locked(
384
+ exec_ctx, chand, state, GRPC_ERROR_REF(state_error), "new_lb+resolver");
385
+ if (lb_policy != NULL) {
386
+ watch_lb_policy(exec_ctx, chand, lb_policy, state);
387
+ }
388
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
389
+ grpc_resolver_next(exec_ctx, chand->resolver, &chand->resolver_result,
390
+ &chand->on_resolver_result_changed);
391
+ gpr_mu_unlock(&chand->mu);
392
+ } else {
393
+ if (chand->resolver != NULL) {
394
+ grpc_resolver_shutdown(exec_ctx, chand->resolver);
395
+ GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
396
+ chand->resolver = NULL;
397
+ }
398
+ grpc_error *refs[] = {error, state_error};
399
+ set_channel_connectivity_state_locked(
400
+ exec_ctx, chand, GRPC_CHANNEL_SHUTDOWN,
401
+ GRPC_ERROR_CREATE_REFERENCING("Got config after disconnection", refs,
402
+ GPR_ARRAY_SIZE(refs)),
403
+ "resolver_gone");
404
+ gpr_mu_unlock(&chand->mu);
405
+ }
406
+
407
+ if (exit_idle) {
408
+ grpc_lb_policy_exit_idle(exec_ctx, lb_policy);
409
+ GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "exit_idle");
410
+ }
411
+
412
+ if (old_lb_policy != NULL) {
413
+ grpc_pollset_set_del_pollset_set(
414
+ exec_ctx, old_lb_policy->interested_parties, chand->interested_parties);
415
+ GRPC_LB_POLICY_UNREF(exec_ctx, old_lb_policy, "channel");
416
+ }
417
+
418
+ if (lb_policy != NULL) {
419
+ GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "config_change");
420
+ }
421
+
422
+ GRPC_CHANNEL_STACK_UNREF(exec_ctx, chand->owning_stack, "resolver");
423
+ GRPC_ERROR_UNREF(state_error);
424
+ }
425
+
426
+ static void cc_start_transport_op(grpc_exec_ctx *exec_ctx,
427
+ grpc_channel_element *elem,
428
+ grpc_transport_op *op) {
429
+ channel_data *chand = elem->channel_data;
430
+
431
+ grpc_closure_sched(exec_ctx, op->on_consumed, GRPC_ERROR_NONE);
432
+
433
+ GPR_ASSERT(op->set_accept_stream == false);
434
+ if (op->bind_pollset != NULL) {
435
+ grpc_pollset_set_add_pollset(exec_ctx, chand->interested_parties,
436
+ op->bind_pollset);
437
+ }
438
+
439
+ gpr_mu_lock(&chand->mu);
440
+ if (op->on_connectivity_state_change != NULL) {
441
+ grpc_connectivity_state_notify_on_state_change(
442
+ exec_ctx, &chand->state_tracker, op->connectivity_state,
443
+ op->on_connectivity_state_change);
444
+ op->on_connectivity_state_change = NULL;
445
+ op->connectivity_state = NULL;
446
+ }
447
+
448
+ if (op->send_ping != NULL) {
449
+ if (chand->lb_policy == NULL) {
450
+ grpc_closure_sched(exec_ctx, op->send_ping,
451
+ GRPC_ERROR_CREATE("Ping with no load balancing"));
452
+ } else {
453
+ grpc_lb_policy_ping_one(exec_ctx, chand->lb_policy, op->send_ping);
454
+ op->bind_pollset = NULL;
455
+ }
456
+ op->send_ping = NULL;
457
+ }
458
+
459
+ if (op->disconnect_with_error != GRPC_ERROR_NONE) {
460
+ if (chand->resolver != NULL) {
461
+ set_channel_connectivity_state_locked(
462
+ exec_ctx, chand, GRPC_CHANNEL_SHUTDOWN,
463
+ GRPC_ERROR_REF(op->disconnect_with_error), "disconnect");
464
+ grpc_resolver_shutdown(exec_ctx, chand->resolver);
465
+ GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
466
+ chand->resolver = NULL;
467
+ if (!chand->started_resolving) {
468
+ grpc_closure_list_fail_all(&chand->waiting_for_config_closures,
469
+ GRPC_ERROR_REF(op->disconnect_with_error));
470
+ grpc_closure_list_sched(exec_ctx, &chand->waiting_for_config_closures);
471
+ }
472
+ if (chand->lb_policy != NULL) {
473
+ grpc_pollset_set_del_pollset_set(exec_ctx,
474
+ chand->lb_policy->interested_parties,
475
+ chand->interested_parties);
476
+ GRPC_LB_POLICY_UNREF(exec_ctx, chand->lb_policy, "channel");
477
+ chand->lb_policy = NULL;
478
+ }
479
+ }
480
+ GRPC_ERROR_UNREF(op->disconnect_with_error);
481
+ }
482
+ gpr_mu_unlock(&chand->mu);
483
+ }
484
+
485
+ static void cc_get_channel_info(grpc_exec_ctx *exec_ctx,
486
+ grpc_channel_element *elem,
487
+ const grpc_channel_info *info) {
488
+ channel_data *chand = elem->channel_data;
489
+ gpr_mu_lock(&chand->mu);
490
+ if (info->lb_policy_name != NULL) {
491
+ *info->lb_policy_name = chand->lb_policy_name == NULL
492
+ ? NULL
493
+ : gpr_strdup(chand->lb_policy_name);
494
+ }
495
+ if (info->service_config_json != NULL) {
496
+ *info->service_config_json = chand->service_config_json == NULL
497
+ ? NULL
498
+ : gpr_strdup(chand->service_config_json);
499
+ }
500
+ gpr_mu_unlock(&chand->mu);
501
+ }
502
+
503
+ /* Constructor for channel_data */
504
+ static grpc_error *cc_init_channel_elem(grpc_exec_ctx *exec_ctx,
505
+ grpc_channel_element *elem,
506
+ grpc_channel_element_args *args) {
507
+ channel_data *chand = elem->channel_data;
508
+ memset(chand, 0, sizeof(*chand));
509
+ GPR_ASSERT(args->is_last);
510
+ GPR_ASSERT(elem->filter == &grpc_client_channel_filter);
511
+ // Initialize data members.
512
+ gpr_mu_init(&chand->mu);
513
+ chand->owning_stack = args->channel_stack;
514
+ grpc_closure_init(&chand->on_resolver_result_changed,
515
+ on_resolver_result_changed, chand,
516
+ grpc_schedule_on_exec_ctx);
517
+ chand->interested_parties = grpc_pollset_set_create();
518
+ grpc_connectivity_state_init(&chand->state_tracker, GRPC_CHANNEL_IDLE,
519
+ "client_channel");
520
+ // Record client channel factory.
521
+ const grpc_arg *arg = grpc_channel_args_find(args->channel_args,
522
+ GRPC_ARG_CLIENT_CHANNEL_FACTORY);
523
+ GPR_ASSERT(arg != NULL);
524
+ GPR_ASSERT(arg->type == GRPC_ARG_POINTER);
525
+ grpc_client_channel_factory_ref(arg->value.pointer.p);
526
+ chand->client_channel_factory = arg->value.pointer.p;
527
+ // Instantiate resolver.
528
+ arg = grpc_channel_args_find(args->channel_args, GRPC_ARG_SERVER_URI);
529
+ GPR_ASSERT(arg != NULL);
530
+ GPR_ASSERT(arg->type == GRPC_ARG_STRING);
531
+ chand->resolver =
532
+ grpc_resolver_create(exec_ctx, arg->value.string, args->channel_args,
533
+ chand->interested_parties);
534
+ if (chand->resolver == NULL) {
535
+ return GRPC_ERROR_CREATE("resolver creation failed");
536
+ }
537
+ return GRPC_ERROR_NONE;
538
+ }
539
+
540
+ /* Destructor for channel_data */
541
+ static void cc_destroy_channel_elem(grpc_exec_ctx *exec_ctx,
542
+ grpc_channel_element *elem) {
543
+ channel_data *chand = elem->channel_data;
544
+
545
+ if (chand->resolver != NULL) {
546
+ grpc_resolver_shutdown(exec_ctx, chand->resolver);
547
+ GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
548
+ }
549
+ if (chand->client_channel_factory != NULL) {
550
+ grpc_client_channel_factory_unref(exec_ctx, chand->client_channel_factory);
551
+ }
552
+ if (chand->lb_policy != NULL) {
553
+ grpc_pollset_set_del_pollset_set(exec_ctx,
554
+ chand->lb_policy->interested_parties,
555
+ chand->interested_parties);
556
+ GRPC_LB_POLICY_UNREF(exec_ctx, chand->lb_policy, "channel");
557
+ }
558
+ gpr_free(chand->lb_policy_name);
559
+ gpr_free(chand->service_config_json);
560
+ if (chand->method_params_table != NULL) {
561
+ grpc_mdstr_hash_table_unref(exec_ctx, chand->method_params_table);
562
+ }
563
+ grpc_connectivity_state_destroy(exec_ctx, &chand->state_tracker);
564
+ grpc_pollset_set_destroy(chand->interested_parties);
565
+ gpr_mu_destroy(&chand->mu);
566
+ }
567
+
568
+ /*************************************************************************
569
+ * PER-CALL FUNCTIONS
570
+ */
571
+
572
+ #define GET_CALL(call_data) \
573
+ ((grpc_subchannel_call *)(gpr_atm_acq_load(&(call_data)->subchannel_call)))
574
+
575
+ #define CANCELLED_CALL ((grpc_subchannel_call *)1)
576
+
577
+ typedef enum {
578
+ GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING,
579
+ GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL
580
+ } subchannel_creation_phase;
581
+
582
+ /** Call data. Holds a pointer to grpc_subchannel_call and the
583
+ associated machinery to create such a pointer.
584
+ Handles queueing of stream ops until a call object is ready, waiting
585
+ for initial metadata before trying to create a call object,
586
+ and handling cancellation gracefully. */
587
+ typedef struct client_channel_call_data {
588
+ // State for handling deadlines.
589
+ // The code in deadline_filter.c requires this to be the first field.
590
+ // TODO(roth): This is slightly sub-optimal in that grpc_deadline_state
591
+ // and this struct both independently store a pointer to the call
592
+ // stack and each has its own mutex. If/when we have time, find a way
593
+ // to avoid this without breaking the grpc_deadline_state abstraction.
594
+ grpc_deadline_state deadline_state;
595
+
596
+ grpc_mdstr *path; // Request path.
597
+ gpr_timespec call_start_time;
598
+ gpr_timespec deadline;
599
+ wait_for_ready_value wait_for_ready_from_service_config;
600
+ grpc_closure read_service_config;
601
+
602
+ grpc_error *cancel_error;
603
+
604
+ /** either 0 for no call, 1 for cancelled, or a pointer to a
605
+ grpc_subchannel_call */
606
+ gpr_atm subchannel_call;
607
+
608
+ gpr_mu mu;
609
+
610
+ subchannel_creation_phase creation_phase;
611
+ grpc_connected_subchannel *connected_subchannel;
612
+ grpc_polling_entity *pollent;
613
+
614
+ grpc_transport_stream_op **waiting_ops;
615
+ size_t waiting_ops_count;
616
+ size_t waiting_ops_capacity;
617
+
618
+ grpc_closure next_step;
619
+
620
+ grpc_call_stack *owning_call;
621
+
622
+ grpc_linked_mdelem lb_token_mdelem;
623
+ } call_data;
624
+
625
+ static void add_waiting_locked(call_data *calld, grpc_transport_stream_op *op) {
626
+ GPR_TIMER_BEGIN("add_waiting_locked", 0);
627
+ if (calld->waiting_ops_count == calld->waiting_ops_capacity) {
628
+ calld->waiting_ops_capacity = GPR_MAX(3, 2 * calld->waiting_ops_capacity);
629
+ calld->waiting_ops =
630
+ gpr_realloc(calld->waiting_ops,
631
+ calld->waiting_ops_capacity * sizeof(*calld->waiting_ops));
632
+ }
633
+ calld->waiting_ops[calld->waiting_ops_count++] = op;
634
+ GPR_TIMER_END("add_waiting_locked", 0);
635
+ }
636
+
637
+ static void fail_locked(grpc_exec_ctx *exec_ctx, call_data *calld,
638
+ grpc_error *error) {
639
+ size_t i;
640
+ for (i = 0; i < calld->waiting_ops_count; i++) {
641
+ grpc_transport_stream_op_finish_with_failure(
642
+ exec_ctx, calld->waiting_ops[i], GRPC_ERROR_REF(error));
643
+ }
644
+ calld->waiting_ops_count = 0;
645
+ GRPC_ERROR_UNREF(error);
646
+ }
647
+
648
+ typedef struct {
649
+ grpc_transport_stream_op **ops;
650
+ size_t nops;
651
+ grpc_subchannel_call *call;
652
+ } retry_ops_args;
653
+
654
+ static void retry_ops(grpc_exec_ctx *exec_ctx, void *args, grpc_error *error) {
655
+ retry_ops_args *a = args;
656
+ size_t i;
657
+ for (i = 0; i < a->nops; i++) {
658
+ grpc_subchannel_call_process_op(exec_ctx, a->call, a->ops[i]);
659
+ }
660
+ GRPC_SUBCHANNEL_CALL_UNREF(exec_ctx, a->call, "retry_ops");
661
+ gpr_free(a->ops);
662
+ gpr_free(a);
663
+ }
664
+
665
+ static void retry_waiting_locked(grpc_exec_ctx *exec_ctx, call_data *calld) {
666
+ if (calld->waiting_ops_count == 0) {
667
+ return;
668
+ }
669
+
670
+ retry_ops_args *a = gpr_malloc(sizeof(*a));
671
+ a->ops = calld->waiting_ops;
672
+ a->nops = calld->waiting_ops_count;
673
+ a->call = GET_CALL(calld);
674
+ if (a->call == CANCELLED_CALL) {
675
+ gpr_free(a);
676
+ fail_locked(exec_ctx, calld, GRPC_ERROR_CANCELLED);
677
+ return;
678
+ }
679
+ calld->waiting_ops = NULL;
680
+ calld->waiting_ops_count = 0;
681
+ calld->waiting_ops_capacity = 0;
682
+ GRPC_SUBCHANNEL_CALL_REF(a->call, "retry_ops");
683
+ grpc_closure_sched(
684
+ exec_ctx, grpc_closure_create(retry_ops, a, grpc_schedule_on_exec_ctx),
685
+ GRPC_ERROR_NONE);
686
+ }
687
+
688
+ static void subchannel_ready(grpc_exec_ctx *exec_ctx, void *arg,
689
+ grpc_error *error) {
690
+ grpc_call_element *elem = arg;
691
+ call_data *calld = elem->call_data;
692
+ channel_data *chand = elem->channel_data;
693
+ gpr_mu_lock(&calld->mu);
694
+ GPR_ASSERT(calld->creation_phase ==
695
+ GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL);
696
+ grpc_polling_entity_del_from_pollset_set(exec_ctx, calld->pollent,
697
+ chand->interested_parties);
698
+ calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING;
699
+ if (calld->connected_subchannel == NULL) {
700
+ gpr_atm_no_barrier_store(&calld->subchannel_call, 1);
701
+ fail_locked(exec_ctx, calld, GRPC_ERROR_CREATE_REFERENCING(
702
+ "Failed to create subchannel", &error, 1));
703
+ } else if (GET_CALL(calld) == CANCELLED_CALL) {
704
+ /* already cancelled before subchannel became ready */
705
+ grpc_error *cancellation_error = GRPC_ERROR_CREATE_REFERENCING(
706
+ "Cancelled before creating subchannel", &error, 1);
707
+ /* if due to deadline, attach the deadline exceeded status to the error */
708
+ if (gpr_time_cmp(calld->deadline, gpr_now(GPR_CLOCK_MONOTONIC)) < 0) {
709
+ cancellation_error =
710
+ grpc_error_set_int(cancellation_error, GRPC_ERROR_INT_GRPC_STATUS,
711
+ GRPC_STATUS_DEADLINE_EXCEEDED);
712
+ }
713
+ fail_locked(exec_ctx, calld, cancellation_error);
714
+ } else {
715
+ /* Create call on subchannel. */
716
+ grpc_subchannel_call *subchannel_call = NULL;
717
+ grpc_error *new_error = grpc_connected_subchannel_create_call(
718
+ exec_ctx, calld->connected_subchannel, calld->pollent, calld->path,
719
+ calld->call_start_time, calld->deadline, &subchannel_call);
720
+ if (new_error != GRPC_ERROR_NONE) {
721
+ new_error = grpc_error_add_child(new_error, error);
722
+ subchannel_call = CANCELLED_CALL;
723
+ fail_locked(exec_ctx, calld, new_error);
724
+ }
725
+ gpr_atm_rel_store(&calld->subchannel_call,
726
+ (gpr_atm)(uintptr_t)subchannel_call);
727
+ retry_waiting_locked(exec_ctx, calld);
728
+ }
729
+ gpr_mu_unlock(&calld->mu);
730
+ GRPC_CALL_STACK_UNREF(exec_ctx, calld->owning_call, "pick_subchannel");
731
+ }
732
+
733
+ static char *cc_get_peer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) {
734
+ call_data *calld = elem->call_data;
735
+ grpc_subchannel_call *subchannel_call = GET_CALL(calld);
736
+ if (subchannel_call == NULL || subchannel_call == CANCELLED_CALL) {
737
+ return NULL;
738
+ } else {
739
+ return grpc_subchannel_call_get_peer(exec_ctx, subchannel_call);
740
+ }
741
+ }
742
+
743
+ typedef struct {
744
+ grpc_metadata_batch *initial_metadata;
745
+ uint32_t initial_metadata_flags;
746
+ grpc_connected_subchannel **connected_subchannel;
747
+ grpc_closure *on_ready;
748
+ grpc_call_element *elem;
749
+ grpc_closure closure;
750
+ } continue_picking_args;
751
+
752
+ /** Return true if subchannel is available immediately (in which case on_ready
753
+ should not be called), or false otherwise (in which case on_ready should be
754
+ called when the subchannel is available). */
755
+ static bool pick_subchannel(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
756
+ grpc_metadata_batch *initial_metadata,
757
+ uint32_t initial_metadata_flags,
758
+ grpc_connected_subchannel **connected_subchannel,
759
+ grpc_closure *on_ready, grpc_error *error);
760
+
761
+ static void continue_picking(grpc_exec_ctx *exec_ctx, void *arg,
762
+ grpc_error *error) {
763
+ continue_picking_args *cpa = arg;
764
+ if (cpa->connected_subchannel == NULL) {
765
+ /* cancelled, do nothing */
766
+ } else if (error != GRPC_ERROR_NONE) {
767
+ grpc_closure_sched(exec_ctx, cpa->on_ready, GRPC_ERROR_REF(error));
768
+ } else {
769
+ call_data *calld = cpa->elem->call_data;
770
+ gpr_mu_lock(&calld->mu);
771
+ if (pick_subchannel(exec_ctx, cpa->elem, cpa->initial_metadata,
772
+ cpa->initial_metadata_flags, cpa->connected_subchannel,
773
+ cpa->on_ready, GRPC_ERROR_NONE)) {
774
+ grpc_closure_sched(exec_ctx, cpa->on_ready, GRPC_ERROR_NONE);
775
+ }
776
+ gpr_mu_unlock(&calld->mu);
777
+ }
778
+ gpr_free(cpa);
779
+ }
780
+
781
+ static bool pick_subchannel(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
782
+ grpc_metadata_batch *initial_metadata,
783
+ uint32_t initial_metadata_flags,
784
+ grpc_connected_subchannel **connected_subchannel,
785
+ grpc_closure *on_ready, grpc_error *error) {
786
+ GPR_TIMER_BEGIN("pick_subchannel", 0);
787
+
788
+ channel_data *chand = elem->channel_data;
789
+ call_data *calld = elem->call_data;
790
+ continue_picking_args *cpa;
791
+ grpc_closure *closure;
792
+
793
+ GPR_ASSERT(connected_subchannel);
794
+
795
+ gpr_mu_lock(&chand->mu);
796
+ if (initial_metadata == NULL) {
797
+ if (chand->lb_policy != NULL) {
798
+ grpc_lb_policy_cancel_pick(exec_ctx, chand->lb_policy,
799
+ connected_subchannel, GRPC_ERROR_REF(error));
800
+ }
801
+ for (closure = chand->waiting_for_config_closures.head; closure != NULL;
802
+ closure = closure->next_data.next) {
803
+ cpa = closure->cb_arg;
804
+ if (cpa->connected_subchannel == connected_subchannel) {
805
+ cpa->connected_subchannel = NULL;
806
+ grpc_closure_sched(
807
+ exec_ctx, cpa->on_ready,
808
+ GRPC_ERROR_CREATE_REFERENCING("Pick cancelled", &error, 1));
809
+ }
810
+ }
811
+ gpr_mu_unlock(&chand->mu);
812
+ GPR_TIMER_END("pick_subchannel", 0);
813
+ GRPC_ERROR_UNREF(error);
814
+ return true;
815
+ }
816
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
817
+ if (chand->lb_policy != NULL) {
818
+ grpc_lb_policy *lb_policy = chand->lb_policy;
819
+ GRPC_LB_POLICY_REF(lb_policy, "pick_subchannel");
820
+ gpr_mu_unlock(&chand->mu);
821
+ // If the application explicitly set wait_for_ready, use that.
822
+ // Otherwise, if the service config specified a value for this
823
+ // method, use that.
824
+ const bool wait_for_ready_set_from_api =
825
+ initial_metadata_flags &
826
+ GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
827
+ const bool wait_for_ready_set_from_service_config =
828
+ calld->wait_for_ready_from_service_config != WAIT_FOR_READY_UNSET;
829
+ if (!wait_for_ready_set_from_api &&
830
+ wait_for_ready_set_from_service_config) {
831
+ if (calld->wait_for_ready_from_service_config == WAIT_FOR_READY_TRUE) {
832
+ initial_metadata_flags |= GRPC_INITIAL_METADATA_WAIT_FOR_READY;
833
+ } else {
834
+ initial_metadata_flags &= ~GRPC_INITIAL_METADATA_WAIT_FOR_READY;
835
+ }
836
+ }
837
+ const grpc_lb_policy_pick_args inputs = {
838
+ initial_metadata, initial_metadata_flags, &calld->lb_token_mdelem,
839
+ gpr_inf_future(GPR_CLOCK_MONOTONIC)};
840
+ const bool result = grpc_lb_policy_pick(
841
+ exec_ctx, lb_policy, &inputs, connected_subchannel, NULL, on_ready);
842
+ GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "pick_subchannel");
843
+ GPR_TIMER_END("pick_subchannel", 0);
844
+ return result;
845
+ }
846
+ if (chand->resolver != NULL && !chand->started_resolving) {
847
+ chand->started_resolving = true;
848
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
849
+ grpc_resolver_next(exec_ctx, chand->resolver, &chand->resolver_result,
850
+ &chand->on_resolver_result_changed);
851
+ }
852
+ if (chand->resolver != NULL) {
853
+ cpa = gpr_malloc(sizeof(*cpa));
854
+ cpa->initial_metadata = initial_metadata;
855
+ cpa->initial_metadata_flags = initial_metadata_flags;
856
+ cpa->connected_subchannel = connected_subchannel;
857
+ cpa->on_ready = on_ready;
858
+ cpa->elem = elem;
859
+ grpc_closure_init(&cpa->closure, continue_picking, cpa,
860
+ grpc_schedule_on_exec_ctx);
861
+ grpc_closure_list_append(&chand->waiting_for_config_closures, &cpa->closure,
862
+ GRPC_ERROR_NONE);
863
+ } else {
864
+ grpc_closure_sched(exec_ctx, on_ready, GRPC_ERROR_CREATE("Disconnected"));
865
+ }
866
+ gpr_mu_unlock(&chand->mu);
867
+
868
+ GPR_TIMER_END("pick_subchannel", 0);
869
+ return false;
870
+ }
871
+
872
+ // The logic here is fairly complicated, due to (a) the fact that we
873
+ // need to handle the case where we receive the send op before the
874
+ // initial metadata op, and (b) the need for efficiency, especially in
875
+ // the streaming case.
876
+ // TODO(ctiller): Explain this more thoroughly.
877
+ static void cc_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
878
+ grpc_call_element *elem,
879
+ grpc_transport_stream_op *op) {
880
+ call_data *calld = elem->call_data;
881
+ channel_data *chand = elem->channel_data;
882
+ GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
883
+ grpc_deadline_state_client_start_transport_stream_op(exec_ctx, elem, op);
884
+ /* try to (atomically) get the call */
885
+ grpc_subchannel_call *call = GET_CALL(calld);
886
+ GPR_TIMER_BEGIN("cc_start_transport_stream_op", 0);
887
+ if (call == CANCELLED_CALL) {
888
+ grpc_transport_stream_op_finish_with_failure(
889
+ exec_ctx, op, GRPC_ERROR_REF(calld->cancel_error));
890
+ GPR_TIMER_END("cc_start_transport_stream_op", 0);
891
+ return;
892
+ }
893
+ if (call != NULL) {
894
+ grpc_subchannel_call_process_op(exec_ctx, call, op);
895
+ GPR_TIMER_END("cc_start_transport_stream_op", 0);
896
+ return;
897
+ }
898
+ /* we failed; lock and figure out what to do */
899
+ gpr_mu_lock(&calld->mu);
900
+ retry:
901
+ /* need to recheck that another thread hasn't set the call */
902
+ call = GET_CALL(calld);
903
+ if (call == CANCELLED_CALL) {
904
+ gpr_mu_unlock(&calld->mu);
905
+ grpc_transport_stream_op_finish_with_failure(
906
+ exec_ctx, op, GRPC_ERROR_REF(calld->cancel_error));
907
+ GPR_TIMER_END("cc_start_transport_stream_op", 0);
908
+ return;
909
+ }
910
+ if (call != NULL) {
911
+ gpr_mu_unlock(&calld->mu);
912
+ grpc_subchannel_call_process_op(exec_ctx, call, op);
913
+ GPR_TIMER_END("cc_start_transport_stream_op", 0);
914
+ return;
915
+ }
916
+ /* if this is a cancellation, then we can raise our cancelled flag */
917
+ if (op->cancel_error != GRPC_ERROR_NONE) {
918
+ if (!gpr_atm_rel_cas(&calld->subchannel_call, 0,
919
+ (gpr_atm)(uintptr_t)CANCELLED_CALL)) {
920
+ goto retry;
921
+ } else {
922
+ // Stash a copy of cancel_error in our call data, so that we can use
923
+ // it for subsequent operations. This ensures that if the call is
924
+ // cancelled before any ops are passed down (e.g., if the deadline
925
+ // is in the past when the call starts), we can return the right
926
+ // error to the caller when the first op does get passed down.
927
+ calld->cancel_error = GRPC_ERROR_REF(op->cancel_error);
928
+ switch (calld->creation_phase) {
929
+ case GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING:
930
+ fail_locked(exec_ctx, calld, GRPC_ERROR_REF(op->cancel_error));
931
+ break;
932
+ case GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL:
933
+ pick_subchannel(exec_ctx, elem, NULL, 0, &calld->connected_subchannel,
934
+ NULL, GRPC_ERROR_REF(op->cancel_error));
935
+ break;
936
+ }
937
+ gpr_mu_unlock(&calld->mu);
938
+ grpc_transport_stream_op_finish_with_failure(
939
+ exec_ctx, op, GRPC_ERROR_REF(op->cancel_error));
940
+ GPR_TIMER_END("cc_start_transport_stream_op", 0);
941
+ return;
942
+ }
943
+ }
944
+ /* if we don't have a subchannel, try to get one */
945
+ if (calld->creation_phase == GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING &&
946
+ calld->connected_subchannel == NULL &&
947
+ op->send_initial_metadata != NULL) {
948
+ calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL;
949
+ grpc_closure_init(&calld->next_step, subchannel_ready, elem,
950
+ grpc_schedule_on_exec_ctx);
951
+ GRPC_CALL_STACK_REF(calld->owning_call, "pick_subchannel");
952
+ /* If a subchannel is not available immediately, the polling entity from
953
+ call_data should be provided to channel_data's interested_parties, so
954
+ that IO of the lb_policy and resolver could be done under it. */
955
+ if (pick_subchannel(exec_ctx, elem, op->send_initial_metadata,
956
+ op->send_initial_metadata_flags,
957
+ &calld->connected_subchannel, &calld->next_step,
958
+ GRPC_ERROR_NONE)) {
959
+ calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING;
960
+ GRPC_CALL_STACK_UNREF(exec_ctx, calld->owning_call, "pick_subchannel");
961
+ } else {
962
+ grpc_polling_entity_add_to_pollset_set(exec_ctx, calld->pollent,
963
+ chand->interested_parties);
964
+ }
965
+ }
966
+ /* if we've got a subchannel, then let's ask it to create a call */
967
+ if (calld->creation_phase == GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING &&
968
+ calld->connected_subchannel != NULL) {
969
+ grpc_subchannel_call *subchannel_call = NULL;
970
+ grpc_error *error = grpc_connected_subchannel_create_call(
971
+ exec_ctx, calld->connected_subchannel, calld->pollent, calld->path,
972
+ calld->call_start_time, calld->deadline, &subchannel_call);
973
+ if (error != GRPC_ERROR_NONE) {
974
+ subchannel_call = CANCELLED_CALL;
975
+ fail_locked(exec_ctx, calld, GRPC_ERROR_REF(error));
976
+ grpc_transport_stream_op_finish_with_failure(exec_ctx, op, error);
977
+ }
978
+ gpr_atm_rel_store(&calld->subchannel_call,
979
+ (gpr_atm)(uintptr_t)subchannel_call);
980
+ retry_waiting_locked(exec_ctx, calld);
981
+ goto retry;
982
+ }
983
+ /* nothing to be done but wait */
984
+ add_waiting_locked(calld, op);
985
+ gpr_mu_unlock(&calld->mu);
986
+ GPR_TIMER_END("cc_start_transport_stream_op", 0);
987
+ }
988
+
989
+ // Gets data from the service config. Invoked when the resolver returns
990
+ // its initial result.
991
+ static void read_service_config(grpc_exec_ctx *exec_ctx, void *arg,
992
+ grpc_error *error) {
993
+ grpc_call_element *elem = arg;
994
+ channel_data *chand = elem->channel_data;
995
+ call_data *calld = elem->call_data;
996
+ // If this is an error, there's no point in looking at the service config.
997
+ if (error == GRPC_ERROR_NONE) {
998
+ // Get the method config table from channel data.
999
+ gpr_mu_lock(&chand->mu);
1000
+ grpc_mdstr_hash_table *method_params_table = NULL;
1001
+ if (chand->method_params_table != NULL) {
1002
+ method_params_table =
1003
+ grpc_mdstr_hash_table_ref(chand->method_params_table);
1004
+ }
1005
+ gpr_mu_unlock(&chand->mu);
1006
+ // If the method config table was present, use it.
1007
+ if (method_params_table != NULL) {
1008
+ const method_parameters *method_params = grpc_method_config_table_get(
1009
+ exec_ctx, method_params_table, calld->path);
1010
+ if (method_params != NULL) {
1011
+ const bool have_method_timeout =
1012
+ gpr_time_cmp(method_params->timeout, gpr_time_0(GPR_TIMESPAN)) != 0;
1013
+ if (have_method_timeout ||
1014
+ method_params->wait_for_ready != WAIT_FOR_READY_UNSET) {
1015
+ gpr_mu_lock(&calld->mu);
1016
+ if (have_method_timeout) {
1017
+ const gpr_timespec per_method_deadline =
1018
+ gpr_time_add(calld->call_start_time, method_params->timeout);
1019
+ if (gpr_time_cmp(per_method_deadline, calld->deadline) < 0) {
1020
+ calld->deadline = per_method_deadline;
1021
+ // Reset deadline timer.
1022
+ grpc_deadline_state_reset(exec_ctx, elem, calld->deadline);
1023
+ }
1024
+ }
1025
+ if (method_params->wait_for_ready != WAIT_FOR_READY_UNSET) {
1026
+ calld->wait_for_ready_from_service_config =
1027
+ method_params->wait_for_ready;
1028
+ }
1029
+ gpr_mu_unlock(&calld->mu);
1030
+ }
1031
+ }
1032
+ grpc_mdstr_hash_table_unref(exec_ctx, method_params_table);
1033
+ }
1034
+ }
1035
+ GRPC_CALL_STACK_UNREF(exec_ctx, calld->owning_call, "read_service_config");
1036
+ }
1037
+
1038
+ /* Constructor for call_data */
1039
+ static grpc_error *cc_init_call_elem(grpc_exec_ctx *exec_ctx,
1040
+ grpc_call_element *elem,
1041
+ grpc_call_element_args *args) {
1042
+ channel_data *chand = elem->channel_data;
1043
+ call_data *calld = elem->call_data;
1044
+ // Initialize data members.
1045
+ grpc_deadline_state_init(exec_ctx, elem, args->call_stack);
1046
+ calld->path = GRPC_MDSTR_REF(args->path);
1047
+ calld->call_start_time = args->start_time;
1048
+ calld->deadline = gpr_convert_clock_type(args->deadline, GPR_CLOCK_MONOTONIC);
1049
+ calld->wait_for_ready_from_service_config = WAIT_FOR_READY_UNSET;
1050
+ calld->cancel_error = GRPC_ERROR_NONE;
1051
+ gpr_atm_rel_store(&calld->subchannel_call, 0);
1052
+ gpr_mu_init(&calld->mu);
1053
+ calld->connected_subchannel = NULL;
1054
+ calld->waiting_ops = NULL;
1055
+ calld->waiting_ops_count = 0;
1056
+ calld->waiting_ops_capacity = 0;
1057
+ calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING;
1058
+ calld->owning_call = args->call_stack;
1059
+ calld->pollent = NULL;
1060
+ // If the resolver has already returned results, then we can access
1061
+ // the service config parameters immediately. Otherwise, we need to
1062
+ // defer that work until the resolver returns an initial result.
1063
+ // TODO(roth): This code is almost but not quite identical to the code
1064
+ // in read_service_config() above. It would be nice to find a way to
1065
+ // combine them, to avoid having to maintain it twice.
1066
+ gpr_mu_lock(&chand->mu);
1067
+ if (chand->lb_policy != NULL) {
1068
+ // We already have a resolver result, so check for service config.
1069
+ if (chand->method_params_table != NULL) {
1070
+ grpc_mdstr_hash_table *method_params_table =
1071
+ grpc_mdstr_hash_table_ref(chand->method_params_table);
1072
+ gpr_mu_unlock(&chand->mu);
1073
+ method_parameters *method_params = grpc_method_config_table_get(
1074
+ exec_ctx, method_params_table, args->path);
1075
+ if (method_params != NULL) {
1076
+ if (gpr_time_cmp(method_params->timeout,
1077
+ gpr_time_0(GPR_CLOCK_MONOTONIC)) != 0) {
1078
+ gpr_timespec per_method_deadline =
1079
+ gpr_time_add(calld->call_start_time, method_params->timeout);
1080
+ calld->deadline = gpr_time_min(calld->deadline, per_method_deadline);
1081
+ }
1082
+ if (method_params->wait_for_ready != WAIT_FOR_READY_UNSET) {
1083
+ calld->wait_for_ready_from_service_config =
1084
+ method_params->wait_for_ready;
1085
+ }
1086
+ }
1087
+ grpc_mdstr_hash_table_unref(exec_ctx, method_params_table);
1088
+ } else {
1089
+ gpr_mu_unlock(&chand->mu);
1090
+ }
1091
+ } else {
1092
+ // We don't yet have a resolver result, so register a callback to
1093
+ // get the service config data once the resolver returns.
1094
+ // Take a reference to the call stack to be owned by the callback.
1095
+ GRPC_CALL_STACK_REF(calld->owning_call, "read_service_config");
1096
+ grpc_closure_init(&calld->read_service_config, read_service_config, elem,
1097
+ grpc_schedule_on_exec_ctx);
1098
+ grpc_closure_list_append(&chand->waiting_for_config_closures,
1099
+ &calld->read_service_config, GRPC_ERROR_NONE);
1100
+ gpr_mu_unlock(&chand->mu);
1101
+ }
1102
+ // Start the deadline timer with the current deadline value. If we
1103
+ // do not yet have service config data, then the timer may be reset
1104
+ // later.
1105
+ grpc_deadline_state_start(exec_ctx, elem, calld->deadline);
1106
+ return GRPC_ERROR_NONE;
1107
+ }
1108
+
1109
+ /* Destructor for call_data */
1110
+ static void cc_destroy_call_elem(grpc_exec_ctx *exec_ctx,
1111
+ grpc_call_element *elem,
1112
+ const grpc_call_final_info *final_info,
1113
+ void *and_free_memory) {
1114
+ call_data *calld = elem->call_data;
1115
+ grpc_deadline_state_destroy(exec_ctx, elem);
1116
+ GRPC_MDSTR_UNREF(exec_ctx, calld->path);
1117
+ GRPC_ERROR_UNREF(calld->cancel_error);
1118
+ grpc_subchannel_call *call = GET_CALL(calld);
1119
+ if (call != NULL && call != CANCELLED_CALL) {
1120
+ GRPC_SUBCHANNEL_CALL_UNREF(exec_ctx, call, "client_channel_destroy_call");
1121
+ }
1122
+ GPR_ASSERT(calld->creation_phase == GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING);
1123
+ gpr_mu_destroy(&calld->mu);
1124
+ GPR_ASSERT(calld->waiting_ops_count == 0);
1125
+ if (calld->connected_subchannel != NULL) {
1126
+ GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, calld->connected_subchannel,
1127
+ "picked");
1128
+ }
1129
+ gpr_free(calld->waiting_ops);
1130
+ gpr_free(and_free_memory);
1131
+ }
1132
+
1133
+ static void cc_set_pollset_or_pollset_set(grpc_exec_ctx *exec_ctx,
1134
+ grpc_call_element *elem,
1135
+ grpc_polling_entity *pollent) {
1136
+ call_data *calld = elem->call_data;
1137
+ calld->pollent = pollent;
1138
+ }
1139
+
1140
+ /*************************************************************************
1141
+ * EXPORTED SYMBOLS
1142
+ */
1143
+
1144
+ const grpc_channel_filter grpc_client_channel_filter = {
1145
+ cc_start_transport_stream_op,
1146
+ cc_start_transport_op,
1147
+ sizeof(call_data),
1148
+ cc_init_call_elem,
1149
+ cc_set_pollset_or_pollset_set,
1150
+ cc_destroy_call_elem,
1151
+ sizeof(channel_data),
1152
+ cc_init_channel_elem,
1153
+ cc_destroy_channel_elem,
1154
+ cc_get_peer,
1155
+ cc_get_channel_info,
1156
+ "client-channel",
1157
+ };
1158
+
1159
+ grpc_connectivity_state grpc_client_channel_check_connectivity_state(
1160
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, int try_to_connect) {
1161
+ channel_data *chand = elem->channel_data;
1162
+ grpc_connectivity_state out;
1163
+ gpr_mu_lock(&chand->mu);
1164
+ out = grpc_connectivity_state_check(&chand->state_tracker, NULL);
1165
+ if (out == GRPC_CHANNEL_IDLE && try_to_connect) {
1166
+ if (chand->lb_policy != NULL) {
1167
+ grpc_lb_policy_exit_idle(exec_ctx, chand->lb_policy);
1168
+ } else {
1169
+ chand->exit_idle_when_lb_policy_arrives = true;
1170
+ if (!chand->started_resolving && chand->resolver != NULL) {
1171
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
1172
+ chand->started_resolving = true;
1173
+ grpc_resolver_next(exec_ctx, chand->resolver, &chand->resolver_result,
1174
+ &chand->on_resolver_result_changed);
1175
+ }
1176
+ }
1177
+ }
1178
+ gpr_mu_unlock(&chand->mu);
1179
+ return out;
1180
+ }
1181
+
1182
+ typedef struct {
1183
+ channel_data *chand;
1184
+ grpc_pollset *pollset;
1185
+ grpc_closure *on_complete;
1186
+ grpc_closure my_closure;
1187
+ } external_connectivity_watcher;
1188
+
1189
+ static void on_external_watch_complete(grpc_exec_ctx *exec_ctx, void *arg,
1190
+ grpc_error *error) {
1191
+ external_connectivity_watcher *w = arg;
1192
+ grpc_closure *follow_up = w->on_complete;
1193
+ grpc_pollset_set_del_pollset(exec_ctx, w->chand->interested_parties,
1194
+ w->pollset);
1195
+ GRPC_CHANNEL_STACK_UNREF(exec_ctx, w->chand->owning_stack,
1196
+ "external_connectivity_watcher");
1197
+ gpr_free(w);
1198
+ follow_up->cb(exec_ctx, follow_up->cb_arg, error);
1199
+ }
1200
+
1201
+ void grpc_client_channel_watch_connectivity_state(
1202
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, grpc_pollset *pollset,
1203
+ grpc_connectivity_state *state, grpc_closure *on_complete) {
1204
+ channel_data *chand = elem->channel_data;
1205
+ external_connectivity_watcher *w = gpr_malloc(sizeof(*w));
1206
+ w->chand = chand;
1207
+ w->pollset = pollset;
1208
+ w->on_complete = on_complete;
1209
+ grpc_pollset_set_add_pollset(exec_ctx, chand->interested_parties, pollset);
1210
+ grpc_closure_init(&w->my_closure, on_external_watch_complete, w,
1211
+ grpc_schedule_on_exec_ctx);
1212
+ GRPC_CHANNEL_STACK_REF(w->chand->owning_stack,
1213
+ "external_connectivity_watcher");
1214
+ gpr_mu_lock(&chand->mu);
1215
+ grpc_connectivity_state_notify_on_state_change(
1216
+ exec_ctx, &chand->state_tracker, state, &w->my_closure);
1217
+ gpr_mu_unlock(&chand->mu);
1218
+ }