grpc 1.8.7 → 1.9.0.pre1

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

Potentially problematic release.


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

Files changed (488) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +549 -325
  3. data/include/grpc/impl/codegen/grpc_types.h +1 -2
  4. data/include/grpc/impl/codegen/port_platform.h +46 -5
  5. data/include/grpc/impl/codegen/slice.h +1 -2
  6. data/include/grpc/module.modulemap +0 -2
  7. data/include/grpc/slice_buffer.h +1 -2
  8. data/include/grpc/support/log.h +4 -2
  9. data/include/grpc/support/thd.h +4 -1
  10. data/include/grpc/support/tls.h +6 -0
  11. data/include/grpc/support/tls_gcc.h +5 -40
  12. data/include/grpc/support/tls_msvc.h +9 -0
  13. data/include/grpc/support/tls_pthread.h +9 -0
  14. data/src/core/ext/filters/client_channel/backup_poller.cc +32 -29
  15. data/src/core/ext/filters/client_channel/backup_poller.h +2 -2
  16. data/src/core/ext/filters/client_channel/channel_connectivity.cc +26 -32
  17. data/src/core/ext/filters/client_channel/client_channel.cc +325 -356
  18. data/src/core/ext/filters/client_channel/client_channel.h +4 -12
  19. data/src/core/ext/filters/client_channel/client_channel_factory.cc +9 -14
  20. data/src/core/ext/filters/client_channel/client_channel_factory.h +7 -20
  21. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +7 -10
  22. data/src/core/ext/filters/client_channel/connector.cc +6 -7
  23. data/src/core/ext/filters/client_channel/connector.h +6 -16
  24. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +38 -50
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -8
  26. data/src/core/ext/filters/client_channel/http_proxy.cc +9 -13
  27. data/src/core/ext/filters/client_channel/http_proxy.h +0 -8
  28. data/src/core/ext/filters/client_channel/lb_policy.cc +72 -94
  29. data/src/core/ext/filters/client_channel/lb_policy.h +83 -92
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +14 -19
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +0 -8
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +474 -591
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -8
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +2 -10
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +6 -6
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +0 -8
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +0 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +0 -9
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +3 -4
  40. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +9 -12
  41. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +160 -182
  42. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -221
  43. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +24 -35
  44. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +9 -20
  45. data/src/core/ext/filters/client_channel/lb_policy_factory.cc +6 -9
  46. data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -15
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -3
  48. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -9
  49. data/src/core/ext/filters/client_channel/parse_address.cc +1 -1
  50. data/src/core/ext/filters/client_channel/parse_address.h +0 -8
  51. data/src/core/ext/filters/client_channel/proxy_mapper.cc +6 -8
  52. data/src/core/ext/filters/client_channel/proxy_mapper.h +6 -16
  53. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +13 -17
  54. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +2 -12
  55. data/src/core/ext/filters/client_channel/resolver.cc +11 -13
  56. data/src/core/ext/filters/client_channel/resolver.h +14 -25
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +57 -70
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -12
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +23 -31
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +27 -45
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -15
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +9 -11
  63. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +53 -66
  64. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +25 -33
  65. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -9
  66. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +26 -35
  67. data/src/core/ext/filters/client_channel/resolver_factory.cc +2 -3
  68. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -12
  69. data/src/core/ext/filters/client_channel/resolver_registry.cc +12 -15
  70. data/src/core/ext/filters/client_channel/resolver_registry.h +3 -12
  71. data/src/core/ext/filters/client_channel/retry_throttle.h +0 -8
  72. data/src/core/ext/filters/client_channel/subchannel.cc +289 -301
  73. data/src/core/ext/filters/client_channel/subchannel.h +57 -84
  74. data/src/core/ext/filters/client_channel/subchannel_index.cc +30 -33
  75. data/src/core/ext/filters/client_channel/subchannel_index.h +4 -16
  76. data/src/core/ext/filters/client_channel/uri_parser.cc +13 -17
  77. data/src/core/ext/filters/client_channel/uri_parser.h +1 -10
  78. data/src/core/ext/filters/deadline/deadline_filter.cc +49 -67
  79. data/src/core/ext/filters/deadline/deadline_filter.h +4 -14
  80. data/src/core/ext/filters/http/client/http_client_filter.cc +60 -77
  81. data/src/core/ext/filters/http/client/http_client_filter.h +0 -8
  82. data/src/core/ext/filters/http/http_filters_plugin.cc +4 -6
  83. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +63 -79
  84. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -8
  85. data/src/core/ext/filters/http/server/http_server_filter.cc +57 -71
  86. data/src/core/ext/filters/http/server/http_server_filter.h +0 -8
  87. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +19 -24
  88. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.h +0 -8
  89. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +3 -3
  90. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +0 -8
  91. data/src/core/ext/filters/max_age/max_age_filter.cc +49 -62
  92. data/src/core/ext/filters/max_age/max_age_filter.h +0 -8
  93. data/src/core/ext/filters/message_size/message_size_filter.cc +23 -29
  94. data/src/core/ext/filters/message_size/message_size_filter.h +0 -8
  95. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +15 -18
  96. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +0 -8
  97. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -8
  98. data/src/core/ext/transport/chttp2/alpn/alpn.h +0 -8
  99. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +33 -40
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -8
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +15 -17
  102. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +8 -8
  103. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +23 -28
  104. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +50 -57
  105. data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -10
  106. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -3
  107. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -10
  108. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +5 -6
  109. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -9
  110. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -11
  111. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -9
  112. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +10 -2
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +516 -636
  114. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +4 -11
  115. data/src/core/ext/transport/chttp2/transport/flow_control.cc +29 -13
  116. data/src/core/ext/transport/chttp2/transport/flow_control.h +196 -53
  117. data/src/core/ext/transport/chttp2/transport/frame.h +0 -8
  118. data/src/core/ext/transport/chttp2/transport/frame_data.cc +31 -33
  119. data/src/core/ext/transport/chttp2/transport/frame_data.h +3 -12
  120. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -3
  121. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +1 -10
  122. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -9
  124. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  125. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +1 -10
  126. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +8 -3
  127. data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -10
  128. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +8 -8
  129. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -11
  130. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +63 -81
  131. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -12
  132. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +230 -318
  133. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +6 -19
  134. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +14 -20
  135. data/src/core/ext/transport/chttp2/transport/hpack_table.h +5 -16
  136. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -7
  137. data/src/core/ext/transport/chttp2/transport/huffsyms.h +0 -8
  138. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +8 -11
  139. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +4 -13
  140. data/src/core/ext/transport/chttp2/transport/internal.h +51 -75
  141. data/src/core/ext/transport/chttp2/transport/parsing.cc +83 -109
  142. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +2 -0
  143. data/src/core/ext/transport/chttp2/transport/stream_map.h +0 -8
  144. data/src/core/ext/transport/chttp2/transport/varint.h +0 -8
  145. data/src/core/ext/transport/chttp2/transport/writing.cc +61 -65
  146. data/src/core/ext/transport/inproc/inproc_plugin.cc +2 -4
  147. data/src/core/ext/transport/inproc/inproc_transport.cc +177 -188
  148. data/src/core/ext/transport/inproc/inproc_transport.h +0 -8
  149. data/src/core/lib/backoff/backoff.cc +39 -44
  150. data/src/core/lib/backoff/backoff.h +61 -57
  151. data/src/core/lib/channel/channel_args.cc +8 -10
  152. data/src/core/lib/channel/channel_args.h +4 -13
  153. data/src/core/lib/channel/channel_stack.cc +19 -27
  154. data/src/core/lib/channel/channel_stack.h +27 -47
  155. data/src/core/lib/channel/channel_stack_builder.cc +11 -14
  156. data/src/core/lib/channel/channel_stack_builder.h +4 -15
  157. data/src/core/lib/channel/connected_channel.cc +23 -36
  158. data/src/core/lib/channel/connected_channel.h +1 -10
  159. data/src/core/lib/channel/handshaker.cc +31 -40
  160. data/src/core/lib/channel/handshaker.h +14 -25
  161. data/src/core/lib/channel/handshaker_factory.cc +6 -6
  162. data/src/core/lib/channel/handshaker_factory.h +5 -15
  163. data/src/core/lib/channel/handshaker_registry.cc +9 -13
  164. data/src/core/lib/channel/handshaker_registry.h +2 -11
  165. data/src/core/lib/compression/algorithm_metadata.h +0 -8
  166. data/src/core/lib/compression/message_compress.cc +19 -23
  167. data/src/core/lib/compression/message_compress.h +2 -12
  168. data/src/core/lib/compression/stream_compression.cc +1 -1
  169. data/src/core/lib/compression/stream_compression.h +0 -8
  170. data/src/core/lib/compression/stream_compression_gzip.cc +12 -11
  171. data/src/core/lib/compression/stream_compression_gzip.h +0 -8
  172. data/src/core/lib/compression/stream_compression_identity.h +0 -8
  173. data/src/core/lib/debug/stats.cc +4 -4
  174. data/src/core/lib/debug/stats.h +9 -19
  175. data/src/core/lib/debug/stats_data.cc +85 -116
  176. data/src/core/lib/debug/stats_data.h +236 -312
  177. data/src/core/lib/debug/trace.cc +1 -1
  178. data/src/core/lib/debug/trace.h +0 -12
  179. data/src/core/lib/{support → gpr++}/abstract.h +8 -3
  180. data/src/core/lib/{support → gpr++}/atomic.h +5 -5
  181. data/src/core/lib/{support → gpr++}/atomic_with_atm.h +3 -3
  182. data/src/core/lib/{support → gpr++}/atomic_with_std.h +3 -3
  183. data/src/core/lib/gpr++/debug_location.h +52 -0
  184. data/src/core/lib/gpr++/inlined_vector.h +112 -0
  185. data/src/core/lib/{support → gpr++}/manual_constructor.h +2 -2
  186. data/src/core/lib/{support → gpr++}/memory.h +3 -3
  187. data/src/core/lib/gpr++/orphanable.h +171 -0
  188. data/src/core/lib/gpr++/ref_counted.h +133 -0
  189. data/src/core/lib/gpr++/ref_counted_ptr.h +99 -0
  190. data/src/core/lib/{support → gpr}/alloc.cc +0 -0
  191. data/src/core/lib/{support → gpr}/arena.cc +1 -1
  192. data/src/core/lib/{support → gpr}/arena.h +3 -11
  193. data/src/core/lib/{support → gpr}/atm.cc +0 -0
  194. data/src/core/lib/{support → gpr}/avl.cc +0 -0
  195. data/src/core/lib/{support → gpr}/cmdline.cc +1 -1
  196. data/src/core/lib/{support → gpr}/cpu_iphone.cc +0 -0
  197. data/src/core/lib/{support → gpr}/cpu_linux.cc +0 -0
  198. data/src/core/lib/{support → gpr}/cpu_posix.cc +0 -0
  199. data/src/core/lib/{support → gpr}/cpu_windows.cc +0 -0
  200. data/src/core/lib/{support → gpr}/env.h +3 -11
  201. data/src/core/lib/{support → gpr}/env_linux.cc +2 -2
  202. data/src/core/lib/{support → gpr}/env_posix.cc +4 -4
  203. data/src/core/lib/{support → gpr}/env_windows.cc +3 -3
  204. data/src/core/lib/{support → gpr}/fork.cc +3 -3
  205. data/src/core/lib/{support → gpr}/fork.h +3 -3
  206. data/src/core/lib/{support → gpr}/host_port.cc +1 -1
  207. data/src/core/lib/{support → gpr}/log.cc +3 -3
  208. data/src/core/lib/{support → gpr}/log_android.cc +3 -3
  209. data/src/core/lib/{support → gpr}/log_linux.cc +1 -1
  210. data/src/core/lib/{support → gpr}/log_posix.cc +5 -5
  211. data/src/core/lib/{support → gpr}/log_windows.cc +3 -3
  212. data/src/core/lib/{support → gpr}/mpscq.cc +1 -1
  213. data/src/core/lib/{support → gpr}/mpscq.h +3 -10
  214. data/src/core/lib/{support → gpr}/murmur_hash.cc +1 -1
  215. data/src/core/lib/{support → gpr}/murmur_hash.h +3 -11
  216. data/src/core/lib/{support → gpr}/spinlock.h +3 -3
  217. data/src/core/lib/{support → gpr}/string.cc +1 -1
  218. data/src/core/lib/{support → gpr}/string.h +3 -10
  219. data/src/core/lib/{support → gpr}/string_posix.cc +0 -0
  220. data/src/core/lib/{support → gpr}/string_util_windows.cc +2 -2
  221. data/src/core/lib/{support → gpr}/string_windows.cc +1 -1
  222. data/src/core/lib/{support → gpr}/string_windows.h +3 -11
  223. data/src/core/lib/{support → gpr}/subprocess_posix.cc +0 -0
  224. data/src/core/lib/{support → gpr}/subprocess_windows.cc +2 -2
  225. data/src/core/lib/{support → gpr}/sync.cc +0 -0
  226. data/src/core/lib/{support → gpr}/sync_posix.cc +10 -1
  227. data/src/core/lib/{support → gpr}/sync_windows.cc +0 -0
  228. data/src/core/lib/{support → gpr}/thd.cc +0 -0
  229. data/src/core/lib/{support → gpr}/thd_internal.h +3 -3
  230. data/src/core/lib/{support → gpr}/thd_posix.cc +18 -2
  231. data/src/core/lib/{support → gpr}/thd_windows.cc +2 -1
  232. data/src/core/lib/{support → gpr}/time.cc +0 -0
  233. data/src/core/lib/{support → gpr}/time_posix.cc +2 -4
  234. data/src/core/lib/{support → gpr}/time_precise.cc +1 -1
  235. data/src/core/lib/{support → gpr}/time_precise.h +3 -11
  236. data/src/core/lib/{support → gpr}/time_windows.cc +1 -3
  237. data/src/core/lib/{support → gpr}/tls_pthread.cc +0 -0
  238. data/src/core/lib/{support → gpr}/tmpfile.h +3 -11
  239. data/src/core/lib/{support → gpr}/tmpfile_msys.cc +2 -2
  240. data/src/core/lib/{support → gpr}/tmpfile_posix.cc +2 -2
  241. data/src/core/lib/{support → gpr}/tmpfile_windows.cc +2 -2
  242. data/src/core/lib/{support → gpr}/wrap_memcpy.cc +0 -0
  243. data/src/core/lib/http/format_request.cc +1 -1
  244. data/src/core/lib/http/format_request.h +0 -8
  245. data/src/core/lib/http/httpcli.cc +55 -74
  246. data/src/core/lib/http/httpcli.h +13 -22
  247. data/src/core/lib/http/httpcli_security_connector.cc +27 -33
  248. data/src/core/lib/http/parser.h +0 -8
  249. data/src/core/lib/iomgr/block_annotate.h +10 -17
  250. data/src/core/lib/iomgr/call_combiner.cc +14 -17
  251. data/src/core/lib/iomgr/call_combiner.h +16 -34
  252. data/src/core/lib/iomgr/closure.h +24 -37
  253. data/src/core/lib/iomgr/combiner.cc +62 -66
  254. data/src/core/lib/iomgr/combiner.h +6 -16
  255. data/src/core/lib/iomgr/endpoint.cc +15 -21
  256. data/src/core/lib/iomgr/endpoint.h +16 -33
  257. data/src/core/lib/iomgr/endpoint_pair.h +0 -8
  258. data/src/core/lib/iomgr/endpoint_pair_posix.cc +4 -5
  259. data/src/core/lib/iomgr/endpoint_pair_windows.cc +4 -6
  260. data/src/core/lib/iomgr/error.cc +2 -6
  261. data/src/core/lib/iomgr/error.h +4 -9
  262. data/src/core/lib/iomgr/error_internal.h +0 -8
  263. data/src/core/lib/iomgr/ev_epoll1_linux.cc +110 -117
  264. data/src/core/lib/iomgr/ev_epoll1_linux.h +0 -8
  265. data/src/core/lib/iomgr/ev_epollex_linux.cc +111 -141
  266. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -8
  267. data/src/core/lib/iomgr/ev_epollsig_linux.cc +83 -109
  268. data/src/core/lib/iomgr/ev_epollsig_linux.h +2 -10
  269. data/src/core/lib/iomgr/ev_poll_posix.cc +103 -125
  270. data/src/core/lib/iomgr/ev_poll_posix.h +0 -8
  271. data/src/core/lib/iomgr/ev_posix.cc +35 -50
  272. data/src/core/lib/iomgr/ev_posix.h +27 -53
  273. data/src/core/lib/iomgr/exec_ctx.cc +46 -78
  274. data/src/core/lib/iomgr/exec_ctx.h +127 -60
  275. data/src/core/lib/iomgr/executor.cc +34 -38
  276. data/src/core/lib/iomgr/executor.h +3 -11
  277. data/src/core/lib/iomgr/fork_posix.cc +13 -12
  278. data/src/core/lib/iomgr/gethostname.h +0 -8
  279. data/src/core/lib/iomgr/gethostname_sysconf.cc +1 -1
  280. data/src/core/lib/iomgr/iocp_windows.cc +14 -16
  281. data/src/core/lib/iomgr/iocp_windows.h +1 -10
  282. data/src/core/lib/iomgr/iomgr.cc +60 -59
  283. data/src/core/lib/iomgr/iomgr.h +3 -12
  284. data/src/core/lib/iomgr/iomgr_internal.h +0 -8
  285. data/src/core/lib/iomgr/iomgr_uv.cc +2 -3
  286. data/src/core/lib/iomgr/iomgr_uv.h +0 -8
  287. data/src/core/lib/iomgr/is_epollexclusive_available.cc +1 -1
  288. data/src/core/lib/iomgr/load_file.cc +1 -1
  289. data/src/core/lib/iomgr/load_file.h +0 -8
  290. data/src/core/lib/iomgr/lockfree_event.cc +7 -8
  291. data/src/core/lib/iomgr/lockfree_event.h +3 -3
  292. data/src/core/lib/iomgr/polling_entity.cc +6 -10
  293. data/src/core/lib/iomgr/polling_entity.h +2 -11
  294. data/src/core/lib/iomgr/pollset.h +4 -13
  295. data/src/core/lib/iomgr/pollset_set.h +5 -18
  296. data/src/core/lib/iomgr/pollset_set_uv.cc +5 -10
  297. data/src/core/lib/iomgr/pollset_set_windows.cc +5 -10
  298. data/src/core/lib/iomgr/pollset_uv.cc +8 -9
  299. data/src/core/lib/iomgr/pollset_uv.h +0 -8
  300. data/src/core/lib/iomgr/pollset_windows.cc +14 -15
  301. data/src/core/lib/iomgr/pollset_windows.h +0 -8
  302. data/src/core/lib/iomgr/port.h +6 -1
  303. data/src/core/lib/iomgr/resolve_address.h +1 -10
  304. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -12
  305. data/src/core/lib/iomgr/resolve_address_uv.cc +7 -8
  306. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -9
  307. data/src/core/lib/iomgr/resource_quota.cc +77 -107
  308. data/src/core/lib/iomgr/resource_quota.h +8 -25
  309. data/src/core/lib/iomgr/sockaddr_utils.cc +1 -1
  310. data/src/core/lib/iomgr/sockaddr_utils.h +0 -8
  311. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  312. data/src/core/lib/iomgr/socket_factory_posix.h +0 -8
  313. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  314. data/src/core/lib/iomgr/socket_mutator.h +1 -9
  315. data/src/core/lib/iomgr/socket_utils.h +0 -8
  316. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -1
  317. data/src/core/lib/iomgr/socket_utils_posix.h +0 -8
  318. data/src/core/lib/iomgr/socket_windows.cc +8 -11
  319. data/src/core/lib/iomgr/socket_windows.h +3 -14
  320. data/src/core/lib/iomgr/tcp_client.h +1 -10
  321. data/src/core/lib/iomgr/tcp_client_posix.cc +94 -78
  322. data/src/core/lib/iomgr/tcp_client_posix.h +36 -8
  323. data/src/core/lib/iomgr/tcp_client_uv.cc +16 -23
  324. data/src/core/lib/iomgr/tcp_client_windows.cc +22 -25
  325. data/src/core/lib/iomgr/tcp_posix.cc +131 -153
  326. data/src/core/lib/iomgr/tcp_posix.h +3 -12
  327. data/src/core/lib/iomgr/tcp_server.h +6 -17
  328. data/src/core/lib/iomgr/tcp_server_posix.cc +31 -35
  329. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -8
  330. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -1
  331. data/src/core/lib/iomgr/tcp_server_uv.cc +23 -34
  332. data/src/core/lib/iomgr/tcp_server_windows.cc +24 -34
  333. data/src/core/lib/iomgr/tcp_uv.cc +42 -56
  334. data/src/core/lib/iomgr/tcp_uv.h +0 -8
  335. data/src/core/lib/iomgr/tcp_windows.cc +43 -50
  336. data/src/core/lib/iomgr/tcp_windows.h +1 -9
  337. data/src/core/lib/iomgr/time_averaged_stats.h +0 -8
  338. data/src/core/lib/iomgr/timer.h +6 -15
  339. data/src/core/lib/iomgr/timer_generic.cc +22 -27
  340. data/src/core/lib/iomgr/timer_heap.h +0 -8
  341. data/src/core/lib/iomgr/timer_manager.cc +17 -19
  342. data/src/core/lib/iomgr/timer_manager.h +0 -8
  343. data/src/core/lib/iomgr/timer_uv.cc +12 -14
  344. data/src/core/lib/iomgr/udp_server.cc +148 -54
  345. data/src/core/lib/iomgr/udp_server.h +16 -21
  346. data/src/core/lib/iomgr/unix_sockets_posix.h +0 -8
  347. data/src/core/lib/iomgr/wakeup_fd_cv.cc +4 -4
  348. data/src/core/lib/iomgr/wakeup_fd_cv.h +12 -20
  349. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  350. data/src/core/lib/iomgr/wakeup_fd_pipe.h +0 -8
  351. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -8
  352. data/src/core/lib/json/json.h +0 -8
  353. data/src/core/lib/json/json_reader.h +0 -8
  354. data/src/core/lib/json/json_writer.h +0 -8
  355. data/src/core/lib/profiling/basic_timers.cc +3 -2
  356. data/src/core/lib/profiling/timers.h +0 -8
  357. data/src/core/lib/security/context/security_context.cc +9 -10
  358. data/src/core/lib/security/context/security_context.h +0 -8
  359. data/src/core/lib/security/credentials/composite/composite_credentials.cc +23 -28
  360. data/src/core/lib/security/credentials/composite/composite_credentials.h +0 -8
  361. data/src/core/lib/security/credentials/credentials.cc +33 -42
  362. data/src/core/lib/security/credentials/credentials.h +24 -43
  363. data/src/core/lib/security/credentials/credentials_metadata.cc +2 -2
  364. data/src/core/lib/security/credentials/fake/fake_credentials.cc +16 -22
  365. data/src/core/lib/security/credentials/fake/fake_credentials.h +0 -8
  366. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +3 -3
  367. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +28 -34
  368. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +0 -8
  369. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -13
  370. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  371. data/src/core/lib/security/credentials/jwt/json_token.h +0 -8
  372. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +14 -20
  373. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +1 -10
  374. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +56 -72
  375. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +5 -17
  376. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +47 -55
  377. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +3 -12
  378. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +23 -28
  379. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -13
  380. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +0 -8
  381. data/src/core/lib/security/transport/auth_filters.h +0 -8
  382. data/src/core/lib/security/transport/client_auth_filter.cc +45 -54
  383. data/src/core/lib/security/transport/lb_targets_info.cc +2 -2
  384. data/src/core/lib/security/transport/lb_targets_info.h +0 -8
  385. data/src/core/lib/security/transport/secure_endpoint.cc +54 -68
  386. data/src/core/lib/security/transport/secure_endpoint.h +0 -8
  387. data/src/core/lib/security/transport/security_connector.cc +62 -86
  388. data/src/core/lib/security/transport/security_connector.h +22 -39
  389. data/src/core/lib/security/transport/security_handshaker.cc +83 -106
  390. data/src/core/lib/security/transport/security_handshaker.h +1 -10
  391. data/src/core/lib/security/transport/server_auth_filter.cc +31 -38
  392. data/src/core/lib/security/transport/tsi_error.h +0 -8
  393. data/src/core/lib/security/util/json_util.h +0 -8
  394. data/src/core/lib/slice/b64.cc +5 -6
  395. data/src/core/lib/slice/b64.h +3 -12
  396. data/src/core/lib/slice/percent_encoding.h +0 -8
  397. data/src/core/lib/slice/slice.cc +8 -9
  398. data/src/core/lib/slice/slice_buffer.cc +11 -16
  399. data/src/core/lib/slice/slice_hash_table.cc +5 -7
  400. data/src/core/lib/slice/slice_hash_table.h +2 -12
  401. data/src/core/lib/slice/slice_intern.cc +4 -5
  402. data/src/core/lib/slice/slice_internal.h +4 -15
  403. data/src/core/lib/slice/slice_string_helpers.cc +1 -1
  404. data/src/core/lib/slice/slice_string_helpers.h +1 -9
  405. data/src/core/lib/surface/alarm.cc +11 -14
  406. data/src/core/lib/surface/alarm_internal.h +0 -8
  407. data/src/core/lib/surface/byte_buffer.cc +2 -3
  408. data/src/core/lib/surface/byte_buffer_reader.cc +7 -9
  409. data/src/core/lib/surface/call.cc +198 -241
  410. data/src/core/lib/surface/call.h +9 -23
  411. data/src/core/lib/surface/call_details.cc +3 -4
  412. data/src/core/lib/surface/call_log_batch.cc +1 -1
  413. data/src/core/lib/surface/call_test_only.h +0 -8
  414. data/src/core/lib/surface/channel.cc +53 -64
  415. data/src/core/lib/surface/channel.h +12 -23
  416. data/src/core/lib/surface/channel_init.cc +2 -3
  417. data/src/core/lib/surface/channel_init.h +2 -12
  418. data/src/core/lib/surface/channel_ping.cc +7 -9
  419. data/src/core/lib/surface/channel_stack_type.h +0 -8
  420. data/src/core/lib/surface/completion_queue.cc +158 -176
  421. data/src/core/lib/surface/completion_queue.h +9 -20
  422. data/src/core/lib/surface/completion_queue_factory.h +0 -8
  423. data/src/core/lib/surface/event_string.cc +1 -1
  424. data/src/core/lib/surface/event_string.h +0 -8
  425. data/src/core/lib/surface/init.cc +27 -25
  426. data/src/core/lib/surface/init.h +0 -8
  427. data/src/core/lib/surface/init_secure.cc +2 -2
  428. data/src/core/lib/surface/lame_client.cc +30 -33
  429. data/src/core/lib/surface/lame_client.h +0 -8
  430. data/src/core/lib/surface/server.cc +151 -203
  431. data/src/core/lib/surface/server.h +7 -16
  432. data/src/core/lib/surface/validate_metadata.h +0 -8
  433. data/src/core/lib/surface/version.cc +2 -2
  434. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  435. data/src/core/lib/transport/bdp_estimator.h +1 -1
  436. data/src/core/lib/transport/byte_stream.cc +24 -38
  437. data/src/core/lib/transport/byte_stream.h +10 -25
  438. data/src/core/lib/transport/connectivity_state.cc +9 -13
  439. data/src/core/lib/transport/connectivity_state.h +4 -14
  440. data/src/core/lib/transport/error_utils.cc +6 -6
  441. data/src/core/lib/transport/error_utils.h +2 -11
  442. data/src/core/lib/transport/metadata.cc +21 -23
  443. data/src/core/lib/transport/metadata.h +8 -20
  444. data/src/core/lib/transport/metadata_batch.cc +34 -45
  445. data/src/core/lib/transport/metadata_batch.h +18 -32
  446. data/src/core/lib/transport/service_config.cc +11 -15
  447. data/src/core/lib/transport/service_config.h +3 -13
  448. data/src/core/lib/transport/static_metadata.cc +1 -1
  449. data/src/core/lib/transport/static_metadata.h +1 -7
  450. data/src/core/lib/transport/status_conversion.cc +2 -3
  451. data/src/core/lib/transport/status_conversion.h +1 -10
  452. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  453. data/src/core/lib/transport/timeout_encoding.h +1 -9
  454. data/src/core/lib/transport/transport.cc +36 -50
  455. data/src/core/lib/transport/transport.h +28 -30
  456. data/src/core/lib/transport/transport_impl.h +12 -23
  457. data/src/core/lib/transport/transport_op_string.cc +2 -2
  458. data/src/core/plugin_registry/grpc_plugin_registry.cc +34 -34
  459. data/src/core/tsi/fake_transport_security.cc +7 -10
  460. data/src/core/tsi/fake_transport_security.h +0 -8
  461. data/src/core/tsi/gts_transport_security.cc +2 -2
  462. data/src/core/tsi/gts_transport_security.h +0 -8
  463. data/src/core/tsi/ssl_transport_security.cc +3 -0
  464. data/src/core/tsi/ssl_transport_security.h +0 -8
  465. data/src/core/tsi/ssl_types.h +0 -8
  466. data/src/core/tsi/transport_security.h +1 -9
  467. data/src/core/tsi/transport_security_adapter.h +0 -8
  468. data/src/core/tsi/transport_security_grpc.cc +11 -18
  469. data/src/core/tsi/transport_security_grpc.h +9 -21
  470. data/src/core/tsi/transport_security_interface.h +0 -8
  471. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -30
  472. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -48
  473. data/src/ruby/lib/grpc/version.rb +1 -1
  474. data/src/ruby/spec/channel_connection_spec.rb +2 -1
  475. data/src/ruby/spec/client_auth_spec.rb +1 -1
  476. data/src/ruby/spec/client_server_spec.rb +2 -2
  477. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  478. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  479. data/src/ruby/spec/generic/interceptor_registry_spec.rb +1 -1
  480. data/src/ruby/spec/generic/rpc_server_spec.rb +12 -12
  481. data/src/ruby/spec/google_rpc_status_utils_spec.rb +3 -2
  482. data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
  483. data/src/ruby/spec/server_spec.rb +9 -9
  484. data/src/ruby/spec/support/helpers.rb +35 -1
  485. metadata +68 -66
  486. data/include/grpc/impl/codegen/exec_ctx_fwd.h +0 -26
  487. data/include/grpc/support/histogram.h +0 -64
  488. data/src/core/lib/support/histogram.cc +0 -227
