grpc 1.74.0 → 1.75.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +83 -41
  3. data/include/grpc/credentials.h +7 -1
  4. data/src/core/call/client_call.cc +4 -4
  5. data/src/core/call/filter_fusion.h +1230 -0
  6. data/src/core/call/metadata.cc +22 -0
  7. data/src/core/call/metadata.h +24 -2
  8. data/src/core/channelz/channelz.cc +10 -17
  9. data/src/core/channelz/channelz.h +58 -19
  10. data/src/core/channelz/channelz_registry.cc +0 -162
  11. data/src/core/channelz/channelz_registry.h +14 -7
  12. data/src/core/channelz/property_list.cc +19 -23
  13. data/src/core/channelz/property_list.h +3 -1
  14. data/src/core/channelz/v2tov1/convert.cc +683 -0
  15. data/src/core/channelz/v2tov1/convert.h +58 -0
  16. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  17. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  18. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  19. data/src/core/channelz/v2tov1/property_list.h +52 -0
  20. data/src/core/client_channel/client_channel_filter.cc +5 -4
  21. data/src/core/client_channel/client_channel_filter.h +2 -2
  22. data/src/core/client_channel/client_channel_internal.h +2 -1
  23. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  24. data/src/core/client_channel/subchannel.cc +14 -6
  25. data/src/core/client_channel/subchannel.h +2 -0
  26. data/src/core/config/core_configuration.cc +3 -1
  27. data/src/core/config/core_configuration.h +12 -0
  28. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  29. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  30. data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
  31. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  32. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  33. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  34. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  37. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  38. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  39. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  40. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  41. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  42. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  43. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  44. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  45. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  46. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  47. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  48. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  49. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  50. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  51. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
  53. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  54. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  55. data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
  56. data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
  57. data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
  61. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  62. data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
  63. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  64. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  65. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
  66. data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
  67. data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
  68. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  69. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
  70. data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  72. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  73. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
  74. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  75. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  76. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  77. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
  78. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
  79. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
  80. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  81. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  82. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
  83. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
  84. data/src/core/filter/auth/auth_filters.h +2 -2
  85. data/src/core/filter/fused_filters.cc +154 -0
  86. data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
  87. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  88. data/src/core/handshaker/security/secure_endpoint.cc +28 -13
  89. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  90. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  91. data/src/core/lib/channel/promise_based_filter.h +6 -5
  92. data/src/core/lib/event_engine/ares_resolver.h +3 -1
  93. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
  94. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
  95. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  96. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  97. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  98. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
  99. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
  100. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
  101. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
  102. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
  103. data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
  104. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
  105. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  106. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
  107. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  108. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  109. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
  110. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
  111. data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
  112. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
  113. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  114. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
  115. data/src/core/lib/experiments/experiments.cc +120 -6
  116. data/src/core/lib/experiments/experiments.h +46 -3
  117. data/src/core/lib/iomgr/combiner.cc +1 -1
  118. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  119. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  120. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  121. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  123. data/src/core/lib/iomgr/tcp_posix.cc +3 -3
  124. data/src/core/lib/promise/activity.h +2 -2
  125. data/src/core/lib/promise/mpsc.cc +8 -8
  126. data/src/core/lib/promise/party.cc +7 -7
  127. data/src/core/lib/promise/party.h +4 -4
  128. data/src/core/lib/promise/poll.h +10 -0
  129. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  130. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  131. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  132. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  133. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  134. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  135. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  136. data/src/core/lib/surface/call.cc +5 -5
  137. data/src/core/lib/surface/call.h +6 -5
  138. data/src/core/lib/surface/completion_queue.cc +2 -4
  139. data/src/core/lib/surface/filter_stack_call.cc +1 -1
  140. data/src/core/lib/surface/version.cc +2 -2
  141. data/src/core/lib/transport/promise_endpoint.cc +2 -2
  142. data/src/core/lib/transport/promise_endpoint.h +3 -3
  143. data/src/core/load_balancing/endpoint_list.cc +29 -2
  144. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  145. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  146. data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
  147. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  148. data/src/core/net/socket_mutator.cc +19 -0
  149. data/src/core/net/socket_mutator.h +25 -0
  150. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  151. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  152. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  153. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  154. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  155. data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
  156. data/src/core/server/server.cc +1 -1
  157. data/src/core/server/server_call_tracer_filter.cc +0 -66
  158. data/src/core/server/server_call_tracer_filter.h +64 -0
  159. data/src/core/server/server_config_selector_filter.cc +1 -1
  160. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  161. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  162. data/src/core/telemetry/call_tracer.cc +20 -14
  163. data/src/core/telemetry/call_tracer.h +22 -17
  164. data/src/core/telemetry/metrics.h +8 -8
  165. data/src/core/telemetry/stats_data.cc +151 -151
  166. data/src/core/telemetry/stats_data.h +87 -87
  167. data/src/core/transport/auth_context.cc +20 -0
  168. data/src/core/transport/auth_context.h +4 -0
  169. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  170. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  171. data/src/core/tsi/ssl_transport_security.cc +202 -32
  172. data/src/core/tsi/ssl_transport_security.h +19 -10
  173. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  174. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  175. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  176. data/src/core/util/latent_see.cc +178 -146
  177. data/src/core/util/latent_see.h +245 -188
  178. data/src/core/util/single_set_ptr.h +5 -2
  179. data/src/core/util/useful.h +91 -0
  180. data/src/core/util/windows/directory_reader.cc +1 -0
  181. data/src/core/util/windows/thd.cc +1 -3
  182. data/src/core/util/work_serializer.cc +1 -1
  183. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  184. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  185. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  186. data/src/ruby/ext/grpc/rb_channel.c +15 -6
  187. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  188. data/src/ruby/lib/grpc/version.rb +1 -1
  189. data/third_party/cares/cares/include/ares.h +925 -460
  190. data/third_party/cares/cares/include/ares_dns.h +86 -71
  191. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  192. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  193. data/third_party/cares/cares/include/ares_version.h +37 -14
  194. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  195. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  196. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  197. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  198. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  199. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  200. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  201. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  202. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  203. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  204. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  205. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  206. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  207. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  208. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  209. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  210. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  211. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  212. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  213. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  214. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  215. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  216. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  217. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  218. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  219. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  220. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  221. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  222. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  223. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  224. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  225. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  226. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  227. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  228. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  229. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  230. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  231. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  232. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  233. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  234. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  235. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  236. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  237. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  238. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  239. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  240. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  241. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  242. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  243. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  244. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  245. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  246. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  247. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  248. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  249. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  250. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  251. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  252. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  253. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  254. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  255. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  256. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  257. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  258. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  259. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  260. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  261. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  262. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  263. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  264. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  265. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  266. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  267. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  268. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  269. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  270. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  271. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  272. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  273. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  274. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  275. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  276. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  277. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  278. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  279. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  280. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  281. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  282. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  283. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  284. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  285. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  286. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  287. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  288. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  289. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  290. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  291. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  292. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  293. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  294. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  295. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  296. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  297. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  298. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  299. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  300. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  301. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  302. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  303. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  304. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  305. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  306. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  307. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  308. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  309. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  310. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  311. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  312. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  313. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  314. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  315. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  316. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  317. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  318. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  319. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  320. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  321. metadata +121 -49
  322. data/src/core/util/ring_buffer.h +0 -122
  323. data/third_party/cares/cares/include/ares_rules.h +0 -125
  324. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  325. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  326. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  327. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  328. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  329. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  330. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  331. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  332. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  333. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  334. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  335. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  336. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  337. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  338. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  339. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  340. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  341. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  342. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  343. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  344. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  345. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  346. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  347. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  348. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  349. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  350. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  351. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  352. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  353. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  354. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  355. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  356. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  357. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  358. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  359. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  360. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  361. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  362. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  363. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  364. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  365. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  366. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  367. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  368. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  369. data/third_party/cares/cares/src/tools/ares_getopt.h +0 -53
