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

Unified Diff: net/quic/quic_stream_factory.cc

Issue 1025573002: QUIC - disable QUIC if packet loss rate is bad for a connection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: disable quic for lossy connections in a row Created 5 years, 9 months 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
Index: net/quic/quic_stream_factory.cc
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index cbcd45eed6f4641b1e701ab9d7fe6a625d307f9b..4dafc06493261b1ab588c68d7ce8fbbc1d9252e1 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -11,6 +11,7 @@
#include "base/message_loop/message_loop_proxy.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
+#include "base/metrics/sparse_histogram.h"
#include "base/rand_util.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
@@ -539,6 +540,8 @@ QuicStreamFactory::QuicStreamFactory(
bool enable_connection_racing,
bool enable_non_blocking_io,
bool disable_disk_cache,
+ int max_number_of_lossy_connections,
+ float packet_loss_threshold,
int socket_receive_buffer_size,
const QuicTagVector& connection_options)
: require_confirmation_(true),
@@ -562,6 +565,8 @@ QuicStreamFactory::QuicStreamFactory(
enable_connection_racing_(enable_connection_racing),
enable_non_blocking_io_(enable_non_blocking_io),
disable_disk_cache_(disable_disk_cache),
+ max_number_of_lossy_connections_(max_number_of_lossy_connections),
+ packet_loss_threshold_(packet_loss_threshold),
socket_receive_buffer_size_(socket_receive_buffer_size),
port_seed_(random_generator_->RandUint64()),
check_persisted_supports_quic_(true),
@@ -762,6 +767,42 @@ scoped_ptr<QuicHttpStream> QuicStreamFactory::CreateIfSessionExists(
new QuicHttpStream(session->GetWeakPtr()));
}
+bool QuicStreamFactory::IsQuicDisabled(uint16 port) {
+ return max_number_of_lossy_connections_ > 0 &&
+ number_of_lossy_connections_[port] >= max_number_of_lossy_connections_;
+}
+
+bool QuicStreamFactory::OnHandshakeConfirmed(QuicClientSession* session,
+ float packet_loss_rate) {
+ DCHECK(session);
+ uint16 port = session->server_id().port();
+ if (packet_loss_rate < packet_loss_threshold_) {
+ number_of_lossy_connections_[port] = 0;
+ return false;
+ }
+
+ if (http_server_properties_) {
+ // We mark it as recently broken, which means that 0-RTT will be disabled
+ // but we'll still race.
+ http_server_properties_->MarkAlternativeServiceRecentlyBroken(
+ AlternativeService(QUIC, session->server_id().host(), port));
+ }
+
+ // We abandon the connection if packet loss rate is too bad.
+ session->CloseSessionOnError(ERR_ABORTED, QUIC_BAD_PACKET_LOSS_RATE);
+
+ if (IsQuicDisabled(port))
+ return true; // Exit if Quic is already disabled for this port.
+
+ if (++number_of_lossy_connections_[port] >=
+ max_number_of_lossy_connections_) {
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicStreamFactory.QuicIsDisabled", port, 0,
Mark P 2015/03/26 20:25:00 Also, is there any way to get the information you
ramant (doing other things) 2015/03/26 21:03:35 Good point. Changed it to UMA_HISTOGRAM_SPARSE_SLO
+ 1024, 1025);
+ }
+
+ return true;
+}
+
void QuicStreamFactory::OnIdleSession(QuicClientSession* session) {
}
@@ -838,12 +879,14 @@ void QuicStreamFactory::CancelRequest(QuicStreamRequest* request) {
void QuicStreamFactory::CloseAllSessions(int error) {
while (!active_sessions_.empty()) {
size_t initial_size = active_sessions_.size();
- active_sessions_.begin()->second->CloseSessionOnError(error);
+ active_sessions_.begin()->second->CloseSessionOnError(error,
+ QUIC_INTERNAL_ERROR);
DCHECK_NE(initial_size, active_sessions_.size());
}
while (!all_sessions_.empty()) {
size_t initial_size = all_sessions_.size();
- all_sessions_.begin()->first->CloseSessionOnError(error);
+ all_sessions_.begin()->first->CloseSessionOnError(error,
+ QUIC_INTERNAL_ERROR);
DCHECK_NE(initial_size, all_sessions_.size());
}
DCHECK(all_sessions_.empty());

Powered by Google App Engine
This is Rietveld 408576698