@@ -27,24 +27,17 @@ extern grpc_core::TraceFlag grpc_http_trace;
27
27
  extern grpc_core::TraceFlag grpc_trace_http2_stream_state;
28
28
  extern grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_refcount;
29
29
 
30
- #ifdef __cplusplus
31
- extern "C" {
32
- #endif
30
+ extern bool g_flow_control_enabled;
33
31
 
34
32
  grpc_transport* grpc_create_chttp2_transport(
35
- grpc_exec_ctx* exec_ctx, const grpc_channel_args* channel_args,
36
- grpc_endpoint* ep, bool is_client);
33
+ const grpc_channel_args* channel_args, grpc_endpoint* ep, bool is_client);
37
34
 
38
35
  /// Takes ownership of \a read_buffer, which (if non-NULL) contains
39
36
  /// leftover bytes previously read from the endpoint (e.g., by handshakers).
40
37
  /// If non-null, \a notify_on_receive_settings will be scheduled when
41
38
  /// HTTP/2 settings are received from the peer.
42
39
  void grpc_chttp2_transport_start_reading(
43
- grpc_exec_ctx* exec_ctx, grpc_transport* transport,
44
- grpc_slice_buffer* read_buffer, grpc_closure* notify_on_receive_settings);
45
-
46
- #ifdef __cplusplus
47
- }
48
- #endif
40
+ grpc_transport* transport, grpc_slice_buffer* read_buffer,
41
+ grpc_closure* notify_on_receive_settings);
49
42
 
