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.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +8 -5
  3. data/etc/roots.pem +10400 -3855
  4. data/include/grpc/grpc_audit_logging.h +2 -2
  5. data/include/grpc/grpc_security_constants.h +2 -0
  6. data/include/grpc/impl/channel_arg_names.h +23 -0
  7. data/src/core/call/call_filters.h +19 -3
  8. data/src/core/call/call_spine.h +4 -4
  9. data/src/core/call/client_call.cc +1 -1
  10. data/src/core/call/metadata.cc +7 -2
  11. data/src/core/call/server_call.cc +13 -3
  12. data/src/core/call/server_call.h +5 -3
  13. data/src/core/client_channel/backup_poller.cc +2 -17
  14. data/src/core/client_channel/client_channel.cc +17 -14
  15. data/src/core/client_channel/client_channel.h +3 -1
  16. data/src/core/client_channel/client_channel_filter.cc +11 -13
  17. data/src/core/client_channel/client_channel_service_config.cc +5 -13
  18. data/src/core/client_channel/direct_channel.cc +5 -1
  19. data/src/core/client_channel/direct_channel.h +3 -1
  20. data/src/core/config/experiment_env_var.cc +30 -0
  21. data/src/core/config/experiment_env_var.h +26 -0
  22. data/src/core/credentials/call/regional_access_boundary_fetcher.cc +6 -6
  23. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +14 -2
  24. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.cc +172 -0
  25. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +103 -0
  26. data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +3 -2
  27. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +10 -3
  28. data/src/core/credentials/transport/tls/tls_security_connector.cc +14 -2
  29. data/src/core/credentials/transport/xds/xds_credentials.cc +4 -12
  30. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -1
  31. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -13
  32. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +11 -9
  33. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  34. data/src/core/ext/transport/chttp2/transport/flow_control.h +3 -2
  35. data/src/core/ext/transport/chttp2/transport/frame.cc +58 -1
  36. data/src/core/ext/transport/chttp2/transport/frame.h +13 -1
  37. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -4
  38. data/src/core/ext/transport/chttp2/transport/frame_security.cc +10 -1
  39. data/src/core/ext/transport/chttp2/transport/frame_security.h +2 -1
  40. data/src/core/ext/transport/chttp2/transport/goaway.cc +11 -1
  41. data/src/core/ext/transport/chttp2/transport/goaway.h +17 -1
  42. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +9 -0
  43. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +117 -276
  44. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +44 -17
  45. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +382 -496
  46. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +75 -77
  47. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  48. data/src/core/ext/transport/chttp2/transport/http2_settings.h +30 -11
  49. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +24 -9
  50. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +26 -0
  51. data/src/core/ext/transport/chttp2/transport/http2_transport.h +2 -0
  52. data/src/core/ext/transport/chttp2/transport/internal.h +4 -0
  53. data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
  54. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +1 -1
  55. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +4 -10
  56. data/src/core/ext/transport/chttp2/transport/read_context.h +62 -20
  57. data/src/core/ext/transport/chttp2/transport/security_frame.h +1 -0
  58. data/src/core/ext/transport/chttp2/transport/stream.h +271 -120
  59. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +77 -61
  60. data/src/core/handshaker/security/secure_endpoint.cc +0 -13
  61. data/src/core/lib/channel/promise_based_filter.cc +77 -3
  62. data/src/core/lib/channel/promise_based_filter.h +238 -184
  63. data/src/core/lib/event_engine/extensions/receive_coalescing_extension.h +0 -4
  64. data/src/core/lib/event_engine/extensions/tcp_trace.h +1 -1
  65. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +2 -12
  66. data/src/core/lib/event_engine/shim.cc +2 -16
  67. data/src/core/lib/event_engine/shim.h +0 -4
  68. data/src/core/lib/experiments/experiments.cc +51 -102
  69. data/src/core/lib/experiments/experiments.h +37 -59
  70. data/src/core/lib/iomgr/error.cc +3 -73
  71. data/src/core/lib/iomgr/error.h +8 -6
  72. data/src/core/lib/iomgr/error_cfstream.cc +1 -2
  73. data/src/core/lib/iomgr/ev_epoll1_linux.cc +2 -6
  74. data/src/core/lib/iomgr/ev_poll_posix.cc +2 -6
  75. data/src/core/lib/iomgr/tcp_posix.cc +2 -6
  76. data/src/core/lib/security/authorization/audit_logging.cc +2 -2
  77. data/src/core/lib/security/authorization/audit_logging.h +3 -3
  78. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +11 -13
  79. data/src/core/lib/security/authorization/grpc_authorization_engine.h +1 -1
  80. data/src/core/lib/security/authorization/matchers.cc +20 -20
  81. data/src/core/lib/security/authorization/matchers.h +15 -16
  82. data/src/core/lib/security/authorization/rbac_policy.h +1 -1
  83. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  84. data/src/core/lib/security/authorization/stdout_logger.h +6 -5
  85. data/src/core/lib/surface/call.cc +0 -8
  86. data/src/core/lib/surface/call.h +2 -0
  87. data/src/core/lib/surface/channel.cc +21 -2
  88. data/src/core/lib/surface/channel.h +14 -6
  89. data/src/core/lib/surface/filter_stack_call.cc +10 -29
  90. data/src/core/lib/surface/legacy_channel.cc +7 -7
  91. data/src/core/lib/surface/legacy_channel.h +3 -1
  92. data/src/core/lib/surface/version.cc +2 -2
  93. data/src/core/lib/transport/bdp_estimator.cc +13 -13
  94. data/src/core/lib/transport/bdp_estimator.h +9 -5
  95. data/src/core/lib/transport/error_utils.cc +26 -138
  96. data/src/core/lib/transport/promise_endpoint.h +2 -4
  97. data/src/core/load_balancing/grpclb/grpclb.cc +2 -1
  98. data/src/core/load_balancing/pick_first/pick_first.cc +33 -2
  99. data/src/core/load_balancing/pick_first/pick_first.h +6 -0
  100. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -10
  101. data/src/core/load_balancing/rls/rls.cc +2 -1
  102. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +2 -7
  103. data/src/core/load_balancing/xds/cds.cc +80 -56
  104. data/src/core/load_balancing/xds/cds.h +21 -0
  105. data/src/core/mitigation_engine/mitigation.h +53 -0
  106. data/src/core/mitigation_engine/mitigation_provider.h +62 -0
  107. data/src/core/resolver/dns/dns_resolver_plugin.cc +1 -6
  108. data/src/core/resolver/xds/xds_resolver.cc +14 -11
  109. data/src/core/server/server.h +1 -4
  110. data/src/core/server/server_config_selector.h +5 -4
  111. data/src/core/server/server_config_selector_filter.cc +67 -80
  112. data/src/core/server/xds_server_config_fetcher.cc +681 -692
  113. data/src/core/server/xds_server_config_fetcher_legacy.cc +15 -12
  114. data/src/core/telemetry/call_tracer.cc +49 -2
  115. data/src/core/telemetry/call_tracer.h +1 -0
  116. data/src/core/telemetry/tcp_tracer.h +38 -0
  117. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  118. data/src/core/tsi/ssl_telemetry_utils.cc +343 -0
  119. data/src/core/tsi/ssl_telemetry_utils.h +74 -0
  120. data/src/core/tsi/ssl_transport_security.cc +577 -301
  121. data/src/core/tsi/ssl_transport_security.h +22 -6
  122. data/src/core/tsi/ssl_transport_security_utils.cc +2 -0
  123. data/src/core/tsi/transport_security.h +7 -0
  124. data/src/core/util/http_client/httpcli.cc +1 -4
  125. data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
  126. data/src/core/util/status_helper.cc +71 -192
  127. data/src/core/util/status_helper.h +16 -21
  128. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +2 -11
  129. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -7
  130. data/src/core/xds/grpc/xds_cluster_parser.cc +5 -16
  131. data/src/core/xds/grpc/xds_common_types.cc +94 -38
  132. data/src/core/xds/grpc/xds_common_types.h +33 -18
  133. data/src/core/xds/grpc/xds_common_types_parser.cc +168 -100
  134. data/src/core/xds/grpc/xds_common_types_parser.h +18 -1
  135. data/src/core/xds/grpc/xds_endpoint_parser.cc +6 -17
  136. data/src/core/xds/grpc/xds_http_filter_registry.cc +2 -10
  137. data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -12
  138. data/src/core/xds/grpc/xds_metadata_parser.cc +0 -2
  139. data/src/core/xds/grpc/xds_route_config_parser.cc +7 -11
  140. data/src/core/xds/grpc/xds_routing.cc +113 -82
  141. data/src/core/xds/grpc/xds_routing.h +70 -20
  142. data/src/core/xds/grpc/xds_server_grpc.cc +22 -13
  143. data/src/core/xds/grpc/xds_server_grpc.h +16 -2
  144. data/src/core/xds/grpc/xds_server_grpc_interface.h +10 -0
  145. data/src/core/xds/grpc/xds_transport_grpc.cc +123 -18
  146. data/src/core/xds/grpc/xds_transport_grpc.h +28 -4
  147. data/src/core/xds/xds_client/lrs_client.cc +3 -7
  148. data/src/core/xds/xds_client/xds_bootstrap.cc +4 -16
  149. data/src/core/xds/xds_client/xds_client.cc +2 -15
  150. data/src/core/xds/xds_client/xds_transport.h +3 -0
  151. data/src/ruby/lib/grpc/version.rb +1 -1
  152. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -1
  153. 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
