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

Side by Side Diff: net/quic/quic_sent_packet_manager.cc

Issue 109323012: Cleanup in QUIC to merge the previous_transmissions_map in (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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_sent_packet_manager.h" 5 #include "net/quic/quic_sent_packet_manager.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "net/quic/congestion_control/pacing_sender.h" 9 #include "net/quic/congestion_control/pacing_sender.h"
10 #include "net/quic/quic_ack_notifier_manager.h" 10 #include "net/quic/quic_ack_notifier_manager.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 send_algorithm_(SendAlgorithmInterface::Create(clock, type)), 71 send_algorithm_(SendAlgorithmInterface::Create(clock, type)),
72 rtt_sample_(QuicTime::Delta::Infinite()), 72 rtt_sample_(QuicTime::Delta::Infinite()),
73 consecutive_rto_count_(0), 73 consecutive_rto_count_(0),
74 using_pacing_(false) { 74 using_pacing_(false) {
75 } 75 }
76 76
77 QuicSentPacketManager::~QuicSentPacketManager() { 77 QuicSentPacketManager::~QuicSentPacketManager() {
78 for (UnackedPacketMap::iterator it = unacked_packets_.begin(); 78 for (UnackedPacketMap::iterator it = unacked_packets_.begin();
79 it != unacked_packets_.end(); ++it) { 79 it != unacked_packets_.end(); ++it) {
80 delete it->second.retransmittable_frames; 80 delete it->second.retransmittable_frames;
81 } 81 // Only delete previous_transmissions once, for the newest packet.
82 while (!previous_transmissions_map_.empty()) { 82 if (it->second.previous_transmissions != NULL &&
83 SequenceNumberSet* previous_transmissions = 83 it->first == *it->second.previous_transmissions->rbegin()) {
84 previous_transmissions_map_.begin()->second; 84 delete it->second.previous_transmissions;
85 for (SequenceNumberSet::const_iterator it = previous_transmissions->begin();
86 it != previous_transmissions->end(); ++it) {
87 DCHECK(ContainsKey(previous_transmissions_map_, *it));
88 previous_transmissions_map_.erase(*it);
89 } 85 }
90 delete previous_transmissions;
91 } 86 }
92 STLDeleteValues(&packet_history_map_); 87 STLDeleteValues(&packet_history_map_);
93 } 88 }
94 89
95 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { 90 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) {
96 if (config.initial_round_trip_time_us() > 0 && 91 if (config.initial_round_trip_time_us() > 0 &&
97 rtt_sample_.IsInfinite()) { 92 rtt_sample_.IsInfinite()) {
98 // The initial rtt should already be set on the client side. 93 // The initial rtt should already be set on the client side.
99 DVLOG_IF(1, !is_server_) 94 DVLOG_IF(1, !is_server_)
100 << "Client did not set an initial RTT, but did negotiate one."; 95 << "Client did not set an initial RTT, but did negotiate one.";
(...skipping 30 matching lines...) Expand all
131 void QuicSentPacketManager::OnRetransmittedPacket( 126 void QuicSentPacketManager::OnRetransmittedPacket(
132 QuicPacketSequenceNumber old_sequence_number, 127 QuicPacketSequenceNumber old_sequence_number,
133 QuicPacketSequenceNumber new_sequence_number) { 128 QuicPacketSequenceNumber new_sequence_number) {
134 DCHECK(ContainsKey(unacked_packets_, old_sequence_number)); 129 DCHECK(ContainsKey(unacked_packets_, old_sequence_number));
135 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number)); 130 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number));
136 DCHECK(unacked_packets_.empty() || 131 DCHECK(unacked_packets_.empty() ||
137 unacked_packets_.rbegin()->first < new_sequence_number); 132 unacked_packets_.rbegin()->first < new_sequence_number);
138 133
139 pending_retransmissions_.erase(old_sequence_number); 134 pending_retransmissions_.erase(old_sequence_number);
140 135
141 RetransmittableFrames* frames = 136 UnackedPacketMap::iterator unacked_it =
142 unacked_packets_[old_sequence_number].retransmittable_frames; 137 unacked_packets_.find(old_sequence_number);
138 RetransmittableFrames* frames = unacked_it->second.retransmittable_frames;
143 DCHECK(frames); 139 DCHECK(frames);
144 140
145 // A notifier may be waiting to hear about ACKs for the original sequence 141 // A notifier may be waiting to hear about ACKs for the original sequence
146 // number. Inform them that the sequence number has changed. 142 // number. Inform them that the sequence number has changed.
147 ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number, 143 ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number,
148 new_sequence_number); 144 new_sequence_number);
149 145
150 // We keep the old packet in the unacked packet list until it, or one of 146 // We keep the old packet in the unacked packet list until it, or one of
151 // the retransmissions of it are acked. 147 // the retransmissions of it are acked.
152 unacked_packets_[old_sequence_number].retransmittable_frames = NULL; 148 unacked_it->second.retransmittable_frames = NULL;
153 unacked_packets_[new_sequence_number] = 149 unacked_packets_[new_sequence_number] =
154 TransmissionInfo(frames, GetSequenceNumberLength(old_sequence_number)); 150 TransmissionInfo(frames, GetSequenceNumberLength(old_sequence_number));
155 151
156 // Keep track of all sequence numbers that this packet 152 // Keep track of all sequence numbers that this packet
157 // has been transmitted as. 153 // has been transmitted as.
158 SequenceNumberSet* previous_transmissions; 154 SequenceNumberSet* previous_transmissions =
159 PreviousTransmissionMap::iterator it = 155 unacked_it->second.previous_transmissions;
160 previous_transmissions_map_.find(old_sequence_number); 156 if (previous_transmissions == NULL) {
161 if (it == previous_transmissions_map_.end()) {
162 // This is the first retransmission of this packet, so create a new entry. 157 // This is the first retransmission of this packet, so create a new entry.
163 previous_transmissions = new SequenceNumberSet; 158 previous_transmissions = new SequenceNumberSet;
164 previous_transmissions_map_[old_sequence_number] = previous_transmissions; 159 unacked_it->second.previous_transmissions = previous_transmissions;
165 previous_transmissions->insert(old_sequence_number); 160 previous_transmissions->insert(old_sequence_number);
166 } else {
167 // Otherwise, use the existing entry.
168 previous_transmissions = it->second;
169 } 161 }
170 previous_transmissions->insert(new_sequence_number); 162 previous_transmissions->insert(new_sequence_number);
171 previous_transmissions_map_[new_sequence_number] = previous_transmissions; 163 unacked_packets_[new_sequence_number].previous_transmissions =
164 previous_transmissions;
172 165
173 DCHECK(HasRetransmittableFrames(new_sequence_number)); 166 DCHECK(HasRetransmittableFrames(new_sequence_number));
174 } 167 }
175 168
176 bool QuicSentPacketManager::OnIncomingAck( 169 bool QuicSentPacketManager::OnIncomingAck(
177 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) { 170 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) {
178 // Determine if the least unacked sequence number is being acked. 171 // Determine if the least unacked sequence number is being acked.
179 QuicPacketSequenceNumber least_unacked_sent_before = 172 QuicPacketSequenceNumber least_unacked_sent_before =
180 GetLeastUnackedSentPacket(); 173 GetLeastUnackedSentPacket();
181 bool new_least_unacked = !IsAwaitingPacket(received_info, 174 bool new_least_unacked = !IsAwaitingPacket(received_info,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 226
234 // If we have received a truncated ack, then we need to 227 // If we have received a truncated ack, then we need to
235 // clear out some previous transmissions to allow the peer 228 // clear out some previous transmissions to allow the peer
236 // to actually ACK new packets. 229 // to actually ACK new packets.
237 if (received_info.is_truncated) { 230 if (received_info.is_truncated) {
238 ClearPreviousRetransmissions(received_info.missing_packets.size() / 2); 231 ClearPreviousRetransmissions(received_info.missing_packets.size() / 2);
239 } 232 }
240 } 233 }
241 234
242 void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) { 235 void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) {
243 UnackedPacketMap::const_iterator it = unacked_packets_.begin(); 236 UnackedPacketMap::iterator it = unacked_packets_.begin();
244 while (it != unacked_packets_.end() && num_to_clear > 0) { 237 while (it != unacked_packets_.end() && num_to_clear > 0) {
245 QuicPacketSequenceNumber sequence_number = it->first; 238 QuicPacketSequenceNumber sequence_number = it->first;
246 ++it;
247 // If this is not a previous transmission then there is no point 239 // If this is not a previous transmission then there is no point
248 // in clearing out any further packets, because it will not affect 240 // in clearing out any further packets, because it will not affect
249 // the high water mark. 241 // the high water mark.
250 if (!IsPreviousTransmission(sequence_number)) { 242 SequenceNumberSet* previous_transmissions =
243 it->second.previous_transmissions;
244 if (previous_transmissions == NULL) {
245 break;
246 }
247 QuicPacketSequenceNumber newest_transmission =
248 *previous_transmissions->rbegin();
249 if (sequence_number == newest_transmission) {
251 break; 250 break;
252 } 251 }
253 252
254 DCHECK(ContainsKey(previous_transmissions_map_, sequence_number)); 253 DCHECK(it->second.retransmittable_frames == NULL);
255 DCHECK(!HasRetransmittableFrames(sequence_number));
256 unacked_packets_.erase(sequence_number);
257 SequenceNumberSet* previous_transmissions =
258 previous_transmissions_map_[sequence_number];
259 previous_transmissions_map_.erase(sequence_number);
260 previous_transmissions->erase(sequence_number); 254 previous_transmissions->erase(sequence_number);
261 if (previous_transmissions->size() == 1) { 255 if (previous_transmissions->size() == 1) {
262 previous_transmissions_map_.erase(*previous_transmissions->begin()); 256 unacked_packets_[newest_transmission].previous_transmissions = NULL;
263 delete previous_transmissions; 257 delete previous_transmissions;
264 } 258 }
259 unacked_packets_.erase(it++);
265 --num_to_clear; 260 --num_to_clear;
266 } 261 }
267 } 262 }
268 263
269 bool QuicSentPacketManager::HasRetransmittableFrames( 264 bool QuicSentPacketManager::HasRetransmittableFrames(
270 QuicPacketSequenceNumber sequence_number) const { 265 QuicPacketSequenceNumber sequence_number) const {
271 if (!ContainsKey(unacked_packets_, sequence_number)) { 266 if (!ContainsKey(unacked_packets_, sequence_number)) {
272 return false; 267 return false;
273 } 268 }
274 269
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 return PendingRetransmission(sequence_number, 331 return PendingRetransmission(sequence_number,
337 pending_retransmissions_.begin()->second, 332 pending_retransmissions_.begin()->second,
338 *retransmittable_frames, 333 *retransmittable_frames,
339 GetSequenceNumberLength(sequence_number)); 334 GetSequenceNumberLength(sequence_number));
340 } 335 }
341 336
342 bool QuicSentPacketManager::IsPreviousTransmission( 337 bool QuicSentPacketManager::IsPreviousTransmission(
343 QuicPacketSequenceNumber sequence_number) const { 338 QuicPacketSequenceNumber sequence_number) const {
344 DCHECK(ContainsKey(unacked_packets_, sequence_number)); 339 DCHECK(ContainsKey(unacked_packets_, sequence_number));
345 340
346 PreviousTransmissionMap::const_iterator it = 341 UnackedPacketMap::const_iterator it = unacked_packets_.find(sequence_number);
347 previous_transmissions_map_.find(sequence_number); 342 if (it->second.previous_transmissions == NULL) {
348 if (it == previous_transmissions_map_.end()) {
349 return false; 343 return false;
350 } 344 }
351 345
352 SequenceNumberSet* previous_transmissions = it->second; 346 SequenceNumberSet* previous_transmissions = it->second.previous_transmissions;
353 DCHECK(!previous_transmissions->empty()); 347 DCHECK(!previous_transmissions->empty());
354 return *previous_transmissions->rbegin() != sequence_number; 348 return *previous_transmissions->rbegin() != sequence_number;
355 } 349 }
356 350
357 QuicPacketSequenceNumber QuicSentPacketManager::GetMostRecentTransmission(
358 QuicPacketSequenceNumber sequence_number) const {
359 DCHECK(ContainsKey(unacked_packets_, sequence_number));
360
361 PreviousTransmissionMap::const_iterator it =
362 previous_transmissions_map_.find(sequence_number);
363 if (it == previous_transmissions_map_.end()) {
364 return sequence_number;
365 }
366
367 SequenceNumberSet* previous_transmissions =
368 previous_transmissions_map_.find(sequence_number)->second;
369 DCHECK(!previous_transmissions->empty());
370 return *previous_transmissions->rbegin();
371 }
372
373 QuicSentPacketManager::UnackedPacketMap::iterator 351 QuicSentPacketManager::UnackedPacketMap::iterator
374 QuicSentPacketManager::MarkPacketReceivedByPeer( 352 QuicSentPacketManager::MarkPacketReceivedByPeer(
375 QuicPacketSequenceNumber sequence_number) { 353 QuicPacketSequenceNumber sequence_number) {
376 DCHECK(ContainsKey(unacked_packets_, sequence_number)); 354 DCHECK(ContainsKey(unacked_packets_, sequence_number));
377 355
378 // If this packet has never been retransmitted, then simply drop it. 356 // If this packet has never been retransmitted, then simply drop it.
379 PreviousTransmissionMap::const_iterator previous_it = 357 UnackedPacketMap::const_iterator previous_it =
380 previous_transmissions_map_.find(sequence_number); 358 unacked_packets_.find(sequence_number);
381 if (previous_it == previous_transmissions_map_.end()) { 359 if (previous_it->second.previous_transmissions == NULL) {
382 UnackedPacketMap::iterator next_unacked = 360 UnackedPacketMap::iterator next_unacked =
383 unacked_packets_.find(sequence_number); 361 unacked_packets_.find(sequence_number);
384 ++next_unacked; 362 ++next_unacked;
385 DiscardPacket(sequence_number); 363 DiscardPacket(sequence_number);
386 return next_unacked; 364 return next_unacked;
387 } 365 }
388 366
389 SequenceNumberSet* previous_transmissions = previous_it->second; 367 SequenceNumberSet* previous_transmissions =
368 previous_it->second.previous_transmissions;
390 DCHECK(!previous_transmissions->empty()); 369 DCHECK(!previous_transmissions->empty());
391 SequenceNumberSet::reverse_iterator previous_transmissions_it = 370 SequenceNumberSet::reverse_iterator previous_transmissions_it =
392 previous_transmissions->rbegin(); 371 previous_transmissions->rbegin();
393 QuicPacketSequenceNumber newest_transmission = *previous_transmissions_it; 372 QuicPacketSequenceNumber newest_transmission = *previous_transmissions_it;
394 if (newest_transmission == sequence_number) { 373 if (newest_transmission == sequence_number) {
395 DiscardPacket(newest_transmission); 374 DiscardPacket(newest_transmission);
396 } else { 375 } else {
397 // If we have received an ack for a previous transmission of a packet, 376 // If we have received an ack for a previous transmission of a packet,
398 // we want to keep the "new" transmission of the packet unacked, 377 // we want to keep the "new" transmission of the packet unacked,
399 // but prevent the data from being retransmitted. 378 // but prevent the data from being retransmitted.
400 delete unacked_packets_[newest_transmission].retransmittable_frames; 379 delete unacked_packets_[newest_transmission].retransmittable_frames;
401 unacked_packets_[newest_transmission].retransmittable_frames = NULL; 380 unacked_packets_[newest_transmission].retransmittable_frames = NULL;
381 unacked_packets_[newest_transmission].previous_transmissions = NULL;
402 pending_retransmissions_.erase(newest_transmission); 382 pending_retransmissions_.erase(newest_transmission);
403 } 383 }
404 previous_transmissions_map_.erase(newest_transmission);
405 384
406 // Clear out information all previous transmissions. 385 // Clear out information all previous transmissions.
407 ++previous_transmissions_it; 386 ++previous_transmissions_it;
408 while (previous_transmissions_it != previous_transmissions->rend()) { 387 while (previous_transmissions_it != previous_transmissions->rend()) {
409 QuicPacketSequenceNumber previous_transmission = *previous_transmissions_it; 388 QuicPacketSequenceNumber previous_transmission = *previous_transmissions_it;
410 ++previous_transmissions_it; 389 ++previous_transmissions_it;
411 DCHECK(ContainsKey(previous_transmissions_map_, previous_transmission));
412 previous_transmissions_map_.erase(previous_transmission);
413 DiscardPacket(previous_transmission); 390 DiscardPacket(previous_transmission);
414 } 391 }
415 392
416 delete previous_transmissions; 393 delete previous_transmissions;
417 394
418 UnackedPacketMap::iterator next_unacked = unacked_packets_.begin(); 395 UnackedPacketMap::iterator next_unacked = unacked_packets_.begin();
419 while (next_unacked != unacked_packets_.end() && 396 while (next_unacked != unacked_packets_.end() &&
420 next_unacked->first < sequence_number) { 397 next_unacked->first < sequence_number) {
421 ++next_unacked; 398 ++next_unacked;
422 } 399 }
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 return; 770 return;
794 } 771 }
795 772
796 using_pacing_ = true; 773 using_pacing_ = true;
797 send_algorithm_.reset( 774 send_algorithm_.reset(
798 new PacingSender(send_algorithm_.release(), 775 new PacingSender(send_algorithm_.release(),
799 QuicTime::Delta::FromMicroseconds(1))); 776 QuicTime::Delta::FromMicroseconds(1)));
800 } 777 }
801 778
802 } // namespace net 779 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/test_tools/quic_sent_packet_manager_peer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698