deadline_filter.cc
Go to the documentation of this file.
1 //
2 // Copyright 2016 gRPC authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
18 
20 
21 #include <new>
22 
23 #include "absl/status/status.h"
24 #include "absl/types/optional.h"
25 
26 #include <grpc/status.h>
27 #include <grpc/support/log.h>
28 
39 
40 namespace grpc_core {
41 
42 // A fire-and-forget class representing a pending deadline timer.
43 // Allocated on the call arena.
44 class TimerState {
45  public:
47  grpc_deadline_state* deadline_state =
48  static_cast<grpc_deadline_state*>(elem_->call_data);
49  GRPC_CALL_STACK_REF(deadline_state->call_stack, "DeadlineTimerState");
50  GRPC_CLOSURE_INIT(&closure_, TimerCallback, this, nullptr);
51  grpc_timer_init(&timer_, deadline, &closure_);
52  }
53 
55 
56  private:
57  // The on_complete callback used when sending a cancel_error batch down the
58  // filter stack. Yields the call combiner when the batch returns.
59  static void YieldCallCombiner(void* arg, grpc_error_handle /*ignored*/) {
60  TimerState* self = static_cast<TimerState*>(arg);
61  grpc_deadline_state* deadline_state =
62  static_cast<grpc_deadline_state*>(self->elem_->call_data);
63  GRPC_CALL_COMBINER_STOP(deadline_state->call_combiner,
64  "got on_complete from cancel_stream batch");
65  GRPC_CALL_STACK_UNREF(deadline_state->call_stack, "DeadlineTimerState");
66  }
67 
68  // This is called via the call combiner, so access to deadline_state is
69  // synchronized.
71  TimerState* self = static_cast<TimerState*>(arg);
73  GRPC_CLOSURE_INIT(&self->closure_, YieldCallCombiner, self, nullptr));
74  batch->cancel_stream = true;
76  self->elem_->filter->start_transport_stream_op_batch(self->elem_, batch);
77  }
78 
79  // Timer callback.
80  static void TimerCallback(void* arg, grpc_error_handle error) {
81  TimerState* self = static_cast<TimerState*>(arg);
82  grpc_deadline_state* deadline_state =
83  static_cast<grpc_deadline_state*>(self->elem_->call_data);
84  if (error != GRPC_ERROR_CANCELLED) {
86  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Deadline Exceeded"),
88  deadline_state->call_combiner->Cancel(GRPC_ERROR_REF(error));
90  nullptr);
91  GRPC_CALL_COMBINER_START(deadline_state->call_combiner, &self->closure_,
92  error,
93  "deadline exceeded -- sending cancel_stream op");
94  } else {
95  GRPC_CALL_STACK_UNREF(deadline_state->call_stack, "DeadlineTimerState");
96  }
97  }
98 
99  // NOTE: This object's dtor is never called, so do not add any data
100  // members that require destruction!
101  // TODO(roth): We should ideally call this object's dtor somewhere,
102  // but that would require adding more synchronization, because we'd
103  // need to call the dtor only after both (a) the timer callback
104  // finishes and (b) the filter sees the call completion and attempts
105  // to cancel the timer.
109 };
110 
111 } // namespace grpc_core
112 
113 //
114 // grpc_deadline_state
115 //
116 
117 // Starts the deadline timer.
118 // This is called via the call combiner, so access to deadline_state is
119 // synchronized.
121  grpc_core::Timestamp deadline) {
122  if (deadline == grpc_core::Timestamp::InfFuture()) return;
123  grpc_deadline_state* deadline_state =
124  static_cast<grpc_deadline_state*>(elem->call_data);
125  GPR_ASSERT(deadline_state->timer_state == nullptr);
126  deadline_state->timer_state =
127  deadline_state->arena->New<grpc_core::TimerState>(elem, deadline);
128 }
129 
130 // Cancels the deadline timer.
131 // This is called via the call combiner, so access to deadline_state is
132 // synchronized.
133 static void cancel_timer_if_needed(grpc_deadline_state* deadline_state) {
134  if (deadline_state->timer_state != nullptr) {
135  deadline_state->timer_state->Cancel();
136  deadline_state->timer_state = nullptr;
137  }
138 }
139 
140 // Callback run when we receive trailing metadata.
142  grpc_deadline_state* deadline_state = static_cast<grpc_deadline_state*>(arg);
143  cancel_timer_if_needed(deadline_state);
144  // Invoke the original callback.
148 }
149 
150 // Inject our own recv_trailing_metadata_ready callback into op.
153  deadline_state->original_recv_trailing_metadata_ready =
154  op->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
156  recv_trailing_metadata_ready, deadline_state,
157  grpc_schedule_on_exec_ctx);
158  op->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
159  &deadline_state->recv_trailing_metadata_ready;
160 }
161 
162 // Callback and associated state for starting the timer after call stack
163 // initialization has been completed.
167  : elem(elem), deadline(deadline) {}
169 
170  bool in_call_combiner = false;
174 };
177  static_cast<struct start_timer_after_init_state*>(arg);
178  grpc_deadline_state* deadline_state =
179  static_cast<grpc_deadline_state*>(state->elem->call_data);
180  if (!state->in_call_combiner) {
181  // We are initially called without holding the call combiner, so we
182  // need to bounce ourselves into it.
183  state->in_call_combiner = true;
184  GRPC_CALL_COMBINER_START(deadline_state->call_combiner, &state->closure,
186  "scheduling deadline timer");
187  return;
188  }
189  delete state;
190  GRPC_CALL_COMBINER_STOP(deadline_state->call_combiner,
191  "done scheduling deadline timer");
192 }
193 
197  : call_stack(args.call_stack),
198  call_combiner(args.call_combiner),
199  arena(args.arena) {
200  // Deadline will always be infinite on servers, so the timer will only be
201  // set on clients with a finite deadline.
203  // When the deadline passes, we indicate the failure by sending down
204  // an op with cancel_error set. However, we can't send down any ops
205  // until after the call stack is fully initialized. If we start the
206  // timer here, we have no guarantee that the timer won't pop before
207  // call stack initialization is finished. To avoid that problem, we
208  // create a closure to start the timer, and we schedule that closure
209  // to be run after call stack initialization is done.
213  grpc_schedule_on_exec_ctx);
215  }
216 }
217 
219 
221  grpc_core::Timestamp new_deadline) {
222  grpc_deadline_state* deadline_state =
223  static_cast<grpc_deadline_state*>(elem->call_data);
224  cancel_timer_if_needed(deadline_state);
225  start_timer_if_needed(elem, new_deadline);
226 }
227 
230  grpc_deadline_state* deadline_state =
231  static_cast<grpc_deadline_state*>(elem->call_data);
232  if (op->cancel_stream) {
233  cancel_timer_if_needed(deadline_state);
234  } else {
235  // Make sure we know when the call is complete, so that we can cancel
236  // the timer.
237  if (op->recv_trailing_metadata) {
238  inject_recv_trailing_metadata_ready(deadline_state, op);
239  }
240  }
241 }
242 
243 //
244 // filter code
245 //
246 
247 // Constructor for channel_data. Used for both client and server filters.
250  GPR_ASSERT(!args->is_last);
251  return GRPC_ERROR_NONE;
252 }
253 
254 // Destructor for channel_data. Used for both client and server filters.
256 
257 // Call data used for both client and server filter.
258 typedef struct base_call_data {
261 
262 // Additional call data used only for the server filter.
263 typedef struct server_call_data {
264  base_call_data base; // Must be first.
265  // The closure for receiving initial metadata.
267  // Received initial metadata batch.
269  // The original recv_initial_metadata_ready closure, which we chain to
270  // after our own closure is invoked.
273 
274 // Constructor for call_data. Used for both client and server filters.
277  new (elem->call_data) grpc_deadline_state(elem, *args, args->deadline);
278  return GRPC_ERROR_NONE;
279 }
280 
281 // Destructor for call_data. Used for both client and server filters.
283  grpc_call_element* elem, const grpc_call_final_info* /*final_info*/,
284  grpc_closure* /*ignored*/) {
285  grpc_deadline_state* deadline_state =
286  static_cast<grpc_deadline_state*>(elem->call_data);
287  deadline_state->~grpc_deadline_state();
288 }
289 
290 // Method for starting a call op for client filter.
294  // Chain to next filter.
296 }
297 
298 // Callback for receiving initial metadata on the server.
300  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
301  server_call_data* calld = static_cast<server_call_data*>(elem->call_data);
304  .value_or(grpc_core::Timestamp::InfFuture()));
305  // Invoke the next callback.
309 }
310 
311 // Method for starting a call op for server filter.
314  server_call_data* calld = static_cast<server_call_data*>(elem->call_data);
315  if (op->cancel_stream) {
317  } else {
318  // If we're receiving initial metadata, we need to get the deadline
319  // from the recv_initial_metadata_ready callback. So we inject our
320  // own callback into that hook.
321  if (op->recv_initial_metadata) {
323  op->payload->recv_initial_metadata.recv_initial_metadata_ready;
324  calld->recv_initial_metadata =
325  op->payload->recv_initial_metadata.recv_initial_metadata;
328  grpc_schedule_on_exec_ctx);
329  op->payload->recv_initial_metadata.recv_initial_metadata_ready =
331  }
332  // Make sure we know when the call is complete, so that we can cancel
333  // the timer.
334  // Note that we trigger this on recv_trailing_metadata, even though
335  // the client never sends trailing metadata, because this is the
336  // hook that tells us when the call is complete on the server side.
337  if (op->recv_trailing_metadata) {
339  }
340  }
341  // Chain to next filter.
343 }
344 
347  nullptr,
349  sizeof(base_call_data),
353  0, // sizeof(channel_data)
358  "deadline",
359 };
360 
363  nullptr,
365  sizeof(server_call_data),
369  0, // sizeof(channel_data)
374  "deadline",
375 };
376 
380  !grpc_channel_args_want_minimal_stack(channel_args));
381 }
382 
383 namespace grpc_core {
385  auto register_filter = [builder](grpc_channel_stack_type type,
386  const grpc_channel_filter* filter) {
387  builder->channel_init()->RegisterStage(
389  [filter](ChannelStackBuilder* builder) {
390  auto args = builder->channel_args();
392  .value_or(!args.WantMinimalStack())) {
393  builder->PrependFilter(filter);
394  }
395  return true;
396  });
397  };
400 }
401 } // namespace grpc_core
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
server_call_data
Definition: deadline_filter.cc:263
recv_initial_metadata_ready
static void recv_initial_metadata_ready(void *arg, grpc_error_handle error)
Definition: deadline_filter.cc:299
grpc_core::GrpcTimeoutMetadata
Definition: metadata_batch.h:59
grpc_core::RegisterDeadlineFilter
void RegisterDeadlineFilter(CoreConfiguration::Builder *builder)
Definition: deadline_filter.cc:384
start_timer_if_needed
static void start_timer_if_needed(grpc_call_element *elem, grpc_core::Timestamp deadline)
Definition: deadline_filter.cc:120
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
grpc_client_deadline_filter
const grpc_channel_filter grpc_client_deadline_filter
Definition: deadline_filter.cc:345
core_configuration.h
metadata_batch.h
start_timer_after_init
static void start_timer_after_init(void *arg, grpc_error_handle error)
Definition: deadline_filter.cc:175
server_call_data::recv_initial_metadata
grpc_metadata_batch * recv_initial_metadata
Definition: deadline_filter.cc:268
grpc_server_deadline_filter
const grpc_channel_filter grpc_server_deadline_filter
Definition: deadline_filter.cc:361
grpc_core::MetadataMap::get
absl::optional< typename Which::ValueType > get(Which) const
Definition: metadata_batch.h:1067
grpc_core::TimerState::YieldCallCombiner
static void YieldCallCombiner(void *arg, grpc_error_handle)
Definition: deadline_filter.cc:59
grpc_deadline_checking_enabled
bool grpc_deadline_checking_enabled(const grpc_channel_args *channel_args)
Definition: deadline_filter.cc:377
start_timer_after_init_state
Definition: deadline_filter.cc:164
recv_trailing_metadata_ready
static void recv_trailing_metadata_ready(void *arg, grpc_error_handle error)
Definition: deadline_filter.cc:141
grpc_channel_next_op
void grpc_channel_next_op(grpc_channel_element *elem, grpc_transport_op *op)
Definition: channel_stack.cc:264
grpc_deadline_state::arena
grpc_core::Arena * arena
Definition: deadline_filter.h:47
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::CoreConfiguration::Builder
Definition: core_configuration.h:41
GRPC_CLIENT_DIRECT_CHANNEL
@ GRPC_CLIENT_DIRECT_CHANNEL
Definition: channel_stack_type.h:34
grpc_core::Timestamp
Definition: src/core/lib/gprpp/time.h:62
grpc_core::Arena::New
T * New(Args &&... args)
Definition: src/core/lib/resource_quota/arena.h:77
server_call_data::base
base_call_data base
Definition: deadline_filter.cc:264
grpc_channel_element
Definition: channel_stack.h:186
elem
Timer elem
Definition: event_engine/iomgr_event_engine/timer_heap_test.cc:109
error
grpc_error_handle error
Definition: retry_filter.cc:499
base_call_data::deadline_state
grpc_deadline_state deadline_state
Definition: deadline_filter.cc:259
start_timer_after_init_state::start_timer_after_init_state
start_timer_after_init_state(grpc_call_element *elem, grpc_core::Timestamp deadline)
Definition: deadline_filter.cc:165
GRPC_STATUS_DEADLINE_EXCEEDED
@ GRPC_STATUS_DEADLINE_EXCEEDED
Definition: include/grpc/impl/codegen/status.h:53
grpc_call_stack_ignore_set_pollset_or_pollset_set
void grpc_call_stack_ignore_set_pollset_or_pollset_set(grpc_call_element *, grpc_polling_entity *)
Definition: channel_stack.cc:233
grpc_call_element::call_data
void * call_data
Definition: channel_stack.h:197
GRPC_ERROR_CANCELLED
#define GRPC_ERROR_CANCELLED
Definition: error.h:238
grpc_call_element
Definition: channel_stack.h:194
grpc_timer
Definition: iomgr/timer.h:33
grpc_channel_args
Definition: grpc_types.h:132
gen_build_yaml.struct
def struct(**kwargs)
Definition: test/core/end2end/gen_build_yaml.py:30
arena
grpc_core::ScopedArenaPtr arena
Definition: binder_transport_test.cc:237
grpc_core::ChannelStackBuilder
Definition: channel_stack_builder.h:41
grpc_core::TimerState::timer_
grpc_timer timer_
Definition: deadline_filter.cc:107
server_call_data::recv_initial_metadata_ready
grpc_closure recv_initial_metadata_ready
Definition: deadline_filter.cc:266
grpc_core::CallCombiner::Cancel
void Cancel(grpc_error_handle error)
Indicates that the call has been cancelled.
Definition: call_combiner.cc:255
status.h
grpc_channel_arg_get_bool
bool grpc_channel_arg_get_bool(const grpc_arg *arg, bool default_value)
Definition: channel_args.cc:447
start_timer_after_init_state::~start_timer_after_init_state
~start_timer_after_init_state()
Definition: deadline_filter.cc:168
GRPC_SERVER_CHANNEL
@ GRPC_SERVER_CHANNEL
Definition: channel_stack_type.h:36
deadline_destroy_call_elem
static void deadline_destroy_call_elem(grpc_call_element *elem, const grpc_call_final_info *, grpc_closure *)
Definition: deadline_filter.cc:282
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
grpc_deadline_state::call_combiner
grpc_core::CallCombiner * call_combiner
Definition: deadline_filter.h:46
GRPC_CALL_STACK_UNREF
#define GRPC_CALL_STACK_UNREF(call_stack, reason)
Definition: channel_stack.h:295
grpc_transport_stream_op_batch::cancel_stream
bool cancel_stream
Definition: transport.h:329
grpc_core::TimerState::closure_
grpc_closure closure_
Definition: deadline_filter.cc:108
GRPC_ARG_ENABLE_DEADLINE_CHECKS
#define GRPC_ARG_ENABLE_DEADLINE_CHECKS
Definition: grpc_types.h:184
profile_analyzer.builder
builder
Definition: profile_analyzer.py:159
channel_init.h
start_timer_after_init_state::elem
grpc_call_element * elem
Definition: deadline_filter.cc:171
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_deadline_state::recv_trailing_metadata_ready
grpc_closure recv_trailing_metadata_ready
Definition: deadline_filter.h:51
grpc_channel_stack_no_post_init
void grpc_channel_stack_no_post_init(grpc_channel_stack *, grpc_channel_element *)
Definition: channel_stack.cc:282
grpc_core::TimerState::Cancel
void Cancel()
Definition: deadline_filter.cc:54
grpc_deadline_state::grpc_deadline_state
grpc_deadline_state(grpc_call_element *elem, const grpc_call_element_args &args, grpc_core::Timestamp deadline)
Definition: deadline_filter.cc:194
grpc_deadline_state::original_recv_trailing_metadata_ready
grpc_closure * original_recv_trailing_metadata_ready
Definition: deadline_filter.h:54
inject_recv_trailing_metadata_ready
static void inject_recv_trailing_metadata_ready(grpc_deadline_state *deadline_state, grpc_transport_stream_op_batch *op)
Definition: deadline_filter.cc:151
grpc_transport_stream_op_batch_payload::cancel_error
grpc_error_handle cancel_error
Definition: transport.h:444
grpc_channel_next_get_info
void grpc_channel_next_get_info(grpc_channel_element *elem, const grpc_channel_info *channel_info)
Definition: channel_stack.cc:258
GRPC_CALL_COMBINER_STOP
#define GRPC_CALL_COMBINER_STOP(call_combiner, reason)
Definition: call_combiner.h:58
deadline_server_start_transport_stream_op_batch
static void deadline_server_start_transport_stream_op_batch(grpc_call_element *elem, grpc_transport_stream_op_batch *op)
Definition: deadline_filter.cc:312
arg
Definition: cmdline.cc:40
grpc_transport_stream_op_batch::payload
grpc_transport_stream_op_batch_payload * payload
Definition: transport.h:307
grpc_deadline_state
Definition: deadline_filter.h:38
cancel_timer_if_needed
static void cancel_timer_if_needed(grpc_deadline_state *deadline_state)
Definition: deadline_filter.cc:133
error.h
grpc_call_next_op
void grpc_call_next_op(grpc_call_element *elem, grpc_transport_stream_op_batch *op)
Definition: channel_stack.cc:251
grpc_call_element_args
Definition: channel_stack.h:80
batch
grpc_transport_stream_op_batch * batch
Definition: retry_filter.cc:243
GRPC_CALL_COMBINER_START
#define GRPC_CALL_COMBINER_START(call_combiner, closure, error, reason)
Definition: call_combiner.h:56
channel_stack_type.h
grpc_channel_filter
Definition: channel_stack.h:111
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
grpc_channel_args_want_minimal_stack
bool grpc_channel_args_want_minimal_stack(const grpc_channel_args *args)
Definition: channel_args.cc:471
server_call_data
struct server_call_data server_call_data
grpc_make_transport_stream_op
grpc_transport_stream_op_batch * grpc_make_transport_stream_op(grpc_closure *on_complete)
Definition: transport.cc:230
grpc_deadline_state_client_start_transport_stream_op_batch
void grpc_deadline_state_client_start_transport_stream_op_batch(grpc_call_element *elem, grpc_transport_stream_op_batch *op)
Definition: deadline_filter.cc:228
grpc_timer_cancel
void grpc_timer_cancel(grpc_timer *timer)
Definition: iomgr/timer.cc:36
base_call_data
struct base_call_data base_call_data
GRPC_ERROR_REF
#define GRPC_ERROR_REF(err)
Definition: error.h:261
debug_location.h
deadline_client_start_transport_stream_op_batch
static void deadline_client_start_transport_stream_op_batch(grpc_call_element *elem, grpc_transport_stream_op_batch *op)
Definition: deadline_filter.cc:291
grpc_error_set_int
grpc_error_handle grpc_error_set_int(grpc_error_handle src, grpc_error_ints which, intptr_t value)
Definition: error.cc:613
grpc_core::TimerState::TimerCallback
static void TimerCallback(void *arg, grpc_error_handle error)
Definition: deadline_filter.cc:80
start_timer_after_init_state::deadline
grpc_core::Timestamp deadline
Definition: deadline_filter.cc:172
grpc_deadline_state_reset
void grpc_deadline_state_reset(grpc_call_element *elem, grpc_core::Timestamp new_deadline)
Definition: deadline_filter.cc:220
grpc_core::TimerState::elem_
grpc_call_element * elem_
Definition: deadline_filter.cc:106
deadline_filter.h
deadline_init_channel_elem
static grpc_error_handle deadline_init_channel_elem(grpc_channel_element *, grpc_channel_element_args *args)
Definition: deadline_filter.cc:248
deadline_destroy_channel_elem
static void deadline_destroy_channel_elem(grpc_channel_element *)
Definition: deadline_filter.cc:255
grpc_channel_stack_type
grpc_channel_stack_type
Definition: channel_stack_type.h:24
server_call_data::next_recv_initial_metadata_ready
grpc_closure * next_recv_initial_metadata_ready
Definition: deadline_filter.cc:271
arg
struct arg arg
state
Definition: bloaty/third_party/zlib/contrib/blast/blast.c:41
exec_ctx.h
grpc_timer_init
void grpc_timer_init(grpc_timer *timer, grpc_core::Timestamp deadline, grpc_closure *closure)
Definition: iomgr/timer.cc:31
grpc_core::TimerState::TimerState
TimerState(grpc_call_element *elem, Timestamp deadline)
Definition: deadline_filter.cc:46
grpc_core::ExecCtx::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: exec_ctx.cc:98
grpc_core::TimerState
Definition: deadline_filter.cc:44
channel_args.h
timer.h
grpc_deadline_state::call_stack
grpc_call_stack * call_stack
Definition: deadline_filter.h:45
grpc_channel_element_args
Definition: channel_stack.h:74
grpc_core::Timestamp::InfFuture
static constexpr Timestamp InfFuture()
Definition: src/core/lib/gprpp/time.h:79
grpc_deadline_state::~grpc_deadline_state
~grpc_deadline_state()
Definition: deadline_filter.cc:218
grpc_call_final_info
Definition: channel_stack.h:95
start_timer_after_init_state::in_call_combiner
bool in_call_combiner
Definition: deadline_filter.cc:170
grpc_core::TimerState::SendCancelOpInCallCombiner
static void SendCancelOpInCallCombiner(void *arg, grpc_error_handle error)
Definition: deadline_filter.cc:70
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
grpc_error
Definition: error_internal.h:42
deadline_init_call_elem
static grpc_error_handle deadline_init_call_elem(grpc_call_element *elem, const grpc_call_element_args *args)
Definition: deadline_filter.cc:275
GRPC_CALL_STACK_REF
#define GRPC_CALL_STACK_REF(call_stack, reason)
Definition: channel_stack.h:293
self
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern self
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/map.c:543
start_timer_after_init_state::closure
grpc_closure closure
Definition: deadline_filter.cc:173
grpc_metadata_batch
Definition: metadata_batch.h:1259
channel_stack_builder.h
grpc_transport_stream_op_batch
Definition: transport.h:284
grpc_closure
Definition: closure.h:56
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
grpc_channel_args_find
const grpc_arg * grpc_channel_args_find(const grpc_channel_args *args, const char *name)
Definition: channel_args.cc:393
grpc_core::Closure::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: closure.h:250
GRPC_ERROR_INT_GRPC_STATUS
@ GRPC_ERROR_INT_GRPC_STATUS
grpc status code representing this error
Definition: error.h:66
state
static struct rpc_state state
Definition: bad_server_response_test.cc:87
base_call_data
Definition: deadline_filter.cc:258
grpc_transport_stream_op_batch_payload::cancel_stream
struct grpc_transport_stream_op_batch_payload::@46 cancel_stream
GRPC_CHANNEL_INIT_BUILTIN_PRIORITY
#define GRPC_CHANNEL_INIT_BUILTIN_PRIORITY
Definition: channel_init.h:31
port_platform.h
grpc_deadline_state::timer_state
grpc_core::TimerState * timer_state
Definition: deadline_filter.h:48


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:08