Go to the documentation of this file.
33 #include "absl/base/attributes.h"
34 #include "absl/status/status.h"
35 #include "absl/strings/cord.h"
36 #include "absl/strings/str_cat.h"
37 #include "absl/strings/str_format.h"
38 #include "absl/strings/string_view.h"
39 #include "absl/types/optional.h"
40 #include "absl/types/variant.h"
97 grpc_experimental_enable_peer_state_based_framing,
false,
98 "If set, the max sizes of frames sent to lower layers is controlled based "
99 "on the peer's memory pressure which is reflected in its max http2 frame "
102 #define DEFAULT_CONNECTION_WINDOW_TARGET (1024 * 1024)
103 #define MAX_WINDOW 0x7fffffffu
104 #define MAX_WRITE_BUFFER_SIZE (64 * 1024 * 1024)
105 #define DEFAULT_MAX_HEADER_LIST_SIZE (8 * 1024)
107 #define DEFAULT_CLIENT_KEEPALIVE_TIME_MS INT_MAX
108 #define DEFAULT_CLIENT_KEEPALIVE_TIMEOUT_MS 20000
109 #define DEFAULT_SERVER_KEEPALIVE_TIME_MS 7200000
110 #define DEFAULT_SERVER_KEEPALIVE_TIMEOUT_MS 20000
111 #define DEFAULT_KEEPALIVE_PERMIT_WITHOUT_CALLS false
112 #define KEEPALIVE_TIME_BACKOFF_MULTIPLIER 2
114 #define DEFAULT_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS 300000
115 #define DEFAULT_MAX_PINGS_BETWEEN_DATA 2
116 #define DEFAULT_MAX_PING_STRIKES 2
118 #define DEFAULT_MAX_PENDING_INDUCED_FRAMES 10000
138 #define MAX_CLIENT_STREAM_ID 0x7fffffffu
209 bool test_only_disable_transient_failure_state_notification =
false;
219 test_only_destruct_callback =
callback;
224 test_only_disable_transient_failure_state_notification = disable;
281 if (grpc_core::test_only_destruct_callback !=
nullptr) {
282 grpc_core::test_only_destruct_callback();
296 if (0 == strcmp(channel_args->
args[
i].
key,
302 if ((t->next_stream_id & 1) != (
value & 1)) {
305 is_client ?
"client" :
"server");
310 }
else if (0 == strcmp(channel_args->
args[
i].
key,
316 t->hpack_compressor.SetMaxUsableSize(
value);
318 }
else if (0 == strcmp(channel_args->
args[
i].
key,
321 &channel_args->
args[
i],
322 {g_default_max_pings_without_data, 0, INT_MAX});
323 }
else if (0 == strcmp(channel_args->
args[
i].
key,
326 &channel_args->
args[
i], {g_default_max_ping_strikes, 0, INT_MAX});
330 t->ping_policy.min_recv_ping_interval_without_data =
332 &channel_args->
args[
i],
334 g_default_min_recv_ping_interval_without_data_ms, 0,
336 }
else if (0 == strcmp(channel_args->
args[
i].
key,
339 &channel_args->
args[
i], {0, 0, MAX_WRITE_BUFFER_SIZE}));
343 &channel_args->
args[
i],
345 ? g_default_client_keepalive_time_ms
346 : g_default_server_keepalive_time_ms,
348 t->keepalive_time =
value == INT_MAX
351 }
else if (0 == strcmp(channel_args->
args[
i].
key,
354 &channel_args->
args[
i],
356 ? g_default_client_keepalive_timeout_ms
357 : g_default_server_keepalive_timeout_ms,
359 t->keepalive_timeout =
value == INT_MAX
362 }
else if (0 == strcmp(channel_args->
args[
i].
key,
364 t->keepalive_permit_without_calls =
static_cast<uint32_t>(
366 }
else if (0 == strcmp(channel_args->
args[
i].
key,
374 static const struct {
375 const char* channel_arg_name;
378 bool availability[2] ;
393 {-1, 16384, 16777215},
403 for (j = 0; j < static_cast<int>
GPR_ARRAY_SIZE(settings_map); j++) {
404 if (0 == strcmp(channel_args->
args[
i].
key,
405 settings_map[j].channel_arg_name)) {
406 if (!settings_map[j].availability[is_client]) {
408 settings_map[j].channel_arg_name,
409 is_client ?
"clients" :
"servers");
412 &channel_args->
args[
i], settings_map[j].integer_options);
423 if (channelz_enabled) {
425 grpc_core::MakeRefCounted<grpc_core::channelz::SocketNode>(
443 t->keepalive_permit_without_calls =
454 t->keepalive_permit_without_calls =
462 t->ping_policy.min_recv_ping_interval_without_data =
472 grpc_schedule_on_exec_ctx);
475 &t->init_keepalive_ping_locked);
497 state_tracker(is_client ?
"client_transport" :
"server_transport",
499 is_client(is_client),
500 next_stream_id(is_client ? 1 : 2),
501 flow_control(peer_string.
c_str(),
546 if (channel_args !=
nullptr) {
568 if (grpc_core::test_only_init_callback !=
nullptr) {
569 grpc_core::test_only_init_callback();
580 t->memory_owner.Reset();
602 t->close_transport_on_writes_finished =
604 "Delayed close due to in-progress write");
606 t->close_transport_on_writes_finished =
614 if (t->ping_state.is_delayed_ping_timer_set) {
617 if (t->have_next_bdp_ping_timer) {
620 switch (t->keepalive_state) {
642 if (t->notify_on_receive_settings !=
nullptr) {
645 t->notify_on_receive_settings =
nullptr;
647 if (t->notify_on_close !=
nullptr) {
650 t->notify_on_close =
nullptr;
681 const void* server_data,
751 s->~grpc_chttp2_stream();
760 s->destroy_stream_arg = then_schedule_closure;
768 if (t->accept_stream_cb ==
nullptr) {
773 t->accepting_stream = &accepting;
774 t->accept_stream_cb(t->accept_stream_cb_user_data, &t->base,
775 reinterpret_cast<void*
>(
id));
776 t->accepting_stream =
nullptr;
791 return "WRITING+MORE";
800 t->is_client ?
"CLIENT" :
"SERVER", t->peer_string.c_str(),
895 switch (t->write_state) {
917 t->combiner->FinallyRun(
941 return "begin partial write in background";
943 return "begin write in current thread";
967 if (t->reading_paused_on_pending_induced_frames) {
968 GPR_ASSERT(t->num_pending_induced_frames == 0);
974 "transport %p : Resuming reading after being paused due to too "
975 "many unwritten SETTINGS ACK, PINGS ACK and RST_STREAM frames",
977 t->reading_paused_on_pending_induced_frames =
false;
989 static bool kEnablePeerStateBasedFraming =
1000 kEnablePeerStateBasedFraming
1007 grpc_schedule_on_exec_ctx),
1008 cl, max_frame_size);
1024 bool closed =
false;
1039 switch (t->write_state) {
1058 t->combiner->FinallyRun(
1076 if (use_value !=
value) {
1082 t->dirtied_local_settings =
true;
1091 s->trailing_metadata_buffer.Set(
1116 gpr_log(
GPR_INFO,
"transport %p got goaway with last stream id %d", t,
1121 gpr_log(
GPR_INFO,
"%s: Got goaway [%d] err=%s", t->peer_string.c_str(),
1130 uint32_t last_stream_id = *(static_cast<uint32_t*>(user_data));
1131 grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(stream);
1132 if (s->id > last_stream_id) {
1133 s->trailing_metadata_buffer.Set(
1134 grpc_core::GrpcStreamNetworkState(),
1135 grpc_core::GrpcStreamNetworkState::kNotSeenByServer);
1136 grpc_chttp2_cancel_stream(s->t, s,
1137 GRPC_ERROR_REF(s->t->goaway_error));
1149 goaway_text ==
"too_many_pings")) {
1151 "Received a GOAWAY with error code ENHANCE_YOUR_CALM and debug "
1152 "data equal to \"too_many_pings\"");
1156 t->keepalive_time > max_keepalive_time
1164 if (!grpc_core::test_only_disable_transient_failure_state_notification) {
1188 "HTTP:%s: Transport %p allocating new grpc_chttp2_stream %p to id %d",
1189 t->is_client ?
"CLI" :
"SVR", t, s, t->next_stream_id));
1192 s->id = t->next_stream_id;
1193 t->next_stream_id += 2;
1198 "Transport Stream IDs exhausted"),
1199 "no_more_stream_ids");
1210 s->trailing_metadata_buffer.Set(
1225 #define CLOSURE_BARRIER_MAY_COVER_WRITE (1 << 0)
1228 #define CLOSURE_BARRIER_FIRST_REF_BIT (1 << 16)
1253 *pclosure =
nullptr;
1262 "complete_closure_step: t=%p %p refs=%d flags=0x%04x desc=%s err=%s "
1265 static_cast<int>(
closure->next_data.scratch /
1267 static_cast<int>(
closure->next_data.scratch %
1273 #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
1282 "Error in HTTP transport completing operation");
1287 #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
1298 #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
1305 closure->error_data.error = 0;
1319 bool is_client,
bool is_initial) {
1321 "HTTP:",
id, is_initial ?
":HDR" :
":TRL", is_client ?
":CLI:" :
":SVR:");
1340 s->context =
op->payload->context;
1341 s->traced =
op->is_traced;
1344 "perform_stream_op_locked[s=%p; op=%p]: %s; on_complete = %p", s,
1347 if (
op->send_initial_metadata) {
1349 s->id, t->is_client,
true);
1351 if (
op->send_trailing_metadata) {
1353 s->id, t->is_client,
false);
1359 if (on_complete !=
nullptr) {
1366 if (
op->cancel_stream) {
1371 if (
op->send_initial_metadata) {
1372 if (t->is_client && t->channelz_socket !=
nullptr) {
1373 t->channelz_socket->RecordStreamStartedFromLocal();
1376 GPR_ASSERT(s->send_initial_metadata_finished ==
nullptr);
1380 s->send_initial_metadata =
1389 s->seen_error =
true;
1391 if (!s->write_closed) {
1398 s->trailing_metadata_buffer.Set(
1405 "Transport closed", &t->closed_with_error, 1),
1411 if (!(
op->send_message &&
1418 s->send_initial_metadata =
nullptr;
1420 t, s, &s->send_initial_metadata_finished,
1422 "Attempt to send initial metadata after stream was closed",
1423 &s->write_closed_error, 1),
1424 "send_initial_metadata_finished");
1428 (
gpr_atm)t->peer_string.c_str());
1432 if (
op->send_message) {
1434 t->num_messages_in_next_write++;
1436 op->payload->send_message.send_message->Length());
1440 if (s->write_closed) {
1441 op->payload->send_message.stream_write_closed =
true;
1447 "fetching_send_message_finished");
1453 frame_hdr[1] =
static_cast<uint8_t>(
len >> 24);
1454 frame_hdr[2] =
static_cast<uint8_t>(
len >> 16);
1455 frame_hdr[3] =
static_cast<uint8_t>(
len >> 8);
1458 s->next_message_end_offset =
1459 s->flow_controlled_bytes_written +
1460 static_cast<int64_t>(s->flow_controlled_buffer.length) +
1463 s->next_message_end_offset -= t->write_buffer_size;
1464 s->write_buffering =
true;
1466 s->write_buffering =
false;
1478 int64_t notify_offset = s->next_message_end_offset;
1479 if (notify_offset <= s->flow_controlled_bytes_written) {
1482 "fetching_send_message_finished");
1485 if (
cb ==
nullptr) {
1488 t->write_cb_pool =
cb->next;
1490 cb->call_at_byte = notify_offset;
1491 cb->closure = s->send_message_finished;
1492 s->send_message_finished =
nullptr;
1494 ? &s->on_write_finished_cbs
1495 : &s->on_flow_controlled_cbs;
1501 (!s->write_buffering ||
1502 s->flow_controlled_buffer.length > t->write_buffer_size)) {
1509 if (
op->send_trailing_metadata) {
1511 GPR_ASSERT(s->send_trailing_metadata_finished ==
nullptr);
1514 s->send_trailing_metadata =
1517 s->write_buffering =
false;
1519 s->seen_error =
true;
1521 if (s->write_closed) {
1522 s->send_trailing_metadata =
nullptr;
1523 s->sent_trailing_metadata_op =
nullptr;
1525 t, s, &s->send_trailing_metadata_finished,
1526 op->payload->send_trailing_metadata.send_trailing_metadata->empty()
1529 "Attempt to send trailing metadata after "
1530 "stream was closed"),
1531 "send_trailing_metadata_finished");
1532 }
else if (s->id != 0) {
1541 if (
op->recv_initial_metadata) {
1543 GPR_ASSERT(s->recv_initial_metadata_ready ==
nullptr);
1544 s->recv_initial_metadata_ready =
1546 s->recv_initial_metadata =
1548 s->trailing_metadata_available =
1552 (
gpr_atm)t->peer_string.c_str());
1557 if (
op->recv_message) {
1559 GPR_ASSERT(s->recv_message_ready ==
nullptr);
1560 s->recv_message_ready = op_payload->
recv_message.recv_message_ready;
1561 s->recv_message = op_payload->
recv_message.recv_message;
1562 s->recv_message->emplace();
1563 s->recv_message_flags = op_payload->
recv_message.flags;
1564 s->call_failed_before_recv_message =
1565 op_payload->
recv_message.call_failed_before_recv_message;
1569 if (
op->recv_trailing_metadata) {
1573 GPR_ASSERT(s->recv_trailing_metadata_finished ==
nullptr);
1574 s->recv_trailing_metadata_finished =
1576 s->recv_trailing_metadata =
1578 s->final_metadata_requested =
true;
1582 if (on_complete !=
nullptr) {
1596 if (!t->is_client) {
1597 if (
op->send_initial_metadata) {
1598 GPR_ASSERT(!
op->payload->send_initial_metadata.send_initial_metadata
1602 if (
op->send_trailing_metadata) {
1603 GPR_ASSERT(!
op->payload->send_trailing_metadata.send_trailing_metadata
1615 op->handler_private.extra_arg = gs;
1679 t, grpc_schedule_on_exec_ctx),
1684 t, grpc_schedule_on_exec_ctx),
1697 t->ping_state.is_delayed_ping_timer_set =
false;
1708 t->peer_string.c_str(),
id);
1731 ~GracefulGoaway()
override {
1750 void MaybeSendFinalGoawayLocked() {
1758 "transport:%p %s peer:%s Transport already shutting down. "
1759 "Graceful GOAWAY abandoned.",
1760 t_, t_->is_client ?
"CLIENT" :
"SERVER", t_->peer_string.c_str()));
1766 "transport:%p %s peer:%s Graceful shutdown: Ping received. "
1767 "Sending final GOAWAY with stream_id:%d",
1768 t_, t_->is_client ?
"CLIENT" :
"SERVER",
1769 t_->peer_string.c_str(), t_->last_new_stream_id));
1777 auto*
self =
static_cast<GracefulGoaway*
>(
arg);
1778 self->t_->combiner->Run(
1784 auto*
self =
static_cast<GracefulGoaway*
>(
arg);
1786 self->MaybeSendFinalGoawayLocked();
1791 auto*
self =
static_cast<GracefulGoaway*
>(
arg);
1796 self->t_->combiner->Run(
1802 auto*
self =
static_cast<GracefulGoaway*
>(
arg);
1803 self->MaybeSendFinalGoawayLocked();
1816 bool immediate_disconnect_hint) {
1820 &
message, &http_error,
nullptr);
1822 !immediate_disconnect_hint) {
1825 GracefulGoaway::Start(t);
1836 t->last_new_stream_id,
static_cast<uint32_t>(http_error),
1846 if (++t->ping_recv_state.ping_strikes > t->ping_policy.max_ping_strikes &&
1847 t->ping_policy.max_ping_strikes != 0) {
1862 if (!t->is_client) {
1864 t->ping_recv_state.ping_strikes = 0;
1866 t->ping_state.pings_before_data_required =
1867 t->ping_policy.max_pings_without_data;
1880 if (
op->set_accept_stream) {
1881 t->accept_stream_cb =
op->set_accept_stream_fn;
1882 t->accept_stream_cb_user_data =
op->set_accept_stream_user_data;
1885 if (
op->bind_pollset) {
1889 if (
op->bind_pollset_set) {
1893 if (
op->send_ping.on_initiate !=
nullptr ||
op->send_ping.on_ack !=
nullptr) {
1898 if (
op->start_connectivity_watch !=
nullptr) {
1899 t->state_tracker.AddWatcher(
op->start_connectivity_watch_state,
1902 if (
op->stop_connectivity_watch !=
nullptr) {
1903 t->state_tracker.RemoveWatcher(
op->stop_connectivity_watch);
1923 op->handler_private.extra_arg = gt;
1936 if (s->recv_initial_metadata_ready !=
nullptr &&
1938 if (s->seen_error) {
1941 *s->recv_initial_metadata =
std::move(s->initial_metadata_buffer);
1946 if (s->trailing_metadata_available !=
nullptr &&
1949 *s->trailing_metadata_available =
true;
1950 s->trailing_metadata_available =
nullptr;
1958 if (s->recv_message_ready ==
nullptr)
return;
1967 if (s->final_metadata_requested && s->seen_error) {
1969 s->recv_message->reset();
1971 if (s->frame_storage.length != 0) {
1976 s, &min_progress_size, &**s->recv_message, s->recv_message_flags);
1977 if (absl::holds_alternative<grpc_core::Pending>(
r)) {
1978 if (s->read_closed) {
1980 s->recv_message->reset();
1987 error = absl::get<grpc_error_handle>(
r);
1989 s->seen_error =
true;
1993 if (t->channelz_socket !=
nullptr) {
1994 t->channelz_socket->RecordMessageReceived();
2000 }
else if (s->read_closed) {
2001 s->recv_message->reset();
2012 if (s->call_failed_before_recv_message !=
nullptr) {
2013 *s->call_failed_before_recv_message =
2028 if (s->recv_trailing_metadata_finished !=
nullptr && s->read_closed &&
2030 if (s->seen_error || !t->is_client) {
2033 if (s->read_closed && s->frame_storage.length == 0 &&
2034 s->recv_trailing_metadata_finished !=
nullptr) {
2036 s->collecting_stats =
nullptr;
2037 *s->recv_trailing_metadata =
std::move(s->trailing_metadata_buffer);
2049 if (t->incoming_stream == s) {
2050 t->incoming_stream =
nullptr;
2059 "Last stream closed after sending GOAWAY", &
error, 1));
2075 if (!t->is_client && !s->sent_trailing_metadata &&
2081 if (!s->read_closed || !s->write_closed) {
2085 &http_error,
nullptr);
2087 t, s->id,
static_cast<uint32_t>(http_error), &s->stats.outgoing);
2092 s->seen_error =
true;
2104 s->seen_error =
true;
2113 s->recv_trailing_metadata_finished !=
nullptr) {
2116 s->trailing_metadata_buffer.Set(
2130 for (
size_t i = 0;
i < *nrefs;
i++) {
2141 const char* main_error_msg) {
2163 "on_write_finished_cb");
2164 cb->next = t->write_cb_pool;
2165 t->write_cb_pool =
cb;
2175 s->send_initial_metadata =
nullptr;
2178 "send_initial_metadata_finished");
2180 s->send_trailing_metadata =
nullptr;
2181 s->sent_trailing_metadata_op =
nullptr;
2184 "send_trailing_metadata_finished");
2188 "fetching_send_message_finished");
2196 if (s->read_closed && s->write_closed) {
2205 bool closed_read =
false;
2206 bool became_closed =
false;
2207 if (close_reads && !s->read_closed) {
2209 s->read_closed =
true;
2212 if (close_writes && !s->write_closed) {
2214 s->write_closed =
true;
2217 if (s->read_closed && s->write_closed) {
2218 became_closed =
true;
2232 for (
int i = 0;
i < 2;
i++) {
2240 if (became_closed) {
2269 if (!s->sent_initial_metadata) {
2351 size_t msg_len =
message.length();
2370 msg_len_writer.
Write(0,
p);
2383 *
p++ =
static_cast<uint8_t>(s->id >> 24);
2384 *
p++ =
static_cast<uint8_t>(s->id >> 16);
2385 *
p++ =
static_cast<uint8_t>(s->id >> 8);
2386 *
p++ =
static_cast<uint8_t>(s->id);
2390 if (!s->sent_initial_metadata) {
2400 &s->stats.outgoing);
2458 grpc_chttp2_mark_stream_writable(t, s);
2465 queue_setting_update(t,
2466 GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
2467 action.initial_window_size());
2471 queue_setting_update(t, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
2472 action.max_frame_size());
2493 "Trying to connect an http1.x server"),
2522 "Endpoint read failed", &
err, 1),
2547 if (t->initial_window_update != 0) {
2548 if (t->initial_window_update > 0) {
2556 t->initial_window_update = 0;
2561 bool keep_reading =
false;
2564 "Transport closed", &t->closed_with_error, 1);
2574 t->endpoint_reading = 0;
2576 keep_reading =
true;
2586 t->reading_paused_on_pending_induced_frames =
true;
2589 "transport %p : Pausing reading due to too "
2590 "many unwritten SETTINGS ACK and RST_STREAM frames",
2605 grpc_schedule_on_exec_ctx);
2613 t->flow_control.bdp_estimator()->SchedulePing();
2617 grpc_schedule_on_exec_ctx),
2619 grpc_schedule_on_exec_ctx));
2633 gpr_log(
GPR_INFO,
"%s: Start BDP ping err=%s", t->peer_string.c_str(),
2643 t->flow_control.bdp_estimator()->StartPing();
2644 t->bdp_ping_started =
true;
2657 gpr_log(
GPR_INFO,
"%s: Complete BDP ping err=%s", t->peer_string.c_str(),
2664 if (!t->bdp_ping_started) {
2672 t->bdp_ping_started =
false;
2674 t->flow_control.bdp_estimator()->CompletePing();
2678 t->have_next_bdp_ping_timer =
true;
2682 &t->next_bdp_ping_timer_expired_locked);
2697 t->have_next_bdp_ping_timer =
false;
2702 if (t->flow_control.bdp_estimator()->accumulator() == 0) {
2704 t->bdp_ping_blocked =
true;
2715 for (
i = 0;
i <
args->num_args;
i++) {
2718 &
args->args[
i], {is_client ? g_default_client_keepalive_time_ms
2719 : g_default_server_keepalive_time_ms,
2729 &
args->args[
i], {is_client ? g_default_client_keepalive_timeout_ms
2730 : g_default_server_keepalive_timeout_ms,
2737 }
else if (0 == strcmp(
args->args[
i].key,
2741 {is_client ? g_default_client_keepalive_permit_without_calls
2742 : g_default_server_keepalive_timeout_ms,
2752 &
args->args[
i], {g_default_max_ping_strikes, 0, INT_MAX});
2753 }
else if (0 == strcmp(
args->args[
i].key,
2756 &
args->args[
i], {g_default_max_pings_without_data, 0, INT_MAX});
2764 {g_default_min_recv_ping_interval_without_data_ms, 0, INT_MAX});
2783 if (t->keepalive_permit_without_calls ||
2793 grpc_schedule_on_exec_ctx);
2796 &t->init_keepalive_ping_locked);
2802 grpc_schedule_on_exec_ctx);
2805 &t->init_keepalive_ping_locked);
2822 if (t->channelz_socket !=
nullptr) {
2823 t->channelz_socket->RecordKeepaliveSent();
2827 gpr_log(
GPR_INFO,
"%s: Start keepalive ping", t->peer_string.c_str());
2834 &t->keepalive_watchdog_fired_locked);
2835 t->keepalive_ping_started =
true;
2851 gpr_log(
GPR_INFO,
"%s: Finish keepalive ping", t->peer_string.c_str());
2853 if (!t->keepalive_ping_started) {
2862 t->keepalive_ping_started =
false;
2867 grpc_schedule_on_exec_ctx);
2870 &t->init_keepalive_ping_locked);
2890 t->peer_string.c_str());
2894 "keepalive watchdog timeout"),
2916 const char* reason) {
2943 if (!t->benign_reclaimer_registered) {
2944 t->benign_reclaimer_registered =
true;
2946 t->memory_owner.PostReclaimer(
2950 GRPC_CLOSURE_INIT(&t->benign_reclaimer_locked,
2951 benign_reclaimer_locked, t,
2952 grpc_schedule_on_exec_ctx);
2953 t->active_reclamation = std::move(*sweep);
2954 t->combiner->Run(&t->benign_reclaimer_locked, GRPC_ERROR_NONE);
2956 GRPC_CHTTP2_UNREF_TRANSPORT(t,
"benign_reclaimer");
2963 if (!t->destructive_reclaimer_registered) {
2964 t->destructive_reclaimer_registered =
true;
2966 t->memory_owner.PostReclaimer(
2970 GRPC_CLOSURE_INIT(&t->destructive_reclaimer_locked,
2971 destructive_reclaimer_locked, t,
2972 grpc_schedule_on_exec_ctx);
2973 t->active_reclamation = std::move(*sweep);
2974 t->combiner->Run(&t->destructive_reclaimer_locked, GRPC_ERROR_NONE);
2976 GRPC_CHTTP2_UNREF_TRANSPORT(t,
"benign_reclaimer");
2990 t->peer_string.c_str());
3000 "HTTP2: %s - skip benign reclamation, there are still %" PRIdPTR
3002 t->peer_string.c_str(),
3005 t->benign_reclaimer_registered =
false;
3007 t->active_reclamation.Finish();
3015 t->destructive_reclaimer_registered =
false;
3021 t->peer_string.c_str(), s->id);
3037 t->active_reclamation.Finish();
3050 return "INITIAL_WRITE";
3052 return "START_NEW_STREAM";
3054 return "SEND_MESSAGE";
3056 return "SEND_INITIAL_METADATA";
3058 return "SEND_TRAILING_METADATA";
3060 return "RETRY_SEND_PING";
3062 return "CONTINUE_PINGS";
3064 return "GOAWAY_SENT";
3066 return "RST_STREAM";
3068 return "CLOSE_FROM_API";
3070 return "STREAM_FLOW_CONTROL";
3072 return "TRANSPORT_FLOW_CONTROL";
3074 return "SEND_SETTINGS";
3076 return "SETTINGS_ACK";
3078 return "FLOW_CONTROL_UNSTALLED_BY_SETTING";
3080 return "FLOW_CONTROL_UNSTALLED_BY_UPDATE";
3082 return "APPLICATION_PING";
3086 return "KEEPALIVE_PING";
3088 return "TRANSPORT_FLOW_CONTROL_UNSTALLED";
3090 return "PING_RESPONSE";
3092 return "FORCE_RST_STREAM";
3119 return t->channelz_socket;
3134 t,
"reading_action");
3135 if (read_buffer !=
nullptr) {
3139 t->notify_on_receive_settings = notify_on_receive_settings;
3140 t->notify_on_close = notify_on_close;
void grpc_chttp2_fake_status(grpc_chttp2_transport *t, grpc_chttp2_stream *s, grpc_error_handle error)
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
grpc_core::TraceFlag grpc_keepalive_trace(false, "http_keepalive")
static int g_default_client_keepalive_time_ms
#define GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER
void grpc_chttp2_maybe_complete_recv_trailing_metadata(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
void grpc_chttp2_complete_closure_step(grpc_chttp2_transport *t, grpc_chttp2_stream *, grpc_closure **pclosure, grpc_error_handle error, const char *desc)
static void next_bdp_ping_timer_expired(void *tp, grpc_error_handle error)
void grpc_transport_move_stats(grpc_transport_stream_stats *from, grpc_transport_stream_stats *to)
static void destroy_transport(grpc_transport *gt)
GPRAPI void grpc_slice_buffer_move_into(grpc_slice_buffer *src, grpc_slice_buffer *dst)
static void init_keepalive_pings_if_enabled(grpc_chttp2_transport *t)
@ GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SETTINGS_ACK()
GPR_GLOBAL_CONFIG_DEFINE_BOOL(grpc_experimental_enable_peer_state_based_framing, false, "If set, the max sizes of frames sent to lower layers is controlled based " "on the peer's memory pressure which is reflected in its max http2 frame " "size.")
static int g_default_server_keepalive_time_ms
static void destructive_reclaimer_locked(void *arg, grpc_error_handle error)
void grpc_chttp2_goaway_parser_destroy(grpc_chttp2_goaway_parser *p)
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_FLOW_CONTROL_UNSTALLED_BY_UPDATE()
@ GRPC_STATUS_UNAVAILABLE
@ GRPC_CHTTP2_KEEPALIVE_STATE_WAITING
const grpc_slice & grpc_slice_ref_internal(const grpc_slice &slice)
static void init_transport_keepalive_settings(grpc_chttp2_transport *t)
static void start_bdp_ping(void *tp, grpc_error_handle error)
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
int pings_before_data_required
bool grpc_chttp2_list_remove_writable_stream(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
#define GRPC_ARG_HTTP2_MAX_PING_STRIKES
bool grpc_chttp2_list_pop_writable_stream(grpc_chttp2_transport *t, grpc_chttp2_stream **s)
static void RunList(const DebugLocation &location, grpc_closure_list *list)
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &... args)
void(* TestOnlyGlobalHttp2TransportDestructCallback)()
#define GPR_DEBUG_ASSERT(x)
static void send_goaway(grpc_chttp2_transport *t, grpc_error_handle error, bool immediate_disconnect_hint)
@ GRPC_CHTTP2_INITIATE_WRITE_APPLICATION_PING
grpc_chttp2_stream * grpc_chttp2_parsing_accept_stream(grpc_chttp2_transport *t, uint32_t id)
grpc_chttp2_stream_list lists[STREAM_LIST_COUNT]
@ GRPC_HTTP2_ENHANCE_YOUR_CALM
static void start_keepalive_ping(void *arg, grpc_error_handle error)
void SetPendingSize(int64_t pending_size)
int grpc_channel_arg_get_integer(const grpc_arg *arg, const grpc_integer_options options)
grpc_error_handle grpc_http_parser_eof(grpc_http_parser *parser)
GPRAPI grpc_slice grpc_slice_from_copied_string(const char *source)
@ GRPC_CHTTP2_INITIATE_WRITE_INITIAL_WRITE
grpc_transport * grpc_create_chttp2_transport(const grpc_channel_args *channel_args, grpc_endpoint *ep, bool is_client)
grpc_chttp2_begin_write_result grpc_chttp2_begin_write(grpc_chttp2_transport *t)
#define GPR_GLOBAL_CONFIG_GET(name)
void TestOnlySetGlobalHttp2TransportDestructCallback(TestOnlyGlobalHttp2TransportDestructCallback callback)
grpc_closure_list lists[GRPC_CHTTP2_PCL_COUNT]
#define GPR_TIMER_SCOPE(tag, important)
#define GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER
constexpr const char * kKeepaliveThrottlingKey
@ GRPC_ERROR_INT_HTTP2_ERROR
http2 error code associated with the error (see the HTTP2 RFC)
static void perform_transport_op_locked(void *stream_op, grpc_error_handle)
void grpc_chttp2_maybe_complete_recv_message(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
grpc_chttp2_transport * t
#define GRPC_ARG_OPTIMIZATION_TARGET
@ GRPC_CHTTP2_INITIATE_WRITE_RST_STREAM
struct grpc_pollset_set grpc_pollset_set
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_CLOSE_FROM_API()
static void remove_stream(grpc_chttp2_transport *t, uint32_t id, grpc_error_handle error)
uintptr_t StatusAllocHeapPtr(absl::Status s)
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_RETRY_SEND_PING()
void reset(T *value=nullptr)
static void send_ping_locked(grpc_chttp2_transport *t, grpc_closure *on_initiate, grpc_closure *on_ack)
#define GRPC_STATS_INC_HTTP2_OP_SEND_MESSAGE()
grpc_chttp2_stream_map stream_map
@ GRPC_CHTTP2_PCL_INFLIGHT
grpc_closure * recv_initial_metadata_ready
GPRAPI void gpr_free(void *ptr)
static int g_default_client_keepalive_timeout_ms
void grpc_chttp2_add_ping_strike(grpc_chttp2_transport *t)
@ GRPC_DTS_CLIENT_PREFIX_0
void grpc_endpoint_read(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, bool urgent, int min_progress_size)
#define GRPC_SLICE_MALLOC(len)
static grpc_closure * add_closure_barrier(grpc_closure *closure)
@ GRPC_CHTTP2_INITIATE_WRITE_FLOW_CONTROL_UNSTALLED_BY_UPDATE
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SEND_SETTINGS()
void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport *t, uint32_t goaway_error, uint32_t last_stream_id, absl::string_view goaway_text)
static void next_bdp_ping_timer_expired_locked(void *tp, grpc_error_handle error)
absl::string_view grpc_endpoint_get_peer(grpc_endpoint *ep)
grpc_chttp2_write_cb * write_cb_pool
@ GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL_UNSTALLED
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_TRANSPORT_FLOW_CONTROL_UNSTALLED()
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_INITIAL_WRITE()
static void null_then_sched_closure(grpc_closure **closure)
@ GRPC_CHANNEL_TRANSIENT_FAILURE
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_START_NEW_STREAM()
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_APPLICATION_PING()
GPRAPI void * gpr_malloc(size_t size)
grpc_core::TraceFlag grpc_http_trace(false, "http")
OPENSSL_EXPORT pem_password_cb void * u
@ GRPC_CHTTP2_PCL_INITIATE
#define GRPC_STATS_INC_HTTP2_OP_SEND_TRAILING_METADATA()
#define GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(desc, errs, count)
#define GRPC_CHTTP2_DATA_FLAG_END_HEADERS
@ GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS
#define DEFAULT_MAX_PENDING_INDUCED_FRAMES
void grpc_chttp2_maybe_complete_recv_initial_metadata(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
#define GRPC_ARG_ENABLE_CHANNELZ
grpc_core::TraceFlag grpc_resource_quota_trace(false, "resource_quota")
#define GRPC_CHTTP2_STREAM_UNREF(stream, reason)
grpc_metadata_batch * send_initial_metadata
#define GRPC_STATS_INC_HTTP2_PARTIAL_WRITES()
static constexpr Timestamp InfPast()
#define GRPC_CHTTP2_UNREF_TRANSPORT(t, r)
static void Execute(void *arg, Timestamps *ts, grpc_error_handle error)
grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_refcount(false, "chttp2_refcount")
@ GRPC_CHTTP2_INITIATE_WRITE_SEND_INITIAL_METADATA
grpc_chttp2_stream(grpc_chttp2_transport *t, grpc_stream_refcount *refcount, const void *server_data, grpc_core::Arena *arena)
@ GRPC_ERROR_STR_RAW_BYTES
hex dump (or similar) with the data that generated this error
#define GRPC_CLOSURE_CREATE(cb, cb_arg, scheduler)
@ GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE
#define GRPC_ERROR_CANCELLED
@ GRPC_CHTTP2_INITIATE_WRITE_GOAWAY_SENT
@ GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS
@ GRPC_CHTTP2_INITIATE_WRITE_FORCE_RST_STREAM
static const grpc_transport_vtable * get_vtable(void)
#define GRPC_STATS_INC_HTTP2_OP_RECV_TRAILING_METADATA()
void TestOnlySetGlobalHttp2TransportInitCallback(TestOnlyGlobalHttp2TransportInitCallback callback)
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_TRANSPORT_FLOW_CONTROL()
static int g_default_max_ping_strikes
@ GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA
bool is_delayed_ping_timer_set
bool grpc_channel_args_find_bool(const grpc_channel_args *args, const char *name, bool default_value)
static void set_pollset(grpc_transport *gt, grpc_stream *, grpc_pollset *pollset)
#define GRPC_TRACE_FLAG_ENABLED(f)
@ GRPC_CHTTP2_GRACEFUL_GOAWAY
static void write_action(void *t, grpc_error_handle error)
grpc_closure * recv_trailing_metadata_finished
static void finish_keepalive_ping_locked(void *arg, grpc_error_handle error)
static void continue_read_action_locked(grpc_chttp2_transport *t)
void grpc_chttp2_parsing_become_skip_parser(grpc_chttp2_transport *t)
grpc_error_handle read_closed_error
@ GRPC_CHTTP2_NO_GOAWAY_SEND
static void write_action_end_locked(void *t, grpc_error_handle error)
#define GRPC_CHTTP2_FRAME_HEADER
static grpc_error_handle try_http_parsing(grpc_chttp2_transport *t)
grpc_core::ScopedArenaPtr arena
bool grpc_closure_list_append(grpc_closure_list *closure_list, grpc_closure *closure)
FlowControlAction MakeAction()
void grpc_chttp2_ack_ping(grpc_chttp2_transport *t, uint64_t id)
@ GRPC_CHTTP2_KEEPALIVE_STATE_DISABLED
grpc_chttp2_stream ** accepting_stream
grpc_error_handle grpc_error_set_str(grpc_error_handle src, grpc_error_strs which, absl::string_view str)
static grpc_error_handle removal_error(grpc_error_handle extra_error, grpc_chttp2_stream *s, const char *main_error_msg)
constexpr bool is_set(int i) const
grpc_core::chttp2::TransportFlowControl flow_control
static void init_keepalive_ping(void *arg, grpc_error_handle error)
GPRAPI uint8_t * grpc_slice_buffer_tiny_add(grpc_slice_buffer *sb, size_t len)
FlowControlAction PeriodicUpdate()
@ GRPC_ERROR_STR_TARGET_ADDRESS
peer that we were trying to communicate when this error occurred
#define GRPC_ENABLE_CHANNELZ_DEFAULT
void grpc_chttp2_stream_unref(grpc_chttp2_stream *s, const char *reason)
grpc_core::Timestamp last_ping_recv_time
bool grpc_channel_arg_get_bool(const grpc_arg *arg, bool default_value)
void grpc_chttp2_mark_stream_writable(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
#define GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_ENCODER
@ GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE
@ GRPC_CHTTP2_FINAL_GOAWAY_SEND_SCHEDULED
static void write_action_begin_locked(void *t, grpc_error_handle error)
static void write_action_end(void *t, grpc_error_handle error)
void grpc_chttp2_stream_map_add(grpc_chttp2_stream_map *map, uint32_t key, void *value)
grpc_chttp2_transport(const grpc_channel_args *channel_args, grpc_endpoint *ep, bool is_client)
grpc_chttp2_initiate_write_reason
void grpc_chttp2_stream_ref(grpc_chttp2_stream *s, const char *reason)
const char * grpc_chttp2_initiate_write_reason_string(grpc_chttp2_initiate_write_reason reason)
void grpc_timer_init_unset(grpc_timer *timer)
static void cancel_pings(grpc_chttp2_transport *t, grpc_error_handle error)
@ GRPC_CHTTP2_INITIATE_WRITE_SEND_TRAILING_METADATA
grpc_error_handle grpc_error_add_child(grpc_error_handle src, grpc_error_handle child)
void(* TestOnlyGlobalHttp2TransportInitCallback)()
grpc_core::Combiner * grpc_combiner_create(void)
std::vector< CordRep * > refs
#define MAX_CLIENT_STREAM_ID
#define DEFAULT_CLIENT_KEEPALIVE_TIMEOUT_MS
void grpc_chttp2_goaway_append(uint32_t last_stream_id, uint32_t error_code, const grpc_slice &debug_data, grpc_slice_buffer *slice_buffer)
void grpc_chttp2_config_default_keepalive_args(grpc_channel_args *args, bool is_client)
static void perform_stream_op(grpc_transport *gt, grpc_stream *gs, grpc_transport_stream_op_batch *op)
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_STREAM_FLOW_CONTROL()
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
static void close_transport_locked(grpc_chttp2_transport *t, grpc_error_handle error)
@ GRPC_CHTTP2_INITIATE_WRITE_KEEPALIVE_PING
union grpc_closure::@14 next_data
bool grpc_chttp2_list_add_writable_stream(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
grpc_closure * destroy_stream_arg
static void post_destructive_reclaimer(grpc_chttp2_transport *t)
constexpr bool has_value() const noexcept
grpc_closure * recv_message_ready
def c_str(s, encoding='ascii')
void * grpc_chttp2_stream_map_find(grpc_chttp2_stream_map *map, uint32_t key)
@ GRPC_CHTTP2_INITIATE_WRITE_START_NEW_STREAM
@ GRPC_CHTTP2_WRITE_STATE_WRITING
grpc_slice_buffer frame_storage
static void perform_transport_op(grpc_transport *gt, grpc_transport_op *op)
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_GOAWAY_SENT()
@ GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_KEEPALIVE_PING()
#define GRPC_ARG_HTTP2_MAX_FRAME_SIZE
void grpc_chttp2_list_add_waiting_for_concurrency(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
static Slice FromCopiedBuffer(const char *p, size_t len)
grpc_slice_buffer * c_slice_buffer()
Return a pointer to the back raw grpc_slice_buffer.
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_CONTINUE_PINGS()
#define DEFAULT_CLIENT_KEEPALIVE_TIME_MS
void RecordStreamFailed()
static void cancel_stream_cb(void *user_data, uint32_t, void *stream)
static void retry_initiate_ping_locked(void *tp, grpc_error_handle error)
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_metadata_batch initial_metadata_buffer
static void add_error(grpc_error_handle error, grpc_error_handle *refs, size_t *nrefs)
void grpc_chttp2_stream_map_for_each(grpc_chttp2_stream_map *map, void(*f)(void *user_data, uint32_t key, void *value), void *user_data)
static bool contains_non_ok_status(grpc_metadata_batch *batch)
@ GRPC_CHTTP2_FINAL_GOAWAY_SENT
void SetMinProgressSize(uint32_t min_progress_size)
static void read_channel_args(grpc_chttp2_transport *t, const grpc_channel_args *channel_args, bool is_client)
void SetPayload(absl::string_view type_url, absl::Cord payload)
static void send_keepalive_ping_locked(grpc_chttp2_transport *t)
@ GRPC_CHTTP2_INITIATE_WRITE_RETRY_SEND_PING
grpc_chttp2_goaway_parser goaway_parser
grpc_chttp2_server_ping_recv_state ping_recv_state
void grpc_chttp2_act_on_flowctl_action(const grpc_core::chttp2::FlowControlAction &action, grpc_chttp2_transport *t, grpc_chttp2_stream *s)
grpc_error_handle cancel_error
unsigned __int64 uint64_t
static void log_metadata(const grpc_metadata_batch *md_batch, uint32_t id, bool is_client, bool is_initial)
#define GRPC_WRITE_BUFFER_HINT
static void connectivity_state_set(grpc_chttp2_transport *t, grpc_connectivity_state state, const absl::Status &status, const char *reason)
#define GRPC_HEADER_SIZE_IN_BYTES
#define GRPC_SLICE_START_PTR(slice)
grpc_error_handle goaway_error
bool grpc_error_get_int(grpc_error_handle err, grpc_error_ints which, intptr_t *p)
#define GRPC_WRITE_THROUGH
static const grpc_transport_vtable vtable
void swap(Json::Value &a, Json::Value &b)
Specialize std::swap() for Json::Value.
grpc_metadata_batch * send_trailing_metadata
GPRAPI grpc_slice grpc_empty_slice(void)
#define gpr_atm_rel_store(p, value)
bool grpc_chttp2_list_pop_waiting_for_concurrency(grpc_chttp2_transport *t, grpc_chttp2_stream **s)
grpc_error_handle closed_with_error
static void read_action_locked(void *t, grpc_error_handle error)
static void finish_bdp_ping(void *tp, grpc_error_handle error)
void grpc_stream_ref(grpc_stream_refcount *refcount, const char *reason)
struct grpc_chttp2_stream grpc_chttp2_stream
#define GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA
void * grpc_chttp2_stream_map_delete(grpc_chttp2_stream_map *map, uint32_t key)
void grpc_http_response_destroy(grpc_http_response *response)
void TestOnlyGlobalHttp2TransportDisableTransientFailureStateNotification(bool disable)
void Write(uint8_t prefix, uint8_t *target) const
void grpc_chttp2_list_remove_stalled_by_transport(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
grpc_closure * send_trailing_metadata_finished
size_t Length() const
The total number of bytes held by the SliceBuffer.
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
static void init_keepalive_ping_locked(void *arg, grpc_error_handle error)
static void callback(void *arg, int status, int timeouts, struct hostent *host)
#define GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES
grpc_transport_stream_op_batch * batch
void grpc_http_parser_destroy(grpc_http_parser *)
void * grpc_chttp2_stream_map_rand(grpc_chttp2_stream_map *map)
_W64 unsigned int uintptr_t
#define GRPC_SLICE_END_PTR(slice)
static void keepalive_watchdog_fired(void *arg, grpc_error_handle error)
void grpc_endpoint_destroy(grpc_endpoint *ep)
@ GRPC_METADATA_PUBLISHED_FROM_WIRE
@ GRPC_CHTTP2_KEEPALIVE_STATE_DYING
@ GRPC_METADATA_PUBLISHED_AT_CLOSE
void schedule_bdp_ping_locked(grpc_chttp2_transport *t)
static const char * write_state_name(grpc_chttp2_write_state st)
GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer *sb)
static void destroy_stream_locked(void *sp, grpc_error_handle)
#define GRPC_ARG_KEEPALIVE_TIMEOUT_MS
void RecordStreamSucceeded()
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
static RefCountedPtr< Security > GetFromChannelArgs(const grpc_channel_args *args)
size_t grpc_chttp2_stream_map_size(grpc_chttp2_stream_map *map)
@ GRPC_CHTTP2_INITIATE_WRITE_FLOW_CONTROL_UNSTALLED_BY_SETTING
#define GRPC_SLICE_LENGTH(slice)
grpc_status_code grpc_http2_status_to_grpc_status(int status)
@ GRPC_CHTTP2_INITIATE_WRITE_CONTINUE_PINGS
void grpc_chttp2_list_remove_waiting_for_concurrency(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
#define DEFAULT_MAX_PINGS_BETWEEN_DATA
grpc_core::Timestamp last_ping_sent_time
grpc_core::RefCountedPtr< grpc_core::channelz::SocketNode > grpc_chttp2_transport_get_socket_node(grpc_transport *transport)
grpc_chttp2_transport * t
#define GRPC_CHTTP2_REF_TRANSPORT(t, r)
grpc_closure * send_initial_metadata_finished
static void set_write_state(grpc_chttp2_transport *t, grpc_chttp2_write_state st, const char *reason)
std::string grpc_transport_stream_op_batch_string(grpc_transport_stream_op_batch *op)
static void keepalive_watchdog_fired_locked(void *arg, grpc_error_handle error)
static int g_default_max_pings_without_data
void grpc_timer_cancel(grpc_timer *timer)
static constexpr Duration Milliseconds(int64_t millis)
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_FLOW_CONTROL_UNSTALLED_BY_SETTING()
ABSL_NAMESPACE_BEGIN Time Now()
bool grpc_chttp2_list_remove_stalled_by_stream(grpc_chttp2_transport *t, grpc_chttp2_stream *s)
void grpc_chttp2_end_write(grpc_chttp2_transport *t, grpc_error_handle error)
#define GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE
#define GPR_ARRAY_SIZE(array)
GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice slice)
static bool g_default_server_keepalive_permit_without_calls
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_RST_STREAM()
uint32_t settings[GRPC_NUM_SETTING_SETS][GRPC_CHTTP2_NUM_SETTINGS]
T Clamp(T val, T min, T max)
#define GRPC_ERROR_REF(err)
#define GRPC_WRITE_INTERNAL_COMPRESS
static void finish_keepalive_ping(void *arg, grpc_error_handle error)
#define GRPC_CHTTP2_STREAM_REF(stream, reason)
static void start_bdp_ping_locked(void *tp, grpc_error_handle error)
Reffer(grpc_chttp2_stream *s)
#define GRPC_CHTTP2_NUM_SETTINGS
@ GRPC_CHTTP2_INITIATE_WRITE_PING_RESPONSE
grpc_error_handle grpc_error_set_int(grpc_error_handle src, grpc_error_ints which, intptr_t value)
grpc_core::Poll< grpc_error_handle > grpc_deframe_unprocessed_incoming_frames(grpc_chttp2_stream *s, uint32_t *min_progress_size, grpc_core::SliceBuffer *stream_out, uint32_t *message_flags)
ResourceQuotaRefPtr ResourceQuotaFromChannelArgs(const grpc_channel_args *args)
static void queue_setting_update(grpc_chttp2_transport *t, grpc_chttp2_setting_id id, uint32_t value)
static void benign_reclaimer_locked(void *arg, grpc_error_handle error)
static void WithUrgency(grpc_chttp2_transport *t, grpc_core::chttp2::FlowControlAction::Urgency urgency, grpc_chttp2_initiate_write_reason reason, F action)
#define GRPC_ARG_MAX_METADATA_SIZE
grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport *t, const grpc_slice &slice)
grpc_core::BitSet< STREAM_LIST_COUNT > included
static void destroy_transport_locked(void *tp, grpc_error_handle)
struct grpc_chttp2_transport grpc_chttp2_transport
#define GRPC_CHTTP2_IF_TRACING(stmt)
void grpc_chttp2_stream_map_destroy(grpc_chttp2_stream_map *map)
std::string grpc_error_std_string(grpc_error_handle error)
grpc_core::RefCountedPtr< grpc_core::channelz::SocketNode > channelz_socket
const grpc_transport_vtable * vtable
#define GRPC_CHTTP2_CLIENT_CONNECT_STRING
static void maybe_start_some_streams(grpc_chttp2_transport *t)
void grpc_chttp2_stream_map_init(grpc_chttp2_stream_map *map, size_t initial_capacity)
#define CLOSURE_BARRIER_MAY_COVER_WRITE
#define GRPC_CHTTP2_DATA_FLAG_END_STREAM
void grpc_endpoint_add_to_pollset_set(grpc_endpoint *ep, grpc_pollset_set *pollset_set)
union grpc_closure::@15 error_data
@ GRPC_CHTTP2_SETTINGS_ENABLE_PUSH
void grpc_chttp2_initiate_write(grpc_chttp2_transport *t, grpc_chttp2_initiate_write_reason reason)
void grpc_chttp2_retry_initiate_ping(void *tp, grpc_error_handle error)
std::string grpc_transport_op_string(grpc_transport_op *op)
static void configure_transport_ping_policy(grpc_chttp2_transport *t)
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SEND_INITIAL_METADATA()
bool grpc_error_has_clear_grpc_status(grpc_error_handle error)
size_t Count() const
Returns the number of slices held by the SliceBuffer.
AllocList * next[kMaxLevel]
#define DEFAULT_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS
static bool g_default_client_keepalive_permit_without_calls
grpc_core::SliceBuffer * send_message
#define GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY
static constexpr Duration Seconds(int64_t seconds)
grpc_metadata_batch * recv_initial_metadata
#define GRPC_ARG_HTTP2_BDP_PROBE
grpc_error_handle grpc_http_parser_parse(grpc_http_parser *parser, const grpc_slice &slice, size_t *start_of_body)
static const char prefix[]
@ GRPC_CHTTP2_INITIATE_WRITE_SETTINGS_ACK
grpc_stream_refcount * refcount
void grpc_http_parser_init(grpc_http_parser *parser, grpc_http_type type, void *request_or_response)
grpc_error_handle write_closed_error
@ GRPC_CHTTP2_WRITE_STATE_IDLE
grpc_core::chttp2::StreamFlowControl flow_control
@ GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE
absl::optional< grpc_core::SliceBuffer > * recv_message
void grpc_chttp2_cancel_stream(grpc_chttp2_transport *t, grpc_chttp2_stream *s, grpc_error_handle due_to_error)
grpc_slice grpc_slice_from_cpp_string(std::string str)
void grpc_timer_init(grpc_timer *timer, grpc_core::Timestamp deadline, grpc_closure *closure)
#define GRPC_STATS_INC_HTTP2_OP_CANCEL()
void grpc_chttp2_mark_stream_closed(grpc_chttp2_transport *t, grpc_chttp2_stream *s, int close_reads, int close_writes, grpc_error_handle error)
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SEND_MESSAGE()
grpc_chttp2_repeated_ping_state ping_state
#define GRPC_ERROR_UNREF(err)
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
#define KEEPALIVE_TIME_BACKOFF_MULTIPLIER
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_PING_RESPONSE()
@ GRPC_METADATA_NOT_PUBLISHED
void grpc_closure_list_fail_all(grpc_closure_list *list, grpc_error_handle forced_failure)
absl::Status StatusMoveFromHeapPtr(uintptr_t ptr)
Move the status from a heap ptr. (GetFrom & FreeHeap)
#define GRPC_STATS_INC_HTTP2_OP_SEND_INITIAL_METADATA()
void grpc_chttp2_add_rst_stream_to_next_write(grpc_chttp2_transport *t, uint32_t id, uint32_t code, grpc_transport_one_way_stats *stats)
static int g_default_server_keepalive_timeout_ms
@ GRPC_CHTTP2_INITIATE_WRITE_STREAM_FLOW_CONTROL
static void set_pollset_set(grpc_transport *gt, grpc_stream *, grpc_pollset_set *pollset_set)
void grpc_chttp2_goaway_parser_init(grpc_chttp2_goaway_parser *p)
struct grpc_stream grpc_stream
grpc_slice_buffer flow_controlled_buffer
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_FORCE_RST_STREAM()
@ GRPC_CHTTP2_INITIATE_WRITE_BDP_PING
void grpc_slice_buffer_destroy_internal(grpc_slice_buffer *sb)
#define GRPC_STATS_INC_HTTP2_SEND_MESSAGE_SIZE(value)
grpc_metadata_batch trailing_metadata_buffer
static void flush_write_list(grpc_chttp2_transport *t, grpc_chttp2_stream *s, grpc_chttp2_write_cb **list, grpc_error_handle error)
@ GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE
static void start_keepalive_ping_locked(void *arg, grpc_error_handle error)
static void close_from_api(grpc_chttp2_transport *t, grpc_chttp2_stream *s, grpc_error_handle error)
void grpc_endpoint_write(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, void *arg, int max_frame_size)
#define GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS
#define GRPC_STATS_INC_HTTP2_OP_RECV_MESSAGE()
static int init_stream(grpc_transport *gt, grpc_stream *gs, grpc_stream_refcount *refcount, const void *server_data, grpc_core::Arena *arena)
static void post_benign_reclaimer(grpc_chttp2_transport *t)
const grpc_chttp2_setting_parameters grpc_chttp2_settings_parameters[GRPC_CHTTP2_NUM_SETTINGS]
void grpc_error_get_status(grpc_error_handle error, grpc_core::Timestamp deadline, grpc_status_code *code, std::string *message, grpc_http2_error_code *http_error, const char **error_string)
static void inc_initiate_write_reason(grpc_chttp2_initiate_write_reason reason)
bool grpc_chttp2_list_pop_stalled_by_stream(grpc_chttp2_transport *t, grpc_chttp2_stream **s)
static constexpr Timestamp InfFuture()
void grpc_chttp2_fail_pending_writes(grpc_chttp2_transport *t, grpc_chttp2_stream *s, grpc_error_handle error)
static void destroy_stream(grpc_transport *gt, grpc_stream *gs, grpc_closure *then_schedule_closure)
@ GRPC_METADATA_SYNTHESIZED_FROM_FAKE
grpc_metadata_batch * recv_trailing_metadata
void grpc_chttp2_reset_ping_clock(grpc_chttp2_transport *t)
@ GRPC_ERROR_INT_OCCURRED_DURING_WRITE
chttp2: did the error occur while a write was in progress
grpc_core::ContextList * cl
@ GRPC_CHTTP2_KEEPALIVE_STATE_PINGING
@ GRPC_ERROR_INT_HTTP_STATUS
HTTP status (i.e. 404)
absl::string_view grpc_endpoint_get_local_address(grpc_endpoint *ep)
#define GRPC_ARG_KEEPALIVE_TIME_MS
#define CLOSURE_BARRIER_FIRST_REF_BIT
#define DEFAULT_KEEPALIVE_PERMIT_WITHOUT_CALLS
#define GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS
absl::Status grpc_error_to_absl_status(grpc_error_handle error)
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern self
#define GRPC_STATS_INC_HTTP2_OP_BATCHES()
void grpc_endpoint_add_to_pollset(grpc_endpoint *ep, grpc_pollset *pollset)
bool grpc_closure_list_empty(grpc_closure_list closure_list)
struct grpc_chttp2_stream::Reffer reffer
struct grpc_chttp2_write_cb * next
@ GRPC_CHTTP2_INITIATE_WRITE_SEND_MESSAGE
static void read_action(void *t, grpc_error_handle error)
#define ABSL_FALLTHROUGH_INTENDED
#define DEFAULT_MAX_HEADER_LIST_SIZE
#define GRPC_COMBINER_UNREF(combiner, reason)
static void end_all_the_calls(grpc_chttp2_transport *t, grpc_error_handle error)
static bool to_string(zval *from)
#define GRPC_CHTTP2_CLIENT_CONNECT_STRLEN
static void finish_bdp_ping_locked(void *tp, grpc_error_handle error)
static void perform_stream_op_locked(void *stream_op, grpc_error_handle)
@ GRPC_CHTTP2_INITIATE_WRITE_CLOSE_FROM_API
void grpc_stream_unref(grpc_stream_refcount *refcount, const char *reason)
#define GPR_TIMER_MARK(tag, important)
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_BDP_ESTIMATOR_PING()
void grpc_slice_buffer_reset_and_unref_internal(grpc_slice_buffer *sb)
#define GRPC_STATS_INC_HTTP2_OP_RECV_INITIAL_METADATA()
grpc_slice_buffer read_buffer
#define DEFAULT_MAX_PING_STRIKES
void grpc_chttp2_transport_start_reading(grpc_transport *transport, grpc_slice_buffer *read_buffer, grpc_closure *notify_on_receive_settings, grpc_closure *notify_on_close)
OPENSSL_EXPORT pem_password_cb * cb
static void cancel_unstarted_streams(grpc_chttp2_transport *t, grpc_error_handle error)
static constexpr Duration Infinity()
RefCountedPtr< Child > Ref() GRPC_MUST_USE_RESULT
@ GRPC_ERROR_INT_GRPC_STATUS
grpc status code representing this error
#define GRPC_STATS_INC_HTTP2_SPURIOUS_WRITES_BEGUN()
#define DEFAULT_SERVER_KEEPALIVE_TIME_MS
#define GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SEND_TRAILING_METADATA()
struct grpc_transport_stream_op_batch_payload::@46 cancel_stream
#define DEFAULT_SERVER_KEEPALIVE_TIMEOUT_MS
#define GRPC_ERROR_IS_NONE(err)
static grpc_endpoint * chttp2_get_endpoint(grpc_transport *t)
#define GRPC_ARG_MAX_CONCURRENT_STREAMS
grpc_core::Combiner * combiner
static const char * begin_writing_desc(bool partial)
static int g_default_min_recv_ping_interval_without_data_ms
grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:54