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);