Improve promise-based-filter APIs (#28839)

* Improve promise-based-filter APIs

* review feedback

* comment

* fix
pull/28827/head^2
Craig Tiller 3 years ago committed by GitHub
parent 66cf5ea6e0
commit 9cb0747ab0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      src/core/ext/filters/http/client_authority_filter.cc
  2. 3
      src/core/ext/filters/http/client_authority_filter.h
  3. 24
      src/core/lib/channel/promise_based_filter.h
  4. 3
      src/core/lib/security/authorization/sdk_server_authz_filter.cc
  5. 3
      src/core/lib/security/authorization/sdk_server_authz_filter.h
  6. 9
      test/core/transport/chttp2/streams_not_seen_test.cc

@ -71,7 +71,8 @@ ArenaPromise<TrailingMetadata> ClientAuthorityFilter::MakeCallPromise(
namespace {
const grpc_channel_filter grpc_client_authority_filter =
MakePromiseBasedFilter<ClientAuthorityFilter>();
MakePromiseBasedFilter<ClientAuthorityFilter, FilterEndpoint::kClient>(
"authority");
bool add_client_authority_filter(ChannelStackBuilder* builder) {
const grpc_channel_args* channel_args = builder->channel_args();

@ -36,9 +36,6 @@ class ClientAuthorityFilter {
static absl::StatusOr<ClientAuthorityFilter> Create(
const grpc_channel_args* args);
static constexpr bool is_client() { return true; }
static constexpr const char* name() { return "authority"; }
// Construct a promise for one call.
ArenaPromise<TrailingMetadata> MakeCallPromise(
ClientInitialMetadata initial_metadata,

@ -35,6 +35,14 @@
namespace grpc_core {
// Designator for whether a filter is client side or server side.
// Please don't use this outside calls to MakePromiseBasedFilter - it's intended
// to be deleted once the promise conversion is complete.
enum class FilterEndpoint {
kClient,
kServer,
};
namespace promise_filter_detail {
// Call data shared between all implementations of promise-based filters.
@ -77,12 +85,12 @@ class BaseCallData {
// Specific call data per channel filter.
// Note that we further specialize for clients and servers since their
// implementations are very different.
template <class ChannelFilter, bool kIsClient = ChannelFilter::is_client()>
template <class ChannelFilter, FilterEndpoint endpoint>
class CallData;
// Client implementation of call data.
template <class ChannelFilter>
class CallData<ChannelFilter, true> : public BaseCallData {
class CallData<ChannelFilter, FilterEndpoint::kClient> : public BaseCallData {
public:
CallData(grpc_call_element* elem, const grpc_call_element_args* args)
: BaseCallData(elem, args) {
@ -386,7 +394,7 @@ class CallData<ChannelFilter, true> : public BaseCallData {
// Server implementation of call data.
template <class ChannelFilter>
class CallData<ChannelFilter, false> : public BaseCallData {
class CallData<ChannelFilter, FilterEndpoint::kServer> : public BaseCallData {
public:
CallData(grpc_call_element* elem, const grpc_call_element_args* args)
: BaseCallData(elem, args) {
@ -661,8 +669,6 @@ class CallData<ChannelFilter, false> : public BaseCallData {
// ChannelFilter contains the following:
// class SomeChannelFilter {
// public:
// static constexpr bool is_client();
// static constexpr const char* name();
// static absl::StatusOr<SomeChannelFilter> Create(
// const grpc_channel_args* args);
// ArenaPromise<TrailingMetadata> MakeCallPromise(
@ -670,9 +676,9 @@ class CallData<ChannelFilter, false> : public BaseCallData {
// };
// TODO(ctiller): allow implementing get_channel_info, start_transport_op in
// some way on ChannelFilter.
template <typename ChannelFilter>
grpc_channel_filter MakePromiseBasedFilter() {
using CallData = promise_filter_detail::CallData<ChannelFilter>;
template <typename ChannelFilter, FilterEndpoint kEndpoint>
grpc_channel_filter MakePromiseBasedFilter(const char* name) {
using CallData = promise_filter_detail::CallData<ChannelFilter, kEndpoint>;
return grpc_channel_filter{
// start_transport_stream_op_batch
@ -718,7 +724,7 @@ grpc_channel_filter MakePromiseBasedFilter() {
// get_channel_info
grpc_channel_next_get_info,
// name
ChannelFilter::name(),
name,
};
}

@ -107,6 +107,7 @@ ArenaPromise<TrailingMetadata> SdkServerAuthzFilter::MakeCallPromise(
}
const grpc_channel_filter SdkServerAuthzFilter::kFilterVtable =
MakePromiseBasedFilter<SdkServerAuthzFilter>();
MakePromiseBasedFilter<SdkServerAuthzFilter, FilterEndpoint::kServer>(
"sdk-server-authz");
} // namespace grpc_core

@ -29,9 +29,6 @@ class SdkServerAuthzFilter {
static absl::StatusOr<SdkServerAuthzFilter> Create(
const grpc_channel_args* args);
static constexpr bool is_client() { return false; }
static constexpr const char* name() { return "sdk-server-authz"; }
ArenaPromise<TrailingMetadata> MakeCallPromise(
ClientInitialMetadata initial_metadata,
NextPromiseFactory next_promise_factory);

@ -61,11 +61,6 @@ class TrailingMetadataRecordingFilter {
return TrailingMetadataRecordingFilter();
}
static constexpr bool is_client() { return true; }
static constexpr const char* name() {
return "trailing-metadata-recording-filter";
}
ArenaPromise<TrailingMetadata> MakeCallPromise(
ClientInitialMetadata initial_metadata,
NextPromiseFactory next_promise_factory) {
@ -93,7 +88,9 @@ class TrailingMetadataRecordingFilter {
};
grpc_channel_filter TrailingMetadataRecordingFilter::kFilterVtable =
MakePromiseBasedFilter<TrailingMetadataRecordingFilter>();
MakePromiseBasedFilter<TrailingMetadataRecordingFilter,
FilterEndpoint::kClient>(
"trailing-metadata-recording-filter");
absl::optional<GrpcStreamNetworkState::ValueType>
TrailingMetadataRecordingFilter::stream_network_state_;

Loading…
Cancel
Save