Merge remote-tracking branch 'upstream/master' into reorg_gcp_metadata_query

pull/36789/head
Mark D. Roth 6 months ago
commit d2b84f46be
  1. 4
      BUILD
  2. 45
      CMakeLists.txt
  3. 1
      Makefile
  4. 2
      Package.swift
  5. 116
      build_autogenerated.yaml
  6. 1
      config.m4
  7. 1
      config.w32
  8. 2
      gRPC-C++.podspec
  9. 3
      gRPC-Core.podspec
  10. 2
      grpc.gemspec
  11. 2
      package.xml
  12. 4
      src/core/BUILD
  13. 45
      src/core/client_channel/client_channel_filter.cc
  14. 12
      src/core/client_channel/client_channel_filter.h
  15. 4
      src/core/client_channel/load_balanced_call_destination.cc
  16. 6
      src/core/ext/filters/backend_metrics/backend_metric_filter.cc
  17. 7
      src/core/ext/filters/backend_metrics/backend_metric_provider.h
  18. 6
      src/core/ext/filters/census/grpc_context.cc
  19. 8
      src/core/ext/filters/http/message_compress/compression_filter.cc
  20. 80
      src/core/ext/transport/chttp2/transport/chttp2_transport.cc
  21. 2
      src/core/ext/transport/chttp2/transport/chttp2_transport.h
  22. 7
      src/core/ext/transport/chttp2/transport/internal.h
  23. 9
      src/core/ext/transport/chttp2/transport/parsing.cc
  24. 8
      src/core/ext/transport/chttp2/transport/writing.cc
  25. 9
      src/core/handshaker/security/secure_endpoint.cc
  26. 39
      src/core/handshaker/security/security_handshaker.cc
  27. 31
      src/core/handshaker/security/tsi_error.cc
  28. 30
      src/core/handshaker/security/tsi_error.h
  29. 39
      src/core/lib/channel/context.h
  30. 18
      src/core/lib/event_engine/posix_engine/posix_endpoint.cc
  31. 2
      src/core/lib/event_engine/posix_engine/posix_endpoint.h
  32. 8
      src/core/lib/event_engine/windows/windows_listener.cc
  33. 41
      src/core/lib/gprpp/status_helper.cc
  34. 34
      src/core/lib/gprpp/status_helper.h
  35. 16
      src/core/lib/iomgr/endpoint_cfstream.cc
  36. 28
      src/core/lib/iomgr/error.cc
  37. 17
      src/core/lib/iomgr/resolve_address_posix.cc
  38. 15
      src/core/lib/iomgr/socket_utils_common_posix.cc
  39. 11
      src/core/lib/iomgr/tcp_client_posix.cc
  40. 6
      src/core/lib/iomgr/tcp_client_windows.cc
  41. 22
      src/core/lib/iomgr/tcp_posix.cc
  42. 11
      src/core/lib/iomgr/tcp_server_windows.cc
  43. 10
      src/core/lib/promise/cancel_callback.h
  44. 6
      src/core/lib/security/credentials/google_default/google_default_credentials.cc
  45. 38
      src/core/lib/surface/call.cc
  46. 14
      src/core/lib/surface/call.h
  47. 7
      src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc
  48. 15
      src/core/server/server_call_tracer_filter.cc
  49. 46
      src/core/telemetry/call_tracer.cc
  50. 16
      src/core/telemetry/call_tracer.h
  51. 9
      src/core/telemetry/metrics.cc
  52. 4
      src/core/telemetry/metrics.h
  53. 7
      src/core/util/http_client/httpcli.cc
  54. 30
      src/cpp/ext/filters/census/client_filter.cc
  55. 8
      src/cpp/ext/filters/census/server_call_tracer.cc
  56. 3
      src/cpp/server/server_context.cc
  57. 13
      src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi
  58. 4
      src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi
  59. 1
      src/python/grpcio/grpc_core_dependencies.py
  60. 32
      test/core/gprpp/status_helper_test.cc
  61. 66
      test/core/iomgr/error_test.cc
  62. 47
      test/core/telemetry/call_tracer_test.cc
  63. 6
      test/core/test_util/fake_stats_plugin.cc
  64. 7
      test/core/tsi/transport_security_test_lib.cc
  65. 16
      test/cpp/end2end/client_lb_end2end_test.cc
  66. 24
      test/cpp/end2end/xds/xds_end2end_test_lib.cc
  67. 4
      test/cpp/ext/otel/otel_test_library.cc
  68. 4
      tools/bazelify_tests/test/portability_tests.bzl
  69. 2
      tools/doxygen/Doxyfile.c++.internal
  70. 2
      tools/doxygen/Doxyfile.core.internal

