Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1149)

Unified Diff: net/quic/quic_sent_packet_manager.cc

Issue 115463002: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/quic_sent_packet_manager_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/quic_sent_packet_manager.cc
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc
index 55693e5b6d5bb1ba497e6bab27677d0416362e27..bda30c72a1f7fb86c14a32778fa985f41e3fb6b2 100644
--- a/net/quic/quic_sent_packet_manager.cc
+++ b/net/quic/quic_sent_packet_manager.cc
@@ -44,10 +44,8 @@ static const int kMinRetransmissionTimeMs = 200;
static const int kMaxRetransmissionTimeMs = 60000;
static const size_t kMaxRetransmissions = 10;
-// We want to make sure if we get a nack packet which triggers several
-// retransmissions, we don't queue up too many packets. 10 is TCP's default
-// initial congestion window(RFC 6928).
-static const size_t kMaxRetransmissionsPerAck = kDefaultInitialWindow;
+// We only retransmit 2 packets per ack.
+static const size_t kMaxRetransmissionsPerAck = 2;
// TCP retransmits after 3 nacks.
static const size_t kNumberOfNacksBeforeRetransmission = 3;
@@ -78,16 +76,11 @@ QuicSentPacketManager::~QuicSentPacketManager() {
for (UnackedPacketMap::iterator it = unacked_packets_.begin();
it != unacked_packets_.end(); ++it) {
delete it->second.retransmittable_frames;
- }
- while (!previous_transmissions_map_.empty()) {
- SequenceNumberSet* previous_transmissions =
- previous_transmissions_map_.begin()->second;
- for (SequenceNumberSet::const_iterator it = previous_transmissions->begin();
- it != previous_transmissions->end(); ++it) {
- DCHECK(ContainsKey(previous_transmissions_map_, *it));
- previous_transmissions_map_.erase(*it);
+ // Only delete previous_transmissions once, for the newest packet.
+ if (it->second.previous_transmissions != NULL &&
+ it->first == *it->second.previous_transmissions->rbegin()) {
+ delete it->second.previous_transmissions;
}
- delete previous_transmissions;
}
STLDeleteValues(&packet_history_map_);
}
@@ -138,8 +131,9 @@ void QuicSentPacketManager::OnRetransmittedPacket(
pending_retransmissions_.erase(old_sequence_number);
- RetransmittableFrames* frames =
- unacked_packets_[old_sequence_number].retransmittable_frames;
+ UnackedPacketMap::iterator unacked_it =
+ unacked_packets_.find(old_sequence_number);
+ RetransmittableFrames* frames = unacked_it->second.retransmittable_frames;
DCHECK(frames);
// A notifier may be waiting to hear about ACKs for the original sequence
@@ -149,26 +143,23 @@ void QuicSentPacketManager::OnRetransmittedPacket(
// We keep the old packet in the unacked packet list until it, or one of
// the retransmissions of it are acked.
- unacked_packets_[old_sequence_number].retransmittable_frames = NULL;
+ unacked_it->second.retransmittable_frames = NULL;
unacked_packets_[new_sequence_number] =
TransmissionInfo(frames, GetSequenceNumberLength(old_sequence_number));
// Keep track of all sequence numbers that this packet
// has been transmitted as.
- SequenceNumberSet* previous_transmissions;
- PreviousTransmissionMap::iterator it =
- previous_transmissions_map_.find(old_sequence_number);
- if (it == previous_transmissions_map_.end()) {
+ SequenceNumberSet* previous_transmissions =
+ unacked_it->second.previous_transmissions;
+ if (previous_transmissions == NULL) {
// This is the first retransmission of this packet, so create a new entry.
previous_transmissions = new SequenceNumberSet;
- previous_transmissions_map_[old_sequence_number] = previous_transmissions;
+ unacked_it->second.previous_transmissions = previous_transmissions;
previous_transmissions->insert(old_sequence_number);
- } else {
- // Otherwise, use the existing entry.
- previous_transmissions = it->second;
}
previous_transmissions->insert(new_sequence_number);
- previous_transmissions_map_[new_sequence_number] = previous_transmissions;
+ unacked_packets_[new_sequence_number].previous_transmissions =
+ previous_transmissions;
DCHECK(HasRetransmittableFrames(new_sequence_number));
}
@@ -240,28 +231,30 @@ void QuicSentPacketManager::HandleAckForSentPackets(
}
void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) {
- UnackedPacketMap::const_iterator it = unacked_packets_.begin();
+ UnackedPacketMap::iterator it = unacked_packets_.begin();
while (it != unacked_packets_.end() && num_to_clear > 0) {
QuicPacketSequenceNumber sequence_number = it->first;
- ++it;
// If this is not a previous transmission then there is no point
// in clearing out any further packets, because it will not affect
// the high water mark.
- if (!IsPreviousTransmission(sequence_number)) {
+ SequenceNumberSet* previous_transmissions =
+ it->second.previous_transmissions;
+ if (previous_transmissions == NULL) {
+ break;
+ }
+ QuicPacketSequenceNumber newest_transmission =
+ *previous_transmissions->rbegin();
+ if (sequence_number == newest_transmission) {
break;
}
- DCHECK(ContainsKey(previous_transmissions_map_, sequence_number));
- DCHECK(!HasRetransmittableFrames(sequence_number));
- unacked_packets_.erase(sequence_number);
- SequenceNumberSet* previous_transmissions =
- previous_transmissions_map_[sequence_number];
- previous_transmissions_map_.erase(sequence_number);
+ DCHECK(it->second.retransmittable_frames == NULL);
previous_transmissions->erase(sequence_number);
if (previous_transmissions->size() == 1) {
- previous_transmissions_map_.erase(*previous_transmissions->begin());
+ unacked_packets_[newest_transmission].previous_transmissions = NULL;
delete previous_transmissions;
}
+ unacked_packets_.erase(it++);
--num_to_clear;
}
}
@@ -343,42 +336,25 @@ bool QuicSentPacketManager::IsPreviousTransmission(
QuicPacketSequenceNumber sequence_number) const {
DCHECK(ContainsKey(unacked_packets_, sequence_number));
- PreviousTransmissionMap::const_iterator it =
- previous_transmissions_map_.find(sequence_number);
- if (it == previous_transmissions_map_.end()) {
+ UnackedPacketMap::const_iterator it = unacked_packets_.find(sequence_number);
+ if (it->second.previous_transmissions == NULL) {
return false;
}
- SequenceNumberSet* previous_transmissions = it->second;
+ SequenceNumberSet* previous_transmissions = it->second.previous_transmissions;
DCHECK(!previous_transmissions->empty());
return *previous_transmissions->rbegin() != sequence_number;
}
-QuicPacketSequenceNumber QuicSentPacketManager::GetMostRecentTransmission(
- QuicPacketSequenceNumber sequence_number) const {
- DCHECK(ContainsKey(unacked_packets_, sequence_number));
-
- PreviousTransmissionMap::const_iterator it =
- previous_transmissions_map_.find(sequence_number);
- if (it == previous_transmissions_map_.end()) {
- return sequence_number;
- }
-
- SequenceNumberSet* previous_transmissions =
- previous_transmissions_map_.find(sequence_number)->second;
- DCHECK(!previous_transmissions->empty());
- return *previous_transmissions->rbegin();
-}
-
QuicSentPacketManager::UnackedPacketMap::iterator
QuicSentPacketManager::MarkPacketReceivedByPeer(
QuicPacketSequenceNumber sequence_number) {
DCHECK(ContainsKey(unacked_packets_, sequence_number));
// If this packet has never been retransmitted, then simply drop it.
- PreviousTransmissionMap::const_iterator previous_it =
- previous_transmissions_map_.find(sequence_number);
- if (previous_it == previous_transmissions_map_.end()) {
+ UnackedPacketMap::const_iterator previous_it =
+ unacked_packets_.find(sequence_number);
+ if (previous_it->second.previous_transmissions == NULL) {
UnackedPacketMap::iterator next_unacked =
unacked_packets_.find(sequence_number);
++next_unacked;
@@ -386,7 +362,8 @@ QuicSentPacketManager::MarkPacketReceivedByPeer(
return next_unacked;
}
- SequenceNumberSet* previous_transmissions = previous_it->second;
+ SequenceNumberSet* previous_transmissions =
+ previous_it->second.previous_transmissions;
DCHECK(!previous_transmissions->empty());
SequenceNumberSet::reverse_iterator previous_transmissions_it =
previous_transmissions->rbegin();
@@ -399,17 +376,15 @@ QuicSentPacketManager::MarkPacketReceivedByPeer(
// but prevent the data from being retransmitted.
delete unacked_packets_[newest_transmission].retransmittable_frames;
unacked_packets_[newest_transmission].retransmittable_frames = NULL;
+ unacked_packets_[newest_transmission].previous_transmissions = NULL;
pending_retransmissions_.erase(newest_transmission);
}
- previous_transmissions_map_.erase(newest_transmission);
// Clear out information all previous transmissions.
++previous_transmissions_it;
while (previous_transmissions_it != previous_transmissions->rend()) {
QuicPacketSequenceNumber previous_transmission = *previous_transmissions_it;
++previous_transmissions_it;
- DCHECK(ContainsKey(previous_transmissions_map_, previous_transmission));
- previous_transmissions_map_.erase(previous_transmission);
DiscardPacket(previous_transmission);
}
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/quic_sent_packet_manager_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698