@@ -14,174 +14,206 @@
14
14
 
15
15
  #include "src/core/util/latent_see.h"
16
16
 
17
- #ifdef GRPC_ENABLE_LATENT_SEE
18
17
  #include <atomic>
19
- #include <chrono>
20
18
  #include <cstdint>
21
- #include <optional>
19
+ #include <memory>
22
20
  #include <string>
23
21
  #include <vector>
24
22
 
23
+ #include "absl/log/log.h"
25
24
  #include "absl/strings/str_cat.h"
26
- #include "absl/strings/str_format.h"
27
- #include "absl/strings/string_view.h"
28
- #include "src/core/util/ring_buffer.h"
25
+ #include "src/core/util/backoff.h"
26
+ #include "src/core/util/notification.h"
29
27
  #include "src/core/util/sync.h"
30
28
 
29
+ namespace grpc_core::latent_see {
30
+
31
+ thread_local std::unique_ptr<Bin> Appender::bin_;
32
+ std::atomic<Sink*> Appender::active_sink_;
33
+
34
+ std::string JsonOutput::MicrosString(int64_t nanos) {
35
+ CHECK_GE(nanos, 0);
36
+ const auto micros = nanos / 1000;
37
+ const auto remainder = nanos % 1000;
38
+ return absl::StrFormat("%d.%03d", micros, remainder);
39
+ }
40
+
41
+ void JsonOutput::Mark(absl::string_view name, int64_t tid, int64_t timestamp) {
42
+ out_ << absl::StrCat(sep_, "{\"name\":\"", name,
43
+ "\",\"ph\":\"i\",\"ts\":", MicrosString(timestamp),
44
+ ",\"pid\":0,\"tid\":", tid, "}");
45
+ sep_ = ",\n";
46
+ }
47
+
48
+ void JsonOutput::FlowBegin(absl::string_view name, int64_t tid,
49
+ int64_t timestamp, int64_t flow_id) {
50
+ out_ << absl::StrCat(sep_, "{\"name\":\"", name,
51
+ "\",\"ph\":\"s\",\"ts\":", MicrosString(timestamp),
52
+ ",\"pid\":0,\"tid\":", tid, ",\"id\":", flow_id, "}");
53
+ sep_ = ",\n";
54
+ }
55
+
56
+ void JsonOutput::FlowEnd(absl::string_view name, int64_t tid, int64_t timestamp,
57
+ int64_t flow_id) {
58
+ out_ << absl::StrCat(sep_, "{\"name\":\"", name,
59
+ "\",\"ph\":\"f\",\"ts\":", MicrosString(timestamp),
60
+ ",\"pid\":0,\"tid\":", tid, ",\"id\":", flow_id, "}");
61
+ sep_ = ",\n";
62
+ }
63
+
64
+ void JsonOutput::Span(absl::string_view name, int64_t tid,
65
+ int64_t timestamp_begin, int64_t duration) {
66
+ out_ << absl::StrCat(sep_, "{\"name\":\"", name,
67
+ "\",\"ph\":\"X\",\"ts\":", MicrosString(timestamp_begin),
68
+ ",\"pid\":0,\"tid\":", tid,
69
+ ",\"dur\":", MicrosString(duration), "}");
70
+ sep_ = ",\n";
71
+ }
72
+
73
+ void JsonOutput::Finish() { out_ << "\n]"; }
74
+ } // namespace grpc_core::latent_see
75
+
76
+ #ifndef GRPC_DISABLE_LATENT_SEE
77
+
31
78
  namespace grpc_core {
32
79
  namespace latent_see {
33
80
 
34
- thread_local uint64_t Log::thread_id_ = Log::Get().next_thread_id_.fetch_add(1);
35
- thread_local Bin* Log::bin_ = nullptr;
36
- thread_local void* Log::bin_owner_ = nullptr;
37
- std::atomic<uint64_t> Flow::next_flow_id_{1};
38
- std::atomic<uintptr_t> Log::free_bins_{0};
39
- const std::chrono::steady_clock::time_point start_time =
40
- std::chrono::steady_clock::now();
41
-
42
- void Log::InstallAtExitHandler() {
43
- atexit([] {
44
- auto& log = Log::Get();
45
- auto json = log.TryGenerateJson();
46
- if (!json.has_value()) {
47
- LOG(INFO) << "Failed to generate latent_see.json (contention with "
48
- "another writer)";
49
- return;
50
- }
51
- if (log.stats_flusher_ != nullptr) {
52
- log.stats_flusher_(*json);
53
- return;
54
- }
55
- LOG(INFO) << "Writing latent_see.json in " << get_current_dir_name();
56
- FILE* f = fopen("latent_see.json", "w");
57
- if (f == nullptr) return;
58
- fprintf(f, "%s", json->c_str());
59
- fclose(f);
60
- });
81
+ namespace {
82
+ const Duration kMaxBackoff = Duration::Milliseconds(300);
83
+ }
84
+
85
+ void Appender::Enable(Sink* sink) {
86
+ active_sink_.store(sink, std::memory_order_release);
61
87
  }
62
88
 
63
- void Log::TryPullEventsAndFlush(
64
- absl::FunctionRef<void(absl::Span<const RecordedEvent>)> callback) {
65
- // Try to lock... if we fail then clear the active events.
66
- // This guarantees freeing up memory even if we're still serializing the
67
- // previous pull.
68
- if (!mu_flushing_.TryLock()) {
69
- for (auto& fragment : fragments_) {
70
- MutexLock lock(&fragment.mu_active);
71
- fragment.active.clear();
89
+ void Appender::Disable() {
90
+ active_sink_.store(nullptr, std::memory_order_relaxed);
91
+ }
92
+
93
+ Sink::Sink() : gatherer_("grpc_latent_see_gatherer", [this]() { Gather(); }) {
94
+ gatherer_.Start();
95
+ }
96
+
97
+ void Sink::Append(std::unique_ptr<Bin> bin) { appending_.Push(bin.release()); }
98
+
99
+ void Sink::Gather() {
100
+ BackOff backoff(BackOff::Options()
101
+ .set_initial_backoff(Duration::Milliseconds(1))
102
+ .set_multiplier(1.1)
103
+ .set_jitter(0.05)
104
+ .set_max_backoff(kMaxBackoff));
105
+ while (true) {
106
+ std::unique_ptr<Bin> bin(static_cast<Bin*>(appending_.Pop()));
107
+ if (bin == nullptr) {
108
+ absl::SleepFor(absl::Milliseconds(backoff.NextAttemptDelay().millis()));
109
+ continue;
72
110
  }
73
- return;
74
- }
75
- // Now we hold the lock; swap all active fragments to flushing.
76
- // This is relatively quick and ensures that we don't stall capture for
77
- // long.
78
- for (auto& fragment : fragments_) {
79
- CHECK_EQ(fragment.flushing.size(), 0);
80
- MutexLock lock(&fragment.mu_active);
81
- fragment.flushing.swap(fragment.active);
111
+ backoff.Reset();
112
+ Record(std::move(bin));
82
113
  }
83
- // Now we've swapped out, call the callback repeatedly with each fragment.
84
- // This is the slow part - there's a lot of copying and transformation that
85
- // happens here.
86
- // We keep the mu_flushing_ held so that we can guarantee only one thread is
87
- // consumed by this at a time.
88
- // Once we've called the callback for each fragment we can clear it, so that
89
- // when we next swap it with the active fragment it will be empty.
90
- // This also retains the memory, so if we're serializing with a regular
91
- // cadence we'll tend to stabilize memory usage for latent_see relatively
92
- // quickly.
93
- for (auto& fragment : fragments_) {
94
- callback(fragment.flushing);
95
- fragment.flushing.clear();
96
- }
97
- mu_flushing_.Unlock();
98
114
  }
99
115
 
100
- std::optional<std::string> Log::TryGenerateJson() {
101
- using Nanos = std::chrono::duration<unsigned long long, std::nano>;
102
- std::string json = "[\n";
103
- bool first = true;
104
- int callbacks = 0;
105
- TryPullEventsAndFlush([&](absl::Span<const RecordedEvent> events) {
106
- ++callbacks;
107
- for (const auto& event : events) {
108
- absl::string_view phase;
109
- bool has_id;
110
- switch (event.event.type) {
111
- case EventType::kBegin:
112
- phase = "B";
113
- has_id = false;
114
- break;
115
- case EventType::kEnd:
116
- phase = "E";
117
- has_id = false;
118
- break;
119
- case EventType::kFlowStart:
120
- phase = "s";
121
- has_id = true;
122
- break;
123
- case EventType::kFlowEnd:
124
- phase = "f";
125
- has_id = true;
126
- break;
127
- case EventType::kMark:
128
- phase = "i";
129
- has_id = false;
130
- break;
131
- }
132
- if (!first) {
133
- absl::StrAppend(&json, ",\n");
134
- }
135
- first = false;
136
- if (event.event.metadata->name[0] != '"') {
137
- absl::StrAppend(
138
- &json, "{\"name\": \"", event.event.metadata->name,
139
- "\", \"ph\": \"", phase, "\", \"ts\": ",
140
- absl::StrFormat(
141
- "%.12g",
142
- Nanos(event.event.timestamp - start_time).count() / 1000.0),
143
- ", \"pid\": 0, \"tid\": ", event.thread_id);
144
- } else {
145
- absl::StrAppend(
146
- &json, "{\"name\": ", event.event.metadata->name, ", \"ph\": \"",
147
- phase, "\", \"ts\": ",
148
- absl::StrFormat(
149
- "%.12g",
150
- Nanos(event.event.timestamp - start_time).count() / 1000.0),
151
- ", \"pid\": 0, \"tid\": ", event.thread_id);
152
- }
116
+ void Sink::Start(size_t max_bins) {
117
+ auto events = std::make_unique<EventDump>();
118
+ MutexLock lock(&mu_);
119
+ max_bins_ = max_bins;
120
+ events_ = std::move(events);
121
+ }
153
122
 
154
- if (has_id) {
155
- absl::StrAppend(&json, ", \"id\": ", event.event.id);
156
- }
157
- if (event.event.type == EventType::kFlowEnd) {
158
- absl::StrAppend(&json, ", \"bp\": \"e\"");
159
- }
160
- absl::StrAppend(&json, ", \"args\": {\"file\": \"",
161
- event.event.metadata->file,
162
- "\", \"line\": ", event.event.metadata->line,
163
- ", \"batch\": ", event.batch_id, "}}");
164
- }
165
- });
166
- if (callbacks == 0) return std::nullopt;
167
- absl::StrAppend(&json, "\n]");
168
- return json;
123
+ std::unique_ptr<Sink::EventDump> Sink::Stop() {
124
+ MutexLock lock(&mu_);
125
+ auto events = std::move(events_);
126
+ events_ = nullptr;
127
+ return events;
128
+ }
129
+
130
+ void Sink::Record(std::unique_ptr<Bin> bin) {
131
+ MutexLock lock(&mu_);
132
+ if (events_ == nullptr) return;
133
+ CHECK_LE(bin->num_events, Bin::kEventsPerBin);
134
+ events_->emplace_back(std::move(bin));
135
+ if (events_->size() > max_bins_) events_->pop_front();
169
136
  }
170
137
 
171
- void Log::FlushBin(Bin* bin) {
172
- if (bin->events.empty()) return;
173
- auto& log = Get();
174
- const auto batch_id =
175
- log.next_batch_id_.fetch_add(1, std::memory_order_relaxed);
176
- auto& fragment = log.fragments_.this_cpu();
177
- const auto thread_id = thread_id_;
178
- {
179
- MutexLock lock(&fragment.mu_active);
180
- for (auto event : bin->events) {
181
- fragment.active.push_back(RecordedEvent{thread_id, batch_id, event});
138
+ void Collect(Notification* n, absl::Duration timeout, size_t memory_limit,
139
+ Output* output) {
140
+ static Sink* sink = new Sink;
141
+ static Mutex* mu = new Mutex;
142
+
143
+ // Collection phase - under a mutex to prevent multiple collections at once.
144
+ mu->Lock();
145
+ // First we enable the appender and then wait for a short time to clear out
146
+ // any backoff
147
+ LOG(INFO) << "Latent-see collection enabling";
148
+ Appender::Enable(sink);
149
+ absl::SleepFor(2 * absl::Milliseconds(kMaxBackoff.millis()));
150
+ // Now we start the collection
151
+ LOG(INFO) << "Latent-see collection recording";
152
+ sink->Start(memory_limit / sizeof(Bin) + 1);
153
+ // If we got a Notification object, use that to sleep until we're notified;
154
+ // if not just sleep.
155
+ if (n == nullptr) {
156
+ absl::SleepFor(timeout);
157
+ } else {
158
+ n->WaitForNotificationWithTimeout(timeout);
159
+ }
160
+ // Grab all events
161
+ LOG(INFO) << "Latent-see collection stopping";
162
+ auto events = sink->Stop();
163
+ // Disable the sink
164
+ Appender::Disable();
165
+ mu->Unlock();
166
+ CHECK(events != nullptr);
167
+ LOG(INFO) << "Latent-see collection stopped: processing " << events->size()
168
+ << " bins";
169
+
170
+ // Next: find the earliest timestamp
171
+ // We save a lot of bytes by subtracting that out
172
+ int64_t earliest_timestamp = std::numeric_limits<int64_t>::max();
173
+ for (const auto& bin : *events) {
174
+ for (const auto& event : *bin) {
175
+ // Exclude negative timestamps as they're used for event type markers
176
+ if (event.timestamp_begin > 0) {
177
+ earliest_timestamp = std::min(
178
+ {earliest_timestamp, event.timestamp_begin, event.timestamp_end});
179
+ } else {
180
+ earliest_timestamp = std::min(earliest_timestamp, -event.timestamp_end);
181
+ }
182
+ }
183
+ }
184
+ std::string json = "[\n";
185
+ // TODO(ctiller): Fuschia Trace Format backend
186
+ absl::flat_hash_map<gpr_thd_id, size_t> thread_id_map;
187
+ for (const auto& bin : *events) {
188
+ size_t displayed_thread_id;
189
+ auto it = thread_id_map.find(bin->thd_id);
190
+ if (it == thread_id_map.end()) {
191
+ displayed_thread_id = thread_id_map.size() + 1;
192
+ thread_id_map[bin->thd_id] = displayed_thread_id;
193
+ } else {
194
+ displayed_thread_id = it->second;
195
+ }
196
+ for (const auto& event : *bin) {
197
+ if (event.timestamp_begin == event.timestamp_end) {
198
+ output->Mark(event.metadata->name, displayed_thread_id,
199
+ event.timestamp_begin - earliest_timestamp);
200
+ } else if (event.timestamp_begin < 0 && event.timestamp_end > 0) {
201
+ output->FlowBegin(event.metadata->name, displayed_thread_id,
202
+ event.timestamp_end - earliest_timestamp,
203
+ -event.timestamp_begin);
204
+ } else if (event.timestamp_begin < 0) {
205
+ output->FlowEnd(event.metadata->name, displayed_thread_id,
206
+ -event.timestamp_end - earliest_timestamp,
207
+ -event.timestamp_begin);
208
+ } else {
209
+ output->Span(event.metadata->name, displayed_thread_id,
210
+ event.timestamp_begin - earliest_timestamp,
211
+ event.timestamp_end - event.timestamp_begin);
212
+ }
182
213
  }
183
214
  }
184
- bin->events.clear();
215
+ output->Finish();
216
+ LOG(INFO) << "Latent-see collection complete";
185
217
  }
186
218
 
187
219
  } // namespace latent_see