- inline bool IsEmpty() { return queue_.Peek() == nullptr; }
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
- inline std::optional<uint32_t> GetNextEntryTokens() {
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
- inline absl::StatusOr<bool> ImmediateEnqueueInternal(T data,
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_ = RstStreamState::kQueued;
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& queue)
609
- : queue_(queue),
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
- queue_.initial_metadata_disassembler_.PrepareForSending(
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
- queue_.trailing_metadata_disassembler_.PrepareForSending(
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
- queue_.message_disassembler_.PrepareBatchedMessageForSending(
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
- inline void MaybeAppendInitialMetadataFrames() {
663
- while (queue_.initial_metadata_disassembler_.HasMoreData()) {
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(queue_.initial_metadata_disassembler_.GetNextFrame(
670
- max_frame_length_, is_end_headers));
666
+ AppendFrame(
667
+ stream_data_queue_.initial_metadata_disassembler_.GetNextFrame(
668
+ max_frame_length_, is_end_headers));
671
669
  }
672
670
  }
673
671
 
674
- inline void MaybeAppendTrailingMetadataFrames() {
675
- while (queue_.trailing_metadata_disassembler_.HasMoreData()) {
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
- queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
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(queue_.trailing_metadata_disassembler_.GetNextFrame(
684
- max_frame_length_, is_end_headers));
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
- inline void MaybeAppendEndOfStreamFrame() {
695
+ void MaybeAppendEndOfStreamFrame() {
689
696
  if (dequeue_flags_.IsHalfCloseDequeued()) {
690
- GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
691
697
  GRPC_DCHECK_EQ(
692
- queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
693
- GRPC_DCHECK_EQ(
694
- queue_.trailing_metadata_disassembler_.GetBufferedLength(), 0u);
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=*/queue_.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
- inline void MaybeAppendMessageFrames() {
721
- while (queue_.message_disassembler_.GetBufferedLength() > 0 &&
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
- queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
725
- Http2DataFrame frame = queue_.message_disassembler_.GenerateNextFrame(
726
- queue_.stream_id_,
727
- std::min(max_tokens_available_ - flow_control_tokens_consumed_,
728
- max_frame_length_));
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
- inline void MaybeAppendResetStreamFrame() {
740
- if (dequeue_flags_.IsResetStreamDequeued()) {
741
- // TODO(akshitpatel) : [PH2][P2] : Consider if we can send reset stream
742
- // frame without flushing all the messages enqueued until now.
743
- GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
744
- GRPC_DCHECK_EQ(
745
- queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
746
- GRPC_DCHECK_EQ(
747
- queue_.trailing_metadata_disassembler_.GetBufferedLength(), 0u);
748
- AppendFrame(Http2RstStreamFrame{queue_.stream_id_, error_code_});
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
- inline void AppendFrame(Http2Frame&& frame) {
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& queue_;
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
- inline bool IsNextQueueEntryMessage() {
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 RstStreamState::kDequeued:
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 RstStreamState::kQueued: {
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_ = RstStreamState::kDequeued;
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 RstStreamState::kNotQueued:
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 RstStreamState::kNotQueued:
908
+ case ResetStreamState::kNotQueued:
893
909
  return false;
894
- case RstStreamState::kQueued:
895
- case RstStreamState::kDequeued:
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 RstStreamState : uint8_t {
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
- RstStreamState reset_stream_state_ ABSL_GUARDED_BY(mu_) =
931
- RstStreamState::kNotQueued;
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
- // For now we don't care about owning/non-owning wakers, instead just share
132
- // implementation.
133
- Waker BaseCallData::MakeNonOwningWaker() { return MakeOwningWaker(); }
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
  }