@ -1341,7 +1341,7 @@ grpc_cc_library(
"grpc_base",
"grpc_public_hdrs",
"grpc_trace",
"legacy_context",
"//src/core:arena",
],
)
@ -2295,7 +2295,6 @@ grpc_cc_library(
srcs = [
"//src/core:handshaker/security/secure_endpoint.cc",
"//src/core:handshaker/security/security_handshaker.cc",
"//src/core:handshaker/security/tsi_error.cc",
"//src/core:lib/security/context/security_context.cc",
"//src/core:lib/security/credentials/call_creds_util.cc",
"//src/core:lib/security/credentials/composite/composite_credentials.cc",
@ -2308,7 +2307,6 @@ grpc_cc_library(
hdrs = [
"//src/core:handshaker/security/secure_endpoint.h",
"//src/core:handshaker/security/security_handshaker.h",
"//src/core:handshaker/security/tsi_error.h",
"//src/core:lib/security/context/security_context.h",
"//src/core:lib/security/credentials/call_creds_util.h",
"//src/core:lib/security/credentials/composite/composite_credentials.h",

45
CMakeLists.txt generated

@ -2232,7 +2232,6 @@ add_library(grpc
src/core/handshaker/proxy_mapper_registry.cc
src/core/handshaker/security/secure_endpoint.cc
src/core/handshaker/security/security_handshaker.cc
src/core/handshaker/security/tsi_error.cc
src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc
src/core/lib/address_utils/parse_address.cc
src/core/lib/address_utils/sockaddr_utils.cc
@ -3029,7 +3028,6 @@ add_library(grpc_unsecure
src/core/handshaker/proxy_mapper_registry.cc
src/core/handshaker/security/secure_endpoint.cc
src/core/handshaker/security/security_handshaker.cc
src/core/handshaker/security/tsi_error.cc
src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc
src/core/lib/address_utils/parse_address.cc
src/core/lib/address_utils/sockaddr_utils.cc
@ -5150,7 +5148,6 @@ add_library(grpc_authorization_provider
src/core/handshaker/proxy_mapper_registry.cc
src/core/handshaker/security/secure_endpoint.cc
src/core/handshaker/security/security_handshaker.cc
src/core/handshaker/security/tsi_error.cc
src/core/lib/address_utils/parse_address.cc
src/core/lib/address_utils/sockaddr_utils.cc
src/core/lib/backoff/backoff.cc
@ -9128,7 +9125,43 @@ endif()
if(gRPC_BUILD_TESTS)
add_executable(cancel_callback_test
src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c
src/core/ext/upb-gen/google/rpc/status.upb_minitable.c
src/core/lib/debug/trace.cc
src/core/lib/experiments/config.cc
src/core/lib/experiments/experiments.cc
src/core/lib/gprpp/status_helper.cc
src/core/lib/gprpp/time.cc
src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/exec_ctx.cc
src/core/lib/iomgr/executor.cc
src/core/lib/iomgr/iomgr_internal.cc
src/core/lib/promise/activity.cc
src/core/lib/promise/trace.cc
src/core/lib/resource_quota/arena.cc
src/core/lib/resource_quota/connection_quota.cc
src/core/lib/resource_quota/memory_quota.cc
src/core/lib/resource_quota/periodic_update.cc
src/core/lib/resource_quota/resource_quota.cc
src/core/lib/resource_quota/thread_quota.cc
src/core/lib/resource_quota/trace.cc
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
test/core/promise/cancel_callback_test.cc
third_party/upb/upb/mini_descriptor/build_enum.c
third_party/upb/upb/mini_descriptor/decode.c
third_party/upb/upb/mini_descriptor/internal/base92.c
third_party/upb/upb/mini_descriptor/internal/encode.c
third_party/upb/upb/mini_descriptor/link.c
third_party/upb/upb/wire/decode.c
third_party/upb/upb/wire/encode.c
third_party/upb/upb/wire/eps_copy_input_stream.c
third_party/upb/upb/wire/internal/decode_fast.c
third_party/upb/upb/wire/reader.c
)
if(WIN32 AND MSVC)
if(BUILD_SHARED_LIBS)
@ -9161,7 +9194,13 @@ target_include_directories(cancel_callback_test
target_link_libraries(cancel_callback_test
${_gRPC_ALLTARGETS_LIBRARIES}
gtest
utf8_range_lib
upb_message_lib
absl::config
absl::function_ref
absl::hash
absl::type_traits
absl::statusor
gpr
)

1
Makefile generated

@ -1063,7 +1063,6 @@ LIBGRPC_SRC = \
src/core/handshaker/proxy_mapper_registry.cc \
src/core/handshaker/security/secure_endpoint.cc \
src/core/handshaker/security/security_handshaker.cc \
src/core/handshaker/security/tsi_error.cc \
src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc \
src/core/lib/address_utils/parse_address.cc \
src/core/lib/address_utils/sockaddr_utils.cc \

2
Package.swift generated

@ -1080,8 +1080,6 @@ let package = Package(
"src/core/handshaker/security/secure_endpoint.h",
"src/core/handshaker/security/security_handshaker.cc",
"src/core/handshaker/security/security_handshaker.h",
"src/core/handshaker/security/tsi_error.cc",
"src/core/handshaker/security/tsi_error.h",
"src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc",
"src/core/handshaker/tcp_connect/tcp_connect_handshaker.h",
"src/core/lib/address_utils/parse_address.cc",

@ -788,7 +788,6 @@ libs:
- src/core/handshaker/proxy_mapper_registry.h
- src/core/handshaker/security/secure_endpoint.h
- src/core/handshaker/security/security_handshaker.h
- src/core/handshaker/security/tsi_error.h
- src/core/handshaker/tcp_connect/tcp_connect_handshaker.h
- src/core/lib/address_utils/parse_address.h
- src/core/lib/address_utils/sockaddr_utils.h
@ -1648,7 +1647,6 @@ libs:
- src/core/handshaker/proxy_mapper_registry.cc
- src/core/handshaker/security/secure_endpoint.cc
- src/core/handshaker/security/security_handshaker.cc
- src/core/handshaker/security/tsi_error.cc
- src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc
- src/core/lib/address_utils/parse_address.cc
- src/core/lib/address_utils/sockaddr_utils.cc
@ -2334,7 +2332,6 @@ libs:
- src/core/handshaker/proxy_mapper_registry.h
- src/core/handshaker/security/secure_endpoint.h
- src/core/handshaker/security/security_handshaker.h
- src/core/handshaker/security/tsi_error.h
- src/core/handshaker/tcp_connect/tcp_connect_handshaker.h
- src/core/lib/address_utils/parse_address.h
- src/core/lib/address_utils/sockaddr_utils.h
@ -2809,7 +2806,6 @@ libs:
- src/core/handshaker/proxy_mapper_registry.cc
- src/core/handshaker/security/secure_endpoint.cc
- src/core/handshaker/security/security_handshaker.cc
- src/core/handshaker/security/tsi_error.cc
- src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc
- src/core/lib/address_utils/parse_address.cc
- src/core/lib/address_utils/sockaddr_utils.cc
@ -4431,7 +4427,6 @@ libs:
- src/core/handshaker/proxy_mapper_registry.h
- src/core/handshaker/security/secure_endpoint.h
- src/core/handshaker/security/security_handshaker.h
- src/core/handshaker/security/tsi_error.h
- src/core/lib/address_utils/parse_address.h
- src/core/lib/address_utils/sockaddr_utils.h
- src/core/lib/avl/avl.h
@ -4781,7 +4776,6 @@ libs:
- src/core/handshaker/proxy_mapper_registry.cc
- src/core/handshaker/security/secure_endpoint.cc
- src/core/handshaker/security/security_handshaker.cc
- src/core/handshaker/security/tsi_error.cc
- src/core/lib/address_utils/parse_address.cc
- src/core/lib/address_utils/sockaddr_utils.cc
- src/core/lib/backoff/backoff.cc
@ -6974,14 +6968,124 @@ targets:
build: test
language: c++
headers:
- src/core/ext/upb-gen/google/protobuf/any.upb.h
- src/core/ext/upb-gen/google/protobuf/any.upb_minitable.h
- src/core/ext/upb-gen/google/rpc/status.upb.h
- src/core/ext/upb-gen/google/rpc/status.upb_minitable.h
- src/core/lib/debug/trace.h
- src/core/lib/event_engine/event_engine_context.h
- src/core/lib/experiments/config.h
- src/core/lib/experiments/experiments.h
- src/core/lib/gprpp/atomic_utils.h
- src/core/lib/gprpp/bitset.h
- src/core/lib/gprpp/cpp_impl_of.h
- src/core/lib/gprpp/down_cast.h
- src/core/lib/gprpp/manual_constructor.h
- src/core/lib/gprpp/orphanable.h
- src/core/lib/gprpp/ref_counted.h
- src/core/lib/gprpp/ref_counted_ptr.h
- src/core/lib/gprpp/status_helper.h
- src/core/lib/gprpp/time.h
- src/core/lib/iomgr/closure.h
- src/core/lib/iomgr/combiner.h
- src/core/lib/iomgr/error.h
- src/core/lib/iomgr/exec_ctx.h
- src/core/lib/iomgr/executor.h
- src/core/lib/iomgr/iomgr_internal.h
- src/core/lib/promise/activity.h
- src/core/lib/promise/cancel_callback.h
- src/core/lib/promise/context.h
- src/core/lib/promise/detail/basic_seq.h
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/seq_state.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/map.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/race.h
- src/core/lib/promise/seq.h
- src/core/lib/promise/trace.h
- src/core/lib/resource_quota/arena.h
- src/core/lib/resource_quota/connection_quota.h
- src/core/lib/resource_quota/memory_quota.h
- src/core/lib/resource_quota/periodic_update.h
- src/core/lib/resource_quota/resource_quota.h
- src/core/lib/resource_quota/thread_quota.h
- src/core/lib/resource_quota/trace.h
- src/core/lib/slice/percent_encoding.h
- src/core/lib/slice/slice.h
- src/core/lib/slice/slice_internal.h
- src/core/lib/slice/slice_refcount.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/util/spinlock.h
- third_party/upb/upb/generated_code_support.h
- third_party/upb/upb/mini_descriptor/build_enum.h
- third_party/upb/upb/mini_descriptor/decode.h
- third_party/upb/upb/mini_descriptor/internal/base92.h
- third_party/upb/upb/mini_descriptor/internal/decoder.h
- third_party/upb/upb/mini_descriptor/internal/encode.h
- third_party/upb/upb/mini_descriptor/internal/encode.hpp
- third_party/upb/upb/mini_descriptor/internal/modifiers.h
- third_party/upb/upb/mini_descriptor/internal/wire_constants.h
- third_party/upb/upb/mini_descriptor/link.h
- third_party/upb/upb/wire/decode.h
- third_party/upb/upb/wire/encode.h
- third_party/upb/upb/wire/eps_copy_input_stream.h
- third_party/upb/upb/wire/internal/constants.h
- third_party/upb/upb/wire/internal/decode_fast.h
- third_party/upb/upb/wire/internal/decoder.h
- third_party/upb/upb/wire/internal/reader.h
- third_party/upb/upb/wire/reader.h
- third_party/upb/upb/wire/types.h
src:
- src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c
- src/core/ext/upb-gen/google/rpc/status.upb_minitable.c
- src/core/lib/debug/trace.cc
- src/core/lib/experiments/config.cc
- src/core/lib/experiments/experiments.cc
- src/core/lib/gprpp/status_helper.cc
- src/core/lib/gprpp/time.cc
- src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
- src/core/lib/iomgr/executor.cc
- src/core/lib/iomgr/iomgr_internal.cc
- src/core/lib/promise/activity.cc
- src/core/lib/promise/trace.cc
- src/core/lib/resource_quota/arena.cc
- src/core/lib/resource_quota/connection_quota.cc
- src/core/lib/resource_quota/memory_quota.cc
- src/core/lib/resource_quota/periodic_update.cc
- src/core/lib/resource_quota/resource_quota.cc
- src/core/lib/resource_quota/thread_quota.cc
- src/core/lib/resource_quota/trace.cc
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/promise/cancel_callback_test.cc
- third_party/upb/upb/mini_descriptor/build_enum.c
- third_party/upb/upb/mini_descriptor/decode.c
- third_party/upb/upb/mini_descriptor/internal/base92.c
- third_party/upb/upb/mini_descriptor/internal/encode.c
- third_party/upb/upb/mini_descriptor/link.c
- third_party/upb/upb/wire/decode.c
- third_party/upb/upb/wire/encode.c
- third_party/upb/upb/wire/eps_copy_input_stream.c
- third_party/upb/upb/wire/internal/decode_fast.c
- third_party/upb/upb/wire/reader.c
deps:
- gtest
- utf8_range_lib
- upb_message_lib
- absl/base:config
- absl/functional:function_ref
- absl/hash:hash
- absl/meta:type_traits
- absl/status:statusor
- gpr
uses_polling: false
- name: cancel_in_a_vacuum_test

1
config.m4 generated

@ -438,7 +438,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/handshaker/proxy_mapper_registry.cc \
src/core/handshaker/security/secure_endpoint.cc \
src/core/handshaker/security/security_handshaker.cc \
src/core/handshaker/security/tsi_error.cc \
src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc \
src/core/lib/address_utils/parse_address.cc \
src/core/lib/address_utils/sockaddr_utils.cc \

1
config.w32 generated

@ -403,7 +403,6 @@ if (PHP_GRPC != "no") {
"src\\core\\handshaker\\proxy_mapper_registry.cc " +
"src\\core\\handshaker\\security\\secure_endpoint.cc " +
"src\\core\\handshaker\\security\\security_handshaker.cc " +
"src\\core\\handshaker\\security\\tsi_error.cc " +
"src\\core\\handshaker\\tcp_connect\\tcp_connect_handshaker.cc " +
"src\\core\\lib\\address_utils\\parse_address.cc " +
"src\\core\\lib\\address_utils\\sockaddr_utils.cc " +

2
gRPC-C++.podspec generated

@ -867,7 +867,6 @@ Pod::Spec.new do |s|
'src/core/handshaker/proxy_mapper_registry.h',
'src/core/handshaker/security/secure_endpoint.h',
'src/core/handshaker/security/security_handshaker.h',
'src/core/handshaker/security/tsi_error.h',
'src/core/handshaker/tcp_connect/tcp_connect_handshaker.h',
'src/core/lib/address_utils/parse_address.h',
'src/core/lib/address_utils/sockaddr_utils.h',
@ -2142,7 +2141,6 @@ Pod::Spec.new do |s|
'src/core/handshaker/proxy_mapper_registry.h',
'src/core/handshaker/security/secure_endpoint.h',
'src/core/handshaker/security/security_handshaker.h',
'src/core/handshaker/security/tsi_error.h',
'src/core/handshaker/tcp_connect/tcp_connect_handshaker.h',
'src/core/lib/address_utils/parse_address.h',
'src/core/lib/address_utils/sockaddr_utils.h',

3
gRPC-Core.podspec generated

@ -1199,8 +1199,6 @@ Pod::Spec.new do |s|
'src/core/handshaker/security/secure_endpoint.h',
'src/core/handshaker/security/security_handshaker.cc',
'src/core/handshaker/security/security_handshaker.h',
'src/core/handshaker/security/tsi_error.cc',
'src/core/handshaker/security/tsi_error.h',
'src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc',
'src/core/handshaker/tcp_connect/tcp_connect_handshaker.h',
'src/core/lib/address_utils/parse_address.cc',
@ -2925,7 +2923,6 @@ Pod::Spec.new do |s|
'src/core/handshaker/proxy_mapper_registry.h',
'src/core/handshaker/security/secure_endpoint.h',
'src/core/handshaker/security/security_handshaker.h',
'src/core/handshaker/security/tsi_error.h',
'src/core/handshaker/tcp_connect/tcp_connect_handshaker.h',
'src/core/lib/address_utils/parse_address.h',
'src/core/lib/address_utils/sockaddr_utils.h',

2
grpc.gemspec generated

@ -1086,8 +1086,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/handshaker/security/secure_endpoint.h )
s.files += %w( src/core/handshaker/security/security_handshaker.cc )
s.files += %w( src/core/handshaker/security/security_handshaker.h )
s.files += %w( src/core/handshaker/security/tsi_error.cc )
s.files += %w( src/core/handshaker/security/tsi_error.h )
s.files += %w( src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc )
s.files += %w( src/core/handshaker/tcp_connect/tcp_connect_handshaker.h )
s.files += %w( src/core/lib/address_utils/parse_address.cc )

2
package.xml generated

@ -1068,8 +1068,6 @@
<file baseinstalldir="/" name="src/core/handshaker/security/secure_endpoint.h" role="src" />
<file baseinstalldir="/" name="src/core/handshaker/security/security_handshaker.cc" role="src" />
<file baseinstalldir="/" name="src/core/handshaker/security/security_handshaker.h" role="src" />
<file baseinstalldir="/" name="src/core/handshaker/security/tsi_error.cc" role="src" />
<file baseinstalldir="/" name="src/core/handshaker/security/tsi_error.h" role="src" />
<file baseinstalldir="/" name="src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc" role="src" />
<file baseinstalldir="/" name="src/core/handshaker/tcp_connect/tcp_connect_handshaker.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/address_utils/parse_address.cc" role="src" />

@ -685,6 +685,8 @@ grpc_cc_library(
"lib/promise/cancel_callback.h",
],
deps = [
"arena",
"context",
"promise_like",
"//:gpr_platform",
],
@ -1653,6 +1655,7 @@ grpc_cc_library(
"absl/log:check",
"absl/log:log",
"absl/status",
"absl/strings",
"absl/strings:str_format",
],
visibility = ["@grpc:alt_grpc_base_legacy"],
@ -5029,6 +5032,7 @@ grpc_cc_library(
"ext/filters/backend_metrics/backend_metric_provider.h",
],
language = "c++",
deps = ["arena"],
)
grpc_cc_library(

@ -269,8 +269,7 @@ class ClientChannelFilter::FilterBasedCallData final
void ResetDeadline(Duration timeout) override {
const Timestamp per_method_deadline =
Timestamp::FromCycleCounterRoundUp(call_start_time_) + timeout;
static_cast<Call*>(call_context_[GRPC_CONTEXT_CALL].value)
->UpdateDeadline(per_method_deadline);
arena_->GetContext<Call>()->UpdateDeadline(per_method_deadline);
}
void CreateDynamicCall();
@ -2133,8 +2132,7 @@ absl::optional<absl::Status> ClientChannelFilter::CallData::CheckResolution(
}
// If the call was queued, add trace annotation.
if (was_queued) {
auto* call_tracer = static_cast<CallTracerAnnotationInterface*>(
call_context()[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value);
auto* call_tracer = arena()->GetContext<CallTracerAnnotationInterface>();
if (call_tracer != nullptr) {
call_tracer->RecordAnnotation("Delayed name resolution complete.");
}
@ -2574,7 +2572,7 @@ class ClientChannelFilter::LoadBalancedCall::LbCallState final
public:
explicit LbCallState(LoadBalancedCall* lb_call) : lb_call_(lb_call) {}
void* Alloc(size_t size) override { return lb_call_->arena()->Alloc(size); }
void* Alloc(size_t size) override { return lb_call_->arena_->Alloc(size); }
// Internal API to allow first-party LB policies to access per-call
// attributes set by the ConfigSelector.
@ -2696,7 +2694,7 @@ class ClientChannelFilter::LoadBalancedCall::BackendMetricAccessor final
recv_trailing_metadata_ != nullptr) {
if (const auto* md = recv_trailing_metadata_->get_pointer(
EndpointLoadMetricsBinMetadata())) {
BackendMetricAllocator allocator(lb_call_->arena());
BackendMetricAllocator allocator(lb_call_->arena_);
lb_call_->backend_metric_data_ =
ParseBackendMetricData(md->as_string_view(), &allocator);
}
@ -2731,28 +2729,29 @@ class ClientChannelFilter::LoadBalancedCall::BackendMetricAccessor final
namespace {
void CreateCallAttemptTracer(grpc_call_context_element* context,
bool is_transparent_retry) {
auto* call_tracer = static_cast<ClientCallTracer*>(
context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value);
void CreateCallAttemptTracer(Arena* arena, bool is_transparent_retry) {
auto* call_tracer = DownCast<ClientCallTracer*>(
arena->GetContext<CallTracerAnnotationInterface>());
if (call_tracer == nullptr) return;
auto* tracer = call_tracer->StartNewAttempt(is_transparent_retry);
context[GRPC_CONTEXT_CALL_TRACER].value = tracer;
arena->SetContext<CallTracerInterface>(tracer);
}
} // namespace
ClientChannelFilter::LoadBalancedCall::LoadBalancedCall(
ClientChannelFilter* chand, grpc_call_context_element* call_context,
absl::AnyInvocable<void()> on_commit, bool is_transparent_retry)
Arena* arena, absl::AnyInvocable<void()> on_commit,
bool is_transparent_retry)
: InternallyRefCounted(
GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_lb_call_trace)
? "LoadBalancedCall"
: nullptr),
chand_(chand),
on_commit_(std::move(on_commit)),
call_context_(call_context) {
CreateCallAttemptTracer(call_context, is_transparent_retry);
call_context_(call_context),
arena_(arena) {
CreateCallAttemptTracer(arena, is_transparent_retry);
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_lb_call_trace)) {
gpr_log(GPR_INFO, "chand=%p lb_call=%p: created", chand_, this);
}
@ -3019,9 +3018,8 @@ ClientChannelFilter::FilterBasedLoadBalancedCall::FilterBasedLoadBalancedCall(
ClientChannelFilter* chand, const grpc_call_element_args& args,
grpc_polling_entity* pollent, grpc_closure* on_call_destruction_complete,
absl::AnyInvocable<void()> on_commit, bool is_transparent_retry)
: LoadBalancedCall(chand, args.context, std::move(on_commit),
: LoadBalancedCall(chand, args.context, args.arena, std::move(on_commit),
is_transparent_retry),
arena_(args.arena),
owning_call_(args.call_stack),
call_combiner_(args.call_combiner),
pollent_(pollent),
@ -3321,10 +3319,7 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::
grpc_status_code code;
std::string message;
grpc_error_get_status(
error,
static_cast<Call*>(self->call_context()[GRPC_CONTEXT_CALL].value)
->deadline(),
&code, &message,
error, self->arena()->GetContext<Call>()->deadline(), &code, &message,
/*http_error=*/nullptr, /*error_string=*/nullptr);
status = absl::Status(static_cast<absl::StatusCode>(code), message);
} else {
@ -3463,8 +3458,7 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::CreateSubchannelCall() {
CHECK_NE(path, nullptr);
SubchannelCall::Args call_args = {
connected_subchannel()->Ref(), pollent_, path->Ref(), /*start_time=*/0,
static_cast<Call*>(call_context()[GRPC_CONTEXT_CALL].value)->deadline(),
arena_,
arena()->GetContext<Call>()->deadline(), arena(),
// TODO(roth): When we implement hedging support, we will probably
// need to use a separate call context for each subchannel call.
call_context(), call_combiner_};
@ -3494,7 +3488,8 @@ ClientChannelFilter::PromiseBasedLoadBalancedCall::PromiseBasedLoadBalancedCall(
ClientChannelFilter* chand, absl::AnyInvocable<void()> on_commit,
bool is_transparent_retry)
: LoadBalancedCall(chand, GetContext<grpc_call_context_element>(),
std::move(on_commit), is_transparent_retry) {}
GetContext<Arena>(), std::move(on_commit),
is_transparent_retry) {}
ArenaPromise<ServerMetadataHandle>
ClientChannelFilter::PromiseBasedLoadBalancedCall::MakeCallPromise(
@ -3610,10 +3605,6 @@ ClientChannelFilter::PromiseBasedLoadBalancedCall::MakeCallPromise(
});
}
Arena* ClientChannelFilter::PromiseBasedLoadBalancedCall::arena() const {
return GetContext<Arena>();
}
grpc_metadata_batch*
ClientChannelFilter::PromiseBasedLoadBalancedCall::send_initial_metadata()
const {

@ -372,7 +372,7 @@ class ClientChannelFilter::LoadBalancedCall
: public InternallyRefCounted<LoadBalancedCall, UnrefCallDtor> {
public:
LoadBalancedCall(ClientChannelFilter* chand,
grpc_call_context_element* call_context,
grpc_call_context_element* call_context, Arena* arena,
absl::AnyInvocable<void()> on_commit,
bool is_transparent_retry);
~LoadBalancedCall() override;
@ -391,8 +391,8 @@ class ClientChannelFilter::LoadBalancedCall
protected:
ClientChannelFilter* chand() const { return chand_; }
ClientCallTracer::CallAttemptTracer* call_attempt_tracer() const {
return static_cast<ClientCallTracer::CallAttemptTracer*>(
call_context_[GRPC_CONTEXT_CALL_TRACER].value);
return DownCast<ClientCallTracer::CallAttemptTracer*>(
arena_->GetContext<CallTracerInterface>());
}
ConnectedSubchannel* connected_subchannel() const {
return connected_subchannel_.get();
@ -401,6 +401,7 @@ class ClientChannelFilter::LoadBalancedCall
lb_subchannel_call_tracker() const {
return lb_subchannel_call_tracker_.get();
}
Arena* arena() const { return arena_; }
void Commit() {
auto on_commit = std::move(on_commit_);
@ -433,7 +434,6 @@ class ClientChannelFilter::LoadBalancedCall
class Metadata;
class BackendMetricAccessor;
virtual Arena* arena() const = 0;
virtual grpc_polling_entity* pollent() = 0;
virtual grpc_metadata_batch* send_initial_metadata() const = 0;
@ -460,6 +460,7 @@ class ClientChannelFilter::LoadBalancedCall
std::unique_ptr<LoadBalancingPolicy::SubchannelCallTrackerInterface>
lb_subchannel_call_tracker_;
grpc_call_context_element* const call_context_;
Arena* const arena_;
};
class ClientChannelFilter::FilterBasedLoadBalancedCall final
@ -495,7 +496,6 @@ class ClientChannelFilter::FilterBasedLoadBalancedCall final
using LoadBalancedCall::chand;
using LoadBalancedCall::Commit;
Arena* arena() const override { return arena_; }
grpc_polling_entity* pollent() override { return pollent_; }
grpc_metadata_batch* send_initial_metadata() const override {
return pending_batches_[0]
@ -550,7 +550,6 @@ class ClientChannelFilter::FilterBasedLoadBalancedCall final
// TODO(roth): Instead of duplicating these fields in every filter
// that uses any one of them, we should store them in the call
// context. This will save per-call memory overhead.
Arena* arena_;
grpc_call_stack* owning_call_;
CallCombiner* call_combiner_;
grpc_polling_entity* pollent_;
@ -598,7 +597,6 @@ class ClientChannelFilter::PromiseBasedLoadBalancedCall final
CallArgs call_args, OrphanablePtr<PromiseBasedLoadBalancedCall> lb_call);
private:
Arena* arena() const override;
grpc_polling_entity* pollent() override { return &pollent_; }
grpc_metadata_batch* send_initial_metadata() const override;

@ -121,9 +121,7 @@ class LbCallState : public ClientChannelLbCallState {
}
ClientCallTracer::CallAttemptTracer* GetCallAttemptTracer() const override {
auto* legacy_context = GetContext<grpc_call_context_element>();
return static_cast<ClientCallTracer::CallAttemptTracer*>(
legacy_context[GRPC_CONTEXT_CALL_TRACER].value);
return GetContext<ClientCallTracer::CallAttemptTracer>();
}
};

@ -130,16 +130,14 @@ BackendMetricFilter::Create(const ChannelArgs&, ChannelFilter::Args) {
void BackendMetricFilter::Call::OnServerTrailingMetadata(ServerMetadata& md) {
if (md.get(GrpcCallWasCancelled()).value_or(false)) return;
auto* ctx = &GetContext<
grpc_call_context_element>()[GRPC_CONTEXT_BACKEND_METRIC_PROVIDER];
auto* ctx = MaybeGetContext<BackendMetricProvider>();
if (ctx == nullptr) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_filter_trace)) {
gpr_log(GPR_INFO, "[%p] No BackendMetricProvider.", this);
}
return;
}
absl::optional<std::string> serialized = MaybeSerializeBackendMetrics(
reinterpret_cast<BackendMetricProvider*>(ctx->value));
absl::optional<std::string> serialized = MaybeSerializeBackendMetrics(ctx);
if (serialized.has_value() && !serialized->empty()) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_filter_trace)) {
gpr_log(GPR_INFO, "[%p] Backend metrics serialized. size: %" PRIuPTR,

@ -15,6 +15,8 @@
#ifndef GRPC_SRC_CORE_EXT_FILTERS_BACKEND_METRICS_BACKEND_METRIC_PROVIDER_H
#define GRPC_SRC_CORE_EXT_FILTERS_BACKEND_METRICS_BACKEND_METRIC_PROVIDER_H
#include "src/core/lib/resource_quota/arena.h"
namespace grpc_core {
struct BackendMetricData;
@ -24,6 +26,11 @@ class BackendMetricProvider {
virtual BackendMetricData GetBackendMetricData() = 0;
};
template <>
struct ArenaContextType<BackendMetricProvider> {
static void Destroy(BackendMetricProvider*) {}
};
} // namespace grpc_core
#endif // GRPC_SRC_CORE_EXT_FILTERS_BACKEND_METRICS_BACKEND_METRIC_PROVIDER_H

@ -21,7 +21,6 @@
#include <grpc/census.h>
#include <grpc/grpc.h>
#include "src/core/lib/channel/context.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/surface/api_trace.h"
#include "src/core/lib/surface/call.h"
@ -30,12 +29,11 @@ void grpc_census_call_set_context(grpc_call* call, census_context* context) {
GRPC_API_TRACE("grpc_census_call_set_context(call=%p, census_context=%p)", 2,
(call, context));
if (context != nullptr) {
grpc_call_context_set(call, GRPC_CONTEXT_TRACING, context, nullptr);
grpc_call_get_arena(call)->SetContext<census_context>(context);
}
}
census_context* grpc_census_call_get_context(grpc_call* call) {
GRPC_API_TRACE("grpc_census_call_get_context(call=%p)", 1, (call));
return static_cast<census_context*>(
grpc_call_context_get(call, GRPC_CONTEXT_TRACING));
return grpc_call_get_arena(call)->GetContext<census_context>();
}

@ -119,9 +119,7 @@ MessageHandle ChannelCompression::CompressMessage(
gpr_log(GPR_INFO, "CompressMessage: len=%" PRIdPTR " alg=%d flags=%d",
message->payload()->Length(), algorithm, message->flags());
}
auto* call_context = GetContext<grpc_call_context_element>();
auto* call_tracer = static_cast<CallTracerInterface*>(
call_context[GRPC_CONTEXT_CALL_TRACER].value);
auto* call_tracer = MaybeGetContext<CallTracerInterface>();
if (call_tracer != nullptr) {
call_tracer->RecordSendMessage(*message->payload());
}
@ -178,9 +176,7 @@ absl::StatusOr<MessageHandle> ChannelCompression::DecompressMessage(
message->payload()->Length(),
args.max_recv_message_length.value_or(-1), args.algorithm);
}
auto* call_context = GetContext<grpc_call_context_element>();
auto* call_tracer = static_cast<CallTracerInterface*>(
call_context[GRPC_CONTEXT_CALL_TRACER].value);
auto* call_tracer = MaybeGetContext<CallTracerInterface>();
if (call_tracer != nullptr) {
call_tracer->RecordReceivedMessage(*message->payload());
}

@ -227,14 +227,13 @@ namespace {
using TaskHandle = ::grpc_event_engine::experimental::EventEngine::TaskHandle;
grpc_core::CallTracerInterface* CallTracerIfSampled(grpc_chttp2_stream* s) {
if (s->context == nullptr || !grpc_core::IsTraceRecordCallopsEnabled()) {
grpc_core::CallTracerAnnotationInterface* CallTracerIfSampled(
grpc_chttp2_stream* s) {
if (!grpc_core::IsTraceRecordCallopsEnabled()) {
return nullptr;
}
auto* call_tracer = static_cast<grpc_core::CallTracerInterface*>(
static_cast<grpc_call_context_element*>(
s->context)[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE]
.value);
auto* call_tracer =
s->arena->GetContext<grpc_core::CallTracerAnnotationInterface>();
if (call_tracer == nullptr || !call_tracer->IsSampled()) {
return nullptr;
}
@ -243,13 +242,11 @@ grpc_core::CallTracerInterface* CallTracerIfSampled(grpc_chttp2_stream* s) {
std::shared_ptr<grpc_core::TcpTracerInterface> TcpTracerIfSampled(
grpc_chttp2_stream* s) {
if (s->context == nullptr || !grpc_core::IsTraceRecordCallopsEnabled()) {
if (!grpc_core::IsTraceRecordCallopsEnabled()) {
return nullptr;
}
auto* call_attempt_tracer = static_cast<grpc_core::CallTracerInterface*>(
static_cast<grpc_call_context_element*>(
s->context)[GRPC_CONTEXT_CALL_TRACER]
.value);
auto* call_attempt_tracer =
s->arena->GetContext<grpc_core::CallTracerInterface>();
if (call_attempt_tracer == nullptr || !call_attempt_tracer->IsSampled()) {
return nullptr;
}
@ -391,10 +388,10 @@ grpc_chttp2_transport::~grpc_chttp2_transport() {
grpc_error_handle error = GRPC_ERROR_CREATE("Transport destroyed");
// ContextList::Execute follows semantics of a callback function and does not
// take a ref on error
if (cl != nullptr) {
grpc_core::ForEachContextListEntryExecute(cl, nullptr, error);
if (context_list != nullptr) {
grpc_core::ForEachContextListEntryExecute(context_list, nullptr, error);
}
cl = nullptr;
context_list = nullptr;
grpc_slice_buffer_destroy(&read_buffer);
grpc_chttp2_goaway_parser_destroy(&goaway_parser);
@ -617,7 +614,7 @@ grpc_chttp2_transport::grpc_chttp2_transport(
&memory_owner),
deframe_state(is_client ? GRPC_DTS_FH_0 : GRPC_DTS_CLIENT_PREFIX_0),
is_client(is_client) {
cl = new grpc_core::ContextList();
context_list = new grpc_core::ContextList();
CHECK(strlen(GRPC_CHTTP2_CLIENT_CONNECT_STRING) ==
GRPC_CHTTP2_CLIENT_CONNECT_STRLEN);
@ -784,7 +781,8 @@ void grpc_chttp2_stream_unref(grpc_chttp2_stream* s) {
grpc_chttp2_stream::grpc_chttp2_stream(grpc_chttp2_transport* t,
grpc_stream_refcount* refcount,
const void* server_data)
const void* server_data,
grpc_core::Arena* arena)
: t(t->Ref()),
refcount([refcount]() {
// We reserve one 'active stream' that's dropped when the stream is
@ -798,6 +796,7 @@ grpc_chttp2_stream::grpc_chttp2_stream(grpc_chttp2_transport* t,
#endif
return refcount;
}()),
arena(arena),
flow_control(&t->flow_control) {
t->streams_allocated.fetch_add(1, std::memory_order_relaxed);
if (server_data) {
@ -855,8 +854,8 @@ grpc_chttp2_stream::~grpc_chttp2_stream() {
void grpc_chttp2_transport::InitStream(grpc_stream* gs,
grpc_stream_refcount* refcount,
const void* server_data,
grpc_core::Arena*) {
new (gs) grpc_chttp2_stream(this, refcount, server_data);
grpc_core::Arena* arena) {
new (gs) grpc_chttp2_stream(this, refcount, server_data, arena);
}
static void destroy_stream_locked(void* sp, grpc_error_handle /*error*/) {
@ -1015,13 +1014,13 @@ static void write_action_begin_locked(
}
static void write_action(grpc_chttp2_transport* t) {
void* cl = t->cl;
if (!t->cl->empty()) {
void* cl = t->context_list;
if (!t->context_list->empty()) {
// Transfer the ownership of the context list to the endpoint and create and
// associate a new context list with the transport.
// The old context list is stored in the cl local variable which is passed
// to the endpoint. Its upto the endpoint to manage its lifetime.
t->cl = new grpc_core::ContextList();
t->context_list = new grpc_core::ContextList();
} else {
// t->cl is Empty. There is nothing to trace in this endpoint_write. set cl
// to nullptr.
@ -1123,19 +1122,16 @@ void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport* t,
uint32_t goaway_error,
uint32_t last_stream_id,
absl::string_view goaway_text) {
t->goaway_error = grpc_error_set_str(
t->goaway_error = grpc_error_set_int(
grpc_error_set_int(
grpc_error_set_int(
grpc_core::StatusCreate(
absl::StatusCode::kUnavailable,
absl::StrFormat(
"GOAWAY received; Error code: %u; Debug Text: %s",
goaway_error, goaway_text),
DEBUG_LOCATION, {}),
grpc_core::StatusIntProperty::kHttp2Error,
static_cast<intptr_t>(goaway_error)),
grpc_core::StatusIntProperty::kRpcStatus, GRPC_STATUS_UNAVAILABLE),
grpc_core::StatusStrProperty::kRawBytes, goaway_text);
grpc_core::StatusCreate(
absl::StatusCode::kUnavailable,
absl::StrFormat("GOAWAY received; Error code: %u; Debug Text: %s",
goaway_error, goaway_text),
DEBUG_LOCATION, {}),
grpc_core::StatusIntProperty::kHttp2Error,
static_cast<intptr_t>(goaway_error)),
grpc_core::StatusIntProperty::kRpcStatus, GRPC_STATUS_UNAVAILABLE);
GRPC_CHTTP2_IF_TRACING(
gpr_log(GPR_INFO, "transport %p got goaway with last stream id %d", t,
@ -1293,12 +1289,10 @@ void grpc_chttp2_complete_closure_step(grpc_chttp2_transport* t,
if (cl_err.ok()) {
cl_err = GRPC_ERROR_CREATE(absl::StrCat(
"Error in HTTP transport completing operation: ", desc,
" write_state=", write_state_name(t->write_state), " refs=",
closure->next_data.scratch / CLOSURE_BARRIER_FIRST_REF_BIT, " flags=",
closure->next_data.scratch % CLOSURE_BARRIER_FIRST_REF_BIT));
cl_err = grpc_error_set_str(cl_err,
grpc_core::StatusStrProperty::kTargetAddress,
std::string(t->peer_string.as_string_view()));
" write_state=", write_state_name(t->write_state),
" refs=", closure->next_data.scratch / CLOSURE_BARRIER_FIRST_REF_BIT,
" flags=", closure->next_data.scratch % CLOSURE_BARRIER_FIRST_REF_BIT,
" peer_address=", t->peer_string.as_string_view()));
}
cl_err = grpc_error_add_child(cl_err, error);
closure->error_data.error = grpc_core::internal::StatusAllocHeapPtr(cl_err);
@ -1376,7 +1370,7 @@ static void perform_stream_op_locked(void* stream_op,
}
if (op->send_initial_metadata) {
if (s->call_tracer) {
if (s->call_tracer != nullptr) {
s->call_tracer->RecordAnnotation(
grpc_core::HttpAnnotation(grpc_core::HttpAnnotation::Type::kStart,
gpr_now(GPR_CLOCK_REALTIME))
@ -2613,9 +2607,9 @@ static grpc_error_handle try_http_parsing(grpc_chttp2_transport* t) {
if (parse_error.ok() &&
(parse_error = grpc_http_parser_eof(&parser)) == absl::OkStatus()) {
error = grpc_error_set_int(
grpc_error_set_int(
GRPC_ERROR_CREATE("Trying to connect an http1.x server"),
grpc_core::StatusIntProperty::kHttpStatus, response.status),
GRPC_ERROR_CREATE(
absl::StrCat("Trying to connect an http1.x server (HTTP status ",
response.status, ")")),
grpc_core::StatusIntProperty::kRpcStatus,
grpc_http2_status_to_grpc_status(response.status));
}

@ -83,7 +83,7 @@ void TestOnlyGlobalHttp2TransportDisableTransientFailureStateNotification(
typedef void (*WriteTimestampsCallback)(void*, Timestamps*,
grpc_error_handle error);
typedef void* (*CopyContextFn)(void*);
typedef void* (*CopyContextFn)(Arena*);
void GrpcHttp2SetWriteTimestampsCallback(WriteTimestampsCallback fn);
void GrpcHttp2SetCopyContextFn(CopyContextFn fn);

@ -466,7 +466,7 @@ struct grpc_chttp2_transport final : public grpc_core::FilterStackTransport,
grpc_chttp2_keepalive_state keepalive_state;
// Soft limit on max header size.
uint32_t max_header_list_size_soft_limit = 0;
grpc_core::ContextList* cl = nullptr;
grpc_core::ContextList* context_list = nullptr;
grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode> channelz_socket;
uint32_t num_messages_in_next_write = 0;
/// The number of pending induced frames (SETTINGS_ACK, PINGS_ACK and
@ -545,12 +545,13 @@ typedef enum {
struct grpc_chttp2_stream {
grpc_chttp2_stream(grpc_chttp2_transport* t, grpc_stream_refcount* refcount,
const void* server_data);
const void* server_data, grpc_core::Arena* arena);
~grpc_chttp2_stream();
void* context = nullptr;
const grpc_core::RefCountedPtr<grpc_chttp2_transport> t;
grpc_stream_refcount* refcount;
grpc_core::Arena* const arena;
grpc_closure destroy_stream;
grpc_closure* destroy_stream_arg;
@ -643,7 +644,7 @@ struct grpc_chttp2_stream {
int64_t write_counter = 0;
/// Only set when enabled.
grpc_core::CallTracerInterface* call_tracer = nullptr;
grpc_core::CallTracerAnnotationInterface* call_tracer = nullptr;
/// Only set when enabled.
std::shared_ptr<grpc_core::TcpTracerInterface> tcp_tracer;

@ -942,13 +942,8 @@ grpc_error_handle grpc_chttp2_header_parser_parse(void* hpack_parser,
grpc_core::CallTracerAnnotationInterface* call_tracer = nullptr;
if (s != nullptr) {
s->stats.incoming.header_bytes += GRPC_SLICE_LENGTH(slice);
if (s->context != nullptr) {
call_tracer = static_cast<grpc_core::CallTracerAnnotationInterface*>(
static_cast<grpc_call_context_element*>(
s->context)[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE]
.value);
}
call_tracer =
s->arena->GetContext<grpc_core::CallTracerAnnotationInterface>();
}
grpc_error_handle error = parser->Parse(
slice, is_last != 0, absl::BitGenRef(t->bitgen), call_tracer);

@ -682,10 +682,10 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write(
grpc_core::GrpcHttp2GetCopyContextFn();
if (copy_context_fn != nullptr &&
grpc_core::GrpcHttp2GetWriteTimestampsCallback() != nullptr) {
t->cl->emplace_back(copy_context_fn(s->context),
outbuf_relative_start_pos, num_stream_bytes,
s->byte_counter, s->write_counter - 1,
s->tcp_tracer);
t->context_list->emplace_back(copy_context_fn(s->arena),
outbuf_relative_start_pos,
num_stream_bytes, s->byte_counter,
s->write_counter - 1, s->tcp_tracer);
}
}
outbuf_relative_start_pos += num_stream_bytes;

@ -40,7 +40,6 @@
#include <grpc/support/port_platform.h>
#include <grpc/support/sync.h>
#include "src/core/handshaker/security/tsi_error.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/gprpp/debug_location.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
@ -340,8 +339,9 @@ static void on_read(void* user_data, grpc_error_handle error) {
if (result != TSI_OK) {
grpc_slice_buffer_reset_and_unref(ep->read_buffer);
call_read_cb(ep, grpc_set_tsi_error_result(
GRPC_ERROR_CREATE("Unwrap failed"), result));
call_read_cb(
ep, GRPC_ERROR_CREATE(absl::StrCat("Unwrap failed (",
tsi_result_to_string(result), ")")));
return;
}
@ -484,7 +484,8 @@ static void endpoint_write(grpc_endpoint* secure_ep, grpc_slice_buffer* slices,
grpc_slice_buffer_reset_and_unref(&ep->output_buffer);
grpc_core::ExecCtx::Run(
DEBUG_LOCATION, cb,
grpc_set_tsi_error_result(GRPC_ERROR_CREATE("Wrap failed"), result));
GRPC_ERROR_CREATE(
absl::StrCat("Wrap failed (", tsi_result_to_string(result), ")")));
return;
}

@ -48,7 +48,6 @@
#include "src/core/handshaker/handshaker_factory.h"
#include "src/core/handshaker/handshaker_registry.h"
#include "src/core/handshaker/security/secure_endpoint.h"
#include "src/core/handshaker/security/tsi_error.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gprpp/debug_location.h"
@ -260,10 +259,9 @@ void SecurityHandshaker::OnPeerCheckedInner(grpc_error_handle error) {
tsi_result result = tsi_handshaker_result_get_unused_bytes(
handshaker_result_, &unused_bytes, &unused_bytes_size);
if (result != TSI_OK) {
HandshakeFailedLocked(grpc_set_tsi_error_result(
GRPC_ERROR_CREATE(
"TSI handshaker result does not provide unused bytes"),
result));
HandshakeFailedLocked(GRPC_ERROR_CREATE(
absl::StrCat("TSI handshaker result does not provide unused bytes (",
tsi_result_to_string(result), ")")));
return;
}
// Check whether we need to wrap the endpoint.
@ -271,10 +269,10 @@ void SecurityHandshaker::OnPeerCheckedInner(grpc_error_handle error) {
result = tsi_handshaker_result_get_frame_protector_type(
handshaker_result_, &frame_protector_type);
if (result != TSI_OK) {
HandshakeFailedLocked(grpc_set_tsi_error_result(
GRPC_ERROR_CREATE("TSI handshaker result does not implement "
"get_frame_protector_type"),
result));
HandshakeFailedLocked(GRPC_ERROR_CREATE(
absl::StrCat("TSI handshaker result does not implement "
"get_frame_protector_type (",
tsi_result_to_string(result), ")")));
return;
}
tsi_zero_copy_grpc_protector* zero_copy_protector = nullptr;
@ -288,9 +286,9 @@ void SecurityHandshaker::OnPeerCheckedInner(grpc_error_handle error) {
handshaker_result_, max_frame_size_ == 0 ? nullptr : &max_frame_size_,
&zero_copy_protector);
if (result != TSI_OK) {
HandshakeFailedLocked(grpc_set_tsi_error_result(
GRPC_ERROR_CREATE("Zero-copy frame protector creation failed"),
result));
HandshakeFailedLocked(GRPC_ERROR_CREATE(
absl::StrCat("Zero-copy frame protector creation failed (",
tsi_result_to_string(result), ")")));
return;
}
break;
@ -300,8 +298,9 @@ void SecurityHandshaker::OnPeerCheckedInner(grpc_error_handle error) {
handshaker_result_, max_frame_size_ == 0 ? nullptr : &max_frame_size_,
&protector);
if (result != TSI_OK) {
HandshakeFailedLocked(grpc_set_tsi_error_result(
GRPC_ERROR_CREATE("Frame protector creation failed"), result));
HandshakeFailedLocked(
GRPC_ERROR_CREATE(absl::StrCat("Frame protector creation failed (",
tsi_result_to_string(result), ")")));
return;
}
break;
@ -356,8 +355,8 @@ grpc_error_handle SecurityHandshaker::CheckPeerLocked() {
tsi_result result =
tsi_handshaker_result_extract_peer(handshaker_result_, &peer);
if (result != TSI_OK) {
return grpc_set_tsi_error_result(
GRPC_ERROR_CREATE("Peer extraction failed"), result);
return GRPC_ERROR_CREATE(absl::StrCat("Peer extraction failed (",
tsi_result_to_string(result), ")"));
}
connector_->check_peer(peer, args_->endpoint, args_->args, &auth_context_,
&on_peer_checked_);
@ -398,11 +397,9 @@ grpc_error_handle SecurityHandshaker::OnHandshakeNextDoneLocked(
if (security_connector != nullptr) {
connector_type = security_connector->type().name();
}
return grpc_set_tsi_error_result(
GRPC_ERROR_CREATE(absl::StrCat(
connector_type, " handshake failed",
(tsi_handshake_error_.empty() ? "" : ": "), tsi_handshake_error_)),
result);
return GRPC_ERROR_CREATE(absl::StrCat(
connector_type, " handshake failed (", tsi_result_to_string(result),
")", (tsi_handshake_error_.empty() ? "" : ": "), tsi_handshake_error_));
}
// Update handshaker result.
if (handshaker_result != nullptr) {

@ -1,31 +0,0 @@
//
//
// Copyright 2015 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
#include "src/core/handshaker/security/tsi_error.h"
#include <grpc/support/port_platform.h>
#include "src/core/lib/gprpp/status_helper.h"
grpc_error_handle grpc_set_tsi_error_result(grpc_error_handle error,
tsi_result result) {
return grpc_error_set_int(
grpc_error_set_str(error, grpc_core::StatusStrProperty::kTsiError,
tsi_result_to_string(result)),
grpc_core::StatusIntProperty::kTsiCode, result);
}

@ -1,30 +0,0 @@
//
//
// Copyright 2015 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
#ifndef GRPC_SRC_CORE_HANDSHAKER_SECURITY_TSI_ERROR_H
#define GRPC_SRC_CORE_HANDSHAKER_SECURITY_TSI_ERROR_H
#include <grpc/support/port_platform.h>
#include "src/core/lib/iomgr/error.h"
#include "src/core/tsi/transport_security_interface.h"
grpc_error_handle grpc_set_tsi_error_result(grpc_error_handle error,
tsi_result result);
#endif // GRPC_SRC_CORE_HANDSHAKER_SECURITY_TSI_ERROR_H

@ -29,29 +29,9 @@
/// This enum represents the indexes into the array, where each index
/// contains a different type of value.
typedef enum {
/// grpc_call* associated with this context.
GRPC_CONTEXT_CALL = 0,
/// Value is a \a census_context.
GRPC_CONTEXT_TRACING,
/// Value is a CallTracerAnnotationInterface. (ClientCallTracer object on the
/// client-side call, or ServerCallTracer on the server-side.)
GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE,
/// Value is a CallTracerInterface (ServerCallTracer on the server-side,
/// CallAttemptTracer on a subchannel call.)
/// TODO(yashykt): Maybe come up with a better name. This will go away in the
/// future anyway, so not super important.
GRPC_CONTEXT_CALL_TRACER,
/// Holds a pointer to ServiceConfigCallData associated with this call.
GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA,
/// Holds a pointer to BackendMetricProvider associated with this call on
/// the server.
GRPC_CONTEXT_BACKEND_METRIC_PROVIDER,
GRPC_CONTEXT_COUNT
} grpc_context_index;
@ -61,9 +41,6 @@ struct grpc_call_context_element {
};
namespace grpc_core {
class Call;
class CallTracerAnnotationInterface;
class CallTracerInterface;
class ServiceConfigCallData;
// Bind the legacy context array into the new style structure
@ -77,22 +54,6 @@ namespace promise_detail {
template <typename T>
struct OldStyleContext;
template <>
struct OldStyleContext<Call> {
static constexpr grpc_context_index kIndex = GRPC_CONTEXT_CALL;
};
template <>
struct OldStyleContext<CallTracerAnnotationInterface> {
static constexpr grpc_context_index kIndex =
GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE;
};
template <>
struct OldStyleContext<CallTracerInterface> {
static constexpr grpc_context_index kIndex = GRPC_CONTEXT_CALL_TRACER;
};
template <>
struct OldStyleContext<ServiceConfigCallData> {
static constexpr grpc_context_index kIndex =

@ -212,14 +212,9 @@ bool CmsgIsZeroCopy(const cmsghdr& cmsg) {
}
#endif // GRPC_LINUX_ERRQUEUE
absl::Status PosixOSError(int error_no, const char* call_name) {
absl::Status s = absl::UnknownError(grpc_core::StrError(error_no));
grpc_core::StatusSetInt(&s, grpc_core::StatusIntProperty::kErrorNo, error_no);
grpc_core::StatusSetStr(&s, grpc_core::StatusStrProperty::kOsError,
grpc_core::StrError(error_no));
grpc_core::StatusSetStr(&s, grpc_core::StatusStrProperty::kSyscall,
call_name);
return s;
absl::Status PosixOSError(int error_no, absl::string_view call_name) {
return absl::UnknownError(absl::StrCat(
call_name, ": ", grpc_core::StrError(error_no), " (", error_no, ")"));
}
} // namespace
@ -282,12 +277,7 @@ void PosixEndpointImpl::FinishEstimate() {
bytes_read_this_round_ = 0;
}
absl::Status PosixEndpointImpl::TcpAnnotateError(absl::Status src_error) {
auto peer_string = ResolvedAddressToNormalizedString(peer_address_);
grpc_core::StatusSetStr(&src_error,
grpc_core::StatusStrProperty::kTargetAddress,
peer_string.ok() ? *peer_string : "");
absl::Status PosixEndpointImpl::TcpAnnotateError(absl::Status src_error) const {
grpc_core::StatusSetInt(&src_error, grpc_core::StatusIntProperty::kFd,
handle_->WrappedFd());
grpc_core::StatusSetInt(&src_error, grpc_core::StatusIntProperty::kRpcStatus,

@ -525,7 +525,7 @@ class PosixEndpointImpl : public grpc_core::RefCounted<PosixEndpointImpl> {
bool WriteWithTimestamps(struct msghdr* msg, size_t sending_length,
ssize_t* sent_length, int* saved_errno,
int additional_flags);
absl::Status TcpAnnotateError(absl::Status src_error);
absl::Status TcpAnnotateError(absl::Status src_error) const;
#ifdef GRPC_LINUX_ERRQUEUE
bool ProcessErrors();
// Reads a cmsg to process zerocopy control messages.

@ -267,13 +267,9 @@ WindowsEventEngineListener::SinglePortSocketListener::PrepareListenerSocket(
SOCKET sock, const EventEngine::ResolvedAddress& addr) {
auto fail = [&](absl::Status error) -> absl::Status {
CHECK(!error.ok());
auto addr_uri = ResolvedAddressToURI(addr);
error = grpc_error_set_int(
grpc_error_set_str(
GRPC_ERROR_CREATE_REFERENCING("Failed to prepare server socket",
&error, 1),
grpc_core::StatusStrProperty::kTargetAddress,
addr_uri.ok() ? *addr_uri : addr_uri.status().ToString()),
GRPC_ERROR_CREATE_REFERENCING("Failed to prepare server socket", &error,
1),
grpc_core::StatusIntProperty::kFd, static_cast<intptr_t>(sock));
if (sock != INVALID_SOCKET) closesocket(sock);
return error;

@ -60,30 +60,16 @@ const absl::string_view kChildrenPropertyUrl = TYPE_URL(TYPE_CHILDREN_TAG);
const char* GetStatusIntPropertyUrl(StatusIntProperty key) {
switch (key) {
case StatusIntProperty::kErrorNo:
return TYPE_URL(TYPE_INT_TAG "errno");
case StatusIntProperty::kFileLine:
return TYPE_URL(TYPE_INT_TAG "file_line");
case StatusIntProperty::kStreamId:
return TYPE_URL(TYPE_INT_TAG "stream_id");
case StatusIntProperty::kRpcStatus:
return TYPE_URL(TYPE_INT_TAG "grpc_status");
case StatusIntProperty::kOffset:
return TYPE_URL(TYPE_INT_TAG "offset");
case StatusIntProperty::kIndex:
return TYPE_URL(TYPE_INT_TAG "index");
case StatusIntProperty::kSize:
return TYPE_URL(TYPE_INT_TAG "size");
case StatusIntProperty::kHttp2Error:
return TYPE_URL(TYPE_INT_TAG "http2_error");
case StatusIntProperty::kTsiCode:
return TYPE_URL(TYPE_INT_TAG "tsi_code");
case StatusIntProperty::kWsaError:
return TYPE_URL(TYPE_INT_TAG "wsa_error");
case StatusIntProperty::kFd:
return TYPE_URL(TYPE_INT_TAG "fd");
case StatusIntProperty::kHttpStatus:
return TYPE_URL(TYPE_INT_TAG "http_status");
case StatusIntProperty::kOccurredDuringWrite:
return TYPE_URL(TYPE_INT_TAG "occurred_during_write");
case StatusIntProperty::ChannelConnectivityState:
@ -100,24 +86,8 @@ const char* GetStatusStrPropertyUrl(StatusStrProperty key) {
return TYPE_URL(TYPE_STR_TAG "description");
case StatusStrProperty::kFile:
return TYPE_URL(TYPE_STR_TAG "file");
case StatusStrProperty::kOsError:
return TYPE_URL(TYPE_STR_TAG "os_error");
case StatusStrProperty::kSyscall:
return TYPE_URL(TYPE_STR_TAG "syscall");
case StatusStrProperty::kTargetAddress:
return TYPE_URL(TYPE_STR_TAG "target_address");
case StatusStrProperty::kGrpcMessage:
return TYPE_URL(TYPE_STR_TAG "grpc_message");
case StatusStrProperty::kRawBytes:
return TYPE_URL(TYPE_STR_TAG "raw_bytes");
case StatusStrProperty::kTsiError:
return TYPE_URL(TYPE_STR_TAG "tsi_error");
case StatusStrProperty::kFilename:
return TYPE_URL(TYPE_STR_TAG "filename");
case StatusStrProperty::kKey:
return TYPE_URL(TYPE_STR_TAG "key");
case StatusStrProperty::kValue:
return TYPE_URL(TYPE_STR_TAG "value");
}
GPR_UNREACHABLE_CODE(return "unknown");
}
@ -348,6 +318,17 @@ std::string StatusToString(const absl::Status& status) {
: absl::StrCat(head, " {", absl::StrJoin(kvs, ", "), "}");
}
absl::Status AddMessagePrefix(absl::string_view prefix, absl::Status status) {
absl::Status new_status(status.code(),
absl::StrCat(prefix, ": ", status.message()));
// TODO(roth): Remove this once we elimiate all status attributes.
status.ForEachPayload(
[&](absl::string_view type_url, const absl::Cord& payload) {
new_status.SetPayload(type_url, payload);
});
return new_status;
}
namespace internal {
google_rpc_Status* StatusToProto(const absl::Status& status, upb_Arena* arena) {

@ -48,8 +48,6 @@ namespace grpc_core {
/// This enum should have the same value of grpc_error_ints
enum class StatusIntProperty {
/// 'errno' from the operating system
kErrorNo,
/// __LINE__ from the call site creating the error
kFileLine,
/// stream identifier: for errors that are associated with an individual
@ -58,23 +56,10 @@ enum class StatusIntProperty {
/// grpc status code representing this error
// TODO(veblush): Remove this after grpc_error is replaced with absl::Status
kRpcStatus,
/// offset into some binary blob (usually represented by
/// RAW_BYTES) where the error occurred
kOffset,
/// context sensitive index associated with the error
kIndex,
/// context sensitive size associated with the error
kSize,
/// http2 error code associated with the error (see the HTTP2 RFC)
kHttp2Error,
/// TSI status code associated with the error
kTsiCode,
/// WSAGetLastError() reported when this error occurred
kWsaError,
/// File descriptor associated with this error
kFd,
/// HTTP status (i.e. 404)
kHttpStatus,
/// chttp2: did the error occur while a write was in progress
kOccurredDuringWrite,
/// channel connectivity state associated with the error
@ -89,24 +74,8 @@ enum class StatusStrProperty {
kDescription,
/// source file in which this error occurred
kFile,
/// operating system description of this error
kOsError,
/// syscall that generated this error
kSyscall,
/// peer that we were trying to communicate when this error occurred
kTargetAddress,
/// grpc status message associated with this error
kGrpcMessage,
/// hex dump (or similar) with the data that generated this error
kRawBytes,
/// tsi error string associated with this error
kTsiError,
/// filename that we were trying to read/write when this error occurred
kFilename,
/// key associated with the error
kKey,
/// value associated with the error
kValue,
};
/// This enum should have the same value of grpc_error_times
@ -158,6 +127,9 @@ GRPC_MUST_USE_RESULT std::vector<absl::Status> StatusGetChildren(
/// CANCELLATION:SampleMessage {errno:'2021', line:'54', children:[ABORTED]}
GRPC_MUST_USE_RESULT std::string StatusToString(const absl::Status& status);
/// Adds prefix to the message of status.
absl::Status AddMessagePrefix(absl::string_view prefix, absl::Status status);
namespace internal {
/// Builds a upb message, google_rpc_Status from a status

@ -106,12 +106,9 @@ static void CFStreamUnref(CFStreamEndpoint* ep) {
static void CFStreamRef(CFStreamEndpoint* ep) { gpr_ref(&ep->refcount); }
#endif
static grpc_error_handle CFStreamAnnotateError(grpc_error_handle src_error,
CFStreamEndpoint* ep) {
return grpc_error_set_str(
grpc_error_set_int(src_error, grpc_core::StatusIntProperty::kRpcStatus,
GRPC_STATUS_UNAVAILABLE),
grpc_core::StatusStrProperty::kTargetAddress, ep->peer_string);
static grpc_error_handle CFStreamAnnotateError(grpc_error_handle src_error) {
return grpc_error_set_int(src_error, grpc_core::StatusIntProperty::kRpcStatus,
GRPC_STATUS_UNAVAILABLE);
}
static void CallReadCb(CFStreamEndpoint* ep, grpc_error_handle error) {
@ -170,7 +167,7 @@ static void ReadAction(void* arg, grpc_error_handle error) {
CFErrorRef stream_error = CFReadStreamCopyError(ep->read_stream);
if (stream_error != nullptr) {
error = CFStreamAnnotateError(
GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "Read error"), ep);
GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "Read error"));
CFRelease(stream_error);
} else {
error = GRPC_ERROR_CREATE("Read error");
@ -179,8 +176,7 @@ static void ReadAction(void* arg, grpc_error_handle error) {
EP_UNREF(ep, "read");
} else if (read_size == 0) {
grpc_slice_buffer_reset_and_unref(ep->read_slices);
CallReadCb(ep,
CFStreamAnnotateError(GRPC_ERROR_CREATE("Socket closed"), ep));
CallReadCb(ep, CFStreamAnnotateError(GRPC_ERROR_CREATE("Socket closed")));
EP_UNREF(ep, "read");
} else {
if (read_size < static_cast<CFIndex>(len)) {
@ -209,7 +205,7 @@ static void WriteAction(void* arg, grpc_error_handle error) {
CFErrorRef stream_error = CFWriteStreamCopyError(ep->write_stream);
if (stream_error != nullptr) {
error = CFStreamAnnotateError(
GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "write failed."), ep);
GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "Write failed"));
CFRelease(stream_error);
} else {
error = GRPC_ERROR_CREATE("write failed.");

@ -21,6 +21,7 @@
#include <string.h>
#include "absl/log/check.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include <grpc/status.h>
@ -58,15 +59,10 @@ absl::Status grpc_status_create(absl::StatusCode code, absl::string_view msg,
absl::Status grpc_os_error(const grpc_core::DebugLocation& location, int err,
const char* call_name) {
auto err_string = grpc_core::StrError(err);
absl::Status s =
StatusCreate(absl::StatusCode::kUnknown, err_string, location, {});
grpc_core::StatusSetInt(&s, grpc_core::StatusIntProperty::kErrorNo, err);
grpc_core::StatusSetStr(&s, grpc_core::StatusStrProperty::kOsError,
err_string);
grpc_core::StatusSetStr(&s, grpc_core::StatusStrProperty::kSyscall,
call_name);
return s;
return StatusCreate(
absl::StatusCode::kUnknown,
absl::StrCat(call_name, ": ", grpc_core::StrError(err), " (", err, ")"),
location, {});
}
#ifdef GPR_WINDOWS
@ -104,15 +100,15 @@ std::string WSAErrorToShortDescription(int err) {
absl::Status grpc_wsa_error(const grpc_core::DebugLocation& location, int err,
absl::string_view call_name) {
char* utf8_message = gpr_format_message(err);
absl::Status s = StatusCreate(absl::StatusCode::kUnavailable,
WSAErrorToShortDescription(err), location, {});
StatusSetInt(&s, grpc_core::StatusIntProperty::kWsaError, err);
StatusSetInt(&s, grpc_core::StatusIntProperty::kRpcStatus,
absl::Status status = StatusCreate(
absl::StatusCode::kUnavailable,
absl::StrCat(call_name, ": ", WSAErrorToShortDescription(err), " (",
utf8_message, " -- ", err, ")"),
location, {});
StatusSetInt(&status, grpc_core::StatusIntProperty::kRpcStatus,
GRPC_STATUS_UNAVAILABLE);
StatusSetStr(&s, grpc_core::StatusStrProperty::kOsError, utf8_message);
StatusSetStr(&s, grpc_core::StatusStrProperty::kSyscall, call_name);
gpr_free(utf8_message);
return s;
return status;
}
#endif

@ -106,14 +106,13 @@ NativeDNSResolver::LookupHostnameBlocking(absl::string_view name,
// parse name, splitting it into host and port parts
SplitHostPort(name, &host, &port);
if (host.empty()) {
err = grpc_error_set_str(GRPC_ERROR_CREATE("unparseable host:port"),
StatusStrProperty::kTargetAddress, name);
err =
GRPC_ERROR_CREATE(absl::StrCat("unparseable host:port \"", name, "\""));
goto done;
}
if (port.empty()) {
if (default_port.empty()) {
err = grpc_error_set_str(GRPC_ERROR_CREATE("no port in name"),
StatusStrProperty::kTargetAddress, name);
err = GRPC_ERROR_CREATE(absl::StrCat("no port in name \"", name, "\""));
goto done;
}
port = std::string(default_port);
@ -139,14 +138,8 @@ NativeDNSResolver::LookupHostnameBlocking(absl::string_view name,
}
}
if (s != 0) {
err = grpc_error_set_str(
grpc_error_set_str(
grpc_error_set_str(
grpc_error_set_int(GRPC_ERROR_CREATE(gai_strerror(s)),
StatusIntProperty::kErrorNo, s),
StatusStrProperty::kOsError, gai_strerror(s)),
StatusStrProperty::kSyscall, "getaddrinfo"),
StatusStrProperty::kTargetAddress, name);
err = absl::UnknownError(absl::StrCat(
"getaddrinfo(\"", name, "\"): ", gai_strerror(s), " (", s, ")"));
goto done;
}
// Success path: fill in addrs

@ -45,6 +45,7 @@
#include "absl/log/check.h"
#include "absl/log/log.h"
#include "absl/strings/str_cat.h"
#include <grpc/event_engine/endpoint_config.h>
#include <grpc/support/alloc.h>
@ -464,15 +465,9 @@ int grpc_ipv6_loopback_available(void) {
return g_ipv6_loopback_available;
}
static grpc_error_handle error_for_fd(int fd,
const grpc_resolved_address* addr) {
static grpc_error_handle error_for_fd(int fd) {
if (fd >= 0) return absl::OkStatus();
auto addr_str = grpc_sockaddr_to_string(addr, false);
grpc_error_handle err = grpc_error_set_str(
GRPC_OS_ERROR(errno, "socket"),
grpc_core::StatusStrProperty::kTargetAddress,
addr_str.ok() ? addr_str.value() : addr_str.status().ToString());
return err;
return GRPC_OS_ERROR(errno, "socket");
}
grpc_error_handle grpc_create_dualstack_socket(
@ -523,7 +518,7 @@ grpc_error_handle grpc_create_dualstack_socket_using_factory(
// If this isn't an IPv4 address, then return whatever we've got.
if (!grpc_sockaddr_is_v4mapped(resolved_addr, nullptr)) {
*dsmode = GRPC_DSMODE_IPV6;
return error_for_fd(*newfd, resolved_addr);
return error_for_fd(*newfd);
}
// Fall back to AF_INET.
if (*newfd >= 0) {
@ -533,7 +528,7 @@ grpc_error_handle grpc_create_dualstack_socket_using_factory(
}
*dsmode = family == AF_INET ? GRPC_DSMODE_IPV4 : GRPC_DSMODE_NONE;
*newfd = create_socket(factory, family, type, protocol);
return error_for_fd(*newfd, resolved_addr);
return error_for_fd(*newfd);
}
#endif

@ -199,8 +199,7 @@ static void on_writable(void* acp, grpc_error_handle error) {
gpr_mu_lock(&ac->mu);
if (!error.ok()) {
error = grpc_error_set_str(error, grpc_core::StatusStrProperty::kOsError,
"Timeout occurred");
error = grpc_core::AddMessagePrefix("Timeout occurred", error);
goto finish;
}
@ -281,8 +280,6 @@ finish:
absl::StrCat("Failed to connect to remote host: ", str);
error = grpc_error_set_str(
error, grpc_core::StatusStrProperty::kDescription, description);
error = grpc_error_set_str(
error, grpc_core::StatusStrProperty::kTargetAddress, addr_str);
}
if (done) {
// This is safe even outside the lock, because "done", the sentinel, is
@ -347,7 +344,7 @@ int64_t grpc_tcp_client_create_from_prepared_fd(
return 0;
}
std::string name = absl::StrCat("tcp-client:", addr_uri.value());
std::string name = absl::StrCat("tcp-client:", *addr_uri);
grpc_fd* fdobj = grpc_fd_create(fd, name.c_str(), true);
int64_t connection_id = 0;
if (connect_errno == EWOULDBLOCK || connect_errno == EINPROGRESS) {
@ -358,7 +355,7 @@ int64_t grpc_tcp_client_create_from_prepared_fd(
if (err >= 0) {
// Connection already succeded. Return 0 to discourage any cancellation
// attempts.
*ep = grpc_tcp_client_create_from_fd(fdobj, options, addr_uri.value());
*ep = grpc_tcp_client_create_from_fd(fdobj, options, *addr_uri);
grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, absl::OkStatus());
return 0;
}
@ -366,8 +363,6 @@ int64_t grpc_tcp_client_create_from_prepared_fd(
// Connection already failed. Return 0 to discourage any cancellation
// attempts.
grpc_error_handle error = GRPC_OS_ERROR(connect_errno, "connect");
error = grpc_error_set_str(
error, grpc_core::StatusStrProperty::kTargetAddress, addr_uri.value());
grpc_fd_orphan(fdobj, nullptr, nullptr, "tcp_client_connect_error");
grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, error);
return 0;

@ -246,10 +246,8 @@ static int64_t tcp_connect(grpc_closure* on_done, grpc_endpoint** endpoint,
failure:
CHECK(!error.ok());
grpc_error_handle final_error = grpc_error_set_str(
GRPC_ERROR_CREATE_REFERENCING("Failed to connect", &error, 1),
grpc_core::StatusStrProperty::kTargetAddress,
addr_uri.ok() ? *addr_uri : addr_uri.status().ToString());
grpc_error_handle final_error =
GRPC_ERROR_CREATE_REFERENCING("Failed to connect", &error, 1);
if (socket != NULL) {
grpc_winsocket_destroy(socket);
} else if (sock != INVALID_SOCKET) {

@ -762,14 +762,11 @@ static void finish_estimate(grpc_tcp* tcp) {
static grpc_error_handle tcp_annotate_error(grpc_error_handle src_error,
grpc_tcp* tcp) {
return grpc_error_set_str(
grpc_error_set_int(
grpc_error_set_int(src_error, grpc_core::StatusIntProperty::kFd,
tcp->fd),
// All tcp errors are marked with UNAVAILABLE so that application may
// choose to retry.
grpc_core::StatusIntProperty::kRpcStatus, GRPC_STATUS_UNAVAILABLE),
grpc_core::StatusStrProperty::kTargetAddress, tcp->peer_string);
return grpc_error_set_int(
grpc_error_set_int(src_error, grpc_core::StatusIntProperty::kFd, tcp->fd),
// All tcp errors are marked with UNAVAILABLE so that application may
// choose to retry.
grpc_core::StatusIntProperty::kRpcStatus, GRPC_STATUS_UNAVAILABLE);
}
static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error_handle error);
@ -1668,10 +1665,6 @@ static bool do_tcp_flush_zerocopy(grpc_tcp* tcp, TcpZerocopySendRecord* record,
if (saved_errno == EAGAIN || saved_errno == ENOBUFS) {
record->UnwindIfThrottled(unwind_slice_idx, unwind_byte_idx);
return false;
} else if (saved_errno == EPIPE) {
*error = tcp_annotate_error(GRPC_OS_ERROR(saved_errno, "sendmsg"), tcp);
tcp_shutdown_buffer_list(tcp);
return true;
} else {
*error = tcp_annotate_error(GRPC_OS_ERROR(saved_errno, "sendmsg"), tcp);
tcp_shutdown_buffer_list(tcp);
@ -1782,11 +1775,6 @@ static bool tcp_flush(grpc_tcp* tcp, grpc_error_handle* error) {
grpc_slice_buffer_remove_first(tcp->outgoing_buffer);
}
return false;
} else if (saved_errno == EPIPE) {
*error = tcp_annotate_error(GRPC_OS_ERROR(saved_errno, "sendmsg"), tcp);
grpc_slice_buffer_reset_and_unref(tcp->outgoing_buffer);
tcp_shutdown_buffer_list(tcp);
return true;
} else {
*error = tcp_annotate_error(GRPC_OS_ERROR(saved_errno, "sendmsg"), tcp);
grpc_slice_buffer_reset_and_unref(tcp->outgoing_buffer);

@ -295,14 +295,9 @@ static grpc_error_handle prepare_socket(SOCKET sock,
failure:
CHECK(!error.ok());
auto addr_uri = grpc_sockaddr_to_uri(addr);
error = grpc_error_set_int(
grpc_error_set_str(
GRPC_ERROR_CREATE_REFERENCING("Failed to prepare server socket",
&error, 1),
grpc_core::StatusStrProperty::kTargetAddress,
addr_uri.ok() ? *addr_uri : addr_uri.status().ToString()),
grpc_core::StatusIntProperty::kFd, (intptr_t)sock);
error = grpc_error_set_int(GRPC_ERROR_CREATE_REFERENCING(
"Failed to prepare server socket", &error, 1),
grpc_core::StatusIntProperty::kFd, (intptr_t)sock);
if (sock != INVALID_SOCKET) closesocket(sock);
return error;
}

@ -17,7 +17,9 @@
#include <grpc/support/port_platform.h>
#include "src/core/lib/promise/context.h"
#include "src/core/lib/promise/detail/promise_like.h"
#include "src/core/lib/resource_quota/arena.h"
namespace grpc_core {
@ -31,6 +33,7 @@ class Handler {
Handler& operator=(const Handler&) = delete;
~Handler() {
if (!done_) {
promise_detail::Context<Arena> ctx(arena_.get());
fn_();
}
}
@ -48,6 +51,13 @@ class Handler {
private:
Fn fn_;
// Since cancellation happens at destruction time we need to either capture
// context here (via the arena), or make sure that no promise is destructed
// without an Arena context on the stack. The latter is an eternal game of
// whackamole, so we're choosing the former for now.
// TODO(ctiller): re-evaluate at some point in the future.
RefCountedPtr<Arena> arena_ =
HasContext<Arena>() ? GetContext<Arena>()->Ref() : nullptr;
bool done_ = false;
};

@ -27,6 +27,7 @@
#include "absl/log/log.h"
#include "absl/status/statusor.h"
#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
@ -283,9 +284,8 @@ static grpc_error_handle create_default_creds_from_path(
json = std::move(*json_or);
}
if (json.type() != Json::Type::kObject) {
error = grpc_error_set_str(GRPC_ERROR_CREATE("Failed to parse JSON"),
grpc_core::StatusStrProperty::kRawBytes,
creds_data->as_string_view());
error = GRPC_ERROR_CREATE(absl::StrCat("Failed to parse JSON \"",
creds_data->as_string_view(), "\""));
goto end;
}

@ -161,8 +161,8 @@ absl::Status Call::InitParent(Call* parent, uint32_t propagation_mask) {
"Census tracing propagation requested without Census context "
"propagation");
}
ContextSet(GRPC_CONTEXT_TRACING, parent->ContextGet(GRPC_CONTEXT_TRACING),
nullptr);
arena()->SetContext<census_context>(
parent->arena()->GetContext<census_context>());
} else if (propagation_mask & GRPC_PROPAGATE_CENSUS_STATS_CONTEXT) {
return absl::UnknownError(
"Census context propagation requested without Census tracing "
@ -602,7 +602,7 @@ class FilterStackCall final : public ChannelBasedCall {
args.send_deadline, args.channel->Ref()),
cq_(args.cq),
stream_op_payload_(context_) {
context_[GRPC_CONTEXT_CALL].value = this;
GetArena()->SetContext<Call>(this);
}
static void ReleaseCall(void* call, grpc_error_handle);
@ -755,7 +755,7 @@ grpc_error_handle FilterStackCall::Create(grpc_call_create_args* args,
GrpcRegisteredMethod(), reinterpret_cast<void*>(static_cast<uintptr_t>(
args->registered_method)));
channel_stack->stats_plugin_group->AddClientCallTracers(
Slice(CSliceRef(path)), args->registered_method, call->context_);
Slice(CSliceRef(path)), args->registered_method, call->GetArena());
} else {
global_stats().IncrementServerCallsCreated();
call->final_op_.server.cancelled = nullptr;
@ -778,12 +778,11 @@ grpc_error_handle FilterStackCall::Create(grpc_call_create_args* args,
// GRPC_CONTEXT_CALL_TRACER as a matter of convenience. In the future
// promise-based world, we would just a single tracer object for each
// stack (call, subchannel_call, server_call.)
call->ContextSet(GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE,
server_call_tracer, nullptr);
call->ContextSet(GRPC_CONTEXT_CALL_TRACER, server_call_tracer, nullptr);
arena->SetContext<CallTracerAnnotationInterface>(server_call_tracer);
arena->SetContext<CallTracerInterface>(server_call_tracer);
}
}
channel_stack->stats_plugin_group->AddServerCallTracers(call->context_);
channel_stack->stats_plugin_group->AddServerCallTracers(arena.get());
}
Call* parent = Call::FromC(args->parent);
@ -1230,8 +1229,7 @@ FilterStackCall::BatchControl* FilterStackCall::ReuseOrAllocateBatchControl(
*pslot = bctl;
}
bctl->call_ = this;
bctl->call_tracer_ = static_cast<CallTracerAnnotationInterface*>(
ContextGet(GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE));
bctl->call_tracer_ = arena()->GetContext<CallTracerAnnotationInterface>();
bctl->op_.payload = &stream_op_payload_;
return bctl;
}
@ -1919,7 +1917,7 @@ class BasicPromiseBasedCall : public ChannelBasedCall, public Party {
if (args.cq != nullptr) {
GRPC_CQ_INTERNAL_REF(args.cq, "bind");
}
context_[GRPC_CONTEXT_CALL].value = this;
GetArena()->SetContext<Call>(this);
}
~BasicPromiseBasedCall() override {
@ -2612,7 +2610,7 @@ class ClientPromiseBasedCall final : public PromiseBasedCall {
}
ScopedContext context(this);
args->channel->channel_stack()->stats_plugin_group->AddClientCallTracers(
*args->path, args->registered_method, this->context());
*args->path, args->registered_method, GetArena());
send_initial_metadata_ = Arena::MakePooled<ClientMetadata>();
send_initial_metadata_->Set(HttpPathMetadata(), std::move(*args->path));
if (args->authority.has_value()) {
@ -3175,8 +3173,7 @@ class ServerCall final : public Call, public DualRefCounted<ServerCall> {
client_initial_metadata_stored_(std::move(client_initial_metadata)),
cq_(cq),
server_(server) {
call_handler_.legacy_context()[GRPC_CONTEXT_CALL].value =
static_cast<Call*>(this);
call_handler_.arena()->SetContext<Call>(this);
global_stats().IncrementServerCallsCreated();
}
@ -3762,6 +3759,19 @@ void* grpc_call_context_get(grpc_call* call, grpc_context_index elem) {
return grpc_core::Call::FromC(call)->ContextGet(elem);
}
void grpc_call_tracer_set(grpc_call* call,
grpc_core::ClientCallTracer* tracer) {
grpc_core::Arena* arena = grpc_call_get_arena(call);
return arena->SetContext<grpc_core::CallTracerAnnotationInterface>(tracer);
}
void* grpc_call_tracer_get(grpc_call* call) {
grpc_core::Arena* arena = grpc_call_get_arena(call);
auto* call_tracer =
arena->GetContext<grpc_core::CallTracerAnnotationInterface>();
return call_tracer;
}
uint8_t grpc_call_is_client(grpc_call* call) {
return grpc_core::Call::FromC(call)->is_client();
}

@ -78,6 +78,11 @@ typedef struct grpc_call_create_args {
namespace grpc_core {
template <>
struct ArenaContextType<census_context> {
static void Destroy(census_context*) {}
};
class Call : public CppImplOf<Call, grpc_call>,
public grpc_event_engine::experimental::EventEngine::
Closure /* for deadlines */ {
@ -241,6 +246,11 @@ class Call : public CppImplOf<Call, grpc_call>,
gpr_cycle_counter start_time_ = gpr_get_cycle_counter();
};
template <>
struct ArenaContextType<Call> {
static void Destroy(Call*) {}
};
class BasicPromiseBasedCall;
class ServerPromiseBasedCall;
@ -338,6 +348,10 @@ void grpc_call_context_set(grpc_call* call, grpc_context_index elem,
// Get a context pointer.
void* grpc_call_context_get(grpc_call* call, grpc_context_index elem);
void grpc_call_tracer_set(grpc_call* call, grpc_core::ClientCallTracer* tracer);
void* grpc_call_tracer_get(grpc_call* call);
#define GRPC_CALL_LOG_BATCH(sev, ops, nops) \
do { \
if (GRPC_TRACE_FLAG_ENABLED(grpc_api_trace)) { \

@ -884,14 +884,11 @@ grpc_error_handle grpc_dns_lookup_ares_continued(
grpc_core::SplitHostPort(name, host, port);
if (host->empty()) {
error =
grpc_error_set_str(GRPC_ERROR_CREATE("unparseable host:port"),
grpc_core::StatusStrProperty::kTargetAddress, name);
GRPC_ERROR_CREATE(absl::StrCat("unparseable host:port \"", name, "\""));
return error;
} else if (check_port && port->empty()) {
if (default_port == nullptr || strlen(default_port) == 0) {
error = grpc_error_set_str(GRPC_ERROR_CREATE("no port in name"),
grpc_core::StatusStrProperty::kTargetAddress,
name);
error = GRPC_ERROR_CREATE(absl::StrCat("no port in name \"", name, "\""));
return error;
}
*port = default_port;

@ -56,25 +56,25 @@ class ServerCallTracerFilter
class Call {
public:
void OnClientInitialMetadata(ClientMetadata& client_initial_metadata) {
auto* call_tracer = CallTracer();
auto* call_tracer = MaybeGetContext<ServerCallTracer>();
if (call_tracer == nullptr) return;
call_tracer->RecordReceivedInitialMetadata(&client_initial_metadata);
}
void OnServerInitialMetadata(ServerMetadata& server_initial_metadata) {
auto* call_tracer = CallTracer();
auto* call_tracer = MaybeGetContext<ServerCallTracer>();
if (call_tracer == nullptr) return;
call_tracer->RecordSendInitialMetadata(&server_initial_metadata);
}
void OnFinalize(const grpc_call_final_info* final_info) {
auto* call_tracer = CallTracer();
auto* call_tracer = MaybeGetContext<ServerCallTracer>();
if (call_tracer == nullptr) return;
call_tracer->RecordEnd(final_info);
}
void OnServerTrailingMetadata(ServerMetadata& server_trailing_metadata) {
auto* call_tracer = CallTracer();
auto* call_tracer = MaybeGetContext<ServerCallTracer>();
if (call_tracer == nullptr) return;
call_tracer->RecordSendTrailingMetadata(&server_trailing_metadata);
}
@ -82,13 +82,6 @@ class ServerCallTracerFilter
static const NoInterceptor OnClientToServerMessage;
static const NoInterceptor OnClientToServerHalfClose;
static const NoInterceptor OnServerToClientMessage;
private:
static ServerCallTracer* CallTracer() {
auto* call_context = GetContext<grpc_call_context_element>();
return static_cast<ServerCallTracer*>(
call_context[GRPC_CONTEXT_CALL_TRACER].value);
}
};
};

@ -299,63 +299,53 @@ class DelegatingServerCallTracer : public ServerCallTracer {
std::vector<ServerCallTracer*> tracers_;
};
void AddClientCallTracerToContext(grpc_call_context_element* call_context,
ClientCallTracer* tracer) {
if (call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value ==
nullptr) {
void AddClientCallTracerToContext(Arena* arena, ClientCallTracer* tracer) {
if (arena->GetContext<CallTracerAnnotationInterface>() == nullptr) {
// This is the first call tracer. Set it directly.
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value = tracer;
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].destroy =
nullptr;
arena->SetContext<CallTracerAnnotationInterface>(tracer);
} else {
// There was already a call tracer present.
auto* orig_tracer = static_cast<ClientCallTracer*>(
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value);
auto* orig_tracer = DownCast<ClientCallTracer*>(
arena->GetContext<CallTracerAnnotationInterface>());
if (orig_tracer->IsDelegatingTracer()) {
// We already created a delegating tracer. Just add the new tracer to the
// list.
static_cast<DelegatingClientCallTracer*>(orig_tracer)->AddTracer(tracer);
DownCast<DelegatingClientCallTracer*>(orig_tracer)->AddTracer(tracer);
} else {
// Create a new delegating tracer and add the first tracer and the new
// tracer to the list.
auto* delegating_tracer =
GetContext<Arena>()->ManagedNew<DelegatingClientCallTracer>(
orig_tracer);
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value =
delegating_tracer;
arena->SetContext<CallTracerAnnotationInterface>(delegating_tracer);
delegating_tracer->AddTracer(tracer);
}
}
}
void AddServerCallTracerToContext(grpc_call_context_element* call_context,
ServerCallTracer* tracer) {
DCHECK(call_context[GRPC_CONTEXT_CALL_TRACER].value ==
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value);
if (call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value ==
nullptr) {
void AddServerCallTracerToContext(Arena* arena, ServerCallTracer* tracer) {
DCHECK_EQ(arena->GetContext<CallTracerInterface>(),
arena->GetContext<CallTracerAnnotationInterface>());
if (arena->GetContext<CallTracerAnnotationInterface>() == nullptr) {
// This is the first call tracer. Set it directly.
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value = tracer;
call_context[GRPC_CONTEXT_CALL_TRACER].value = tracer;
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].destroy =
nullptr;
arena->SetContext<CallTracerAnnotationInterface>(tracer);
arena->SetContext<CallTracerInterface>(tracer);
} else {
// There was already a call tracer present.
auto* orig_tracer = static_cast<ServerCallTracer*>(
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value);
auto* orig_tracer = DownCast<ServerCallTracer*>(
arena->GetContext<CallTracerAnnotationInterface>());
if (orig_tracer->IsDelegatingTracer()) {
// We already created a delegating tracer. Just add the new tracer to the
// list.
static_cast<DelegatingServerCallTracer*>(orig_tracer)->AddTracer(tracer);
DownCast<DelegatingServerCallTracer*>(orig_tracer)->AddTracer(tracer);
} else {
// Create a new delegating tracer and add the first tracer and the new
// tracer to the list.
auto* delegating_tracer =
GetContext<Arena>()->ManagedNew<DelegatingServerCallTracer>(
orig_tracer);
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value =
delegating_tracer;
call_context[GRPC_CONTEXT_CALL_TRACER].value = delegating_tracer;
arena->SetContext<CallTracerAnnotationInterface>(delegating_tracer);
arena->SetContext<CallTracerInterface>(delegating_tracer);
delegating_tracer->AddTracer(tracer);
}
}

@ -214,13 +214,21 @@ class ServerCallTracerFactory {
// Convenience functions to add call tracers to a call context. Allows setting
// multiple call tracers to a single call. It is only valid to add client call
// tracers before the client_channel filter sees the send_initial_metadata op.
void AddClientCallTracerToContext(grpc_call_context_element* call_context,
ClientCallTracer* tracer);
void AddClientCallTracerToContext(Arena* arena, ClientCallTracer* tracer);
// TODO(yashykt): We want server call tracers to be registered through the
// ServerCallTracerFactory, which has yet to be made into a list.
void AddServerCallTracerToContext(grpc_call_context_element* call_context,
ServerCallTracer* tracer);
void AddServerCallTracerToContext(Arena* arena, ServerCallTracer* tracer);
template <>
struct ArenaContextType<CallTracerInterface> {
static void Destroy(CallTracerAnnotationInterface*) {}
};
template <>
struct ArenaContextType<CallTracerAnnotationInterface> {
static void Destroy(CallTracerAnnotationInterface*) {}
};
template <>
struct ContextSubclass<ClientCallTracer::CallAttemptTracer> {

@ -100,23 +100,22 @@ RegisteredMetricCallback::~RegisteredMetricCallback() {
}
void GlobalStatsPluginRegistry::StatsPluginGroup::AddClientCallTracers(
const Slice& path, bool registered_method,
grpc_call_context_element* call_context) {
const Slice& path, bool registered_method, Arena* arena) {
for (auto& state : plugins_state_) {
auto* call_tracer = state.plugin->GetClientCallTracer(
path, registered_method, state.scope_config);
if (call_tracer != nullptr) {
AddClientCallTracerToContext(call_context, call_tracer);
AddClientCallTracerToContext(arena, call_tracer);
}
}
}
void GlobalStatsPluginRegistry::StatsPluginGroup::AddServerCallTracers(
grpc_call_context_element* call_context) {
Arena* arena) {
for (auto& state : plugins_state_) {
auto* call_tracer = state.plugin->GetServerCallTracer(state.scope_config);
if (call_tracer != nullptr) {
AddServerCallTracerToContext(call_context, call_tracer);
AddServerCallTracerToContext(arena, call_tracer);
}
}
}

@ -464,10 +464,10 @@ class GlobalStatsPluginRegistry {
// Adds all available client call tracers associated with the stats plugins
// within the group to \a call_context.
void AddClientCallTracers(const Slice& path, bool registered_method,
grpc_call_context_element* call_context);
Arena* arena);
// Adds all available server call tracers associated with the stats plugins
// within the group to \a call_context.
void AddServerCallTracers(grpc_call_context_element* call_context);
void AddServerCallTracers(Arena* arena);
private:
friend class RegisteredMetricCallback;

@ -244,11 +244,8 @@ void HttpRequest::AppendError(grpc_error_handle error) {
}
const grpc_resolved_address* addr = &addresses_[next_address_ - 1];
auto addr_text = grpc_sockaddr_to_uri(addr);
overall_error_ = grpc_error_add_child(
overall_error_,
grpc_error_set_str(
error, StatusStrProperty::kTargetAddress,
addr_text.ok() ? addr_text.value() : addr_text.status().ToString()));
if (addr_text.ok()) error = AddMessagePrefix(*addr_text, std::move(error));
overall_error_ = grpc_error_add_child(overall_error_, std::move(error));
}
void HttpRequest::OnReadInternal(grpc_error_handle error) {

@ -100,17 +100,15 @@ OpenCensusClientFilter::MakeCallPromise(
grpc_core::NextPromiseFactory next_promise_factory) {
auto* path = call_args.client_initial_metadata->get_pointer(
grpc_core::HttpPathMetadata());
auto* call_context = grpc_core::GetContext<grpc_call_context_element>();
auto* tracer =
grpc_core::GetContext<grpc_core::Arena>()
->ManagedNew<OpenCensusCallTracer>(
call_context, path != nullptr ? path->Ref() : grpc_core::Slice(),
grpc_core::GetContext<grpc_core::Arena>(),
OpenCensusTracingEnabled() && tracing_enabled_);
DCHECK(call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value ==
nullptr);
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value = tracer;
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].destroy = nullptr;
auto* arena = grpc_core::GetContext<grpc_core::Arena>();
auto* tracer = arena->ManagedNew<OpenCensusCallTracer>(
grpc_core::GetContext<grpc_call_context_element>(),
path != nullptr ? path->Ref() : grpc_core::Slice(),
grpc_core::GetContext<grpc_core::Arena>(),
OpenCensusTracingEnabled() && tracing_enabled_);
DCHECK_EQ(arena->GetContext<grpc_core::CallTracerAnnotationInterface>(),
nullptr);
grpc_core::SetContext<grpc_core::CallTracerAnnotationInterface>(tracer);
return next_promise_factory(std::move(call_args));
}
@ -314,8 +312,8 @@ OpenCensusCallTracer::OpenCensusCallTracer(
method_(GetMethod(path_)),
arena_(arena),
tracing_enabled_(tracing_enabled) {
auto* parent_context = reinterpret_cast<CensusContext*>(
call_context_[GRPC_CONTEXT_TRACING].value);
auto* parent_context =
reinterpret_cast<CensusContext*>(arena->GetContext<census_context>());
GenerateClientContext(tracing_enabled_ ? absl::StrCat("Sent.", method_) : "",
&context_,
(parent_context == nullptr) ? nullptr : parent_context);
@ -424,9 +422,9 @@ class OpenCensusClientInterceptor : public grpc::experimental::Interceptor {
grpc::experimental::InterceptorBatchMethods* methods) override {
if (methods->QueryInterceptionHookPoint(
grpc::experimental::InterceptionHookPoints::POST_RECV_STATUS)) {
auto* tracer = static_cast<OpenCensusCallTracer*>(
grpc_call_context_get(info_->client_context()->c_call(),
GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE));
auto* tracer = grpc_core::DownCast<OpenCensusCallTracer*>(
grpc_call_get_arena(info_->client_context()->c_call())
->GetContext<grpc_core::CallTracerAnnotationInterface>());
if (tracer != nullptr) {
tracer->RecordApiLatency(absl::Now() - start_time_,
static_cast<absl::StatusCode>(

@ -40,16 +40,16 @@
#include "opencensus/trace/span_id.h"
#include "opencensus/trace/trace_id.h"
#include <grpc/grpc.h>
#include <grpc/support/port_platform.h>
#include <grpcpp/opencensus.h>
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/channel/context.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/promise/context.h"
#include "src/core/lib/resource_quota/arena.h"
#include "src/core/lib/slice/slice.h"
#include "src/core/lib/slice/slice_buffer.h"
#include "src/core/lib/surface/call.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/telemetry/call_tracer.h"
#include "src/core/telemetry/tcp_tracer.h"
@ -206,8 +206,8 @@ void OpenCensusServerCallTracer::RecordReceivedInitialMetadata(
tracing_enabled ? sml.tracing_slice.as_string_view() : "",
absl::StrCat("Recv.", method_), &context_);
if (tracing_enabled) {
auto* call_context = grpc_core::GetContext<grpc_call_context_element>();
call_context[GRPC_CONTEXT_TRACING].value = &context_;
grpc_core::SetContext<census_context>(
reinterpret_cast<census_context*>(&context_));
}
if (OpenCensusStatsEnabled()) {
std::vector<std::pair<opencensus::tags::TagKey, std::string>> tags =

@ -410,8 +410,7 @@ void ServerContextBase::CreateCallMetricRecorder(
auto* backend_metric_state =
arena->New<BackendMetricState>(server_metric_recorder);
call_metric_recorder_ = backend_metric_state;
grpc_call_context_set(call_.call, GRPC_CONTEXT_BACKEND_METRIC_PROVIDER,
backend_metric_state, nullptr);
arena->SetContext<grpc_core::BackendMetricProvider>(backend_metric_state);
}
grpc::string_ref ServerContextBase::ExperimentalGetAuthority() const {

@ -63,6 +63,9 @@ cdef extern from "src/core/telemetry/call_tracer.h" namespace "grpc_core":
cdef cppclass ClientCallTracer:
pass
cdef cppclass CallTracerAnnotationInterface:
pass
cdef cppclass ServerCallTracer:
string TraceId() nogil
string SpanId() nogil
@ -72,14 +75,10 @@ cdef extern from "src/core/telemetry/call_tracer.h" namespace "grpc_core":
@staticmethod
void RegisterGlobal(ServerCallTracerFactory* factory) nogil
cdef extern from "src/core/lib/channel/context.h":
ctypedef enum grpc_context_index:
GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE
cdef extern from "src/core/lib/surface/call.h":
void grpc_call_context_set(grpc_call* call, grpc_context_index elem,
void* value, void (*destroy)(void* value)) nogil
void *grpc_call_context_get(grpc_call* call, grpc_context_index elem) nogil
void grpc_call_tracer_set(grpc_call* call, void* value) nogil
void* grpc_call_tracer_get(grpc_call* call) nogil
cdef extern from "grpc/support/alloc.h":

@ -50,11 +50,11 @@ def maybe_save_server_trace_context(RequestCallEvent event) -> None:
cdef void _set_call_tracer(grpc_call* call, void* capsule_ptr):
cdef ClientCallTracer* call_tracer = <ClientCallTracer*>capsule_ptr
grpc_call_context_set(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE, call_tracer, NULL)
grpc_call_tracer_set(call, call_tracer)
cdef void* _get_call_tracer(grpc_call* call):
cdef void* call_tracer = grpc_call_context_get(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE)
cdef void* call_tracer = grpc_call_tracer_get(call)
return call_tracer

@ -412,7 +412,6 @@ CORE_SOURCE_FILES = [
'src/core/handshaker/proxy_mapper_registry.cc',
'src/core/handshaker/security/secure_endpoint.cc',
'src/core/handshaker/security/security_handshaker.cc',
'src/core/handshaker/security/tsi_error.cc',
'src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc',
'src/core/lib/address_utils/parse_address.cc',
'src/core/lib/address_utils/sockaddr_utils.cc',

@ -47,26 +47,26 @@ TEST(StatusUtilTest, CreateStatus) {
TEST(StatusUtilTest, SetAndGetInt) {
absl::Status s = absl::CancelledError();
StatusSetInt(&s, StatusIntProperty::kErrorNo, 2021);
EXPECT_EQ(2021, StatusGetInt(s, StatusIntProperty::kErrorNo));
StatusSetInt(&s, StatusIntProperty::kStreamId, 2021);
EXPECT_EQ(2021, StatusGetInt(s, StatusIntProperty::kStreamId));
}
TEST(StatusUtilTest, GetIntNotExistent) {
absl::Status s = absl::CancelledError();
EXPECT_EQ(absl::optional<intptr_t>(),
StatusGetInt(s, StatusIntProperty::kErrorNo));
StatusGetInt(s, StatusIntProperty::kStreamId));
}
TEST(StatusUtilTest, SetAndGetStr) {
absl::Status s = absl::CancelledError();
StatusSetStr(&s, StatusStrProperty::kOsError, "value");
EXPECT_EQ("value", StatusGetStr(s, StatusStrProperty::kOsError));
StatusSetStr(&s, StatusStrProperty::kFile, "value");
EXPECT_EQ("value", StatusGetStr(s, StatusStrProperty::kFile));
}
TEST(StatusUtilTest, GetStrNotExistent) {
absl::Status s = absl::CancelledError();
EXPECT_EQ(absl::optional<std::string>(),
StatusGetStr(s, StatusStrProperty::kOsError));
StatusGetStr(s, StatusStrProperty::kFile));
}
TEST(StatusUtilTest, SetAndGetTime) {
@ -96,8 +96,8 @@ TEST(StatusUtilTest, AddAndGetChildren) {
TEST(StatusUtilTest, ToAndFromProto) {
absl::Status s = absl::CancelledError("Message");
StatusSetInt(&s, StatusIntProperty::kErrorNo, 2021);
StatusSetStr(&s, StatusStrProperty::kOsError, "value");
StatusSetInt(&s, StatusIntProperty::kStreamId, 2021);
StatusSetStr(&s, StatusStrProperty::kFile, "value");
upb::Arena arena;
google_rpc_Status* msg = internal::StatusToProto(s, arena.ptr());
size_t len;
@ -109,8 +109,8 @@ TEST(StatusUtilTest, ToAndFromProto) {
TEST(StatusUtilTest, ToAndFromProtoWithNonUTF8Characters) {
absl::Status s = absl::CancelledError("_\xAB\xCD\xEF_");
StatusSetInt(&s, StatusIntProperty::kErrorNo, 2021);
StatusSetStr(&s, StatusStrProperty::kOsError, "!\xFF\xCC\xAA!");
StatusSetInt(&s, StatusIntProperty::kStreamId, 2021);
StatusSetStr(&s, StatusStrProperty::kFile, "!\xFF\xCC\xAA!");
upb::Arena arena;
google_rpc_Status* msg = internal::StatusToProto(s, arena.ptr());
size_t len;
@ -134,9 +134,9 @@ TEST(StatusUtilTest, CancelledErrorToString) {
TEST(StatusUtilTest, ErrorWithIntPropertyToString) {
absl::Status s = absl::CancelledError("Message");
StatusSetInt(&s, StatusIntProperty::kErrorNo, 2021);
StatusSetInt(&s, StatusIntProperty::kStreamId, 2021);
std::string t = StatusToString(s);
EXPECT_EQ("CANCELLED:Message {errno:2021}", t);
EXPECT_EQ("CANCELLED:Message {stream_id:2021}", t);
}
TEST(StatusUtilTest, ErrorWithStrPropertyToString) {
@ -158,16 +158,16 @@ TEST(StatusUtilTest, ErrorWithTimePropertyToString) {
TEST(StatusUtilTest, ComplexErrorWithChildrenToString) {
absl::Status s = absl::CancelledError("Message");
StatusSetInt(&s, StatusIntProperty::kErrorNo, 2021);
StatusSetInt(&s, StatusIntProperty::kStreamId, 2021);
absl::Status s1 = absl::AbortedError("Message1");
StatusAddChild(&s, s1);
absl::Status s2 = absl::AlreadyExistsError("Message2");
StatusSetStr(&s2, StatusStrProperty::kOsError, "value");
StatusSetStr(&s2, StatusStrProperty::kFile, "value");
StatusAddChild(&s, s2);
std::string t = StatusToString(s);
EXPECT_EQ(
"CANCELLED:Message {errno:2021, children:["
"ABORTED:Message1, ALREADY_EXISTS:Message2 {os_error:\"value\"}]}",
"CANCELLED:Message {stream_id:2021, children:["
"ABORTED:Message1, ALREADY_EXISTS:Message2 {file:\"value\"}]}",
t);
}

@ -23,11 +23,13 @@
#include <gmock/gmock.h>
#include "absl/log/log.h"
#include "absl/strings/str_cat.h"
#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/gprpp/strerror.h"
#include "test/core/test_util/test_config.h"
TEST(ErrorTest, SetGetInt) {
@ -41,16 +43,9 @@ TEST(ErrorTest, SetGetInt) {
EXPECT_TRUE(i); // line set will never be 0
#endif
EXPECT_TRUE(
!grpc_error_get_int(error, grpc_core::StatusIntProperty::kErrorNo, &i));
EXPECT_TRUE(
!grpc_error_get_int(error, grpc_core::StatusIntProperty::kSize, &i));
intptr_t errnumber = 314;
error = grpc_error_set_int(error, grpc_core::StatusIntProperty::kErrorNo,
errnumber);
EXPECT_TRUE(
grpc_error_get_int(error, grpc_core::StatusIntProperty::kErrorNo, &i));
EXPECT_EQ(i, errnumber);
!grpc_error_get_int(error, grpc_core::StatusIntProperty::kStreamId, &i));
EXPECT_TRUE(!grpc_error_get_int(
error, grpc_core::StatusIntProperty::kHttp2Error, &i));
intptr_t http = 2;
error = grpc_error_set_int(error, grpc_core::StatusIntProperty::kHttp2Error,
@ -64,10 +59,6 @@ TEST(ErrorTest, SetGetStr) {
grpc_error_handle error = GRPC_ERROR_CREATE("Test");
std::string str;
EXPECT_TRUE(
!grpc_error_get_str(error, grpc_core::StatusStrProperty::kSyscall, &str));
EXPECT_TRUE(!grpc_error_get_str(
error, grpc_core::StatusStrProperty::kTsiError, &str));
#ifndef NDEBUG
// grpc_core::StatusStrProperty::kFile is for debug only
EXPECT_TRUE(
@ -90,28 +81,24 @@ TEST(ErrorTest, SetGetStr) {
TEST(ErrorTest, CopyAndUnRef) {
// error1 has one ref
grpc_error_handle error1 =
grpc_error_set_str(GRPC_ERROR_CREATE("Test"),
grpc_core::StatusStrProperty::kGrpcMessage, "message");
std::string str;
EXPECT_TRUE(grpc_error_get_str(
error1, grpc_core::StatusStrProperty::kGrpcMessage, &str));
EXPECT_EQ(str, "message");
grpc_error_handle error1 = grpc_error_set_int(
GRPC_ERROR_CREATE("Test"), grpc_core::StatusIntProperty::kStreamId, 1);
intptr_t i;
EXPECT_TRUE(
grpc_error_get_int(error1, grpc_core::StatusIntProperty::kStreamId, &i));
EXPECT_EQ(i, 1);
// this gives error3 a ref to the new error, and decrements error1 to one ref
grpc_error_handle error3 = grpc_error_set_str(
error1, grpc_core::StatusStrProperty::kSyscall, "syscall");
grpc_error_handle error3 =
grpc_error_set_int(error1, grpc_core::StatusIntProperty::kHttp2Error, 2);
EXPECT_NE(error3, error1); // should not be the same because of extra ref
EXPECT_TRUE(grpc_error_get_str(
error3, grpc_core::StatusStrProperty::kGrpcMessage, &str));
EXPECT_EQ(str, "message");
EXPECT_TRUE(grpc_error_get_int(
error3, grpc_core::StatusIntProperty::kHttp2Error, &i));
EXPECT_EQ(i, 2);
// error 1 should not have a syscall but 3 should
EXPECT_TRUE(!grpc_error_get_str(
error1, grpc_core::StatusStrProperty::kSyscall, &str));
EXPECT_TRUE(
grpc_error_get_str(error3, grpc_core::StatusStrProperty::kSyscall, &str));
EXPECT_EQ(str, "syscall");
// error 1 should not have kHttp2Error
EXPECT_FALSE(grpc_error_get_int(
error1, grpc_core::StatusIntProperty::kHttp2Error, &i));
}
TEST(ErrorTest, CreateReferencing) {
@ -146,7 +133,8 @@ TEST(ErrorTest, PrintErrorString) {
grpc_error_handle error = grpc_error_set_int(
GRPC_ERROR_CREATE("Error"), grpc_core::StatusIntProperty::kRpcStatus,
GRPC_STATUS_UNIMPLEMENTED);
error = grpc_error_set_int(error, grpc_core::StatusIntProperty::kSize, 666);
error =
grpc_error_set_int(error, grpc_core::StatusIntProperty::kHttp2Error, 666);
error = grpc_error_set_str(error, grpc_core::StatusStrProperty::kGrpcMessage,
"message");
// VLOG(2) << grpc_core::StatusToString(error);
@ -176,16 +164,8 @@ TEST(ErrorTest, TestOsError) {
int fake_errno = 5;
const char* syscall = "syscall name";
grpc_error_handle error = GRPC_OS_ERROR(fake_errno, syscall);
intptr_t i = 0;
EXPECT_TRUE(
grpc_error_get_int(error, grpc_core::StatusIntProperty::kErrorNo, &i));
EXPECT_EQ(i, fake_errno);
std::string str;
EXPECT_TRUE(
grpc_error_get_str(error, grpc_core::StatusStrProperty::kSyscall, &str));
EXPECT_EQ(str, syscall);
EXPECT_EQ(error.message(),
absl::StrCat("syscall name: ", grpc_core::StrError(5), " (5)"));
}
int main(int argc, char** argv) {

@ -38,16 +38,13 @@ namespace {
class CallTracerTest : public ::testing::Test {
protected:
RefCountedPtr<Arena> arena_ = SimpleArenaAllocator()->MakeArena();
grpc_call_context_element context_[GRPC_CONTEXT_COUNT] = {};
std::vector<std::string> annotation_logger_;
};
TEST_F(CallTracerTest, BasicClientCallTracer) {
FakeClientCallTracer client_call_tracer(&annotation_logger_);
AddClientCallTracerToContext(context_, &client_call_tracer);
static_cast<CallTracerAnnotationInterface*>(
context_[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value)
->RecordAnnotation("Test");
AddClientCallTracerToContext(arena_.get(), &client_call_tracer);
arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
EXPECT_EQ(annotation_logger_, std::vector<std::string>{"Test"});
}
@ -56,12 +53,10 @@ TEST_F(CallTracerTest, MultipleClientCallTracers) {
FakeClientCallTracer client_call_tracer1(&annotation_logger_);
FakeClientCallTracer client_call_tracer2(&annotation_logger_);
FakeClientCallTracer client_call_tracer3(&annotation_logger_);
AddClientCallTracerToContext(context_, &client_call_tracer1);
AddClientCallTracerToContext(context_, &client_call_tracer2);
AddClientCallTracerToContext(context_, &client_call_tracer3);
static_cast<CallTracerAnnotationInterface*>(
context_[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value)
->RecordAnnotation("Test");
AddClientCallTracerToContext(arena_.get(), &client_call_tracer1);
AddClientCallTracerToContext(arena_.get(), &client_call_tracer2);
AddClientCallTracerToContext(arena_.get(), &client_call_tracer3);
arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
EXPECT_EQ(annotation_logger_,
std::vector<std::string>({"Test", "Test", "Test"}));
}
@ -71,12 +66,12 @@ TEST_F(CallTracerTest, MultipleClientCallAttemptTracers) {
FakeClientCallTracer client_call_tracer1(&annotation_logger_);
FakeClientCallTracer client_call_tracer2(&annotation_logger_);
FakeClientCallTracer client_call_tracer3(&annotation_logger_);
AddClientCallTracerToContext(context_, &client_call_tracer1);
AddClientCallTracerToContext(context_, &client_call_tracer2);
AddClientCallTracerToContext(context_, &client_call_tracer3);
AddClientCallTracerToContext(arena_.get(), &client_call_tracer1);
AddClientCallTracerToContext(arena_.get(), &client_call_tracer2);
AddClientCallTracerToContext(arena_.get(), &client_call_tracer3);
auto* attempt_tracer =
static_cast<ClientCallTracer*>(
context_[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value)
DownCast<ClientCallTracer*>(
arena_->GetContext<CallTracerAnnotationInterface>())
->StartNewAttempt(true /* is_transparent_retry */);
attempt_tracer->RecordAnnotation("Test");
EXPECT_EQ(annotation_logger_,
@ -86,13 +81,9 @@ TEST_F(CallTracerTest, MultipleClientCallAttemptTracers) {
TEST_F(CallTracerTest, BasicServerCallTracerTest) {
FakeServerCallTracer server_call_tracer(&annotation_logger_);
AddServerCallTracerToContext(context_, &server_call_tracer);
static_cast<CallTracerAnnotationInterface*>(
context_[GRPC_CONTEXT_CALL_TRACER].value)
->RecordAnnotation("Test");
static_cast<CallTracerAnnotationInterface*>(
context_[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value)
->RecordAnnotation("Test");
AddServerCallTracerToContext(arena_.get(), &server_call_tracer);
arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
EXPECT_EQ(annotation_logger_, std::vector<std::string>({"Test", "Test"}));
}
@ -101,12 +92,10 @@ TEST_F(CallTracerTest, MultipleServerCallTracers) {
FakeServerCallTracer server_call_tracer1(&annotation_logger_);
FakeServerCallTracer server_call_tracer2(&annotation_logger_);
FakeServerCallTracer server_call_tracer3(&annotation_logger_);
AddServerCallTracerToContext(context_, &server_call_tracer1);
AddServerCallTracerToContext(context_, &server_call_tracer2);
AddServerCallTracerToContext(context_, &server_call_tracer3);
static_cast<CallTracerAnnotationInterface*>(
context_[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value)
->RecordAnnotation("Test");
AddServerCallTracerToContext(arena_.get(), &server_call_tracer1);
AddServerCallTracerToContext(arena_.get(), &server_call_tracer2);
AddServerCallTracerToContext(arena_.get(), &server_call_tracer3);
arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
EXPECT_EQ(annotation_logger_,
std::vector<std::string>({"Test", "Test", "Test"}));
}

@ -57,11 +57,7 @@ ArenaPromise<ServerMetadataHandle> FakeStatsClientFilter::MakeCallPromise(
FakeClientCallTracer* client_call_tracer =
fake_client_call_tracer_factory_->CreateFakeClientCallTracer();
if (client_call_tracer != nullptr) {
auto* call_context = GetContext<grpc_call_context_element>();
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value =
client_call_tracer;
call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].destroy =
nullptr;
SetContext<CallTracerAnnotationInterface>(client_call_tracer);
}
return next_promise_factory(std::move(call_args));
}

@ -32,14 +32,15 @@
#include <openssl/x509v3.h>
#include "absl/log/check.h"
#include "absl/strings/str_cat.h"
#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include "src/core/handshaker/security/tsi_error.h"
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/iomgr/error.h"
static void notification_signal(tsi_test_fixture* fixture) {
gpr_mu_lock(&fixture->mu);
@ -318,8 +319,8 @@ grpc_error_handle on_handshake_next_done(
}
if (result != TSI_OK) {
notification_signal(fixture);
return grpc_set_tsi_error_result(GRPC_ERROR_CREATE("Handshake failed"),
result);
return GRPC_ERROR_CREATE(
absl::StrCat("Handshake failed (", tsi_result_to_string(result), ")"));
}
// Update handshaker result.
if (handshaker_result != nullptr) {

@ -582,12 +582,20 @@ class ClientLbEnd2endTest : public ::testing::Test {
static std::string MakeConnectionFailureRegex(absl::string_view prefix) {
return absl::StrCat(prefix,
"; last error: (UNKNOWN|UNAVAILABLE): "
// IP address
"(ipv6:%5B::1%5D|ipv4:127.0.0.1):[0-9]+: "
// Prefixes added for context
"(Failed to connect to remote host: )?"
"(Connection refused|Connection reset by peer|"
"recvmsg:Connection reset by peer|"
"getsockopt\\(SO\\_ERROR\\): Connection reset by peer|"
"Socket closed|FD shutdown)");
"(Timeout occurred: )?"
// Syscall
"((connect|recvmsg|getsockopt\\(SO\\_ERROR\\)): )?"
// strerror() output or other message
"(Connection refused"
"|Connection reset by peer"
"|Socket closed"
"|FD shutdown)"
// errno value
"( \\([0-9]+\\))?");
}
const std::string server_host_;

@ -836,14 +836,22 @@ void XdsEnd2endTest::SetProtoDuration(
std::string XdsEnd2endTest::MakeConnectionFailureRegex(
absl::string_view prefix) {
return absl::StrCat(
prefix,
"(UNKNOWN|UNAVAILABLE): (ipv6:%5B::1%5D|ipv4:127.0.0.1):[0-9]+: "
"(Failed to connect to remote host: )?"
"(Connection refused|Connection reset by peer|"
"recvmsg:Connection reset by peer|"
"getsockopt\\(SO\\_ERROR\\): Connection reset by peer|"
"Socket closed|FD shutdown)");
return absl::StrCat(prefix,
"(UNKNOWN|UNAVAILABLE): "
// IP address
"(ipv6:%5B::1%5D|ipv4:127.0.0.1):[0-9]+: "
// Prefixes added for context
"(Failed to connect to remote host: )?"
"(Timeout occurred: )?"
// Syscall
"((connect|recvmsg|getsockopt\\(SO\\_ERROR\\)): )?"
// strerror() output or other message
"(Connection refused"
"|Connection reset by peer"
"|Socket closed"
"|FD shutdown)"
// errno value
"( \\([0-9]+\\))?");
}
grpc_core::PemKeyCertPairList XdsEnd2endTest::ReadTlsIdentityPair(

@ -68,9 +68,7 @@ class AddLabelsFilter : public grpc_core::ChannelFilter {
grpc_core::CallArgs call_args,
grpc_core::NextPromiseFactory next_promise_factory) override {
using CallAttemptTracer = grpc_core::ClientCallTracer::CallAttemptTracer;
auto* call_context = grpc_core::GetContext<grpc_call_context_element>();
auto* call_tracer = static_cast<CallAttemptTracer*>(
call_context[GRPC_CONTEXT_CALL_TRACER].value);
auto* call_tracer = grpc_core::GetContext<CallAttemptTracer>();
EXPECT_NE(call_tracer, nullptr);
for (const auto& pair : labels_to_inject_) {
call_tracer->SetOptionalLabel(pair.first, pair.second);

@ -53,7 +53,9 @@ def generate_run_tests_portability_tests(name):
# C and C++ under different compilers
for language in ["c", "c++"]:
compiler_configs = [
["gcc_7", "", "tools/dockerfile/test/cxx_gcc_7_x64.current_version"],
# TODO(https://github.com/grpc/grpc/issues/36751): Replace gcc_8 with gcc_7 once it's fixed.
# ["gcc_7", "", "tools/dockerfile/test/cxx_gcc_7_x64.current_version"],
["gcc_8", "", "tools/dockerfile/test/cxx_gcc_8_x64.current_version"],
["gcc_12", "--cmake_configure_extra_args=-DCMAKE_CXX_STANDARD=20", "tools/dockerfile/test/cxx_gcc_12_x64.current_version"],
["gcc10.2_openssl102", "--cmake_configure_extra_args=-DgRPC_SSL_PROVIDER=package", "tools/dockerfile/test/cxx_debian11_openssl102_x64.current_version"],
["gcc10.2_openssl111", "--cmake_configure_extra_args=-DgRPC_SSL_PROVIDER=package", "tools/dockerfile/test/cxx_debian11_openssl111_x64.current_version"],

@ -2085,8 +2085,6 @@ src/core/handshaker/security/secure_endpoint.cc \
src/core/handshaker/security/secure_endpoint.h \
src/core/handshaker/security/security_handshaker.cc \
src/core/handshaker/security/security_handshaker.h \
src/core/handshaker/security/tsi_error.cc \
src/core/handshaker/security/tsi_error.h \
src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc \
src/core/handshaker/tcp_connect/tcp_connect_handshaker.h \
src/core/lib/address_utils/parse_address.cc \

@ -1855,8 +1855,6 @@ src/core/handshaker/security/secure_endpoint.cc \
src/core/handshaker/security/secure_endpoint.h \
src/core/handshaker/security/security_handshaker.cc \
src/core/handshaker/security/security_handshaker.h \
src/core/handshaker/security/tsi_error.cc \
src/core/handshaker/security/tsi_error.h \
src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc \
src/core/handshaker/tcp_connect/tcp_connect_handshaker.h \
src/core/lib/README.md \

Loading…
Cancel
Save