grpc 1.82.0 → 1.83.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +8 -5
- data/etc/roots.pem +10400 -3855
- data/include/grpc/grpc_audit_logging.h +2 -2
- data/include/grpc/grpc_security_constants.h +2 -0
- data/include/grpc/impl/channel_arg_names.h +23 -0
- data/src/core/call/call_filters.h +19 -3
- data/src/core/call/call_spine.h +4 -4
- data/src/core/call/client_call.cc +1 -1
- data/src/core/call/metadata.cc +7 -2
- data/src/core/call/server_call.cc +13 -3
- data/src/core/call/server_call.h +5 -3
- data/src/core/client_channel/backup_poller.cc +2 -17
- data/src/core/client_channel/client_channel.cc +17 -14
- data/src/core/client_channel/client_channel.h +3 -1
- data/src/core/client_channel/client_channel_filter.cc +11 -13
- data/src/core/client_channel/client_channel_service_config.cc +5 -13
- data/src/core/client_channel/direct_channel.cc +5 -1
- data/src/core/client_channel/direct_channel.h +3 -1
- data/src/core/config/experiment_env_var.cc +30 -0
- data/src/core/config/experiment_env_var.h +26 -0
- data/src/core/credentials/call/regional_access_boundary_fetcher.cc +6 -6
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +14 -2
- data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.cc +172 -0
- data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +103 -0
- data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +3 -2
- data/src/core/credentials/transport/tls/load_system_roots_supported.cc +10 -3
- data/src/core/credentials/transport/tls/tls_security_connector.cc +14 -2
- data/src/core/credentials/transport/xds/xds_credentials.cc +4 -12
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -13
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +11 -9
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +3 -2
- data/src/core/ext/transport/chttp2/transport/frame.cc +58 -1
- data/src/core/ext/transport/chttp2/transport/frame.h +13 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -4
- data/src/core/ext/transport/chttp2/transport/frame_security.cc +10 -1
- data/src/core/ext/transport/chttp2/transport/frame_security.h +2 -1
- data/src/core/ext/transport/chttp2/transport/goaway.cc +11 -1
- data/src/core/ext/transport/chttp2/transport/goaway.h +17 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +9 -0
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +117 -276
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +44 -17
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +382 -496
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +75 -77
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +30 -11
- data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +24 -9
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +26 -0
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +2 -0
- data/src/core/ext/transport/chttp2/transport/internal.h +4 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +4 -10
- data/src/core/ext/transport/chttp2/transport/read_context.h +62 -20
- data/src/core/ext/transport/chttp2/transport/security_frame.h +1 -0
- data/src/core/ext/transport/chttp2/transport/stream.h +271 -120
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +77 -61
- data/src/core/handshaker/security/secure_endpoint.cc +0 -13
- data/src/core/lib/channel/promise_based_filter.cc +77 -3
- data/src/core/lib/channel/promise_based_filter.h +238 -184
- data/src/core/lib/event_engine/extensions/receive_coalescing_extension.h +0 -4
- data/src/core/lib/event_engine/extensions/tcp_trace.h +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +2 -12
- data/src/core/lib/event_engine/shim.cc +2 -16
- data/src/core/lib/event_engine/shim.h +0 -4
- data/src/core/lib/experiments/experiments.cc +51 -102
- data/src/core/lib/experiments/experiments.h +37 -59
- data/src/core/lib/iomgr/error.cc +3 -73
- data/src/core/lib/iomgr/error.h +8 -6
- data/src/core/lib/iomgr/error_cfstream.cc +1 -2
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +2 -6
- data/src/core/lib/iomgr/ev_poll_posix.cc +2 -6
- data/src/core/lib/iomgr/tcp_posix.cc +2 -6
- data/src/core/lib/security/authorization/audit_logging.cc +2 -2
- data/src/core/lib/security/authorization/audit_logging.h +3 -3
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +11 -13
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +1 -1
- data/src/core/lib/security/authorization/matchers.cc +20 -20
- data/src/core/lib/security/authorization/matchers.h +15 -16
- data/src/core/lib/security/authorization/rbac_policy.h +1 -1
- data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
- data/src/core/lib/security/authorization/stdout_logger.h +6 -5
- data/src/core/lib/surface/call.cc +0 -8
- data/src/core/lib/surface/call.h +2 -0
- data/src/core/lib/surface/channel.cc +21 -2
- data/src/core/lib/surface/channel.h +14 -6
- data/src/core/lib/surface/filter_stack_call.cc +10 -29
- data/src/core/lib/surface/legacy_channel.cc +7 -7
- data/src/core/lib/surface/legacy_channel.h +3 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +13 -13
- data/src/core/lib/transport/bdp_estimator.h +9 -5
- data/src/core/lib/transport/error_utils.cc +26 -138
- data/src/core/lib/transport/promise_endpoint.h +2 -4
- data/src/core/load_balancing/grpclb/grpclb.cc +2 -1
- data/src/core/load_balancing/pick_first/pick_first.cc +33 -2
- data/src/core/load_balancing/pick_first/pick_first.h +6 -0
- data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -10
- data/src/core/load_balancing/rls/rls.cc +2 -1
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +2 -7
- data/src/core/load_balancing/xds/cds.cc +80 -56
- data/src/core/load_balancing/xds/cds.h +21 -0
- data/src/core/mitigation_engine/mitigation.h +53 -0
- data/src/core/mitigation_engine/mitigation_provider.h +62 -0
- data/src/core/resolver/dns/dns_resolver_plugin.cc +1 -6
- data/src/core/resolver/xds/xds_resolver.cc +14 -11
- data/src/core/server/server.h +1 -4
- data/src/core/server/server_config_selector.h +5 -4
- data/src/core/server/server_config_selector_filter.cc +67 -80
- data/src/core/server/xds_server_config_fetcher.cc +681 -692
- data/src/core/server/xds_server_config_fetcher_legacy.cc +15 -12
- data/src/core/telemetry/call_tracer.cc +49 -2
- data/src/core/telemetry/call_tracer.h +1 -0
- data/src/core/telemetry/tcp_tracer.h +38 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/ssl_telemetry_utils.cc +343 -0
- data/src/core/tsi/ssl_telemetry_utils.h +74 -0
- data/src/core/tsi/ssl_transport_security.cc +577 -301
- data/src/core/tsi/ssl_transport_security.h +22 -6
- data/src/core/tsi/ssl_transport_security_utils.cc +2 -0
- data/src/core/tsi/transport_security.h +7 -0
- data/src/core/util/http_client/httpcli.cc +1 -4
- data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
- data/src/core/util/status_helper.cc +71 -192
- data/src/core/util/status_helper.h +16 -21
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +2 -11
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -7
- data/src/core/xds/grpc/xds_cluster_parser.cc +5 -16
- data/src/core/xds/grpc/xds_common_types.cc +94 -38
- data/src/core/xds/grpc/xds_common_types.h +33 -18
- data/src/core/xds/grpc/xds_common_types_parser.cc +168 -100
- data/src/core/xds/grpc/xds_common_types_parser.h +18 -1
- data/src/core/xds/grpc/xds_endpoint_parser.cc +6 -17
- data/src/core/xds/grpc/xds_http_filter_registry.cc +2 -10
- data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -12
- data/src/core/xds/grpc/xds_metadata_parser.cc +0 -2
- data/src/core/xds/grpc/xds_route_config_parser.cc +7 -11
- data/src/core/xds/grpc/xds_routing.cc +113 -82
- data/src/core/xds/grpc/xds_routing.h +70 -20
- data/src/core/xds/grpc/xds_server_grpc.cc +22 -13
- data/src/core/xds/grpc/xds_server_grpc.h +16 -2
- data/src/core/xds/grpc/xds_server_grpc_interface.h +10 -0
- data/src/core/xds/grpc/xds_transport_grpc.cc +123 -18
- data/src/core/xds/grpc/xds_transport_grpc.h +28 -4
- data/src/core/xds/xds_client/lrs_client.cc +3 -7
- data/src/core/xds/xds_client/xds_bootstrap.cc +4 -16
- data/src/core/xds/xds_client/xds_client.cc +2 -15
- data/src/core/xds/xds_client/xds_transport.h +3 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -1
- metadata +9 -1
|
@@ -26,12 +26,10 @@
|
|
|
26
26
|
#include <cstdint>
|
|
27
27
|
#include <limits>
|
|
28
28
|
#include <optional>
|
|
29
|
-
#include <queue>
|
|
30
29
|
#include <string>
|
|
31
30
|
#include <type_traits>
|
|
32
31
|
#include <utility>
|
|
33
32
|
#include <variant>
|
|
34
|
-
#include <vector>
|
|
35
33
|
|
|
36
34
|
#include "src/core/call/message.h"
|
|
37
35
|
#include "src/core/ext/transport/chttp2/transport/frame.h"
|
|
@@ -103,7 +101,7 @@ class SimpleQueue {
|
|
|
103
101
|
}
|
|
104
102
|
|
|
105
103
|
// Returns true if the queue is empty. This function is NOT thread safe.
|
|
106
|
-
|
|
104
|
+
bool IsEmpty() { return queue_.Peek() == nullptr; }
|
|
107
105
|
|
|
108
106
|
// Clears the queue. This function is NOT thread safe.
|
|
109
107
|
void Clear() {
|
|
@@ -112,7 +110,7 @@ class SimpleQueue {
|
|
|
112
110
|
GRPC_DCHECK(IsEmpty());
|
|
113
111
|
}
|
|
114
112
|
|
|
115
|
-
|
|
113
|
+
std::optional<uint32_t> GetNextEntryTokens() {
|
|
116
114
|
Entry* front = queue_.Peek();
|
|
117
115
|
return front == nullptr ? std::nullopt : std::make_optional(front->tokens);
|
|
118
116
|
}
|
|
@@ -141,8 +139,7 @@ class SimpleQueue {
|
|
|
141
139
|
return Pending{};
|
|
142
140
|
}
|
|
143
141
|
|
|
144
|
-
|
|
145
|
-
const uint32_t tokens) {
|
|
142
|
+
absl::StatusOr<bool> ImmediateEnqueueInternal(T data, const uint32_t tokens) {
|
|
146
143
|
GRPC_DCHECK_LE(tokens_consumed_,
|
|
147
144
|
std::numeric_limits<uint32_t>::max() - tokens);
|
|
148
145
|
if (tokens_consumed_ > std::numeric_limits<uint32_t>::max() - tokens) {
|
|
@@ -456,7 +453,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
456
453
|
|
|
457
454
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
458
455
|
<< "Immediate enqueueing reset stream with error code: " << error_code;
|
|
459
|
-
reset_stream_state_ =
|
|
456
|
+
reset_stream_state_ = ResetStreamState::kQueued;
|
|
460
457
|
reset_stream_error_code_ = error_code;
|
|
461
458
|
|
|
462
459
|
// became_non_empty is set to true if the queue is empty because we are not
|
|
@@ -605,8 +602,8 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
605
602
|
public:
|
|
606
603
|
HandleDequeue(const uint32_t max_tokens, const uint32_t max_frame_length,
|
|
607
604
|
HPackCompressor& encoder, FrameSender& frame_sender,
|
|
608
|
-
StreamDataQueue&
|
|
609
|
-
:
|
|
605
|
+
StreamDataQueue& stream_data_queue)
|
|
606
|
+
: stream_data_queue_(stream_data_queue),
|
|
610
607
|
max_frame_length_(max_frame_length),
|
|
611
608
|
max_tokens_available_(max_tokens),
|
|
612
609
|
flow_control_tokens_consumed_(0),
|
|
@@ -615,7 +612,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
615
612
|
|
|
616
613
|
void operator()(InitialMetadataType initial_metadata) {
|
|
617
614
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing initial metadata for sending";
|
|
618
|
-
|
|
615
|
+
stream_data_queue_.initial_metadata_disassembler_.PrepareForSending(
|
|
619
616
|
std::move(initial_metadata.metadata), encoder_);
|
|
620
617
|
dequeue_flags_.set_initial_metadata_dequeued();
|
|
621
618
|
MaybeAppendInitialMetadataFrames();
|
|
@@ -623,14 +620,14 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
623
620
|
|
|
624
621
|
void operator()(TrailingMetadataType trailing_metadata) {
|
|
625
622
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing trailing metadata for sending";
|
|
626
|
-
|
|
623
|
+
stream_data_queue_.trailing_metadata_disassembler_.PrepareForSending(
|
|
627
624
|
std::move(trailing_metadata.metadata), encoder_);
|
|
628
625
|
dequeue_flags_.set_trailing_metadata_dequeued();
|
|
629
626
|
}
|
|
630
627
|
|
|
631
628
|
void operator()(MessageHandle message) {
|
|
632
629
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing message for sending";
|
|
633
|
-
|
|
630
|
+
stream_data_queue_.message_disassembler_.PrepareBatchedMessageForSending(
|
|
634
631
|
std::move(message));
|
|
635
632
|
}
|
|
636
633
|
|
|
@@ -659,39 +656,52 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
659
656
|
DequeueFlags GetDequeueFlags() const { return dequeue_flags_; }
|
|
660
657
|
|
|
661
658
|
private:
|
|
662
|
-
|
|
663
|
-
while (
|
|
659
|
+
void MaybeAppendInitialMetadataFrames() {
|
|
660
|
+
while (stream_data_queue_.initial_metadata_disassembler_.HasMoreData()) {
|
|
664
661
|
GRPC_DCHECK(!dequeue_flags_.IsHalfCloseDequeued());
|
|
665
662
|
GRPC_DCHECK(!dequeue_flags_.IsResetStreamDequeued());
|
|
666
663
|
// TODO(akshitpatel) : [PH2][P2] : I do not think we need this.
|
|
667
664
|
// HasMoreData() should be enough.
|
|
668
665
|
bool is_end_headers = false;
|
|
669
|
-
AppendFrame(
|
|
670
|
-
|
|
666
|
+
AppendFrame(
|
|
667
|
+
stream_data_queue_.initial_metadata_disassembler_.GetNextFrame(
|
|
668
|
+
max_frame_length_, is_end_headers));
|
|
671
669
|
}
|
|
672
670
|
}
|
|
673
671
|
|
|
674
|
-
|
|
675
|
-
while (
|
|
672
|
+
void MaybeAppendTrailingMetadataFrames() {
|
|
673
|
+
while (stream_data_queue_.trailing_metadata_disassembler_.HasMoreData()) {
|
|
676
674
|
GRPC_DCHECK(!dequeue_flags_.IsHalfCloseDequeued());
|
|
677
|
-
GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
678
675
|
GRPC_DCHECK_EQ(
|
|
679
|
-
|
|
676
|
+
stream_data_queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
677
|
+
GRPC_DCHECK_EQ(stream_data_queue_.initial_metadata_disassembler_
|
|
678
|
+
.GetBufferedLength(),
|
|
679
|
+
0u);
|
|
680
|
+
GRPC_DCHECK(dequeue_flags_.IsTrailingMetadataDequeued());
|
|
680
681
|
// TODO(akshitpatel) : [PH2][P2] : I do not think we need this.
|
|
681
682
|
// HasMoreData() should be enough.
|
|
682
683
|
bool is_end_headers = false;
|
|
683
|
-
AppendFrame(
|
|
684
|
-
|
|
684
|
+
AppendFrame(
|
|
685
|
+
stream_data_queue_.trailing_metadata_disassembler_.GetNextFrame(
|
|
686
|
+
max_frame_length_, is_end_headers));
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
// In gRPC C++, TrailingMetadata is always followed by RST_STREAM.
|
|
690
|
+
if (dequeue_flags_.IsTrailingMetadataDequeued()) {
|
|
691
|
+
AppendResetStreamFrame(Http2ErrorCode::kNoError);
|
|
685
692
|
}
|
|
686
693
|
}
|
|
687
694
|
|
|
688
|
-
|
|
695
|
+
void MaybeAppendEndOfStreamFrame() {
|
|
689
696
|
if (dequeue_flags_.IsHalfCloseDequeued()) {
|
|
690
|
-
GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
691
697
|
GRPC_DCHECK_EQ(
|
|
692
|
-
|
|
693
|
-
GRPC_DCHECK_EQ(
|
|
694
|
-
|
|
698
|
+
stream_data_queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
699
|
+
GRPC_DCHECK_EQ(stream_data_queue_.initial_metadata_disassembler_
|
|
700
|
+
.GetBufferedLength(),
|
|
701
|
+
0u);
|
|
702
|
+
GRPC_DCHECK_EQ(stream_data_queue_.trailing_metadata_disassembler_
|
|
703
|
+
.GetBufferedLength(),
|
|
704
|
+
0u);
|
|
695
705
|
Http2Frame* last_frame = frame_sender_.MutableLastRegularFrame();
|
|
696
706
|
|
|
697
707
|
// On the Server side, trailing metadata acts as end of stream and is
|
|
@@ -711,21 +721,23 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
711
721
|
*last_frame);
|
|
712
722
|
if (merged) return;
|
|
713
723
|
}
|
|
714
|
-
AppendFrame(Http2DataFrame{/*stream_id=*/
|
|
724
|
+
AppendFrame(Http2DataFrame{/*stream_id=*/stream_data_queue_.stream_id_,
|
|
715
725
|
/*end_stream=*/true,
|
|
716
726
|
/*payload=*/SliceBuffer()});
|
|
717
727
|
}
|
|
718
728
|
}
|
|
719
729
|
|
|
720
|
-
|
|
721
|
-
while (
|
|
730
|
+
void MaybeAppendMessageFrames() {
|
|
731
|
+
while (stream_data_queue_.message_disassembler_.GetBufferedLength() > 0 &&
|
|
722
732
|
(max_tokens_available_ - flow_control_tokens_consumed_) > 0) {
|
|
723
|
-
GRPC_DCHECK_EQ(
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
733
|
+
GRPC_DCHECK_EQ(stream_data_queue_.initial_metadata_disassembler_
|
|
734
|
+
.GetBufferedLength(),
|
|
735
|
+
0u);
|
|
736
|
+
Http2DataFrame frame =
|
|
737
|
+
stream_data_queue_.message_disassembler_.GenerateNextFrame(
|
|
738
|
+
stream_data_queue_.stream_id_,
|
|
739
|
+
std::min(max_tokens_available_ - flow_control_tokens_consumed_,
|
|
740
|
+
max_frame_length_));
|
|
729
741
|
flow_control_tokens_consumed_ += frame.payload.Length();
|
|
730
742
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
731
743
|
<< "Appending message frame with length " << frame.payload.Length()
|
|
@@ -736,31 +748,35 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
736
748
|
}
|
|
737
749
|
}
|
|
738
750
|
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
751
|
+
void AppendResetStreamFrame(Http2ErrorCode error_code)
|
|
752
|
+
ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
753
|
+
// The caller is guaranteed to hold the StreamDataQueue mutex.
|
|
754
|
+
GRPC_DCHECK_EQ(
|
|
755
|
+
stream_data_queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
756
|
+
GRPC_DCHECK_EQ(
|
|
757
|
+
stream_data_queue_.initial_metadata_disassembler_.GetBufferedLength(),
|
|
758
|
+
0u);
|
|
759
|
+
GRPC_DCHECK_EQ(stream_data_queue_.trailing_metadata_disassembler_
|
|
760
|
+
.GetBufferedLength(),
|
|
761
|
+
0u);
|
|
762
|
+
AppendFrame(
|
|
763
|
+
Http2RstStreamFrame{stream_data_queue_.stream_id_,
|
|
764
|
+
Http2ErrorCodeToFrameErrorCode(error_code)});
|
|
765
|
+
stream_data_queue_.reset_stream_state_ = ResetStreamState::kDequeued;
|
|
766
|
+
dequeue_flags_.set_reset_stream_dequeued();
|
|
750
767
|
}
|
|
751
768
|
|
|
752
|
-
|
|
769
|
+
void AppendFrame(Http2Frame&& frame) {
|
|
753
770
|
// FrameSender automatically accounts for the frame size in write quota.
|
|
754
771
|
// We do tend to overestimate the bytes consumed here but should be good
|
|
755
772
|
// enough for our purposes.
|
|
756
773
|
frame_sender_.AddRegularFrame(std::forward<Http2Frame>(frame));
|
|
757
774
|
}
|
|
758
775
|
|
|
759
|
-
StreamDataQueue&
|
|
776
|
+
StreamDataQueue& stream_data_queue_;
|
|
760
777
|
const uint32_t max_frame_length_;
|
|
761
778
|
const uint32_t max_tokens_available_;
|
|
762
779
|
uint32_t flow_control_tokens_consumed_;
|
|
763
|
-
uint32_t error_code_ = static_cast<uint32_t>(Http2ErrorCode::kNoError);
|
|
764
780
|
HPackCompressor& encoder_;
|
|
765
781
|
FrameSender& frame_sender_;
|
|
766
782
|
DequeueFlags dequeue_flags_;
|
|
@@ -841,7 +857,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
841
857
|
return is_writable_;
|
|
842
858
|
}
|
|
843
859
|
|
|
844
|
-
|
|
860
|
+
bool IsNextQueueEntryMessage() {
|
|
845
861
|
std::optional<size_t> next_entry_tokens = queue_.GetNextEntryTokens();
|
|
846
862
|
return next_entry_tokens.has_value() && *next_entry_tokens > 0;
|
|
847
863
|
}
|
|
@@ -854,7 +870,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
854
870
|
const bool can_send_reset_stream, FrameSender& frame_sender)
|
|
855
871
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
|
856
872
|
switch (reset_stream_state_) {
|
|
857
|
-
case
|
|
873
|
+
case ResetStreamState::kDequeued:
|
|
858
874
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
859
875
|
<< "Reset stream is already dequeued. Returning empty frames.";
|
|
860
876
|
GRPC_DCHECK(queue_.IsEmpty());
|
|
@@ -862,7 +878,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
862
878
|
return DequeueResult{is_writable_, priority_,
|
|
863
879
|
/*flow_control_tokens_consumed=*/0u,
|
|
864
880
|
/*flags=*/DequeueFlags{}};
|
|
865
|
-
case
|
|
881
|
+
case ResetStreamState::kQueued: {
|
|
866
882
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
867
883
|
<< "Reset stream is queued. Skipping all frames (if any) for "
|
|
868
884
|
"dequeuing.";
|
|
@@ -874,11 +890,11 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
874
890
|
flags.set_reset_stream_dequeued();
|
|
875
891
|
}
|
|
876
892
|
queue_.Clear();
|
|
877
|
-
reset_stream_state_ =
|
|
893
|
+
reset_stream_state_ = ResetStreamState::kDequeued;
|
|
878
894
|
return DequeueResult{is_writable_, priority_,
|
|
879
895
|
/*flow_control_tokens_consumed=*/0u, flags};
|
|
880
896
|
}
|
|
881
|
-
case
|
|
897
|
+
case ResetStreamState::kNotQueued:
|
|
882
898
|
return std::nullopt;
|
|
883
899
|
default:
|
|
884
900
|
GRPC_CHECK(false) << "Invalid reset stream state: "
|
|
@@ -889,10 +905,10 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
889
905
|
|
|
890
906
|
bool IsEnqueueClosed() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
|
891
907
|
switch (reset_stream_state_) {
|
|
892
|
-
case
|
|
908
|
+
case ResetStreamState::kNotQueued:
|
|
893
909
|
return false;
|
|
894
|
-
case
|
|
895
|
-
case
|
|
910
|
+
case ResetStreamState::kQueued:
|
|
911
|
+
case ResetStreamState::kDequeued:
|
|
896
912
|
// This can happen when the transport tries to close the stream and the
|
|
897
913
|
// stream is cancelled from the call stack.
|
|
898
914
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Reset stream already queued.";
|
|
@@ -910,7 +926,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
910
926
|
// This is only used for DCHECKs. Not actually used for any business logic.
|
|
911
927
|
const bool is_client_;
|
|
912
928
|
|
|
913
|
-
enum class
|
|
929
|
+
enum class ResetStreamState : uint8_t {
|
|
914
930
|
kNotQueued = 0,
|
|
915
931
|
kQueued,
|
|
916
932
|
kDequeued,
|
|
@@ -927,8 +943,8 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
927
943
|
// (if needed) to send them. This variable also has 1-1 correspondence with
|
|
928
944
|
// whether the stream is in the list of writable streams in the transport.
|
|
929
945
|
bool is_writable_ ABSL_GUARDED_BY(mu_) = false;
|
|
930
|
-
|
|
931
|
-
|
|
946
|
+
ResetStreamState reset_stream_state_ ABSL_GUARDED_BY(mu_) =
|
|
947
|
+
ResetStreamState::kNotQueued;
|
|
932
948
|
SimpleQueue<QueueEntry> queue_;
|
|
933
949
|
WritableStreamPriority priority_ ABSL_GUARDED_BY(mu_) =
|
|
934
950
|
WritableStreamPriority::kDefault;
|
|
@@ -883,10 +883,6 @@ class SecureEndpoint final : public EventEngine::Endpoint,
|
|
|
883
883
|
impl_->DisableRpcReceiveCoalescing();
|
|
884
884
|
}
|
|
885
885
|
|
|
886
|
-
void EnforceRxMemoryAlignment() override {
|
|
887
|
-
impl_->EnforceRxMemoryAlignment();
|
|
888
|
-
}
|
|
889
|
-
|
|
890
886
|
std::shared_ptr<TelemetryInfo> GetTelemetryInfo() const override {
|
|
891
887
|
return std::make_shared<Impl::TelemetryInfo>(impl_->GetTelemetryInfo());
|
|
892
888
|
}
|
|
@@ -1108,15 +1104,6 @@ class SecureEndpoint final : public EventEngine::Endpoint,
|
|
|
1108
1104
|
}
|
|
1109
1105
|
}
|
|
1110
1106
|
|
|
1111
|
-
void EnforceRxMemoryAlignment() {
|
|
1112
|
-
auto* ext = grpc_event_engine::experimental::QueryExtension<
|
|
1113
|
-
grpc_event_engine::experimental::ReceiveCoalescingExtension>(
|
|
1114
|
-
wrapped_ep_.get());
|
|
1115
|
-
if (ext != nullptr) {
|
|
1116
|
-
ext->EnforceRxMemoryAlignment();
|
|
1117
|
-
}
|
|
1118
|
-
}
|
|
1119
|
-
|
|
1120
1107
|
void* QueryExtension(absl::string_view id) {
|
|
1121
1108
|
return wrapped_ep_->QueryExtension(id);
|
|
1122
1109
|
}
|
|
@@ -34,6 +34,8 @@
|
|
|
34
34
|
#include "src/core/util/grpc_check.h"
|
|
35
35
|
#include "src/core/util/latent_see.h"
|
|
36
36
|
#include "src/core/util/manual_constructor.h"
|
|
37
|
+
#include "src/core/util/orphanable.h"
|
|
38
|
+
#include "src/core/util/ref_counted.h"
|
|
37
39
|
#include "src/core/util/status_helper.h"
|
|
38
40
|
#include "absl/base/attributes.h"
|
|
39
41
|
#include "absl/functional/function_ref.h"
|
|
@@ -82,6 +84,61 @@ absl::Status StatusFromMetadata(const ServerMetadata& md) {
|
|
|
82
84
|
///////////////////////////////////////////////////////////////////////////////
|
|
83
85
|
// BaseCallData
|
|
84
86
|
|
|
87
|
+
class BaseCallData::WeakWakerHandle final : public Wakeable, public Orphanable {
|
|
88
|
+
public:
|
|
89
|
+
explicit WeakWakerHandle(BaseCallData* base) : base_(base) {}
|
|
90
|
+
|
|
91
|
+
void Ref() { refs_.Ref(); }
|
|
92
|
+
|
|
93
|
+
void Orphan() override {
|
|
94
|
+
mu_.Lock();
|
|
95
|
+
base_ = nullptr;
|
|
96
|
+
mu_.Unlock();
|
|
97
|
+
Unref();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
void Wakeup(WakeupMask wakeup_mask) override { WakeupGeneric(wakeup_mask); }
|
|
101
|
+
|
|
102
|
+
void WakeupAsync(WakeupMask wakeup_mask) override {
|
|
103
|
+
WakeupGeneric(wakeup_mask);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
void Drop(WakeupMask) override { Unref(); }
|
|
107
|
+
|
|
108
|
+
std::string ActivityDebugTag(WakeupMask) const override {
|
|
109
|
+
MutexLock lock(&mu_);
|
|
110
|
+
return base_ == nullptr ? "<unknown>" : base_->DebugTag();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private:
|
|
114
|
+
void WakeupGeneric(WakeupMask wakeup_mask) {
|
|
115
|
+
BaseCallData* wakeup_base = nullptr;
|
|
116
|
+
{
|
|
117
|
+
MutexLock lock(&mu_);
|
|
118
|
+
if (base_ != nullptr) {
|
|
119
|
+
auto* call_stack = base_->call_stack();
|
|
120
|
+
if (call_stack->refcount.refs.RefIfNonZero(DEBUG_LOCATION, "waker")) {
|
|
121
|
+
wakeup_base = base_;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (wakeup_base != nullptr) {
|
|
126
|
+
wakeup_base->Wakeup(wakeup_mask);
|
|
127
|
+
}
|
|
128
|
+
Unref();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
void Unref() {
|
|
132
|
+
if (refs_.Unref()) {
|
|
133
|
+
delete this;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
RefCount refs_;
|
|
138
|
+
mutable Mutex mu_;
|
|
139
|
+
BaseCallData* base_ ABSL_GUARDED_BY(mu_);
|
|
140
|
+
};
|
|
141
|
+
|
|
85
142
|
BaseCallData::BaseCallData(
|
|
86
143
|
grpc_call_element* elem, const grpc_call_element_args* args, uint8_t flags,
|
|
87
144
|
absl::FunctionRef<Interceptor*()> make_send_interceptor,
|
|
@@ -128,9 +185,18 @@ BaseCallData::~BaseCallData() {
|
|
|
128
185
|
// Orphan().
|
|
129
186
|
void BaseCallData::Orphan() { abort(); }
|
|
130
187
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
188
|
+
Waker BaseCallData::MakeNonOwningWaker() {
|
|
189
|
+
if (IsV2NonOwningWakerImplementationEnabled()) {
|
|
190
|
+
if (handle_ == nullptr) {
|
|
191
|
+
handle_ = MakeOrphanable<WeakWakerHandle>(this);
|
|
192
|
+
}
|
|
193
|
+
handle_->Ref();
|
|
194
|
+
// The wakeup mask is unused by BaseCallData and WeakWakerHandle, so 0 is
|
|
195
|
+
// passed as a placeholder.
|
|
196
|
+
return Waker(handle_.get(), 0);
|
|
197
|
+
}
|
|
198
|
+
return MakeOwningWaker();
|
|
199
|
+
}
|
|
134
200
|
|
|
135
201
|
Waker BaseCallData::MakeOwningWaker() {
|
|
136
202
|
GRPC_CALL_STACK_REF(call_stack_, "waker");
|
|
@@ -147,6 +213,14 @@ void BaseCallData::Wakeup(WakeupMask) {
|
|
|
147
213
|
GRPC_CALL_COMBINER_START(call_combiner_, closure, absl::OkStatus(), "wakeup");
|
|
148
214
|
}
|
|
149
215
|
|
|
216
|
+
void BaseCallData::WakeupAsync(WakeupMask wakeup_mask) {
|
|
217
|
+
if (IsV2NonOwningWakerImplementationEnabled()) {
|
|
218
|
+
Wakeup(wakeup_mask);
|
|
219
|
+
} else {
|
|
220
|
+
Crash("not implemented");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
150
224
|
void BaseCallData::Drop(WakeupMask) {
|
|
151
225
|
GRPC_CALL_STACK_UNREF(call_stack_, "waker");
|
|
152
226
|
}
|