50
43
  #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CHTTP2_TRANSPORT_H */
@@ -29,7 +29,7 @@
29
29
  #include <grpc/support/useful.h>
30
30
 
31
31
  #include "src/core/ext/transport/chttp2/transport/internal.h"
32
- #include "src/core/lib/support/string.h"
32
+ #include "src/core/lib/gpr/string.h"
33
33
 
34
34
  grpc_core::TraceFlag grpc_flowctl_trace(false, "flowctl");
35
35
 
@@ -149,8 +149,26 @@ void FlowControlAction::Trace(grpc_chttp2_transport* t) const {
149
149
  gpr_free(mf_str);
150
150
  }
151
151
 
152
- TransportFlowControl::TransportFlowControl(grpc_exec_ctx* exec_ctx,
153
- const grpc_chttp2_transport* t,
152
+ TransportFlowControlDisabled::TransportFlowControlDisabled(
153
+ grpc_chttp2_transport* t) {
154
+ remote_window_ = kMaxWindow;
155
+ target_initial_window_size_ = kMaxWindow;
156
+ announced_window_ = kMaxWindow;
157
+ t->settings[GRPC_PEER_SETTINGS][GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE] =
158
+ kFrameSize;
159
+ t->settings[GRPC_SENT_SETTINGS][GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE] =
160
+ kFrameSize;
161
+ t->settings[GRPC_ACKED_SETTINGS][GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE] =
162
+ kFrameSize;
163
+ t->settings[GRPC_PEER_SETTINGS][GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE] =
164
+ kMaxWindow;
165
+ t->settings[GRPC_SENT_SETTINGS][GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE] =
166
+ kMaxWindow;
167
+ t->settings[GRPC_ACKED_SETTINGS][GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE] =
168
+ kMaxWindow;
169
+ }
170
+
171
+ TransportFlowControl::TransportFlowControl(const grpc_chttp2_transport* t,
154
172
  bool enable_bdp_probe)
155
173
  : t_(t),
156
174
  enable_bdp_probe_(enable_bdp_probe),
@@ -163,7 +181,7 @@ TransportFlowControl::TransportFlowControl(grpc_exec_ctx* exec_ctx,
163
181
  .set_min_control_value(-1)
164
182
  .set_max_control_value(25)
165
183
  .set_integral_range(10)),
166
- last_pid_update_(grpc_exec_ctx_now(exec_ctx)) {}
184
+ last_pid_update_(grpc_core::ExecCtx::Get()->Now()) {}
167
185
 
168
186
  uint32_t TransportFlowControl::MaybeSendUpdate(bool writing_anyway) {
169
187
  FlowControlTrace trace("t updt sent", this, nullptr);
@@ -308,9 +326,8 @@ double TransportFlowControl::TargetLogBdp() {
308
326
  1 + log2(bdp_estimator_.EstimateBdp()));
309
327
  }
310
328
 
311
- double TransportFlowControl::SmoothLogBdp(grpc_exec_ctx* exec_ctx,
312
- double value) {
313
- grpc_millis now = grpc_exec_ctx_now(exec_ctx);
329
+ double TransportFlowControl::SmoothLogBdp(double value) {
330
+ grpc_millis now = grpc_core::ExecCtx::Get()->Now();
314
331
  double bdp_error = value - pid_controller_.last_control_value();
315
332
  const double dt = (double)(now - last_pid_update_) * 1e-3;
316
333
  last_pid_update_ = now;
@@ -320,7 +337,7 @@ double TransportFlowControl::SmoothLogBdp(grpc_exec_ctx* exec_ctx,
320
337
  }
321
338
 
322
339
  FlowControlAction::Urgency TransportFlowControl::DeltaUrgency(
323
- int32_t value, grpc_chttp2_setting_id setting_id) {
340
+ int64_t value, grpc_chttp2_setting_id setting_id) {
324
341
  int64_t delta =
325
342
  (int64_t)value - (int64_t)t_->settings[GRPC_LOCAL_SETTINGS][setting_id];
326
343
  // TODO(ncteisen): tune this
@@ -331,15 +348,14 @@ FlowControlAction::Urgency TransportFlowControl::DeltaUrgency(
331
348
  }
332
349
  }
333
350
 
334
- FlowControlAction TransportFlowControl::PeriodicUpdate(
335
- grpc_exec_ctx* exec_ctx) {
351
+ FlowControlAction TransportFlowControl::PeriodicUpdate() {
336
352
  FlowControlAction action;
337
353
  if (enable_bdp_probe_) {
338
354
  // get bdp estimate and update initial_window accordingly.
339
355
  // target might change based on how much memory pressure we are under
340
356
  // TODO(ncteisen): experiment with setting target to be huge under low
341
357
  // memory pressure.
342
- const double target = pow(2, SmoothLogBdp(exec_ctx, TargetLogBdp()));
358
+ const double target = pow(2, SmoothLogBdp(TargetLogBdp()));
343
359
 
344
360
  // Though initial window 'could' drop to 0, we keep the floor at 128
345
361
  target_initial_window_size_ = (int32_t)GPR_CLAMP(target, 128, INT32_MAX);
@@ -347,7 +363,7 @@ FlowControlAction TransportFlowControl::PeriodicUpdate(
347
363
  action.set_send_initial_window_update(
348
364
  DeltaUrgency(target_initial_window_size_,
349
365
  GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE),
350
- target_initial_window_size_);
366
+ (uint32_t)target_initial_window_size_);
351
367
 
352
368
  // get bandwidth estimate and update max_frame accordingly.
353
369
  double bw_dbl = bdp_estimator_.EstimateBandwidth();
@@ -357,7 +373,7 @@ FlowControlAction TransportFlowControl::PeriodicUpdate(
357
373
  target_initial_window_size_),
358
374
  16384, 16777215);
359
375
  action.set_send_max_frame_size_update(
360
- DeltaUrgency(frame_size, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE),
376
+ DeltaUrgency((int64_t)frame_size, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE),
361
377
  frame_size);
362
378
  }
363
379
  return UpdateAction(action);
@@ -24,7 +24,8 @@
24
24
 
25
25
  #include <grpc/support/useful.h>
26
26
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
27
- #include "src/core/lib/support/manual_constructor.h"
27
+ #include "src/core/lib/gpr++/abstract.h"
28
+ #include "src/core/lib/gpr++/manual_constructor.h"
28
29
  #include "src/core/lib/transport/bdp_estimator.h"
29
30
  #include "src/core/lib/transport/pid_controller.h"
30
31
 
@@ -43,10 +44,16 @@ namespace grpc_core {
43
44
  namespace chttp2 {
44
45
 
45
46
  static constexpr uint32_t kDefaultWindow = 65535;
47
+ static constexpr int64_t kMaxWindow = (int64_t)((1u << 31) - 1);
48
+ // TODO(ncteisen): Tune this
49
+ static constexpr uint32_t kFrameSize = 1024 * 1024;
46
50
 
47
51
  class TransportFlowControl;
48
52
  class StreamFlowControl;
49
53
 
54
+ // Encapsulates a collections of actions the transport needs to take with
55
+ // regard to flow control. Each action comes with urgencies that tell the
56
+ // transport how quickly the action must take place.
50
57
  class FlowControlAction {
51
58
  public:
52
59
  enum class Urgency : uint8_t {
@@ -132,37 +139,122 @@ class FlowControlTrace {
132
139
  int64_t announced_window_delta_;
133
140
  };
134
141
 
135
- class TransportFlowControl {
142
+ // Fat interface with all methods a flow control implementation needs to
143
+ // support. gRPC C Core does not support pure virtual functions, so instead
144
+ // we abort in any methods which require implementation in the base class.
145
+ class TransportFlowControlBase {
136
146
  public:
137
- TransportFlowControl(grpc_exec_ctx* exec_ctx, const grpc_chttp2_transport* t,
138
- bool enable_bdp_probe);
147
+ TransportFlowControlBase() {}
148
+ virtual ~TransportFlowControlBase() {}
149
+
150
+ // Is flow control enabled? This is needed in other codepaths like the checks
151
+ // in parsing and in writing.
152
+ virtual bool flow_control_enabled() const { abort(); }
153
+
154
+ // Called to check if the transport needs to send a WINDOW_UPDATE frame
155
+ virtual uint32_t MaybeSendUpdate(bool writing_anyway) { abort(); }
156
+
157
+ // Using the protected members, returns and Action to be taken by the
158
+ // tranport.
159
+ virtual FlowControlAction MakeAction() { abort(); }
160
+
161
+ // Using the protected members, returns and Action to be taken by the
162
+ // tranport. Also checks for updates to our BDP estimate and acts
163
+ // accordingly.
164
+ virtual FlowControlAction PeriodicUpdate() { abort(); }
165
+
166
+ // Called to do bookkeeping when a stream owned by this transport sends
167
+ // data on the wire
168
+ virtual void StreamSentData(int64_t size) { abort(); }
169
+
170
+ // Called to do bookkeeping when a stream owned by this transport receives
171
+ // data from the wire. Also does error checking for frame size.
172
+ virtual grpc_error* RecvData(int64_t incoming_frame_size) { abort(); }
173
+
174
+ // Called to do bookkeeping when we receive a WINDOW_UPDATE frame.
175
+ virtual void RecvUpdate(uint32_t size) { abort(); }
176
+
177
+ // Returns the BdpEstimator held by this object. Caller is responsible for
178
+ // checking for nullptr. TODO(ncteisen): consider fully encapsulating all
179
+ // bdp estimator actions inside TransportFlowControl
180
+ virtual BdpEstimator* bdp_estimator() { return nullptr; }
181
+
182
+ // Getters
183
+ int64_t remote_window() const { return remote_window_; }
184
+ virtual int64_t target_window() const { return target_initial_window_size_; }
185
+ int64_t announced_window() const { return announced_window_; }
186
+
187
+ // Used in certain benchmarks in which we don't want FlowControl to be a
188
+ // factor
189
+ virtual void TestOnlyForceHugeWindow() {}
190
+
191
+ GRPC_ABSTRACT_BASE_CLASS
192
+
193
+ protected:
194
+ friend class ::grpc::testing::TrickledCHTTP2;
195
+ int64_t remote_window_ = kDefaultWindow;
196
+ int64_t target_initial_window_size_ = kDefaultWindow;
197
+ int64_t announced_window_ = kDefaultWindow;
198
+ };
199
+
200
+ // Implementation of flow control that does NOTHING. Always returns maximum
201
+ // values, never initiates writes, and assumes that the remote peer is doing
202
+ // the same. To be used to narrow down on flow control as the cause of negative
203
+ // performance.
204
+ class TransportFlowControlDisabled final : public TransportFlowControlBase {
205
+ public:
206
+ // Maxes out all values
207
+ TransportFlowControlDisabled(grpc_chttp2_transport* t);
208
+
209
+ bool flow_control_enabled() const override { return false; }
210
+
211
+ // Never do anything.
212
+ uint32_t MaybeSendUpdate(bool writing_anyway) override { return 0; }
213
+ FlowControlAction MakeAction() override { return FlowControlAction(); }
214
+ FlowControlAction PeriodicUpdate() override { return FlowControlAction(); }
215
+ void StreamSentData(int64_t size) override {}
216
+ grpc_error* RecvData(int64_t incoming_frame_size) override {
217
+ return GRPC_ERROR_NONE;
218
+ }
219
+ void RecvUpdate(uint32_t size) override {}
220
+ };
221
+
222
+ // Implementation of flow control that abides to HTTP/2 spec and attempts
223
+ // to be as performant as possible.
224
+ class TransportFlowControl final : public TransportFlowControlBase {
225
+ public:
226
+ TransportFlowControl(const grpc_chttp2_transport* t, bool enable_bdp_probe);
139
227
  ~TransportFlowControl() {}
140
228
 
229
+ bool flow_control_enabled() const override { return true; }
230
+
141
231
  bool bdp_probe() const { return enable_bdp_probe_; }
142
232
 
143
233
  // returns an announce if we should send a transport update to our peer,
144
234
  // else returns zero; writing_anyway indicates if a write would happen
145
235
  // regardless of the send - if it is false and this function returns non-zero,
146
236
  // this announce will cause a write to occur
147
- uint32_t MaybeSendUpdate(bool writing_anyway);
237
+ uint32_t MaybeSendUpdate(bool writing_anyway) override;
148
238
 
149
239
  // Reads the flow control data and returns and actionable struct that will
150
240
  // tell chttp2 exactly what it needs to do
151
- FlowControlAction MakeAction() { return UpdateAction(FlowControlAction()); }
241
+ FlowControlAction MakeAction() override {
242
+ return UpdateAction(FlowControlAction());
243
+ }
152
244
 
153
245
  // Call periodically (at a low-ish rate, 100ms - 10s makes sense)
154
246
  // to perform more complex flow control calculations and return an action
155
247
  // to let chttp2 change its parameters
156
- FlowControlAction PeriodicUpdate(grpc_exec_ctx* exec_ctx);
248
+ FlowControlAction PeriodicUpdate() override;
157
249
 
158
- void StreamSentData(int64_t size) { remote_window_ -= size; }
250
+ void StreamSentData(int64_t size) override { remote_window_ -= size; }
159
251
 
160
252
  grpc_error* ValidateRecvData(int64_t incoming_frame_size);
161
253
  void CommitRecvData(int64_t incoming_frame_size) {
162
254
  announced_window_ -= incoming_frame_size;
163
255
  }
164
256
 
165
- grpc_error* RecvData(int64_t incoming_frame_size) {
257
+ grpc_error* RecvData(int64_t incoming_frame_size) override {
166
258
  FlowControlTrace trace(" data recv", this, nullptr);
167
259
  grpc_error* error = ValidateRecvData(incoming_frame_size);
168
260
  if (error != GRPC_ERROR_NONE) return error;
@@ -171,18 +263,18 @@ class TransportFlowControl {
171
263
  }
172
264
 
173
265
  // we have received a WINDOW_UPDATE frame for a transport
174
- void RecvUpdate(uint32_t size) {
266
+ void RecvUpdate(uint32_t size) override {
175
267
  FlowControlTrace trace("t updt recv", this, nullptr);
176
268
  remote_window_ += size;
177
269
  }
178
270
 
179
- int64_t remote_window() const { return remote_window_; }
180
- int64_t target_window() const {
271
+ // See comment above announced_stream_total_over_incoming_window_ for the
272
+ // logic behind this decision.
273
+ int64_t target_window() const override {
181
274
  return (uint32_t)GPR_MIN((int64_t)((1u << 31) - 1),
182
275
  announced_stream_total_over_incoming_window_ +
183
276
  target_initial_window_size_);
184
277
  }
185
- int64_t announced_window() const { return announced_window_; }
186
278
 
187
279
  const grpc_chttp2_transport* transport() const { return t_; }
188
280
 
@@ -202,18 +294,17 @@ class TransportFlowControl {
202
294
  }
203
295
  }
204
296
 
205
- BdpEstimator* bdp_estimator() { return &bdp_estimator_; }
297
+ BdpEstimator* bdp_estimator() override { return &bdp_estimator_; }
206
298
 
207
- void TestOnlyForceHugeWindow() {
299
+ void TestOnlyForceHugeWindow() override {
208
300
  announced_window_ = 1024 * 1024 * 1024;
209
301
  remote_window_ = 1024 * 1024 * 1024;
210
302
  }
211
303
 
212
304
  private:
213
- friend class ::grpc::testing::TrickledCHTTP2;
214
305
  double TargetLogBdp();
215
- double SmoothLogBdp(grpc_exec_ctx* exec_ctx, double value);
216
- FlowControlAction::Urgency DeltaUrgency(int32_t value,
306
+ double SmoothLogBdp(double value);
307
+ FlowControlAction::Urgency DeltaUrgency(int64_t value,
217
308
  grpc_chttp2_setting_id setting_id);
218
309
 
219
310
  FlowControlAction UpdateAction(FlowControlAction action) {
@@ -226,9 +317,6 @@ class TransportFlowControl {
226
317
 
227
318
  const grpc_chttp2_transport* const t_;
228
319
 
229
- /** Our bookkeeping for the remote peer's available window */
230
- int64_t remote_window_ = kDefaultWindow;
231
-
232
320
  /** calculating what we should give for local window:
233
321
  we track the total amount of flow control over initial window size
234
322
  across all streams: this is data that we want to receive right now (it
@@ -240,13 +328,6 @@ class TransportFlowControl {
240
328
  int64_t announced_stream_total_over_incoming_window_ = 0;
241
329
  int64_t announced_stream_total_under_incoming_window_ = 0;
242
330
 
243
- /** This is out window according to what we have sent to our remote peer. The
244
- * difference between this and target window is what we use to decide when
245
- * to send WINDOW_UPDATE frames. */
246
- int64_t announced_window_ = kDefaultWindow;
247
-
248
- int32_t target_initial_window_size_ = kDefaultWindow;
249
-
250
331
  /** should we probe bdp? */
251
332
  const bool enable_bdp_probe_;
252
333
 
@@ -258,39 +339,117 @@ class TransportFlowControl {
258
339
  grpc_millis last_pid_update_ = 0;
259
340
  };
260
341
 
261
- class StreamFlowControl {
342
+ // Fat interface with all methods a stream flow control implementation needs
343
+ // to support. gRPC C Core does not support pure virtual functions, so instead
344
+ // we abort in any methods which require implementation in the base class.
345
+ class StreamFlowControlBase {
346
+ public:
347
+ StreamFlowControlBase() {}
348
+ virtual ~StreamFlowControlBase() {}
349
+
350
+ // Updates an action using the protected members.
351
+ virtual FlowControlAction UpdateAction(FlowControlAction action) { abort(); }
352
+
353
+ // Using the protected members, returns an Action for this stream to be
354
+ // taken by the tranport.
355
+ virtual FlowControlAction MakeAction() { abort(); }
356
+
357
+ // Bookkeeping for when data is sent on this stream.
358
+ virtual void SentData(int64_t outgoing_frame_size) { abort(); }
359
+
360
+ // Bookkeeping and error checking for when data is received by this stream.
361
+ virtual grpc_error* RecvData(int64_t incoming_frame_size) { abort(); }
362
+
363
+ // Called to check if this stream needs to send a WINDOW_UPDATE frame.
364
+ virtual uint32_t MaybeSendUpdate() { abort(); }
365
+
366
+ // Bookkeeping for receiving a WINDOW_UPDATE from for this stream.
367
+ virtual void RecvUpdate(uint32_t size) { abort(); }
368
+
369
+ // Bookkeeping for when a call pulls bytes out of the transport. At this
370
+ // point we consider the data 'used' and can thus let out peer know we are
371
+ // ready for more data.
372
+ virtual void IncomingByteStreamUpdate(size_t max_size_hint,
373
+ size_t have_already) {
374
+ abort();
375
+ }
376
+
377
+ // Used in certain benchmarks in which we don't want FlowControl to be a
378
+ // factor
379
+ virtual void TestOnlyForceHugeWindow() {}
380
+
381
+ // Getters
382
+ int64_t remote_window_delta() { return remote_window_delta_; }
383
+ int64_t local_window_delta() { return local_window_delta_; }
384
+ int64_t announced_window_delta() { return announced_window_delta_; }
385
+
386
+ GRPC_ABSTRACT_BASE_CLASS
387
+
388
+ protected:
389
+ friend class ::grpc::testing::TrickledCHTTP2;
390
+ int64_t remote_window_delta_ = 0;
391
+ int64_t local_window_delta_ = 0;
392
+ int64_t announced_window_delta_ = 0;
393
+ };
394
+
395
+ // Implementation of flow control that does NOTHING. Always returns maximum
396
+ // values, never initiates writes, and assumes that the remote peer is doing
397
+ // the same. To be used to narrow down on flow control as the cause of negative
398
+ // performance.
399
+ class StreamFlowControlDisabled : public StreamFlowControlBase {
400
+ public:
401
+ FlowControlAction UpdateAction(FlowControlAction action) override {
402
+ return action;
403
+ }
404
+ FlowControlAction MakeAction() override { return FlowControlAction(); }
405
+ void SentData(int64_t outgoing_frame_size) override {}
406
+ grpc_error* RecvData(int64_t incoming_frame_size) override {
407
+ return GRPC_ERROR_NONE;
408
+ }
409
+ uint32_t MaybeSendUpdate() override { return 0; }
410
+ void RecvUpdate(uint32_t size) override {}
411
+ void IncomingByteStreamUpdate(size_t max_size_hint,
412
+ size_t have_already) override {}
413
+ };
414
+
415
+ // Implementation of flow control that abides to HTTP/2 spec and attempts
416
+ // to be as performant as possible.
417
+ class StreamFlowControl final : public StreamFlowControlBase {
262
418
  public:
263
419
  StreamFlowControl(TransportFlowControl* tfc, const grpc_chttp2_stream* s);
264
420
  ~StreamFlowControl() {
265
421
  tfc_->PreUpdateAnnouncedWindowOverIncomingWindow(announced_window_delta_);
266
422
  }
267
423
 
268
- FlowControlAction UpdateAction(FlowControlAction action);
269
- FlowControlAction MakeAction() { return UpdateAction(tfc_->MakeAction()); }
424
+ FlowControlAction UpdateAction(FlowControlAction action) override;
425
+ FlowControlAction MakeAction() override {
426
+ return UpdateAction(tfc_->MakeAction());
427
+ }
270
428
 
271
429
  // we have sent data on the wire, we must track this in our bookkeeping for
272
430
  // the remote peer's flow control.
273
- void SentData(int64_t outgoing_frame_size) {
431
+ void SentData(int64_t outgoing_frame_size) override {
274
432
  FlowControlTrace tracer(" data sent", tfc_, this);
275
433
  tfc_->StreamSentData(outgoing_frame_size);
276
434
  remote_window_delta_ -= outgoing_frame_size;
277
435
  }
278
436
 
279
437
  // we have received data from the wire
280
- grpc_error* RecvData(int64_t incoming_frame_size);
438
+ grpc_error* RecvData(int64_t incoming_frame_size) override;
281
439
 
282
440
  // returns an announce if we should send a stream update to our peer, else
283
441
  // returns zero
284
- uint32_t MaybeSendUpdate();
442
+ uint32_t MaybeSendUpdate() override;
285
443
 
286
444
  // we have received a WINDOW_UPDATE frame for a stream
287
- void RecvUpdate(uint32_t size) {
445
+ void RecvUpdate(uint32_t size) override {
288
446
  FlowControlTrace trace("s updt recv", tfc_, this);
289
447
  remote_window_delta_ += size;
290
448
  }
291
449
 
292
450
  // the application is asking for a certain amount of bytes
293
- void IncomingByteStreamUpdate(size_t max_size_hint, size_t have_already);
451
+ void IncomingByteStreamUpdate(size_t max_size_hint,
452
+ size_t have_already) override;
294
453
 
295
454
  int64_t remote_window_delta() const { return remote_window_delta_; }
296
455
  int64_t local_window_delta() const { return local_window_delta_; }
@@ -298,14 +457,13 @@ class StreamFlowControl {
298
457
 
299
458
  const grpc_chttp2_stream* stream() const { return s_; }
300
459
 
301
- void TestOnlyForceHugeWindow() {
460
+ void TestOnlyForceHugeWindow() override {
302
461
  announced_window_delta_ = 1024 * 1024 * 1024;
303
462
  local_window_delta_ = 1024 * 1024 * 1024;
304
463
  remote_window_delta_ = 1024 * 1024 * 1024;
305
464
  }
306
465
 
307
466
  private:
308
- friend class ::grpc::testing::TrickledCHTTP2;
309
467
  TransportFlowControl* const tfc_;
310
468
  const grpc_chttp2_stream* const s_;
311
469
 
@@ -314,21 +472,6 @@ class StreamFlowControl {
314
472
  announced_window_delta_ += change;
315
473
  tfc->PostUpdateAnnouncedWindowOverIncomingWindow(announced_window_delta_);
316
474
  }
317
-
318
- /** window available for us to send to peer, over or under the initial
319
- * window
320
- * size of the transport... ie:
321
- * remote_window = remote_window_delta + transport.initial_window_size */
322
- int64_t remote_window_delta_ = 0;
323
-
324
- /** window available for peer to send to us (as a delta on
325
- * transport.initial_window_size)
326
- * local_window = local_window_delta + transport.initial_window_size */
327
- int64_t local_window_delta_ = 0;
328
-
329
- /** window available for peer to send to us over this stream that we have
330
- * announced to the peer */
331
- int64_t announced_window_delta_ = 0;
332
475
  };
333
476
 
334
477
  } // namespace chttp2