grpc 1.47.0 → 1.48.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 (574) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +105 -47
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +20 -11
  5. data/include/grpc/event_engine/slice_buffer.h +8 -2
  6. data/include/grpc/grpc.h +3 -3
  7. data/include/grpc/impl/codegen/compression_types.h +2 -1
  8. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  9. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  10. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  11. data/include/grpc/impl/codegen/port_platform.h +6 -3
  12. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  13. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
  14. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
  15. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  16. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
  18. data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
  19. data/src/core/ext/filters/client_channel/client_channel.h +19 -4
  20. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
  43. data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
  44. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
  45. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
  52. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
  53. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
  59. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  60. data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
  62. data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
  63. data/src/core/ext/filters/client_channel/subchannel.h +6 -22
  64. data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
  68. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
  74. data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
  75. data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
  76. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  77. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
  78. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
  79. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  80. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
  81. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  82. data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
  83. data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
  85. data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
  86. data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
  87. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  88. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  89. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  90. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  91. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  92. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  93. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  94. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
  95. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
  98. data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
  99. data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
  101. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
  106. data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
  107. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
  108. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
  110. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
  112. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  117. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  118. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  119. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  120. data/src/core/ext/xds/certificate_provider_store.cc +2 -0
  121. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  122. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  123. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  124. data/src/core/ext/xds/upb_utils.h +1 -2
  125. data/src/core/ext/xds/xds_api.cc +16 -18
  126. data/src/core/ext/xds/xds_api.h +12 -5
  127. data/src/core/ext/xds/xds_bootstrap.cc +37 -24
  128. data/src/core/ext/xds/xds_bootstrap.h +9 -11
  129. data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
  130. data/src/core/ext/xds/xds_certificate_provider.h +16 -1
  131. data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
  132. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  133. data/src/core/ext/xds/xds_client.cc +71 -22
  134. data/src/core/ext/xds/xds_client.h +17 -3
  135. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  136. data/src/core/ext/xds/xds_client_stats.h +4 -3
  137. data/src/core/ext/xds/xds_cluster.cc +21 -10
  138. data/src/core/ext/xds/xds_cluster.h +9 -1
  139. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  140. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  141. data/src/core/ext/xds/xds_common_types.cc +36 -22
  142. data/src/core/ext/xds/xds_common_types.h +12 -4
  143. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  144. data/src/core/ext/xds/xds_endpoint.h +13 -5
  145. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
  146. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  147. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  148. data/src/core/ext/xds/xds_http_filters.h +3 -3
  149. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  150. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  151. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  152. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  153. data/src/core/ext/xds/xds_listener.cc +51 -33
  154. data/src/core/ext/xds/xds_listener.h +10 -1
  155. data/src/core/ext/xds/xds_resource_type.h +3 -3
  156. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  157. data/src/core/ext/xds/xds_route_config.cc +56 -28
  158. data/src/core/ext/xds/xds_route_config.h +11 -2
  159. data/src/core/ext/xds/xds_routing.cc +16 -0
  160. data/src/core/ext/xds/xds_routing.h +7 -2
  161. data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
  162. data/src/core/lib/address_utils/parse_address.cc +5 -8
  163. data/src/core/lib/address_utils/parse_address.h +3 -2
  164. data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
  165. data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
  166. data/src/core/lib/avl/avl.h +3 -3
  167. data/src/core/lib/backoff/backoff.cc +1 -1
  168. data/src/core/lib/backoff/backoff.h +1 -1
  169. data/src/core/lib/channel/call_tracer.h +3 -3
  170. data/src/core/lib/channel/channel_args.h +1 -0
  171. data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
  172. data/src/core/lib/channel/channel_fwd.h +26 -0
  173. data/src/core/lib/channel/channel_stack.cc +4 -4
  174. data/src/core/lib/channel/channel_stack.h +1 -11
  175. data/src/core/lib/channel/channel_stack_builder.h +2 -5
  176. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  177. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
  178. data/src/core/lib/channel/channelz.cc +2 -1
  179. data/src/core/lib/channel/channelz.h +2 -3
  180. data/src/core/lib/channel/channelz_registry.cc +4 -5
  181. data/src/core/lib/channel/connected_channel.cc +1 -0
  182. data/src/core/lib/channel/connected_channel.h +1 -0
  183. data/src/core/lib/channel/promise_based_filter.cc +11 -5
  184. data/src/core/lib/channel/promise_based_filter.h +2 -0
  185. data/src/core/lib/compression/compression.cc +6 -1
  186. data/src/core/lib/compression/compression_internal.cc +3 -6
  187. data/src/core/lib/compression/compression_internal.h +3 -2
  188. data/src/core/lib/compression/message_compress.cc +3 -1
  189. data/src/core/lib/compression/message_compress.h +2 -3
  190. data/src/core/lib/debug/stats.cc +9 -9
  191. data/src/core/lib/debug/stats.h +2 -1
  192. data/src/core/lib/debug/stats_data.cc +2 -1
  193. data/src/core/lib/debug/stats_data.h +0 -4
  194. data/src/core/lib/debug/trace.h +13 -12
  195. data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
  196. data/src/core/lib/event_engine/event_engine.cc +24 -19
  197. data/src/core/lib/event_engine/event_engine_factory.h +2 -2
  198. data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
  199. data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
  200. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  201. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  202. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  203. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  204. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  205. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  206. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  207. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  208. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  209. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  210. data/src/core/lib/event_engine/promise.h +69 -0
  211. data/src/core/lib/gpr/time_posix.cc +6 -9
  212. data/src/core/lib/gpr/time_windows.cc +10 -7
  213. data/src/core/lib/gprpp/manual_constructor.h +0 -67
  214. data/src/core/lib/gprpp/status_helper.cc +44 -30
  215. data/src/core/lib/gprpp/time.cc +8 -0
  216. data/src/core/lib/gprpp/time.h +4 -0
  217. data/src/core/lib/http/format_request.cc +5 -4
  218. data/src/core/lib/http/format_request.h +1 -1
  219. data/src/core/lib/http/httpcli.cc +18 -12
  220. data/src/core/lib/http/httpcli.h +19 -3
  221. data/src/core/lib/http/httpcli_security_connector.cc +16 -4
  222. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  223. data/src/core/lib/http/parser.cc +6 -7
  224. data/src/core/lib/http/parser.h +3 -0
  225. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  226. data/src/core/lib/iomgr/endpoint.h +1 -1
  227. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
  228. data/src/core/lib/iomgr/error.cc +11 -9
  229. data/src/core/lib/iomgr/error.h +9 -5
  230. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  231. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  232. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  233. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  234. data/src/core/lib/iomgr/ev_posix.cc +54 -92
  235. data/src/core/lib/iomgr/ev_posix.h +5 -3
  236. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  237. data/src/core/lib/iomgr/iomgr.cc +7 -0
  238. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  239. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  240. data/src/core/lib/iomgr/load_file.cc +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  242. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  243. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  244. data/src/core/lib/iomgr/tcp_client.h +24 -13
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
  247. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
  249. data/src/core/lib/iomgr/tcp_posix.cc +91 -29
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
  254. data/src/core/lib/iomgr/tcp_windows.cc +5 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  256. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  257. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  258. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  259. data/src/core/lib/iomgr/work_serializer.h +2 -3
  260. data/src/core/lib/matchers/matchers.cc +6 -3
  261. data/src/core/lib/matchers/matchers.h +2 -0
  262. data/src/core/lib/promise/activity.cc +0 -1
  263. data/src/core/lib/promise/activity.h +7 -13
  264. data/src/core/lib/promise/loop.h +1 -0
  265. data/src/core/lib/promise/promise.h +1 -0
  266. data/src/core/lib/promise/sleep.cc +36 -31
  267. data/src/core/lib/promise/sleep.h +25 -25
  268. data/src/core/lib/resolver/resolver.cc +5 -0
  269. data/src/core/lib/resolver/resolver.h +3 -0
  270. data/src/core/lib/resolver/resolver_factory.h +5 -2
  271. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  272. data/src/core/lib/resolver/resolver_registry.h +12 -1
  273. data/src/core/lib/resolver/server_address.cc +8 -0
  274. data/src/core/lib/resolver/server_address.h +9 -2
  275. data/src/core/lib/resource_quota/memory_quota.cc +18 -60
  276. data/src/core/lib/resource_quota/memory_quota.h +11 -25
  277. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  278. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  279. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  280. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  281. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  282. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  283. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
  284. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  285. data/src/core/lib/security/authorization/matchers.cc +9 -1
  286. data/src/core/lib/security/authorization/matchers.h +7 -0
  287. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  288. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  289. data/src/core/lib/security/context/security_context.cc +5 -2
  290. data/src/core/lib/security/context/security_context.h +14 -2
  291. data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
  292. data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
  293. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  294. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  295. data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
  296. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  297. data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
  298. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  299. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  300. data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
  301. data/src/core/lib/security/credentials/credentials.cc +4 -8
  302. data/src/core/lib/security/credentials/credentials.h +10 -8
  303. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
  304. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
  305. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  306. data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
  307. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  308. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  309. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  310. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
  311. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  312. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
  313. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
  314. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  315. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
  316. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
  317. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
  318. data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
  319. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
  320. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
  321. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  322. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  323. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
  324. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
  325. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  326. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  327. data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
  328. data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
  329. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
  330. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
  331. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
  332. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
  333. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
  334. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
  335. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  336. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  337. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
  338. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
  339. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
  340. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
  341. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  342. data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
  343. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
  344. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  345. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  346. data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
  347. data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
  348. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  349. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  350. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  354. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  355. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  356. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  357. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  358. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  359. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  360. data/src/core/lib/security/security_connector/security_connector.h +18 -6
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
  362. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  363. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  364. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  365. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  366. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  368. data/src/core/lib/security/transport/auth_filters.h +7 -0
  369. data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
  370. data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
  371. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  372. data/src/core/lib/security/transport/security_handshaker.cc +44 -11
  373. data/src/core/lib/security/transport/security_handshaker.h +4 -0
  374. data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
  375. data/src/core/lib/security/util/json_util.cc +3 -2
  376. data/src/core/lib/security/util/json_util.h +0 -2
  377. data/src/core/lib/service_config/service_config_call_data.h +2 -1
  378. data/src/core/lib/service_config/service_config_impl.cc +6 -6
  379. data/src/core/lib/service_config/service_config_impl.h +1 -3
  380. data/src/core/lib/service_config/service_config_parser.cc +2 -4
  381. data/src/core/lib/slice/slice_buffer.cc +30 -1
  382. data/src/core/lib/slice/slice_buffer.h +37 -6
  383. data/src/core/lib/slice/slice_string_helpers.cc +0 -20
  384. data/src/core/lib/slice/slice_string_helpers.h +0 -4
  385. data/src/core/lib/surface/call.cc +53 -115
  386. data/src/core/lib/surface/call.h +5 -1
  387. data/src/core/lib/surface/channel.h +2 -0
  388. data/src/core/lib/surface/channel_ping.cc +1 -1
  389. data/src/core/lib/surface/completion_queue.cc +15 -14
  390. data/src/core/lib/surface/completion_queue.h +2 -1
  391. data/src/core/lib/surface/init.cc +0 -1
  392. data/src/core/lib/surface/lame_client.cc +1 -1
  393. data/src/core/lib/surface/lame_client.h +1 -1
  394. data/src/core/lib/surface/server.cc +14 -8
  395. data/src/core/lib/surface/server.h +4 -1
  396. data/src/core/lib/surface/validate_metadata.cc +1 -1
  397. data/src/core/lib/surface/version.cc +2 -2
  398. data/src/core/lib/transport/error_utils.cc +13 -7
  399. data/src/core/lib/transport/handshaker.cc +3 -3
  400. data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
  401. data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
  402. data/src/core/lib/transport/transport.cc +0 -3
  403. data/src/core/lib/transport/transport.h +20 -14
  404. data/src/core/lib/transport/transport_fwd.h +20 -0
  405. data/src/core/lib/transport/transport_impl.h +1 -0
  406. data/src/core/lib/transport/transport_op_string.cc +9 -9
  407. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  409. data/src/core/tsi/fake_transport_security.cc +13 -1
  410. data/src/core/tsi/fake_transport_security.h +6 -0
  411. data/src/core/tsi/ssl_transport_security.cc +1 -1
  412. data/src/core/tsi/transport_security_grpc.cc +3 -2
  413. data/src/core/tsi/transport_security_grpc.h +5 -2
  414. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  415. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  416. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  417. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  418. data/src/ruby/ext/grpc/extconf.rb +49 -18
  419. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  420. data/src/ruby/lib/grpc/errors.rb +1 -1
  421. data/src/ruby/lib/grpc/version.rb +1 -1
  422. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  423. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  424. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  426. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  427. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  429. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  430. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  431. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  432. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  433. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  434. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  436. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  437. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  438. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  439. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  440. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  441. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  442. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  443. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  444. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  445. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  446. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  447. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  448. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  449. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  450. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  451. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  452. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
  453. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  454. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  455. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  456. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  457. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  458. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  459. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  460. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  461. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  462. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  463. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  464. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  470. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  471. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  472. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  473. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  474. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  475. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  476. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  477. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  478. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  479. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  480. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  481. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  482. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  483. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  484. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  485. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  486. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  487. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  488. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  489. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  490. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  491. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  492. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  493. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  494. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  495. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  496. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  497. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  498. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  499. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  500. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  501. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  502. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  503. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  504. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  506. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  507. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  508. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  509. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  510. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  511. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  514. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  515. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  516. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  517. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  518. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  519. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  526. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  527. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  529. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  530. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  536. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  537. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  538. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  539. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  540. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  541. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  544. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  545. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  546. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  547. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  548. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  549. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  550. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  551. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  552. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  553. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  554. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  555. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  556. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  557. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  558. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  559. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  560. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  561. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  562. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  563. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  564. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  565. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  566. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  567. metadata +39 -15
  568. data/src/core/lib/slice/slice_split.cc +0 -103
  569. data/src/core/lib/slice/slice_split.h +0 -36
  570. data/src/core/lib/transport/byte_stream.cc +0 -165
  571. data/src/core/lib/transport/byte_stream.h +0 -170
  572. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
  573. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
  574. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -97,6 +97,8 @@ typedef size_t msg_iovlen_type;
