OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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_connection_logger.h" | 5 #include "net/quic/quic_connection_logger.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
118 base::Uint64ToString(frame->largest_observed)); | 118 base::Uint64ToString(frame->largest_observed)); |
119 dict->SetString( | 119 dict->SetString( |
120 "delta_time_largest_observed_us", | 120 "delta_time_largest_observed_us", |
121 base::Int64ToString(frame->delta_time_largest_observed.ToMicroseconds())); | 121 base::Int64ToString(frame->delta_time_largest_observed.ToMicroseconds())); |
122 dict->SetInteger("entropy_hash", | 122 dict->SetInteger("entropy_hash", |
123 frame->entropy_hash); | 123 frame->entropy_hash); |
124 dict->SetBoolean("truncated", frame->is_truncated); | 124 dict->SetBoolean("truncated", frame->is_truncated); |
125 | 125 |
126 base::ListValue* missing = new base::ListValue(); | 126 base::ListValue* missing = new base::ListValue(); |
127 dict->Set("missing_packets", missing); | 127 dict->Set("missing_packets", missing); |
128 const PacketNumberSet& missing_packets = frame->missing_packets; | 128 for (QuicPacketNumber packet : frame->missing_packets) |
129 for (PacketNumberSet::const_iterator it = missing_packets.begin(); | 129 missing->AppendString(base::Uint64ToString(packet)); |
130 it != missing_packets.end(); ++it) { | |
131 missing->AppendString(base::Uint64ToString(*it)); | |
132 } | |
133 | 130 |
134 base::ListValue* revived = new base::ListValue(); | 131 base::ListValue* revived = new base::ListValue(); |
135 dict->Set("revived_packets", revived); | 132 dict->Set("revived_packets", revived); |
136 const PacketNumberSet& revived_packets = frame->revived_packets; | 133 const PacketNumberSet& revived_packets = frame->revived_packets; |
137 for (PacketNumberSet::const_iterator it = revived_packets.begin(); | 134 for (PacketNumberSet::const_iterator it = revived_packets.begin(); |
138 it != revived_packets.end(); ++it) { | 135 it != revived_packets.end(); ++it) { |
139 revived->AppendString(base::Uint64ToString(*it)); | 136 revived->AppendString(base::Uint64ToString(*it)); |
140 } | 137 } |
141 | 138 |
142 base::ListValue* received = new base::ListValue(); | 139 base::ListValue* received = new base::ListValue(); |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
357 break; | 354 break; |
358 case STREAM_FRAME: | 355 case STREAM_FRAME: |
359 net_log_.AddEvent( | 356 net_log_.AddEvent( |
360 NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_SENT, | 357 NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_SENT, |
361 base::Bind(&NetLogQuicStreamFrameCallback, frame.stream_frame)); | 358 base::Bind(&NetLogQuicStreamFrameCallback, frame.stream_frame)); |
362 break; | 359 break; |
363 case ACK_FRAME: { | 360 case ACK_FRAME: { |
364 net_log_.AddEvent( | 361 net_log_.AddEvent( |
365 NetLog::TYPE_QUIC_SESSION_ACK_FRAME_SENT, | 362 NetLog::TYPE_QUIC_SESSION_ACK_FRAME_SENT, |
366 base::Bind(&NetLogQuicAckFrameCallback, frame.ack_frame)); | 363 base::Bind(&NetLogQuicAckFrameCallback, frame.ack_frame)); |
367 const PacketNumberSet& missing_packets = frame.ack_frame->missing_packets; | 364 const PacketNumberQueue& missing_packets = |
365 frame.ack_frame->missing_packets; | |
368 const uint8 max_ranges = std::numeric_limits<uint8>::max(); | 366 const uint8 max_ranges = std::numeric_limits<uint8>::max(); |
369 // Compute an upper bound on the number of NACK ranges. If the bound | 367 // Compute an upper bound on the number of NACK ranges. If the bound |
370 // is below the max, then it clearly isn't truncated. | 368 // is below the max, then it clearly isn't truncated. |
371 if (missing_packets.size() < max_ranges || | 369 if (missing_packets.NumPackets() < max_ranges || |
372 (*missing_packets.rbegin() - *missing_packets.begin() - | 370 (missing_packets.Max() - missing_packets.Min() - |
373 missing_packets.size() + 1) < max_ranges) { | 371 missing_packets.NumPackets() + 1) < max_ranges) { |
374 break; | 372 break; |
375 } | 373 } |
376 size_t num_ranges = 0; | 374 size_t num_ranges = 0; |
377 QuicPacketNumber last_missing = 0; | 375 QuicPacketNumber last_missing = 0; |
378 for (PacketNumberSet::const_iterator it = missing_packets.begin(); | 376 for (QuicPacketNumber packet : missing_packets) { |
379 it != missing_packets.end(); ++it) { | 377 if (packet != last_missing + 1 && ++num_ranges >= max_ranges) { |
380 if (*it != last_missing + 1 && ++num_ranges >= max_ranges) { | |
381 ++num_truncated_acks_sent_; | 378 ++num_truncated_acks_sent_; |
382 break; | 379 break; |
383 } | 380 } |
384 last_missing = *it; | 381 last_missing = packet; |
385 } | 382 } |
386 break; | 383 break; |
387 } | 384 } |
388 case RST_STREAM_FRAME: | 385 case RST_STREAM_FRAME: |
389 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.RstStreamErrorCodeClient", | 386 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.RstStreamErrorCodeClient", |
390 frame.rst_stream_frame->error_code); | 387 frame.rst_stream_frame->error_code); |
391 net_log_.AddEvent( | 388 net_log_.AddEvent( |
392 NetLog::TYPE_QUIC_SESSION_RST_STREAM_FRAME_SENT, | 389 NetLog::TYPE_QUIC_SESSION_RST_STREAM_FRAME_SENT, |
393 base::Bind(&NetLogQuicRstStreamFrameCallback, | 390 base::Bind(&NetLogQuicRstStreamFrameCallback, |
394 frame.rst_stream_frame)); | 391 frame.rst_stream_frame)); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
550 | 547 |
551 const size_t kApproximateLargestSoloAckBytes = 100; | 548 const size_t kApproximateLargestSoloAckBytes = 100; |
552 if (last_received_packet_number_ < received_acks_.size() && | 549 if (last_received_packet_number_ < received_acks_.size() && |
553 last_received_packet_size_ < kApproximateLargestSoloAckBytes) { | 550 last_received_packet_size_ < kApproximateLargestSoloAckBytes) { |
554 received_acks_[static_cast<size_t>(last_received_packet_number_)] = true; | 551 received_acks_[static_cast<size_t>(last_received_packet_number_)] = true; |
555 } | 552 } |
556 | 553 |
557 if (frame.is_truncated) | 554 if (frame.is_truncated) |
558 ++num_truncated_acks_received_; | 555 ++num_truncated_acks_received_; |
559 | 556 |
560 if (frame.missing_packets.empty()) | 557 if (frame.missing_packets.Empty()) |
561 return; | 558 return; |
562 | 559 |
563 PacketNumberSet missing_packets = frame.missing_packets; | 560 const PacketNumberQueue& missing_packets = frame.missing_packets; |
ramant (doing other things)
2015/09/10 03:58:26
Hi Ryan,
Added lower_bound method. Could you ple
| |
564 PacketNumberSet::const_iterator it = | 561 PacketNumberQueue::const_iterator it = |
565 missing_packets.lower_bound(largest_received_missing_packet_number_); | 562 missing_packets.lower_bound(largest_received_missing_packet_number_); |
566 if (it == missing_packets.end()) | 563 if (it == missing_packets.end()) |
567 return; | 564 return; |
568 | 565 |
569 if (*it == largest_received_missing_packet_number_) { | 566 if (*it == largest_received_missing_packet_number_) { |
570 ++it; | 567 ++it; |
571 if (it == missing_packets.end()) | 568 if (it == missing_packets.end()) |
572 return; | 569 return; |
573 } | 570 } |
574 // Scan through the list and log consecutive ranges of missing packets. | 571 // Scan through the list and log consecutive ranges of missing packets. |
575 size_t num_consecutive_missing_packets = 0; | 572 size_t num_consecutive_missing_packets = 0; |
576 QuicPacketNumber previous_missing_packet = *it - 1; | 573 QuicPacketNumber previous_missing_packet = *it - 1; |
577 while (it != missing_packets.end()) { | 574 while (it != missing_packets.end()) { |
578 if (previous_missing_packet == *it - 1) { | 575 if (previous_missing_packet == *it - 1) { |
579 ++num_consecutive_missing_packets; | 576 ++num_consecutive_missing_packets; |
580 } else { | 577 } else { |
581 DCHECK_NE(0u, num_consecutive_missing_packets); | 578 DCHECK_NE(0u, num_consecutive_missing_packets); |
582 UpdatePacketGapSentHistogram(num_consecutive_missing_packets); | 579 UpdatePacketGapSentHistogram(num_consecutive_missing_packets); |
583 // Make sure this packet it included in the count. | 580 // Make sure this packet it included in the count. |
584 num_consecutive_missing_packets = 1; | 581 num_consecutive_missing_packets = 1; |
585 } | 582 } |
586 previous_missing_packet = *it; | 583 previous_missing_packet = *it; |
587 ++it; | 584 ++it; |
588 } | 585 } |
589 if (num_consecutive_missing_packets != 0) { | 586 if (num_consecutive_missing_packets != 0) { |
590 UpdatePacketGapSentHistogram(num_consecutive_missing_packets); | 587 UpdatePacketGapSentHistogram(num_consecutive_missing_packets); |
591 } | 588 } |
592 largest_received_missing_packet_number_ = *missing_packets.rbegin(); | 589 largest_received_missing_packet_number_ = missing_packets.Max(); |
593 } | 590 } |
594 | 591 |
595 void QuicConnectionLogger::OnStopWaitingFrame( | 592 void QuicConnectionLogger::OnStopWaitingFrame( |
596 const QuicStopWaitingFrame& frame) { | 593 const QuicStopWaitingFrame& frame) { |
597 net_log_.AddEvent( | 594 net_log_.AddEvent( |
598 NetLog::TYPE_QUIC_SESSION_STOP_WAITING_FRAME_RECEIVED, | 595 NetLog::TYPE_QUIC_SESSION_STOP_WAITING_FRAME_RECEIVED, |
599 base::Bind(&NetLogQuicStopWaitingFrameCallback, &frame)); | 596 base::Bind(&NetLogQuicStopWaitingFrameCallback, &frame)); |
600 } | 597 } |
601 | 598 |
602 void QuicConnectionLogger::OnRstStreamFrame(const QuicRstStreamFrame& frame) { | 599 void QuicConnectionLogger::OnRstStreamFrame(const QuicRstStreamFrame& frame) { |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
872 continue; | 869 continue; |
873 } | 870 } |
874 // Record some overlapping patterns, to get a better picture, since this is | 871 // Record some overlapping patterns, to get a better picture, since this is |
875 // not very expensive. | 872 // not very expensive. |
876 if (i % 3 == 0) | 873 if (i % 3 == 0) |
877 six_packet_histogram->Add(recent_6_mask); | 874 six_packet_histogram->Add(recent_6_mask); |
878 } | 875 } |
879 } | 876 } |
880 | 877 |
881 } // namespace net | 878 } // namespace net |
OLD | NEW |