[event_engine/promises] Eliminate lock contention on call path for GetDefaultEventEngine (#31405)

* [event_engine/promises] Eliminate lock contention on call path for GetDefaultEventEngine

* crash fix

* fix
pull/31407/head
Craig Tiller 3 years ago committed by GitHub
parent b3d9833166
commit 0d77dd2bbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      src/core/lib/channel/promise_based_filter.cc
  2. 14
      src/core/lib/channel/promise_based_filter.h
  3. 7
      test/core/filters/client_authority_filter_test.cc

@ -25,7 +25,6 @@
#include <grpc/status.h>
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/event_engine/default_event_engine.h"
#include "src/core/lib/gprpp/manual_constructor.h"
#include "src/core/lib/gprpp/status_helper.h"
#include "src/core/lib/iomgr/error.h"
@ -45,7 +44,9 @@ BaseCallData::BaseCallData(grpc_call_element* elem,
call_combiner_(args->call_combiner),
deadline_(args->deadline),
context_(args->context),
event_engine_(grpc_event_engine::experimental::GetDefaultEventEngine()) {
event_engine_(
static_cast<ChannelFilter*>(elem->channel_data)
->hack_until_per_channel_stack_event_engines_land_get_event_engine()) {
if (flags & kFilterExaminesServerInitialMetadata) {
server_initial_metadata_latch_ = arena_->New<Latch<ServerMetadata*>>();
}

@ -108,6 +108,16 @@ class ChannelFilter {
virtual bool GetChannelInfo(const grpc_channel_info*) { return false; }
virtual ~ChannelFilter() = default;
grpc_event_engine::experimental::EventEngine*
hack_until_per_channel_stack_event_engines_land_get_event_engine() {
return event_engine_.get();
}
private:
// TODO(ctiller): remove once per-channel-stack event engines land
std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_ =
grpc_event_engine::experimental::GetDefaultEventEngine();
};
// Designator for whether a filter is client side or server side.
@ -176,7 +186,7 @@ class BaseCallData : public Activity, private Wakeable {
call_data->pollent_.load(std::memory_order_acquire)),
promise_detail::Context<CallFinalization>(&call_data->finalization_),
promise_detail::Context<grpc_event_engine::experimental::EventEngine>(
call_data->event_engine_.get()) {}
call_data->event_engine_) {}
};
class Flusher {
@ -283,7 +293,7 @@ class BaseCallData : public Activity, private Wakeable {
grpc_call_context_element* const context_;
std::atomic<grpc_polling_entity*> pollent_{nullptr};
Latch<ServerMetadata*>* server_initial_metadata_latch_ = nullptr;
std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_;
grpc_event_engine::experimental::EventEngine* event_engine_;
};
class ClientCallData : public BaseCallData {

@ -127,5 +127,10 @@ TEST(ClientAuthorityFilterTest,
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
// TODO(ctiller): promise_based_call currently demands to instantiate an event
// engine which needs grpc to be initialized.
grpc_init();
int r = RUN_ALL_TESTS();
grpc_shutdown();
return r;
}

Loading…
Cancel
Save