97
97
 
98
98
  extern grpc_core::TraceFlag grpc_tcp_trace;
99
99
 
100
+ GPR_GLOBAL_CONFIG_DECLARE_BOOL(grpc_experimental_enable_tcp_frame_size_tuning);
101
+
100
102
  namespace grpc_core {
101
103
 
102
104
  class TcpZerocopySendRecord {
@@ -357,6 +359,13 @@ using grpc_core::TcpZerocopySendCtx;
357
359
  using grpc_core::TcpZerocopySendRecord;
358
360
 
359
361
  namespace {
362
+
363
+ bool ExperimentalTcpFrameSizeTuningEnabled() {
364
+ static const bool kEnableTcpFrameSizeTuning =
365
+ GPR_GLOBAL_CONFIG_GET(grpc_experimental_enable_tcp_frame_size_tuning);
366
+ return kEnableTcpFrameSizeTuning;
367
+ }
368
+
360
369
  struct grpc_tcp {
361
370
  grpc_tcp(int max_sends, size_t send_bytes_threshold)
362
371
  : tcp_zerocopy_send_ctx(max_sends, send_bytes_threshold) {}
@@ -426,6 +435,11 @@ struct grpc_tcp {
426
435
  on errors anymore */
427
436
  TcpZerocopySendCtx tcp_zerocopy_send_ctx;
428
437
  TcpZerocopySendRecord* current_zerocopy_send = nullptr;
438
+
439
+ bool frame_size_tuning_enabled;
440
+ int min_progress_size; /* A hint from upper layers specifying the minimum
441
+ number of bytes that need to be read to make
442
+ meaningful progress */
429
443
  };
430
444
 
431
445
  struct backup_poller {
@@ -736,6 +750,7 @@ static bool tcp_do_read(grpc_tcp* tcp, grpc_error_handle* error)
736
750
  }
737
751
 
738
752
  GPR_ASSERT(tcp->incoming_buffer->length != 0);
753
+ GPR_DEBUG_ASSERT(tcp->min_progress_size > 0);
739
754
 
740
755
  do {
741
756
  /* Assume there is something on the queue. If we receive TCP_INQ from
@@ -767,7 +782,8 @@ static bool tcp_do_read(grpc_tcp* tcp, grpc_error_handle* error)
767
782
 
768
783
  /* We have read something in previous reads. We need to deliver those
769
784
  * bytes to the upper layer. */
770
- if (read_bytes <= 0 && total_read_bytes > 0) {
785
+ if (read_bytes <= 0 &&
786
+ total_read_bytes >= static_cast<size_t>(tcp->min_progress_size)) {
771
787
  tcp->inq = 1;
772
788
  break;
773
789
  }
@@ -776,6 +792,9 @@ static bool tcp_do_read(grpc_tcp* tcp, grpc_error_handle* error)
776
792
  /* NB: After calling call_read_cb a parallel call of the read handler may
777
793
  * be running. */
778
794
  if (errno == EAGAIN) {
795
+ if (total_read_bytes > 0) {
796
+ break;
797
+ }
779
798
  finish_estimate(tcp);
780
799
  tcp->inq = 0;
781
800
  return false;
@@ -848,18 +867,45 @@ static bool tcp_do_read(grpc_tcp* tcp, grpc_error_handle* error)
848
867
  }
849
868
 
850
869
  GPR_DEBUG_ASSERT(total_read_bytes > 0);
870
+ *error = GRPC_ERROR_NONE;
871
+ if (tcp->frame_size_tuning_enabled) {
872
+ // Update min progress size based on the total number of bytes read in
873
+ // this round.
874
+ tcp->min_progress_size -= total_read_bytes;
875
+ if (tcp->min_progress_size > 0) {
876
+ // There is still some bytes left to be read before we can signal
877
+ // the read as complete. Append the bytes read so far into
878
+ // last_read_buffer which serves as a staging buffer. Return false
879
+ // to indicate tcp_handle_read needs to be scheduled again.
880
+ grpc_slice_buffer_move_first(tcp->incoming_buffer, total_read_bytes,
881
+ &tcp->last_read_buffer);
882
+ return false;
883
+ } else {
884
+ // The required number of bytes have been read. Append the bytes
885
+ // read in this round into last_read_buffer. Then swap last_read_buffer
886
+ // and incoming_buffer. Now incoming buffer contains all the bytes
887
+ // read since the start of the last tcp_read operation. last_read_buffer
888
+ // would contain any spare space left in the incoming buffer. This
889
+ // space will be used in the next tcp_read operation.
890
+ tcp->min_progress_size = 1;
891
+ grpc_slice_buffer_move_first(tcp->incoming_buffer, total_read_bytes,
892
+ &tcp->last_read_buffer);
893
+ grpc_slice_buffer_swap(&tcp->last_read_buffer, tcp->incoming_buffer);
894
+ return true;
895
+ }
896
+ }
851
897
  if (total_read_bytes < tcp->incoming_buffer->length) {
852
898
  grpc_slice_buffer_trim_end(tcp->incoming_buffer,
853
899
  tcp->incoming_buffer->length - total_read_bytes,
854
900
  &tcp->last_read_buffer);
855
901
  }
856
- *error = GRPC_ERROR_NONE;
857
902
  return true;
858
903
  }
859
904
 
860
905
  static void maybe_make_read_slices(grpc_tcp* tcp)
861
906
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(tcp->read_mu) {
862
- if (tcp->incoming_buffer->length == 0 &&
907
+ if (tcp->incoming_buffer->length <
908
+ static_cast<size_t>(tcp->min_progress_size) &&
863
909
  tcp->incoming_buffer->count < MAX_READ_IOVEC) {
864
910
  if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
865
911
  gpr_log(GPR_INFO,
@@ -868,15 +914,20 @@ static void maybe_make_read_slices(grpc_tcp* tcp)
868
914
  tcp, tcp->min_read_chunk_size, tcp->max_read_chunk_size,
869
915
  tcp->target_length, tcp->incoming_buffer->length);
870
916
  }
871
- int target_length = static_cast<int>(tcp->target_length);
917
+ int target_length =
918
+ std::max(static_cast<int>(tcp->target_length), tcp->min_progress_size);
872
919
  int extra_wanted =
873
920
  target_length - static_cast<int>(tcp->incoming_buffer->length);
921
+ int min_read_chunk_size =
922
+ std::max(tcp->min_read_chunk_size, tcp->min_progress_size);
923
+ int max_read_chunk_size =
924
+ std::max(tcp->max_read_chunk_size, tcp->min_progress_size);
874
925
  grpc_slice_buffer_add_indexed(
875
926
  tcp->incoming_buffer,
876
927
  tcp->memory_owner.MakeSlice(grpc_core::MemoryRequest(
877
- tcp->min_read_chunk_size,
878
- grpc_core::Clamp(extra_wanted, tcp->min_read_chunk_size,
879
- tcp->max_read_chunk_size))));
928
+ min_read_chunk_size,
929
+ grpc_core::Clamp(extra_wanted, min_read_chunk_size,
930
+ max_read_chunk_size))));
880
931
  maybe_post_reclaimer(tcp);
881
932
  }
882
933
  }
@@ -889,7 +940,7 @@ static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error_handle error) {
889
940
  }
890
941
  tcp->read_mu.Lock();
891
942
  grpc_error_handle tcp_read_error;
892
- if (GPR_LIKELY(error == GRPC_ERROR_NONE)) {
943
+ if (GPR_LIKELY(GRPC_ERROR_IS_NONE(error))) {
893
944
  maybe_make_read_slices(tcp);
894
945
  if (!tcp_do_read(tcp, &tcp_read_error)) {
895
946
  /* We've consumed the edge, request a new one */
@@ -912,12 +963,14 @@ static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error_handle error) {
912
963
  }
913
964
 
914
965
  static void tcp_read(grpc_endpoint* ep, grpc_slice_buffer* incoming_buffer,
915
- grpc_closure* cb, bool urgent, int /*min_progress_size*/) {
966
+ grpc_closure* cb, bool urgent, int min_progress_size) {
916
967
  grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
917
968
  GPR_ASSERT(tcp->read_cb == nullptr);
918
969
  tcp->read_cb = cb;
919
970
  tcp->read_mu.Lock();
920
971
  tcp->incoming_buffer = incoming_buffer;
972
+ tcp->min_progress_size =
973
+ tcp->frame_size_tuning_enabled ? min_progress_size : 1;
921
974
  grpc_slice_buffer_reset_and_unref_internal(incoming_buffer);
922
975
  grpc_slice_buffer_swap(incoming_buffer, &tcp->last_read_buffer);
923
976
  tcp->read_mu.Unlock();
@@ -945,14 +998,15 @@ static void tcp_read(grpc_endpoint* ep, grpc_slice_buffer* incoming_buffer,
945
998
 
946
999
  /* A wrapper around sendmsg. It sends \a msg over \a fd and returns the number
947
1000
  * of bytes sent. */
948
- ssize_t tcp_send(int fd, const struct msghdr* msg, int additional_flags = 0) {
1001
+ ssize_t tcp_send(int fd, const struct msghdr* msg, int* saved_errno,
1002
+ int additional_flags = 0) {
949
1003
  GPR_TIMER_SCOPE("sendmsg", 1);
950
1004
  ssize_t sent_length;
951
1005
  do {
952
1006
  /* TODO(klempner): Cork if this is a partial write */
953
1007
  GRPC_STATS_INC_SYSCALL_WRITE();
954
1008
  sent_length = sendmsg(fd, msg, SENDMSG_FLAGS | additional_flags);
955
- } while (sent_length < 0 && errno == EINTR);
1009
+ } while (sent_length < 0 && (*saved_errno = errno) == EINTR);
956
1010
  return sent_length;
957
1011
  }
958
1012
 
@@ -964,7 +1018,7 @@ ssize_t tcp_send(int fd, const struct msghdr* msg, int additional_flags = 0) {
964
1018
  */
965
1019
  static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg,
966
1020
  size_t sending_length,
967
- ssize_t* sent_length,
1021
+ ssize_t* sent_length, int* saved_errno,
968
1022
  int additional_flags = 0);
969
1023
 
970
1024
  /** The callback function to be invoked when we get an error on the socket. */
@@ -1008,7 +1062,7 @@ static void ZerocopyDisableAndWaitForRemaining(grpc_tcp* tcp) {
1008
1062
 
1009
1063
  static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg,
1010
1064
  size_t sending_length,
1011
- ssize_t* sent_length,
1065
+ ssize_t* sent_length, int* saved_errno,
1012
1066
  int additional_flags) {
1013
1067
  if (!tcp->socket_ts_enabled) {
1014
1068
  uint32_t opt = grpc_core::kTimestampingSocketOptions;
@@ -1037,7 +1091,7 @@ static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg,
1037
1091
  msg->msg_controllen = CMSG_SPACE(sizeof(uint32_t));
1038
1092
 
1039
1093
  /* If there was an error on sendmsg the logic in tcp_flush will handle it. */
1040
- ssize_t length = tcp_send(tcp->fd, msg, additional_flags);
1094
+ ssize_t length = tcp_send(tcp->fd, msg, saved_errno, additional_flags);
1041
1095
  *sent_length = length;
1042
1096
  /* Only save timestamps if all the bytes were taken by sendmsg. */
1043
1097
  if (sending_length == static_cast<size_t>(length)) {
@@ -1231,7 +1285,7 @@ static void tcp_handle_error(void* arg /* grpc_tcp */,
1231
1285
  grpc_error_std_string(error).c_str());
1232
1286
  }
1233
1287
 
1234
- if (error != GRPC_ERROR_NONE ||
1288
+ if (!GRPC_ERROR_IS_NONE(error) ||
1235
1289
  static_cast<bool>(gpr_atm_acq_load(&tcp->stop_error_notification))) {
1236
1290
  /* We aren't going to register to hear on error anymore, so it is safe to
1237
1291
  * unref. */
@@ -1262,6 +1316,7 @@ static void ZerocopyDisableAndWaitForRemaining(grpc_tcp* /*tcp*/) {}
1262
1316
  static bool tcp_write_with_timestamps(grpc_tcp* /*tcp*/, struct msghdr* /*msg*/,
1263
1317
  size_t /*sending_length*/,
1264
1318
  ssize_t* /*sent_length*/,
1319
+ int* /* saved_errno */,
1265
1320
  int /*additional_flags*/) {
1266
1321
  gpr_log(GPR_ERROR, "Write with timestamps not supported for this platform");
1267
1322
  GPR_ASSERT(0);
@@ -1342,6 +1397,7 @@ static bool do_tcp_flush_zerocopy(grpc_tcp* tcp, TcpZerocopySendRecord* record,
1342
1397
  size_t unwind_slice_idx;
1343
1398
  size_t unwind_byte_idx;
1344
1399
  bool tried_sending_message;
1400
+ int saved_errno;
1345
1401
  msghdr msg;
1346
1402
  // iov consumes a large space. Keep it as the last item on the stack to
1347
1403
  // improve locality. After all, we expect only the first elements of it being
@@ -1360,10 +1416,11 @@ static bool do_tcp_flush_zerocopy(grpc_tcp* tcp, TcpZerocopySendRecord* record,
1360
1416
  // Before calling sendmsg (with or without timestamps): we
1361
1417
  // take a single ref on the zerocopy send record.
1362
1418
  tcp->tcp_zerocopy_send_ctx.NoteSend(record);
1419
+ saved_errno = 0;
1363
1420
  if (tcp->outgoing_buffer_arg != nullptr) {
1364
1421
  if (!tcp->ts_capable ||
1365
1422
  !tcp_write_with_timestamps(tcp, &msg, sending_length, &sent_length,
1366
- MSG_ZEROCOPY)) {
1423
+ &saved_errno, MSG_ZEROCOPY)) {
1367
1424
  /* We could not set socket options to collect Fathom timestamps.
1368
1425
  * Fallback on writing without timestamps. */
1369
1426
  tcp->ts_capable = false;
@@ -1377,20 +1434,20 @@ static bool do_tcp_flush_zerocopy(grpc_tcp* tcp, TcpZerocopySendRecord* record,
1377
1434
  msg.msg_controllen = 0;
1378
1435
  GRPC_STATS_INC_TCP_WRITE_SIZE(sending_length);
1379
1436
  GRPC_STATS_INC_TCP_WRITE_IOV_SIZE(iov_size);
1380
- sent_length = tcp_send(tcp->fd, &msg, MSG_ZEROCOPY);
1437
+ sent_length = tcp_send(tcp->fd, &msg, &saved_errno, MSG_ZEROCOPY);
1381
1438
  }
1382
1439
  if (sent_length < 0) {
1383
1440
  // If this particular send failed, drop ref taken earlier in this method.
1384
1441
  tcp->tcp_zerocopy_send_ctx.UndoSend();
1385
- if (errno == EAGAIN) {
1442
+ if (saved_errno == EAGAIN) {
1386
1443
  record->UnwindIfThrottled(unwind_slice_idx, unwind_byte_idx);
1387
1444
  return false;
1388
- } else if (errno == EPIPE) {
1389
- *error = tcp_annotate_error(GRPC_OS_ERROR(errno, "sendmsg"), tcp);
1445
+ } else if (saved_errno == EPIPE) {
1446
+ *error = tcp_annotate_error(GRPC_OS_ERROR(saved_errno, "sendmsg"), tcp);
1390
1447
  tcp_shutdown_buffer_list(tcp);
1391
1448
  return true;
1392
1449
  } else {
1393
- *error = tcp_annotate_error(GRPC_OS_ERROR(errno, "sendmsg"), tcp);
1450
+ *error = tcp_annotate_error(GRPC_OS_ERROR(saved_errno, "sendmsg"), tcp);
1394
1451
  tcp_shutdown_buffer_list(tcp);
1395
1452
  return true;
1396
1453
  }
@@ -1434,6 +1491,7 @@ static bool tcp_flush(grpc_tcp* tcp, grpc_error_handle* error) {
1434
1491
  size_t trailing;
1435
1492
  size_t unwind_slice_idx;
1436
1493
  size_t unwind_byte_idx;
1494
+ int saved_errno;
1437
1495
 
1438
1496
  // We always start at zero, because we eagerly unref and trim the slice
1439
1497
  // buffer as we write
@@ -1465,9 +1523,11 @@ static bool tcp_flush(grpc_tcp* tcp, grpc_error_handle* error) {
1465
1523
  msg.msg_iovlen = iov_size;
1466
1524
  msg.msg_flags = 0;
1467
1525
  bool tried_sending_message = false;
1526
+ saved_errno = 0;
1468
1527
  if (tcp->outgoing_buffer_arg != nullptr) {
1469
1528
  if (!tcp->ts_capable ||
1470
- !tcp_write_with_timestamps(tcp, &msg, sending_length, &sent_length)) {
1529
+ !tcp_write_with_timestamps(tcp, &msg, sending_length, &sent_length,
1530
+ &saved_errno)) {
1471
1531
  /* We could not set socket options to collect Fathom timestamps.
1472
1532
  * Fallback on writing without timestamps. */
1473
1533
  tcp->ts_capable = false;
@@ -1483,11 +1543,11 @@ static bool tcp_flush(grpc_tcp* tcp, grpc_error_handle* error) {
1483
1543
  GRPC_STATS_INC_TCP_WRITE_SIZE(sending_length);
1484
1544
  GRPC_STATS_INC_TCP_WRITE_IOV_SIZE(iov_size);
1485
1545
 
1486
- sent_length = tcp_send(tcp->fd, &msg);
1546
+ sent_length = tcp_send(tcp->fd, &msg, &saved_errno);
1487
1547
  }
1488
1548
 
1489
1549
  if (sent_length < 0) {
1490
- if (errno == EAGAIN) {
1550
+ if (saved_errno == EAGAIN) {
1491
1551
  tcp->outgoing_byte_idx = unwind_byte_idx;
1492
1552
  // unref all and forget about all slices that have been written to this
1493
1553
  // point
@@ -1495,13 +1555,13 @@ static bool tcp_flush(grpc_tcp* tcp, grpc_error_handle* error) {
1495
1555
  grpc_slice_buffer_remove_first(tcp->outgoing_buffer);
1496
1556
  }
1497
1557
  return false;
1498
- } else if (errno == EPIPE) {
1499
- *error = tcp_annotate_error(GRPC_OS_ERROR(errno, "sendmsg"), tcp);
1558
+ } else if (saved_errno == EPIPE) {
1559
+ *error = tcp_annotate_error(GRPC_OS_ERROR(saved_errno, "sendmsg"), tcp);
1500
1560
  grpc_slice_buffer_reset_and_unref_internal(tcp->outgoing_buffer);
1501
1561
  tcp_shutdown_buffer_list(tcp);
1502
1562
  return true;
1503
1563
  } else {
1504
- *error = tcp_annotate_error(GRPC_OS_ERROR(errno, "sendmsg"), tcp);
1564
+ *error = tcp_annotate_error(GRPC_OS_ERROR(saved_errno, "sendmsg"), tcp);
1505
1565
  grpc_slice_buffer_reset_and_unref_internal(tcp->outgoing_buffer);
1506
1566
  tcp_shutdown_buffer_list(tcp);
1507
1567
  return true;
@@ -1537,7 +1597,7 @@ static void tcp_handle_write(void* arg /* grpc_tcp */,
1537
1597
  grpc_tcp* tcp = static_cast<grpc_tcp*>(arg);
1538
1598
  grpc_closure* cb;
1539
1599
 
1540
- if (error != GRPC_ERROR_NONE) {
1600
+ if (!GRPC_ERROR_IS_NONE(error)) {
1541
1601
  cb = tcp->write_cb;
1542
1602
  tcp->write_cb = nullptr;
1543
1603
  if (tcp->current_zerocopy_send != nullptr) {
@@ -1560,7 +1620,7 @@ static void tcp_handle_write(void* arg /* grpc_tcp */,
1560
1620
  }
1561
1621
  notify_on_write(tcp);
1562
1622
  // tcp_flush does not populate error if it has returned false.
1563
- GPR_DEBUG_ASSERT(error == GRPC_ERROR_NONE);
1623
+ GPR_DEBUG_ASSERT(GRPC_ERROR_IS_NONE(error));
1564
1624
  } else {
1565
1625
  cb = tcp->write_cb;
1566
1626
  tcp->write_cb = nullptr;
@@ -1792,6 +1852,8 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
1792
1852
  tcp->socket_ts_enabled = false;
1793
1853
  tcp->ts_capable = true;
1794
1854
  tcp->outgoing_buffer_arg = nullptr;
1855
+ tcp->frame_size_tuning_enabled = ExperimentalTcpFrameSizeTuningEnabled();
1856
+ tcp->min_progress_size = 1;
1795
1857
  if (tcp_tx_zerocopy_enabled && !tcp->tcp_zerocopy_send_ctx.memory_limited()) {
1796
1858
  #ifdef GRPC_LINUX_ERRQUEUE
1797
1859
  const int enable = 1;
@@ -191,7 +191,7 @@ static void tcp_server_destroy(grpc_tcp_server* s) {
191
191
  static void on_read(void* arg, grpc_error_handle err) {
192
192
  grpc_tcp_listener* sp = static_cast<grpc_tcp_listener*>(arg);
193
193
  grpc_pollset* read_notifier_pollset;
194
- if (err != GRPC_ERROR_NONE) {
194
+ if (!GRPC_ERROR_IS_NONE(err)) {
195
195
  goto error;
196
196
  }
197
197
 
@@ -253,7 +253,7 @@ static void on_read(void* arg, grpc_error_handle err) {
253
253
 
254
254
  err = grpc_apply_socket_mutator_in_args(fd, GRPC_FD_SERVER_CONNECTION_USAGE,
255
255
  sp->server->channel_args);
256
- if (err != GRPC_ERROR_NONE) {
256
+ if (!GRPC_ERROR_IS_NONE(err)) {
257
257
  goto error;
258
258
  }
259
259
 
@@ -344,14 +344,14 @@ static grpc_error_handle add_wildcard_addrs_to_server(grpc_tcp_server* s,
344
344
  }
345
345
  }
346
346
  if (*out_port > 0) {
347
- if (v6_err != GRPC_ERROR_NONE) {
347
+ if (!GRPC_ERROR_IS_NONE(v6_err)) {
348
348
  gpr_log(GPR_INFO,
349
349
  "Failed to add :: listener, "
350
350
  "the environment may not support IPv6: %s",
351
351
  grpc_error_std_string(v6_err).c_str());
352
352
  GRPC_ERROR_UNREF(v6_err);
353
353
  }
354
- if (v4_err != GRPC_ERROR_NONE) {
354
+ if (!GRPC_ERROR_IS_NONE(v4_err)) {
355
355
  gpr_log(GPR_INFO,
356
356
  "Failed to add 0.0.0.0 listener, "
357
357
  "the environment may not support IPv4: %s",
@@ -362,7 +362,7 @@ static grpc_error_handle add_wildcard_addrs_to_server(grpc_tcp_server* s,
362
362
  } else {
363
363
  grpc_error_handle root_err = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
364
364
  "Failed to add any wildcard listeners");
365
- GPR_ASSERT(v6_err != GRPC_ERROR_NONE && v4_err != GRPC_ERROR_NONE);
365
+ GPR_ASSERT(!GRPC_ERROR_IS_NONE(v6_err) && !GRPC_ERROR_IS_NONE(v4_err));
366
366
  root_err = grpc_error_add_child(root_err, v6_err);
367
367
  root_err = grpc_error_add_child(root_err, v4_err);
368
368
  return root_err;
@@ -385,10 +385,10 @@ static grpc_error_handle clone_port(grpc_tcp_listener* listener,
385
385
  grpc_dualstack_mode dsmode;
386
386
  err = grpc_create_dualstack_socket(&listener->addr, SOCK_STREAM, 0, &dsmode,
387
387
  &fd);
388
- if (err != GRPC_ERROR_NONE) return err;
388
+ if (!GRPC_ERROR_IS_NONE(err)) return err;
389
389
  err = grpc_tcp_server_prepare_socket(listener->server, fd, &listener->addr,
390
390
  true, &port);
391
- if (err != GRPC_ERROR_NONE) return err;
391
+ if (!GRPC_ERROR_IS_NONE(err)) return err;
392
392
  listener->server->nports++;
393
393
  addr_str = grpc_sockaddr_to_string(&listener->addr, true);
394
394
  if (!addr_str.ok()) {
@@ -90,7 +90,7 @@ static grpc_error_handle add_socket_to_server(grpc_tcp_server* s, int fd,
90
90
 
91
91
  grpc_error_handle err =
92
92
  grpc_tcp_server_prepare_socket(s, fd, addr, s->so_reuseport, &port);
93
- if (err != GRPC_ERROR_NONE) return err;
93
+ if (!GRPC_ERROR_IS_NONE(err)) return err;
94
94
  GPR_ASSERT(port > 0);
95
95
  absl::StatusOr<std::string> addr_str = grpc_sockaddr_to_string(addr, true);
96
96
  if (!addr_str.ok()) {
@@ -137,7 +137,7 @@ grpc_error_handle grpc_tcp_server_add_addr(grpc_tcp_server* s,
137
137
  int fd;
138
138
  grpc_error_handle err =
139
139
  grpc_create_dualstack_socket(addr, SOCK_STREAM, 0, dsmode, &fd);
140
- if (err != GRPC_ERROR_NONE) {
140
+ if (!GRPC_ERROR_IS_NONE(err)) {
141
141
  return err;
142
142
  }
143
143
  if (*dsmode == GRPC_DSMODE_IPV4 &&
@@ -158,36 +158,36 @@ grpc_error_handle grpc_tcp_server_prepare_socket(
158
158
 
159
159
  if (so_reuseport && !grpc_is_unix_socket(addr)) {
160
160
  err = grpc_set_socket_reuse_port(fd, 1);
161
- if (err != GRPC_ERROR_NONE) goto error;
161
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
162
162
  }
163
163
 
164
164
  #ifdef GRPC_LINUX_ERRQUEUE
165
165
  err = grpc_set_socket_zerocopy(fd);
166
- if (err != GRPC_ERROR_NONE) {
166
+ if (!GRPC_ERROR_IS_NONE(err)) {
167
167
  /* it's not fatal, so just log it. */
168
168
  gpr_log(GPR_DEBUG, "Node does not support SO_ZEROCOPY, continuing.");
169
169
  GRPC_ERROR_UNREF(err);
170
170
  }
171
171
  #endif
172
172
  err = grpc_set_socket_nonblocking(fd, 1);
173
- if (err != GRPC_ERROR_NONE) goto error;
173
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
174
174
  err = grpc_set_socket_cloexec(fd, 1);
175
- if (err != GRPC_ERROR_NONE) goto error;
175
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
176
176
  if (!grpc_is_unix_socket(addr)) {
177
177
  err = grpc_set_socket_low_latency(fd, 1);
178
- if (err != GRPC_ERROR_NONE) goto error;
178
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
179
179
  err = grpc_set_socket_reuse_addr(fd, 1);
180
- if (err != GRPC_ERROR_NONE) goto error;
180
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
181
181
  err = grpc_set_socket_tcp_user_timeout(fd, s->channel_args,
182
182
  false /* is_client */);
183
- if (err != GRPC_ERROR_NONE) goto error;
183
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
184
184
  }
185
185
  err = grpc_set_socket_no_sigpipe_if_possible(fd);
186
- if (err != GRPC_ERROR_NONE) goto error;
186
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
187
187
 
188
188
  err = grpc_apply_socket_mutator_in_args(fd, GRPC_FD_SERVER_LISTENER_USAGE,
189
189
  s->channel_args);
190
- if (err != GRPC_ERROR_NONE) goto error;
190
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
191
191
 
192
192
  if (bind(fd, reinterpret_cast<grpc_sockaddr*>(const_cast<char*>(addr->addr)),
193
193
  addr->len) < 0) {
@@ -212,7 +212,7 @@ grpc_error_handle grpc_tcp_server_prepare_socket(
212
212
  return GRPC_ERROR_NONE;
213
213
 
214
214
  error:
215
- GPR_ASSERT(err != GRPC_ERROR_NONE);
215
+ GPR_ASSERT(!GRPC_ERROR_IS_NONE(err));
216
216
  if (fd >= 0) {
217
217
  close(fd);
218
218
  }
@@ -65,7 +65,7 @@ static grpc_error_handle get_unused_port(int* port) {
65
65
  int fd;
66
66
  grpc_error_handle err =
67
67
  grpc_create_dualstack_socket(&wild, SOCK_STREAM, 0, &dsmode, &fd);
68
- if (err != GRPC_ERROR_NONE) {
68
+ if (!GRPC_ERROR_IS_NONE(err)) {
69
69
  return err;
70
70
  }
71
71
  if (dsmode == GRPC_DSMODE_IPV4) {
@@ -164,7 +164,7 @@ grpc_error_handle grpc_tcp_server_add_all_local_addrs(grpc_tcp_server* s,
164
164
  }
165
165
  }
166
166
  freeifaddrs(ifa);
167
- if (err != GRPC_ERROR_NONE) {
167
+ if (!GRPC_ERROR_IS_NONE(err)) {
168
168
  return err;
169
169
  } else if (sp == nullptr) {
170
170
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No local addresses");
@@ -197,7 +197,7 @@ static grpc_error_handle prepare_socket(SOCKET sock,
197
197
  int sockname_temp_len;
198
198
 
199
199
  error = grpc_tcp_prepare_socket(sock);
200
- if (error != GRPC_ERROR_NONE) {
200
+ if (!GRPC_ERROR_IS_NONE(error)) {
201
201
  goto failure;
202
202
  }
203
203
 
@@ -224,7 +224,7 @@ static grpc_error_handle prepare_socket(SOCKET sock,
224
224
  return GRPC_ERROR_NONE;
225
225
 
226
226
  failure:
227
- GPR_ASSERT(error != GRPC_ERROR_NONE);
227
+ GPR_ASSERT(!GRPC_ERROR_IS_NONE(error));
228
228
  auto addr_uri = grpc_sockaddr_to_uri(addr);
229
229
  grpc_error_set_int(
230
230
  grpc_error_set_str(
@@ -267,7 +267,7 @@ static grpc_error_handle start_accept_locked(grpc_tcp_listener* port) {
267
267
  }
268
268
 
269
269
  error = grpc_tcp_prepare_socket(sock);
270
- if (error != GRPC_ERROR_NONE) goto failure;
270
+ if (!GRPC_ERROR_IS_NONE(error)) goto failure;
271
271
 
272
272
  /* Start the "accept" asynchronously. */
273
273
  success = port->AcceptEx(port->socket->socket, sock, port->addresses, 0,
@@ -292,7 +292,7 @@ static grpc_error_handle start_accept_locked(grpc_tcp_listener* port) {
292
292
  return error;
293
293
 
294
294
  failure:
295
- GPR_ASSERT(error != GRPC_ERROR_NONE);
295
+ GPR_ASSERT(!GRPC_ERROR_IS_NONE(error));
296
296
  if (sock != INVALID_SOCKET) closesocket(sock);
297
297
  return error;
298
298
  }
@@ -316,7 +316,7 @@ static void on_accept(void* arg, grpc_error_handle error) {
316
316
  /* The general mechanism for shutting down is to queue abortion calls. While
317
317
  this is necessary in the read/write case, it's useless for the accept
318
318
  case. We only need to adjust the pending callback count */
319
- if (error != GRPC_ERROR_NONE) {
319
+ if (!GRPC_ERROR_IS_NONE(error)) {
320
320
  gpr_log(GPR_INFO, "Skipping on_accept due to error: %s",
321
321
  grpc_error_std_string(error).c_str());
322
322
 
@@ -419,7 +419,7 @@ static grpc_error_handle add_socket_to_server(grpc_tcp_server* s, SOCKET sock,
419
419
  }
420
420
 
421
421
  error = prepare_socket(sock, addr, &port);
422
- if (error != GRPC_ERROR_NONE) {
422
+ if (!GRPC_ERROR_IS_NONE(error)) {
423
423
  return error;
424
424
  }
425
425
 
@@ -511,7 +511,7 @@ static grpc_error_handle tcp_server_add_port(grpc_tcp_server* s,
511
511
  done:
512
512
  gpr_free(allocated_addr);
513
513
 
514
- if (error != GRPC_ERROR_NONE) {
514
+ if (!GRPC_ERROR_IS_NONE(error)) {
515
515
  grpc_error_handle error_out =
516
516
  GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
517
517
  "Failed to add port to server", &error, 1);
@@ -89,11 +89,11 @@ static grpc_error_handle enable_socket_low_latency(SOCKET sock) {
89
89
  grpc_error_handle grpc_tcp_prepare_socket(SOCKET sock) {
90
90
  grpc_error_handle err;
91
91
  err = grpc_tcp_set_non_block(sock);
92
- if (err != GRPC_ERROR_NONE) return err;
92
+ if (!GRPC_ERROR_IS_NONE(err)) return err;
93
93
  err = set_dualstack(sock);
94
- if (err != GRPC_ERROR_NONE) return err;
94
+ if (!GRPC_ERROR_IS_NONE(err)) return err;
95
95
  err = enable_socket_low_latency(sock);
96
- if (err != GRPC_ERROR_NONE) return err;
96
+ if (!GRPC_ERROR_IS_NONE(err)) return err;
97
97
  return GRPC_ERROR_NONE;
98
98
  }
99
99
 
@@ -186,7 +186,7 @@ static void on_read(void* tcpp, grpc_error_handle error) {
186
186
 
187
187
  (void)GRPC_ERROR_REF(error);
188
188
 
189
- if (error == GRPC_ERROR_NONE) {
189
+ if (GRPC_ERROR_IS_NONE(error)) {
190
190
  if (info->wsa_error != 0 && !tcp->shutting_down) {
191
191
  char* utf8_message = gpr_format_message(info->wsa_error);
192
192
  error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(utf8_message);
@@ -331,7 +331,7 @@ static void on_write(void* tcpp, grpc_error_handle error) {
331
331
  tcp->write_cb = NULL;
332
332
  gpr_mu_unlock(&tcp->mu);
333
333
 
334
- if (error == GRPC_ERROR_NONE) {
334
+ if (GRPC_ERROR_IS_NONE(error)) {
335
335
  if (info->wsa_error != 0) {
336
336
  error = GRPC_WSA_ERROR(info->wsa_error, "WSASend");
337
337
  } else {
@@ -45,7 +45,7 @@ absl::StatusOr<std::vector<grpc_resolved_address>>
45
45
  grpc_resolve_unix_domain_address(absl::string_view name) {
46
46
  grpc_resolved_address addr;
47
47
  grpc_error_handle error = grpc_core::UnixSockaddrPopulate(name, &addr);
48
- if (error == GRPC_ERROR_NONE) {
48
+ if (GRPC_ERROR_IS_NONE(error)) {
49
49
  return std::vector<grpc_resolved_address>({addr});
50
50
  }
51
51
  auto result = grpc_error_to_absl_status(error);
@@ -58,7 +58,7 @@ grpc_resolve_unix_abstract_domain_address(const absl::string_view name) {
58
58
  grpc_resolved_address addr;
59
59
  grpc_error_handle error =
60
60
  grpc_core::UnixAbstractSockaddrPopulate(name, &addr);
61
- if (error == GRPC_ERROR_NONE) {
61
+ if (GRPC_ERROR_IS_NONE(error)) {
62
62
  return std::vector<grpc_resolved_address>({addr});
63
63
  }
64
64
  auto result = grpc_error_to_absl_status(error);
@@ -41,9 +41,9 @@ static grpc_error_handle pipe_init(grpc_wakeup_fd* fd_info) {
41
41
  }
42
42
  grpc_error_handle err;
43
43
  err = grpc_set_socket_nonblocking(pipefd[0], 1);
44
- if (err != GRPC_ERROR_NONE) return err;
44
+ if (!GRPC_ERROR_IS_NONE(err)) return err;
45
45
  err = grpc_set_socket_nonblocking(pipefd[1], 1);
46
- if (err != GRPC_ERROR_NONE) return err;
46
+ if (!GRPC_ERROR_IS_NONE(err)) return err;
47
47
  fd_info->read_fd = pipefd[0];
48
48
  fd_info->write_fd = pipefd[1];
49
49
  return GRPC_ERROR_NONE;
@@ -32,22 +32,25 @@ static const grpc_wakeup_fd_vtable* wakeup_fd_vtable = nullptr;
32
32
  int grpc_allow_specialized_wakeup_fd = 1;
33
33
  int grpc_allow_pipe_wakeup_fd = 1;
34
34
 
35
- int has_real_wakeup_fd = 1;
36
- int cv_wakeup_fds_enabled = 0;
35
+ static int has_real_wakeup_fd = 1;
36
+
37
+ static gpr_once once_init_wakeup_fd = GPR_ONCE_INIT;
37
38
 
38
39
  void grpc_wakeup_fd_global_init(void) {
39
- if (grpc_allow_specialized_wakeup_fd &&
40
- grpc_specialized_wakeup_fd_vtable.check_availability()) {
41
- wakeup_fd_vtable = &grpc_specialized_wakeup_fd_vtable;
42
- } else if (grpc_allow_pipe_wakeup_fd &&
43
- grpc_pipe_wakeup_fd_vtable.check_availability()) {
44
- wakeup_fd_vtable = &grpc_pipe_wakeup_fd_vtable;
45
- } else {
46
- has_real_wakeup_fd = 0;
47
- }
40
+ gpr_once_init(&once_init_wakeup_fd, []() {
41
+ if (grpc_allow_specialized_wakeup_fd &&
42
+ grpc_specialized_wakeup_fd_vtable.check_availability()) {
43
+ wakeup_fd_vtable = &grpc_specialized_wakeup_fd_vtable;
44
+ } else if (grpc_allow_pipe_wakeup_fd &&
45
+ grpc_pipe_wakeup_fd_vtable.check_availability()) {
46
+ wakeup_fd_vtable = &grpc_pipe_wakeup_fd_vtable;
47
+ } else {
48
+ has_real_wakeup_fd = 0;
49
+ }
50
+ });
48
51
  }
49
52
 
50
- void grpc_wakeup_fd_global_destroy(void) { wakeup_fd_vtable = nullptr; }
53
+ void grpc_wakeup_fd_global_destroy(void) {}
51
54
 
52
55
  int grpc_has_wakeup_fd(void) { return has_real_wakeup_fd; }
53
56
 
@@ -59,8 +59,6 @@ void grpc_wakeup_fd_global_destroy(void);
59
59
  void grpc_wakeup_fd_global_init_force_fallback(void);
60
60
 
61
61
  int grpc_has_wakeup_fd(void);
62
- int grpc_cv_wakeup_fds_enabled(void);
63
- void grpc_enable_cv_wakeup_fds(int enable);
64
62
 
65
63
  typedef struct grpc_wakeup_fd grpc_wakeup_fd;
66
64