grpc 1.50.0 → 1.51.0

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

Potentially problematic release.


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

Files changed (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +131 -42
  3. data/include/grpc/event_engine/event_engine.h +10 -3
  4. data/include/grpc/event_engine/slice_buffer.h +17 -0
  5. data/include/grpc/grpc.h +0 -10
  6. data/include/grpc/impl/codegen/grpc_types.h +1 -5
  7. data/include/grpc/impl/codegen/port_platform.h +0 -3
  8. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  11. data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
  12. data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
  13. data/src/core/ext/filters/client_channel/client_channel.h +3 -4
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
  15. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  17. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  18. data/src/core/ext/filters/client_channel/connector.h +1 -1
  19. data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
  20. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  21. data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
  22. data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
  32. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
  34. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
  36. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
  53. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  54. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
  55. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
  59. data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
  60. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  61. data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
  62. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
  63. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  64. data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
  65. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  70. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  71. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
  73. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  74. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
  75. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
  77. data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
  78. data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
  79. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
  86. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
  92. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  93. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
  94. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
  96. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
  97. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
  98. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
  99. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
  102. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
  103. data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
  104. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
  105. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  106. data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
  107. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
  108. data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
  109. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  110. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  111. data/src/core/ext/xds/xds_api.cc +15 -68
  112. data/src/core/ext/xds/xds_api.h +3 -7
  113. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  116. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  117. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  118. data/src/core/ext/xds/xds_client.cc +122 -90
  119. data/src/core/ext/xds/xds_client.h +7 -2
  120. data/src/core/ext/xds/xds_client_grpc.cc +5 -24
  121. data/src/core/ext/xds/xds_cluster.cc +291 -183
  122. data/src/core/ext/xds/xds_cluster.h +11 -15
  123. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
  124. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
  125. data/src/core/ext/xds/xds_common_types.cc +208 -141
  126. data/src/core/ext/xds/xds_common_types.h +19 -13
  127. data/src/core/ext/xds/xds_endpoint.cc +214 -129
  128. data/src/core/ext/xds/xds_endpoint.h +4 -7
  129. data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
  130. data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
  131. data/src/core/ext/xds/xds_http_filters.cc +60 -73
  132. data/src/core/ext/xds/xds_http_filters.h +67 -19
  133. data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
  134. data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
  135. data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
  136. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  137. data/src/core/ext/xds/xds_listener.cc +459 -417
  138. data/src/core/ext/xds/xds_listener.h +43 -47
  139. data/src/core/ext/xds/xds_resource_type.h +3 -11
  140. data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
  141. data/src/core/ext/xds/xds_route_config.cc +94 -80
  142. data/src/core/ext/xds/xds_route_config.h +10 -10
  143. data/src/core/ext/xds/xds_routing.cc +2 -1
  144. data/src/core/ext/xds/xds_routing.h +2 -0
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
  146. data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
  147. data/src/core/lib/address_utils/parse_address.cc +11 -10
  148. data/src/core/lib/channel/channel_args.h +16 -1
  149. data/src/core/lib/channel/channel_stack.cc +23 -20
  150. data/src/core/lib/channel/channel_stack.h +17 -4
  151. data/src/core/lib/channel/channel_stack_builder.cc +4 -7
  152. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  153. data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
  154. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  155. data/src/core/lib/channel/channel_trace.cc +4 -5
  156. data/src/core/lib/channel/channelz.cc +1 -1
  157. data/src/core/lib/channel/connected_channel.cc +695 -35
  158. data/src/core/lib/channel/connected_channel.h +0 -4
  159. data/src/core/lib/channel/promise_based_filter.cc +1004 -140
  160. data/src/core/lib/channel/promise_based_filter.h +364 -87
  161. data/src/core/lib/compression/message_compress.cc +5 -5
  162. data/src/core/lib/debug/event_log.cc +88 -0
  163. data/src/core/lib/debug/event_log.h +81 -0
  164. data/src/core/lib/debug/histogram_view.cc +69 -0
  165. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  166. data/src/core/lib/debug/stats.cc +22 -119
  167. data/src/core/lib/debug/stats.h +29 -35
  168. data/src/core/lib/debug/stats_data.cc +224 -73
  169. data/src/core/lib/debug/stats_data.h +263 -122
  170. data/src/core/lib/event_engine/common_closures.h +71 -0
  171. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  172. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  173. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  174. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  175. data/src/core/lib/event_engine/poller.h +10 -4
  176. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  177. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  178. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  179. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  180. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  181. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  182. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
  183. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  184. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  185. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  186. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  187. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  188. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  189. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
  190. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  191. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  192. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  193. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  194. data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
  195. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
  196. data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
  197. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  198. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  199. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  200. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  201. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  202. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  203. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  204. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  205. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  206. data/src/core/lib/event_engine/slice.cc +7 -6
  207. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  208. data/src/core/lib/event_engine/thread_pool.cc +106 -25
  209. data/src/core/lib/event_engine/thread_pool.h +32 -9
  210. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  211. data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
  212. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  213. data/src/core/lib/experiments/config.cc +1 -1
  214. data/src/core/lib/experiments/experiments.cc +13 -2
  215. data/src/core/lib/experiments/experiments.h +8 -1
  216. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  217. data/src/core/lib/gpr/log_linux.cc +3 -4
  218. data/src/core/lib/gpr/string.h +1 -1
  219. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  220. data/src/core/lib/gprpp/load_file.cc +75 -0
  221. data/src/core/lib/gprpp/load_file.h +33 -0
  222. data/src/core/lib/gprpp/per_cpu.h +46 -0
  223. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  224. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  225. data/src/core/lib/gprpp/status_helper.h +1 -3
  226. data/src/core/lib/gprpp/strerror.cc +41 -0
  227. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
  228. data/src/core/lib/gprpp/thd_windows.cc +1 -2
  229. data/src/core/lib/gprpp/time.cc +3 -4
  230. data/src/core/lib/gprpp/time.h +13 -2
  231. data/src/core/lib/gprpp/validation_errors.h +18 -1
  232. data/src/core/lib/http/httpcli.cc +40 -44
  233. data/src/core/lib/http/httpcli.h +6 -5
  234. data/src/core/lib/http/httpcli_security_connector.cc +4 -6
  235. data/src/core/lib/http/parser.cc +54 -65
  236. data/src/core/lib/iomgr/buffer_list.cc +105 -116
  237. data/src/core/lib/iomgr/buffer_list.h +60 -44
  238. data/src/core/lib/iomgr/call_combiner.cc +11 -10
  239. data/src/core/lib/iomgr/call_combiner.h +3 -4
  240. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  241. data/src/core/lib/iomgr/closure.h +49 -5
  242. data/src/core/lib/iomgr/combiner.cc +2 -2
  243. data/src/core/lib/iomgr/endpoint.h +1 -1
  244. data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
  245. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  246. data/src/core/lib/iomgr/error.cc +27 -42
  247. data/src/core/lib/iomgr/error.h +22 -152
  248. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  249. data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
  250. data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
  251. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  252. data/src/core/lib/iomgr/exec_ctx.h +2 -3
  253. data/src/core/lib/iomgr/executor.cc +1 -2
  254. data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
  255. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  256. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  257. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
  258. data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
  259. data/src/core/lib/iomgr/load_file.cc +5 -9
  260. data/src/core/lib/iomgr/lockfree_event.cc +10 -10
  261. data/src/core/lib/iomgr/pollset_windows.cc +4 -4
  262. data/src/core/lib/iomgr/python_util.h +2 -2
  263. data/src/core/lib/iomgr/resolve_address.cc +8 -3
  264. data/src/core/lib/iomgr/resolve_address.h +3 -4
  265. data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
  266. data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
  267. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  268. data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
  269. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  270. data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
  271. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
  272. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  273. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  274. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
  275. data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
  276. data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
  277. data/src/core/lib/iomgr/tcp_posix.cc +92 -108
  278. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
  279. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  280. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
  281. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
  282. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  283. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
  284. data/src/core/lib/iomgr/tcp_windows.cc +27 -34
  285. data/src/core/lib/iomgr/timer.h +8 -8
  286. data/src/core/lib/iomgr/timer_generic.cc +9 -15
  287. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  288. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
  289. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  290. data/src/core/lib/json/json_channel_args.h +42 -0
  291. data/src/core/lib/json/json_object_loader.cc +7 -2
  292. data/src/core/lib/json/json_object_loader.h +22 -0
  293. data/src/core/lib/json/json_util.cc +5 -5
  294. data/src/core/lib/json/json_util.h +4 -4
  295. data/src/core/lib/load_balancing/lb_policy.cc +1 -1
  296. data/src/core/lib/load_balancing/lb_policy.h +4 -0
  297. data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
  298. data/src/core/lib/matchers/matchers.cc +3 -4
  299. data/src/core/lib/promise/activity.cc +16 -2
  300. data/src/core/lib/promise/activity.h +38 -15
  301. data/src/core/lib/promise/arena_promise.h +80 -51
  302. data/src/core/lib/promise/context.h +13 -6
  303. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  304. data/src/core/lib/promise/detail/promise_factory.h +58 -10
  305. data/src/core/lib/promise/detail/status.h +28 -0
  306. data/src/core/lib/promise/detail/switch.h +1455 -0
  307. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
  308. data/src/core/lib/promise/for_each.h +129 -0
  309. data/src/core/lib/promise/loop.h +7 -5
  310. data/src/core/lib/promise/map_pipe.h +87 -0
  311. data/src/core/lib/promise/pipe.cc +19 -0
  312. data/src/core/lib/promise/pipe.h +505 -0
  313. data/src/core/lib/promise/poll.h +13 -0
  314. data/src/core/lib/promise/seq.h +3 -5
  315. data/src/core/lib/promise/sleep.cc +5 -4
  316. data/src/core/lib/promise/sleep.h +1 -2
  317. data/src/core/lib/promise/try_concurrently.h +341 -0
  318. data/src/core/lib/promise/try_seq.h +10 -13
  319. data/src/core/lib/resolver/server_address.cc +1 -0
  320. data/src/core/lib/resolver/server_address.h +1 -3
  321. data/src/core/lib/resource_quota/api.cc +0 -1
  322. data/src/core/lib/resource_quota/arena.cc +19 -0
  323. data/src/core/lib/resource_quota/arena.h +89 -0
  324. data/src/core/lib/resource_quota/memory_quota.cc +1 -0
  325. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  326. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  327. data/src/core/lib/security/authorization/matchers.cc +25 -22
  328. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  329. data/src/core/lib/security/context/security_context.h +10 -0
  330. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  331. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  333. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  334. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  335. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
  341. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  342. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
  345. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
  346. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  350. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
  354. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
  355. data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
  356. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
  357. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
  358. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
  359. data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
  360. data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
  361. data/src/core/lib/security/transport/security_handshaker.cc +53 -53
  362. data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
  363. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  364. data/src/core/lib/security/util/json_util.cc +4 -5
  365. data/src/core/lib/service_config/service_config.h +1 -1
  366. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  367. data/src/core/lib/service_config/service_config_impl.h +14 -17
  368. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  369. data/src/core/lib/service_config/service_config_parser.h +14 -10
  370. data/src/core/lib/slice/b64.cc +2 -2
  371. data/src/core/lib/slice/slice.cc +7 -1
  372. data/src/core/lib/slice/slice.h +19 -6
  373. data/src/core/lib/slice/slice_buffer.cc +13 -14
  374. data/src/core/lib/slice/slice_internal.h +13 -21
  375. data/src/core/lib/slice/slice_refcount.h +34 -19
  376. data/src/core/lib/surface/byte_buffer.cc +3 -4
  377. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  378. data/src/core/lib/surface/call.cc +1366 -239
  379. data/src/core/lib/surface/call.h +44 -0
  380. data/src/core/lib/surface/call_details.cc +3 -3
  381. data/src/core/lib/surface/call_trace.cc +113 -0
  382. data/src/core/lib/surface/call_trace.h +30 -0
  383. data/src/core/lib/surface/channel.cc +44 -49
  384. data/src/core/lib/surface/channel.h +9 -1
  385. data/src/core/lib/surface/channel_ping.cc +1 -1
  386. data/src/core/lib/surface/channel_stack_type.cc +4 -0
  387. data/src/core/lib/surface/channel_stack_type.h +2 -0
  388. data/src/core/lib/surface/completion_queue.cc +38 -52
  389. data/src/core/lib/surface/init.cc +8 -39
  390. data/src/core/lib/surface/init_internally.h +8 -0
  391. data/src/core/lib/surface/lame_client.cc +10 -8
  392. data/src/core/lib/surface/server.cc +48 -70
  393. data/src/core/lib/surface/server.h +3 -4
  394. data/src/core/lib/surface/validate_metadata.cc +11 -12
  395. data/src/core/lib/surface/version.cc +2 -2
  396. data/src/core/lib/transport/connectivity_state.cc +2 -2
  397. data/src/core/lib/transport/error_utils.cc +34 -28
  398. data/src/core/lib/transport/error_utils.h +3 -3
  399. data/src/core/lib/transport/handshaker.cc +14 -14
  400. data/src/core/lib/transport/handshaker.h +1 -1
  401. data/src/core/lib/transport/handshaker_factory.h +26 -0
  402. data/src/core/lib/transport/handshaker_registry.cc +8 -2
  403. data/src/core/lib/transport/handshaker_registry.h +3 -4
  404. data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
  405. data/src/core/lib/transport/metadata_batch.h +17 -1
  406. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  407. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  408. data/src/core/lib/transport/transport.cc +63 -17
  409. data/src/core/lib/transport/transport.h +64 -68
  410. data/src/core/lib/transport/transport_impl.h +1 -1
  411. data/src/core/lib/transport/transport_op_string.cc +7 -6
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
  413. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
  416. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  417. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  418. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  419. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  420. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
  421. data/src/core/tsi/fake_transport_security.cc +3 -3
  422. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
  423. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  424. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
  425. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
  426. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
  427. data/src/ruby/lib/grpc/version.rb +1 -1
  428. data/src/ruby/spec/channel_spec.rb +0 -43
  429. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  430. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  431. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  432. data/third_party/zlib/compress.c +3 -3
  433. data/third_party/zlib/crc32.c +21 -12
  434. data/third_party/zlib/deflate.c +112 -106
  435. data/third_party/zlib/deflate.h +2 -2
  436. data/third_party/zlib/gzlib.c +1 -1
  437. data/third_party/zlib/gzread.c +3 -5
  438. data/third_party/zlib/gzwrite.c +1 -1
  439. data/third_party/zlib/infback.c +10 -7
  440. data/third_party/zlib/inflate.c +5 -2
  441. data/third_party/zlib/inftrees.c +2 -2
  442. data/third_party/zlib/inftrees.h +1 -1
  443. data/third_party/zlib/trees.c +61 -62
  444. data/third_party/zlib/uncompr.c +2 -2
  445. data/third_party/zlib/zconf.h +16 -3
  446. data/third_party/zlib/zlib.h +10 -10
  447. data/third_party/zlib/zutil.c +9 -7
  448. data/third_party/zlib/zutil.h +1 -0
  449. metadata +55 -18
  450. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  451. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  452. data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
  453. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  454. data/src/core/lib/gpr/murmur_hash.h +0 -29
  455. data/src/core/lib/gpr/tls.h +0 -156
  456. data/src/core/lib/promise/call_push_pull.h +0 -148
  457. data/src/core/lib/slice/slice_api.cc +0 -39
  458. data/src/core/lib/slice/slice_buffer_api.cc +0 -35
  459. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -29,7 +29,7 @@
29
29
  #include <grpc/support/alloc.h>
30
30
  #include <grpc/support/log.h>
31
31
 
32
- #include "src/core/lib/slice/slice_refcount.h"
32
+ #include "src/core/lib/slice/slice.h"
33
33
 
34
34
  #define OUTPUT_BLOCK_SIZE 1024
35
35
 
@@ -82,7 +82,7 @@ static int zlib_body(z_stream* zs, grpc_slice_buffer* input,
82
82
  return 1;
83
83
 
84
84
  error:
85
- grpc_slice_unref_internal(outbuf);
85
+ grpc_core::CSliceUnref(outbuf);
86
86
  return 0;
87
87
  }
88
88
 
@@ -109,7 +109,7 @@ static int zlib_compress(grpc_slice_buffer* input, grpc_slice_buffer* output,
109
109
  r = zlib_body(&zs, input, output, deflate) && output->length < input->length;
110
110
  if (!r) {
111
111
  for (i = count_before; i < output->count; i++) {
112
- grpc_slice_unref_internal(output->slices[i]);
112
+ grpc_core::CSliceUnref(output->slices[i]);
113
113
  }
114
114
  output->count = count_before;
115
115
  output->length = length_before;
@@ -133,7 +133,7 @@ static int zlib_decompress(grpc_slice_buffer* input, grpc_slice_buffer* output,
133
133
  r = zlib_body(&zs, input, output, inflate);
134
134
  if (!r) {
135
135
  for (i = count_before; i < output->count; i++) {
136
- grpc_slice_unref_internal(output->slices[i]);
136
+ grpc_core::CSliceUnref(output->slices[i]);
137
137
  }
138
138
  output->count = count_before;
139
139
  output->length = length_before;
@@ -145,7 +145,7 @@ static int zlib_decompress(grpc_slice_buffer* input, grpc_slice_buffer* output,
145
145
  static int copy(grpc_slice_buffer* input, grpc_slice_buffer* output) {
146
146
  size_t i;
147
147
  for (i = 0; i < input->count; i++) {
148
- grpc_slice_buffer_add(output, grpc_slice_ref_internal(input->slices[i]));
148
+ grpc_slice_buffer_add(output, grpc_core::CSliceRef(input->slices[i]));
149
149
  }
150
150
  return 1;
151
151
  }
@@ -0,0 +1,88 @@
1
+ // Copyright 2022 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/lib/debug/event_log.h"
18
+
19
+ #include <algorithm>
20
+ #include <atomic>
21
+
22
+ #include "absl/strings/str_cat.h"
23
+ #include "absl/strings/str_join.h"
24
+
25
+ #include <grpc/support/log.h>
26
+
27
+ namespace grpc_core {
28
+
29
+ std::atomic<EventLog*> EventLog::g_instance_{nullptr};
30
+
31
+ EventLog::~EventLog() {
32
+ GPR_ASSERT(g_instance_.load(std::memory_order_acquire) != this);
33
+ }
34
+
35
+ void EventLog::BeginCollection() {
36
+ for (auto& fragment : fragments_) {
37
+ MutexLock lock(&fragment.mu);
38
+ fragment.entries.clear();
39
+ }
40
+ collection_begin_ = gpr_get_cycle_counter();
41
+ g_instance_.store(this, std::memory_order_release);
42
+ Append("logging", 1);
43
+ }
44
+
45
+ std::vector<EventLog::Entry> EventLog::EndCollection(
46
+ absl::Span<const absl::string_view> wanted_events) {
47
+ Append("logging", -1);
48
+ g_instance_.store(nullptr, std::memory_order_release);
49
+ std::vector<Entry> result;
50
+ for (auto& fragment : fragments_) {
51
+ MutexLock lock(&fragment.mu);
52
+ for (const auto& entry : fragment.entries) {
53
+ if (std::find(wanted_events.begin(), wanted_events.end(), entry.event) !=
54
+ wanted_events.end()) {
55
+ result.push_back(entry);
56
+ }
57
+ }
58
+ fragment.entries.clear();
59
+ }
60
+ std::stable_sort(
61
+ result.begin(), result.end(),
62
+ [](const Entry& a, const Entry& b) { return a.when < b.when; });
63
+ return result;
64
+ }
65
+
66
+ void EventLog::AppendInternal(absl::string_view event, int64_t delta) {
67
+ auto& fragment = fragments_.this_cpu();
68
+ MutexLock lock(&fragment.mu);
69
+ fragment.entries.push_back({gpr_get_cycle_counter(), event, delta});
70
+ }
71
+
72
+ std::string EventLog::EndCollectionAndReportCsv(
73
+ absl::Span<const absl::string_view> columns) {
74
+ auto events = EndCollection(columns);
75
+ std::vector<int64_t> values(columns.size(), 0);
76
+ std::string result =
77
+ absl::StrCat("timestamp,", absl::StrJoin(columns, ","), "\n");
78
+ for (const auto& entry : events) {
79
+ auto idx = std::find(columns.begin(), columns.end(), entry.event) -
80
+ columns.begin();
81
+ values[idx] += entry.delta;
82
+ absl::StrAppend(&result, entry.when - collection_begin_, ",",
83
+ absl::StrJoin(values, ","), "\n");
84
+ }
85
+ return result;
86
+ }
87
+
88
+ } // namespace grpc_core
@@ -0,0 +1,81 @@
1
+ // Copyright 2022 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_CORE_LIB_DEBUG_EVENT_LOG_H
16
+ #define GRPC_CORE_LIB_DEBUG_EVENT_LOG_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <stdint.h>
21
+
22
+ #include <atomic>
23
+ #include <string>
24
+ #include <vector>
25
+
26
+ #include "absl/base/thread_annotations.h"
27
+ #include "absl/strings/string_view.h"
28
+ #include "absl/types/span.h"
29
+
30
+ #include "src/core/lib/gpr/time_precise.h"
31
+ #include "src/core/lib/gprpp/per_cpu.h"
32
+ #include "src/core/lib/gprpp/sync.h"
33
+
34
+ namespace grpc_core {
35
+
36
+ // Debug utility to collect a burst of events and then later log them as a
37
+ // detailed sequence.
38
+ // Collects (timestamp, counter-name, delta) and gives back a csv with
39
+ // timestamps and accumulated values for each counter in separate columns.
40
+ class EventLog {
41
+ public:
42
+ EventLog() = default;
43
+ ~EventLog();
44
+
45
+ EventLog(const EventLog&) = delete;
46
+ EventLog& operator=(const EventLog&) = delete;
47
+
48
+ void BeginCollection();
49
+ std::string EndCollectionAndReportCsv(
50
+ absl::Span<const absl::string_view> columns);
51
+
52
+ static void Append(absl::string_view event, int64_t delta) {
53
+ EventLog* log = g_instance_.load(std::memory_order_acquire);
54
+ if (log == nullptr) return;
55
+ log->AppendInternal(event, delta);
56
+ }
57
+
58
+ private:
59
+ struct Entry {
60
+ gpr_cycle_counter when;
61
+ absl::string_view event;
62
+ int64_t delta;
63
+ };
64
+
65
+ struct Fragment {
66
+ Mutex mu;
67
+ std::vector<Entry> entries ABSL_GUARDED_BY(mu);
68
+ };
69
+
70
+ void AppendInternal(absl::string_view event, int64_t delta);
71
+ std::vector<Entry> EndCollection(
72
+ absl::Span<const absl::string_view> wanted_events);
73
+
74
+ PerCpu<Fragment> fragments_;
75
+ gpr_cycle_counter collection_begin_;
76
+ static std::atomic<EventLog*> g_instance_;
77
+ };
78
+
79
+ } // namespace grpc_core
80
+
81
+ #endif // GRPC_CORE_LIB_DEBUG_EVENT_LOG_H
@@ -0,0 +1,69 @@
1
+ // Copyright 2021 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/lib/debug/histogram_view.h"
18
+
19
+ namespace grpc_core {
20
+
21
+ double HistogramView::Count() const {
22
+ double sum = 0;
23
+ for (int i = 0; i < num_buckets; i++) {
24
+ sum += buckets[i];
25
+ }
26
+ return sum;
27
+ }
28
+
29
+ double HistogramView::ThresholdForCountBelow(double count_below) const {
30
+ double lower_bound;
31
+ double upper_bound;
32
+ int upper_idx;
33
+
34
+ // find the lowest bucket that gets us above count_below
35
+ double count_so_far = 0.0;
36
+ int lower_idx = 0;
37
+ for (; lower_idx < num_buckets; lower_idx++) {
38
+ count_so_far += static_cast<double>(buckets[lower_idx]);
39
+ if (count_so_far >= count_below) {
40
+ break;
41
+ }
42
+ }
43
+ if (count_so_far == count_below) {
44
+ // this bucket hits the threshold exactly... we should be midway through
45
+ // any run of zero values following the bucket
46
+ for (upper_idx = lower_idx + 1; upper_idx < num_buckets; upper_idx++) {
47
+ if (buckets[upper_idx]) {
48
+ break;
49
+ }
50
+ }
51
+ return (bucket_boundaries[lower_idx] + bucket_boundaries[upper_idx]) / 2.0;
52
+ } else {
53
+ // treat values as uniform throughout the bucket, and find where this value
54
+ // should lie
55
+ lower_bound = bucket_boundaries[lower_idx];
56
+ upper_bound = bucket_boundaries[lower_idx + 1];
57
+ return upper_bound - (upper_bound - lower_bound) *
58
+ (count_so_far - count_below) /
59
+ static_cast<double>(buckets[lower_idx]);
60
+ }
61
+ }
62
+
63
+ double HistogramView::Percentile(double p) const {
64
+ const double count = Count();
65
+ if (count == 0) return 0.0;
66
+ return ThresholdForCountBelow(count * p / 100.0);
67
+ }
68
+
69
+ } // namespace grpc_core
@@ -12,24 +12,26 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- #include <grpc/support/port_platform.h>
15
+ #ifndef GRPC_CORE_LIB_DEBUG_HISTOGRAM_VIEW_H
16
+ #define GRPC_CORE_LIB_DEBUG_HISTOGRAM_VIEW_H
16
17
 
17
- #include "src/core/lib/slice/slice_refcount.h"
18
+ #include <grpc/support/port_platform.h>
18
19
 
19
- #include <chrono>
20
+ #include <stdint.h>
20
21
 
21
22
  namespace grpc_core {
22
23
 
23
- uint32_t g_hash_seed = []() {
24
- auto now = std::chrono::system_clock::now();
25
- auto now_since_epoch = now.time_since_epoch();
26
- auto now_ns =
27
- std::chrono::duration_cast<std::chrono::nanoseconds>(now_since_epoch);
28
- return static_cast<uint32_t>(now_ns.count());
29
- }();
24
+ struct HistogramView {
25
+ int (*bucket_for)(int value);
26
+ const int* bucket_boundaries;
27
+ int num_buckets;
28
+ const uint64_t* buckets;
29
+
30
+ double Percentile(double p) const;
31
+ double Count() const;
32
+ double ThresholdForCountBelow(double count_below) const;
33
+ };
30
34
 
31
35
  } // namespace grpc_core
32
36
 
33
- void grpc_test_only_set_slice_hash_seed(uint32_t seed) {
34
- grpc_core::g_hash_seed = seed;
35
- }
37
+ #endif // GRPC_CORE_LIB_DEBUG_HISTOGRAM_VIEW_H
@@ -20,146 +20,49 @@
20
20
 
21
21
  #include "src/core/lib/debug/stats.h"
22
22
 
23
- #include <inttypes.h>
24
- #include <string.h>
23
+ #include <stddef.h>
25
24
 
26
25
  #include <algorithm>
27
26
  #include <vector>
28
27
 
29
28
  #include "absl/strings/str_cat.h"
30
- #include "absl/strings/str_format.h"
31
29
  #include "absl/strings/str_join.h"
32
30
 
33
- #include <grpc/support/alloc.h>
34
- #include <grpc/support/cpu.h>
35
-
36
31
  namespace grpc_core {
37
- Stats* const g_stats_data = [] {
38
- size_t num_cores = gpr_cpu_num_cores();
39
- Stats* stats = static_cast<Stats*>(
40
- gpr_zalloc(sizeof(Stats) + num_cores * sizeof(grpc_stats_data)));
41
- stats->num_cores = num_cores;
42
- return stats;
43
- }();
44
- } // namespace grpc_core
45
-
46
- void grpc_stats_collect(grpc_stats_data* output) {
47
- memset(output, 0, sizeof(*output));
48
- for (size_t core = 0; core < grpc_core::g_stats_data->num_cores; core++) {
49
- for (size_t i = 0; i < GRPC_STATS_COUNTER_COUNT; i++) {
50
- output->counters[i] += gpr_atm_no_barrier_load(
51
- &grpc_core::g_stats_data->per_cpu[core].counters[i]);
52
- }
53
- for (size_t i = 0; i < GRPC_STATS_HISTOGRAM_BUCKETS; i++) {
54
- output->histograms[i] += gpr_atm_no_barrier_load(
55
- &grpc_core::g_stats_data->per_cpu[core].histograms[i]);
56
- }
57
- }
58
- }
59
-
60
- void grpc_stats_diff(const grpc_stats_data* b, const grpc_stats_data* a,
61
- grpc_stats_data* c) {
62
- for (size_t i = 0; i < GRPC_STATS_COUNTER_COUNT; i++) {
63
- c->counters[i] = b->counters[i] - a->counters[i];
64
- }
65
- for (size_t i = 0; i < GRPC_STATS_HISTOGRAM_BUCKETS; i++) {
66
- c->histograms[i] = b->histograms[i] - a->histograms[i];
67
- }
68
- }
69
-
70
- void grpc_stats_inc_histogram_value(int histogram, int value) {
71
- const int bucket = grpc_stats_get_bucket[histogram](value);
72
- gpr_atm_no_barrier_fetch_add(
73
- &GRPC_THREAD_STATS_DATA()
74
- ->histograms[grpc_stats_histo_start[histogram] + bucket],
75
- 1);
76
- }
77
32
 
78
- size_t grpc_stats_histo_count(const grpc_stats_data* stats,
79
- grpc_stats_histograms histogram) {
80
- size_t sum = 0;
81
- for (int i = 0; i < grpc_stats_histo_buckets[histogram]; i++) {
82
- sum += static_cast<size_t>(
83
- stats->histograms[grpc_stats_histo_start[histogram] + i]);
84
- }
85
- return sum;
86
- }
87
-
88
- static double threshold_for_count_below(const gpr_atm* bucket_counts,
89
- const int* bucket_boundaries,
90
- int num_buckets, double count_below) {
91
- double count_so_far;
92
- double lower_bound;
93
- double upper_bound;
94
- int lower_idx;
95
- int upper_idx;
96
-
97
- /* find the lowest bucket that gets us above count_below */
98
- count_so_far = 0.0;
99
- for (lower_idx = 0; lower_idx < num_buckets; lower_idx++) {
100
- count_so_far += static_cast<double>(bucket_counts[lower_idx]);
101
- if (count_so_far >= count_below) {
102
- break;
103
- }
104
- }
105
- if (count_so_far == count_below) {
106
- /* this bucket hits the threshold exactly... we should be midway through
107
- any run of zero values following the bucket */
108
- for (upper_idx = lower_idx + 1; upper_idx < num_buckets; upper_idx++) {
109
- if (bucket_counts[upper_idx]) {
110
- break;
111
- }
112
- }
113
- return (bucket_boundaries[lower_idx] + bucket_boundaries[upper_idx]) / 2.0;
114
- } else {
115
- /* treat values as uniform throughout the bucket, and find where this value
116
- should lie */
117
- lower_bound = bucket_boundaries[lower_idx];
118
- upper_bound = bucket_boundaries[lower_idx + 1];
119
- return upper_bound - (upper_bound - lower_bound) *
120
- (count_so_far - count_below) /
121
- static_cast<double>(bucket_counts[lower_idx]);
122
- }
123
- }
124
-
125
- double grpc_stats_histo_percentile(const grpc_stats_data* stats,
126
- grpc_stats_histograms histogram,
127
- double percentile) {
128
- size_t count = grpc_stats_histo_count(stats, histogram);
129
- if (count == 0) return 0.0;
130
- return threshold_for_count_below(
131
- stats->histograms + grpc_stats_histo_start[histogram],
132
- grpc_stats_histo_bucket_boundaries[histogram],
133
- grpc_stats_histo_buckets[histogram],
134
- static_cast<double>(count) * percentile / 100.0);
135
- }
33
+ namespace stats_detail {
136
34
 
137
35
  namespace {
138
36
  template <typename I>
139
- std::string ArrayToJson(const I* values, size_t count) {
37
+ std::string ArrayToJson(absl::Span<const I> values) {
140
38
  std::vector<std::string> parts;
141
- for (size_t i = 0; i < count; i++) {
142
- parts.push_back(absl::StrFormat("%d", values[i]));
39
+ for (auto value : values) {
40
+ parts.push_back(absl::StrCat(value));
143
41
  }
144
42
  return absl::StrCat("[", absl::StrJoin(parts, ","), "]");
145
43
  }
146
44
  } // namespace
147
45
 
148
- std::string grpc_stats_data_as_json(const grpc_stats_data* data) {
46
+ std::string StatsAsJson(absl::Span<const uint64_t> counters,
47
+ absl::Span<const absl::string_view> counter_name,
48
+ absl::Span<const HistogramView> histograms,
49
+ absl::Span<const absl::string_view> histogram_name) {
149
50
  std::vector<std::string> parts;
150
- for (size_t i = 0; i < GRPC_STATS_COUNTER_COUNT; i++) {
151
- parts.push_back(absl::StrFormat(
152
- "\"%s\": %" PRIdPTR, grpc_stats_counter_name[i], data->counters[i]));
51
+ for (size_t i = 0; i < counters.size(); i++) {
52
+ parts.push_back(absl::StrCat("\"", counter_name[i], "\": ", counters[i]));
153
53
  }
154
- for (size_t i = 0; i < GRPC_STATS_HISTOGRAM_COUNT; i++) {
155
- parts.push_back(absl::StrFormat(
156
- "\"%s\": %s", grpc_stats_histogram_name[i],
157
- ArrayToJson(data->histograms + grpc_stats_histo_start[i],
158
- grpc_stats_histo_buckets[i])));
54
+ for (size_t i = 0; i < histograms.size(); i++) {
159
55
  parts.push_back(
160
- absl::StrFormat("\"%s_bkt\": %s", grpc_stats_histogram_name[i],
161
- ArrayToJson(grpc_stats_histo_bucket_boundaries[i],
162
- grpc_stats_histo_buckets[i])));
56
+ absl::StrCat("\"", histogram_name[i], "\": ",
57
+ ArrayToJson(absl::Span<const uint64_t>(
58
+ histograms[i].buckets, histograms[i].num_buckets))));
59
+ parts.push_back(absl::StrCat(
60
+ "\"", histogram_name[i], "_bkt\": ",
61
+ ArrayToJson(absl::Span<const int>(histograms[i].bucket_boundaries,
62
+ histograms[i].num_buckets))));
163
63
  }
164
64
  return absl::StrCat("{", absl::StrJoin(parts, ", "), "}");
165
65
  }
66
+
67
+ } // namespace stats_detail
68
+ } // namespace grpc_core
@@ -21,50 +21,44 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
- #include <stddef.h>
24
+ #include <stdint.h>
25
25
 
26
26
  #include <string>
27
+ #include <vector>
27
28
 
28
- #include <grpc/support/atm.h>
29
+ #include "absl/strings/string_view.h"
30
+ #include "absl/types/span.h"
29
31
 
30
- #include "src/core/lib/debug/stats_data.h" // IWYU pragma: export
31
- #include "src/core/lib/iomgr/exec_ctx.h"
32
-
33
- typedef struct grpc_stats_data {
34
- gpr_atm counters[GRPC_STATS_COUNTER_COUNT];
35
- gpr_atm histograms[GRPC_STATS_HISTOGRAM_BUCKETS];
36
- } grpc_stats_data;
32
+ #include "src/core/lib/debug/histogram_view.h"
33
+ #include "src/core/lib/debug/stats_data.h"
34
+ #include "src/core/lib/gprpp/no_destruct.h"
37
35
 
38
36
  namespace grpc_core {
39
- struct Stats {
40
- size_t num_cores;
41
- grpc_stats_data per_cpu[0];
42
- };
43
- extern Stats* const g_stats_data;
44
- } // namespace grpc_core
45
37
 
46
- #define GRPC_THREAD_STATS_DATA() \
47
- (&::grpc_core::g_stats_data \
48
- ->per_cpu[grpc_core::ExecCtx::Get()->starting_cpu()])
38
+ inline GlobalStatsCollector& global_stats() {
39
+ return *NoDestructSingleton<GlobalStatsCollector>::Get();
40
+ }
49
41
 
50
- #define GRPC_STATS_INC_COUNTER(ctr) \
51
- (gpr_atm_no_barrier_fetch_add(&GRPC_THREAD_STATS_DATA()->counters[(ctr)], 1))
42
+ namespace stats_detail {
43
+ std::string StatsAsJson(absl::Span<const uint64_t> counters,
44
+ absl::Span<const absl::string_view> counter_name,
45
+ absl::Span<const HistogramView> histograms,
46
+ absl::Span<const absl::string_view> histogram_name);
47
+ }
52
48
 
53
- #define GRPC_STATS_INC_HISTOGRAM(histogram, index) \
54
- (gpr_atm_no_barrier_fetch_add( \
55
- &GRPC_THREAD_STATS_DATA()->histograms[histogram##_FIRST_SLOT + (index)], \
56
- 1))
49
+ template <typename T>
50
+ std::string StatsAsJson(T* data) {
51
+ std::vector<HistogramView> histograms;
52
+ for (int i = 0; i < static_cast<int>(T::Histogram::COUNT); i++) {
53
+ histograms.push_back(
54
+ data->histogram(static_cast<typename T::Histogram>(i)));
55
+ }
56
+ return stats_detail::StatsAsJson(
57
+ absl::Span<const uint64_t>(data->counters,
58
+ static_cast<int>(T::Counter::COUNT)),
59
+ T::counter_name, histograms, T::histogram_name);
60
+ }
57
61
 
58
- void grpc_stats_collect(grpc_stats_data* output);
59
- // c = b-a
60
- void grpc_stats_diff(const grpc_stats_data* b, const grpc_stats_data* a,
61
- grpc_stats_data* c);
62
- std::string grpc_stats_data_as_json(const grpc_stats_data* data);
63
- double grpc_stats_histo_percentile(const grpc_stats_data* stats,
64
- grpc_stats_histograms histogram,
65
- double percentile);
66
- size_t grpc_stats_histo_count(const grpc_stats_data* stats,
67
- grpc_stats_histograms histogram);
68
- void grpc_stats_inc_histogram_value(int histogram, int value);
62
+ } // namespace grpc_core
69
63
 
70
64
  #endif // GRPC_CORE_LIB_DEBUG_STATS_H