[svc-cfg] Move ServiceConfigChannelArgFilter to promises (#33473)

Co-authored-by: ctiller <ctiller@users.noreply.github.com>
pull/33494/head
Craig Tiller 2 years ago committed by GitHub
parent a8132669f4
commit 14de20bc3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      BUILD
  2. 96
      src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc

@ -3033,12 +3033,14 @@ grpc_cc_library(
"xds_orca_service_upb", "xds_orca_service_upb",
"xds_orca_upb", "xds_orca_upb",
"//src/core:arena", "//src/core:arena",
"//src/core:arena_promise",
"//src/core:channel_args", "//src/core:channel_args",
"//src/core:channel_fwd", "//src/core:channel_fwd",
"//src/core:channel_init", "//src/core:channel_init",
"//src/core:channel_stack_type", "//src/core:channel_stack_type",
"//src/core:closure", "//src/core:closure",
"//src/core:construct_destruct", "//src/core:construct_destruct",
"//src/core:context",
"//src/core:delegating_helper", "//src/core:delegating_helper",
"//src/core:dual_ref_counted", "//src/core:dual_ref_counted",
"//src/core:env", "//src/core:env",

@ -19,7 +19,8 @@
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <new> #include <functional>
#include <memory>
#include <string> #include <string>
#include <utility> #include <utility>
@ -34,10 +35,12 @@
#include "src/core/lib/channel/channel_fwd.h" #include "src/core/lib/channel/channel_fwd.h"
#include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/channel/channel_stack_builder.h" #include "src/core/lib/channel/channel_stack_builder.h"
#include "src/core/lib/channel/context.h"
#include "src/core/lib/channel/promise_based_filter.h"
#include "src/core/lib/config/core_configuration.h" #include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/iomgr/closure.h" #include "src/core/lib/promise/arena_promise.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/resource_quota/arena.h"
#include "src/core/lib/service_config/service_config.h" #include "src/core/lib/service_config/service_config.h"
#include "src/core/lib/service_config/service_config_call_data.h" #include "src/core/lib/service_config/service_config_call_data.h"
@ -45,20 +48,25 @@
#include "src/core/lib/service_config/service_config_parser.h" #include "src/core/lib/service_config/service_config_parser.h"
#include "src/core/lib/surface/channel_init.h" #include "src/core/lib/surface/channel_init.h"
#include "src/core/lib/surface/channel_stack_type.h" #include "src/core/lib/surface/channel_stack_type.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/transport.h"
namespace grpc_core { namespace grpc_core {
namespace { namespace {
class ServiceConfigChannelArgChannelData { class ServiceConfigChannelArgFilter : public ChannelFilter {
public: public:
explicit ServiceConfigChannelArgChannelData( static absl::StatusOr<ServiceConfigChannelArgFilter> Create(
const grpc_channel_element_args* args) { const ChannelArgs& args, ChannelFilter::Args) {
auto service_config_str = return ServiceConfigChannelArgFilter(args);
args->channel_args.GetOwnedString(GRPC_ARG_SERVICE_CONFIG); }
explicit ServiceConfigChannelArgFilter(const ChannelArgs& args) {
auto service_config_str = args.GetOwnedString(GRPC_ARG_SERVICE_CONFIG);
if (service_config_str.has_value()) { if (service_config_str.has_value()) {
auto service_config = ServiceConfigImpl::Create( auto service_config =
args->channel_args, service_config_str->c_str()); ServiceConfigImpl::Create(args, *service_config_str);
if (!service_config.ok()) { if (!service_config.ok()) {
gpr_log(GPR_ERROR, "%s", service_config.status().ToString().c_str()); gpr_log(GPR_ERROR, "%s", service_config.status().ToString().c_str());
} else { } else {
@ -67,62 +75,34 @@ class ServiceConfigChannelArgChannelData {
} }
} }
RefCountedPtr<ServiceConfig> service_config() const { // Construct a promise for one call.
return service_config_; ArenaPromise<ServerMetadataHandle> MakeCallPromise(
} CallArgs call_args, NextPromiseFactory next_promise_factory) override;
private: private:
RefCountedPtr<ServiceConfig> service_config_; RefCountedPtr<ServiceConfig> service_config_;
}; };
grpc_error_handle ServiceConfigChannelArgInitCallElem( ArenaPromise<ServerMetadataHandle>
grpc_call_element* elem, const grpc_call_element_args* args) { ServiceConfigChannelArgFilter::MakeCallPromise(
auto* chand = CallArgs call_args, NextPromiseFactory next_promise_factory) {
static_cast<ServiceConfigChannelArgChannelData*>(elem->channel_data);
RefCountedPtr<ServiceConfig> service_config = chand->service_config();
const ServiceConfigParser::ParsedConfigVector* method_configs = nullptr; const ServiceConfigParser::ParsedConfigVector* method_configs = nullptr;
if (service_config != nullptr) { if (service_config_ != nullptr) {
method_configs = service_config->GetMethodParsedConfigVector(args->path); method_configs = service_config_->GetMethodParsedConfigVector(
call_args.client_initial_metadata->get_pointer(HttpPathMetadata())
->c_slice());
} }
auto* service_config_call_data = auto* arena = GetContext<Arena>();
args->arena->New<ServiceConfigCallData>(args->arena, args->context); auto* service_config_call_data = arena->New<ServiceConfigCallData>(
service_config_call_data->SetServiceConfig(std::move(service_config), arena, GetContext<grpc_call_context_element>());
method_configs); service_config_call_data->SetServiceConfig(service_config_, method_configs);
return absl::OkStatus(); return next_promise_factory(std::move(call_args));
}
void ServiceConfigChannelArgDestroyCallElem(
grpc_call_element* /*elem*/, const grpc_call_final_info* /*final_info*/,
grpc_closure* /*then_schedule_closure*/) {}
grpc_error_handle ServiceConfigChannelArgInitChannelElem(
grpc_channel_element* elem, grpc_channel_element_args* args) {
ServiceConfigChannelArgChannelData* chand =
static_cast<ServiceConfigChannelArgChannelData*>(elem->channel_data);
new (chand) ServiceConfigChannelArgChannelData(args);
return absl::OkStatus();
}
void ServiceConfigChannelArgDestroyChannelElem(grpc_channel_element* elem) {
ServiceConfigChannelArgChannelData* chand =
static_cast<ServiceConfigChannelArgChannelData*>(elem->channel_data);
chand->~ServiceConfigChannelArgChannelData();
} }
const grpc_channel_filter ServiceConfigChannelArgFilter = { const grpc_channel_filter kServiceConfigChannelArgFilter =
grpc_call_next_op, MakePromiseBasedFilter<ServiceConfigChannelArgFilter,
nullptr, FilterEndpoint::kClient>(
grpc_channel_next_op, "service_config_channel_arg");
0,
ServiceConfigChannelArgInitCallElem,
grpc_call_stack_ignore_set_pollset_or_pollset_set,
ServiceConfigChannelArgDestroyCallElem,
sizeof(ServiceConfigChannelArgChannelData),
ServiceConfigChannelArgInitChannelElem,
grpc_channel_stack_no_post_init,
ServiceConfigChannelArgDestroyChannelElem,
grpc_channel_next_get_info,
"service_config_channel_arg"};
} // namespace } // namespace
@ -136,7 +116,7 @@ void RegisterServiceConfigChannelArgFilter(
!channel_args.GetString(GRPC_ARG_SERVICE_CONFIG).has_value()) { !channel_args.GetString(GRPC_ARG_SERVICE_CONFIG).has_value()) {
return true; return true;
} }
builder->PrependFilter(&ServiceConfigChannelArgFilter); builder->PrependFilter(&kServiceConfigChannelArgFilter);
return true; return true;
}); });
} }

Loading…
Cancel
Save