Internal QUICHE change
PiperOrigin-RevId: 344255387
Change-Id: I02cd0dd29159e1f92bdfecbf69c5edc68102dae0
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index 4ddf2d8..5bebbe3 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -73,7 +73,7 @@
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_testonly_default_true, true)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_tls_use_early_select_cert, false)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_unified_iw_options, false)
-QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_circular_deque_for_unacked_packets, false)
+QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_circular_deque_for_unacked_packets_v2, false)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_encryption_level_context, false)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_fast_huffman_encoder, true)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_write_or_buffer_data_at_level, false)
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index fba8b67..21a9626 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -671,7 +671,17 @@
// applications may want to use higher priority stream data for bandwidth
// probing, and some applications want to consider RTO is an indication of
// loss, etc.
- unacked_packets_.RetransmitFrames(*transmission_info, transmission_type);
+ // transmission_info owning these frames may be deallocated after each
+ // retransimission. Make a copy of retransmissible frames to prevent the
+ // invalidation.
+ if (unacked_packets_.use_circular_deque()) {
+ unacked_packets_.RetransmitFrames(
+ QuicFrames(transmission_info->retransmittable_frames),
+ transmission_type);
+ } else {
+ unacked_packets_.RetransmitFrames(
+ transmission_info->retransmittable_frames, transmission_type);
+ }
return;
}
diff --git a/quic/core/quic_unacked_packet_map.cc b/quic/core/quic_unacked_packet_map.cc
index 852a0df..2ad31b5 100644
--- a/quic/core/quic_unacked_packet_map.cc
+++ b/quic/core/quic_unacked_packet_map.cc
@@ -124,7 +124,7 @@
session_notifier_(nullptr),
supports_multiple_packet_number_spaces_(false) {
if (use_circular_deque_) {
- QUIC_RELOADABLE_FLAG_COUNT(quic_use_circular_deque_for_unacked_packets);
+ QUIC_RELOADABLE_FLAG_COUNT(quic_use_circular_deque_for_unacked_packets_v2);
}
}
@@ -474,9 +474,9 @@
}
}
-void QuicUnackedPacketMap::RetransmitFrames(const QuicTransmissionInfo& info,
+void QuicUnackedPacketMap::RetransmitFrames(const QuicFrames& frames,
TransmissionType type) {
- session_notifier_->RetransmitFrames(info.retransmittable_frames, type);
+ session_notifier_->RetransmitFrames(frames, type);
}
void QuicUnackedPacketMap::MaybeAggregateAckedStreamFrame(
diff --git a/quic/core/quic_unacked_packet_map.h b/quic/core/quic_unacked_packet_map.h
index 137d3f8..33b7bba 100644
--- a/quic/core/quic_unacked_packet_map.h
+++ b/quic/core/quic_unacked_packet_map.h
@@ -59,10 +59,8 @@
void NotifyFramesLost(const QuicTransmissionInfo& info,
TransmissionType type);
- // Notifies session_notifier to retransmit frames in |info| with
- // |transmission_type|.
- void RetransmitFrames(const QuicTransmissionInfo& info,
- TransmissionType type);
+ // Notifies session_notifier to retransmit frames with |transmission_type|.
+ void RetransmitFrames(const QuicFrames& frames, TransmissionType type);
// Marks |info| as no longer in flight.
void RemoveFromInFlight(QuicTransmissionInfo* info);
@@ -333,7 +331,7 @@
friend class test::QuicUnackedPacketMapPeer;
// TODO(haoyuewang) Remove these methods when deprecate
- // quic_use_circular_deque_for_unacked_packets flag.
+ // quic_use_circular_deque_for_unacked_packets_v2 flag.
size_t unacked_packets_size() const {
return use_circular_deque_ ? unacked_packets_.size()
: unacked_packets_deque_.size();
@@ -433,7 +431,7 @@
std::deque<QuicTransmissionInfo> unacked_packets_deque_;
const bool use_circular_deque_ =
- GetQuicReloadableFlag(quic_use_circular_deque_for_unacked_packets);
+ GetQuicReloadableFlag(quic_use_circular_deque_for_unacked_packets_v2);
// The packet at the 0th index of unacked_packets_.
QuicPacketNumber least_unacked_;
diff --git a/quic/core/quic_unacked_packet_map_test.cc b/quic/core/quic_unacked_packet_map_test.cc
index 4b598be..f2f8b8e 100644
--- a/quic/core/quic_unacked_packet_map_test.cc
+++ b/quic/core/quic_unacked_packet_map_test.cc
@@ -658,7 +658,7 @@
}
TEST_P(QuicUnackedPacketMapTest, ReserveInitialCapacityTest) {
- SetQuicReloadableFlag(quic_use_circular_deque_for_unacked_packets, true);
+ SetQuicReloadableFlag(quic_use_circular_deque_for_unacked_packets_v2, true);
QuicUnackedPacketMap unacked_packets(GetParam());
ASSERT_EQ(QuicUnackedPacketMapPeer::GetCapacity(unacked_packets), 0u);
unacked_packets.ReserveInitialCapacity(16);