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

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

Issue 186293002: Disable QUIC port selection when the server is going away. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add comments Created 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_stream_factory.h ('k') | net/quic/quic_stream_factory_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_stream_factory.h" 5 #include "net/quic/quic_stream_factory.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 425
426 void QuicStreamFactory::OnIdleSession(QuicClientSession* session) { 426 void QuicStreamFactory::OnIdleSession(QuicClientSession* session) {
427 } 427 }
428 428
429 void QuicStreamFactory::OnSessionGoingAway(QuicClientSession* session) { 429 void QuicStreamFactory::OnSessionGoingAway(QuicClientSession* session) {
430 const AliasSet& aliases = session_aliases_[session]; 430 const AliasSet& aliases = session_aliases_[session];
431 for (AliasSet::const_iterator it = aliases.begin(); it != aliases.end(); 431 for (AliasSet::const_iterator it = aliases.begin(); it != aliases.end();
432 ++it) { 432 ++it) {
433 DCHECK(active_sessions_.count(*it)); 433 DCHECK(active_sessions_.count(*it));
434 DCHECK_EQ(session, active_sessions_[*it]); 434 DCHECK_EQ(session, active_sessions_[*it]);
435 // Track sessions which have recently gone away so that we can disable
436 // port suggestions.
437 if (session->goaway_received()) {
438 gone_away_aliases_.insert(*it);
439 }
440
435 active_sessions_.erase(*it); 441 active_sessions_.erase(*it);
436 if (!http_server_properties_) 442 if (!http_server_properties_)
437 continue; 443 continue;
438 444
439 if (!session->IsCryptoHandshakeConfirmed()) { 445 if (!session->IsCryptoHandshakeConfirmed()) {
440 // TODO(rch): In the special case where the session has received no 446 // TODO(rch): In the special case where the session has received no
441 // packets from the peer, we should consider blacklisting this 447 // packets from the peer, we should consider blacklisting this
442 // differently so that we still race TCP but we don't consider the 448 // differently so that we still race TCP but we don't consider the
443 // session connected until the handshake has been confirmed. 449 // session connected until the handshake has been confirmed.
444 http_server_properties_->SetBrokenAlternateProtocol(it->first); 450 http_server_properties_->SetBrokenAlternateProtocol(it->first);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 return ContainsKey(active_sessions_, host_port_proxy_pair); 536 return ContainsKey(active_sessions_, host_port_proxy_pair);
531 } 537 }
532 538
533 int QuicStreamFactory::CreateSession( 539 int QuicStreamFactory::CreateSession(
534 const HostPortProxyPair& host_port_proxy_pair, 540 const HostPortProxyPair& host_port_proxy_pair,
535 bool is_https, 541 bool is_https,
536 CertVerifier* cert_verifier, 542 CertVerifier* cert_verifier,
537 const AddressList& address_list, 543 const AddressList& address_list,
538 const BoundNetLog& net_log, 544 const BoundNetLog& net_log,
539 QuicClientSession** session) { 545 QuicClientSession** session) {
546 bool enable_port_selection = enable_port_selection_;
547 if (enable_port_selection &&
548 ContainsKey(gone_away_aliases_, host_port_proxy_pair)) {
549 // Disable port selection when the server is going away.
550 // There is no point in trying to return to the same server, if
551 // that server is no longer handling requests.
552 enable_port_selection = false;
553 gone_away_aliases_.erase(host_port_proxy_pair);
554 }
555
540 QuicConnectionId connection_id = random_generator_->RandUint64(); 556 QuicConnectionId connection_id = random_generator_->RandUint64();
541 IPEndPoint addr = *address_list.begin(); 557 IPEndPoint addr = *address_list.begin();
542 scoped_refptr<PortSuggester> port_suggester = 558 scoped_refptr<PortSuggester> port_suggester =
543 new PortSuggester(host_port_proxy_pair.first, port_seed_); 559 new PortSuggester(host_port_proxy_pair.first, port_seed_);
544 DatagramSocket::BindType bind_type = enable_port_selection_ ? 560 DatagramSocket::BindType bind_type = enable_port_selection ?
545 DatagramSocket::RANDOM_BIND : // Use our callback. 561 DatagramSocket::RANDOM_BIND : // Use our callback.
546 DatagramSocket::DEFAULT_BIND; // Use OS to randomize. 562 DatagramSocket::DEFAULT_BIND; // Use OS to randomize.
547 scoped_ptr<DatagramClientSocket> socket( 563 scoped_ptr<DatagramClientSocket> socket(
548 client_socket_factory_->CreateDatagramClientSocket( 564 client_socket_factory_->CreateDatagramClientSocket(
549 bind_type, 565 bind_type,
550 base::Bind(&PortSuggester::SuggestPort, port_suggester), 566 base::Bind(&PortSuggester::SuggestPort, port_suggester),
551 net_log.net_log(), net_log.source())); 567 net_log.net_log(), net_log.source()));
552 int rv = socket->Connect(addr); 568 int rv = socket->Connect(addr);
553 if (rv != OK) 569 if (rv != OK)
554 return rv; 570 return rv;
555 UMA_HISTOGRAM_COUNTS("Net.QuicEphemeralPortsSuggested", 571 UMA_HISTOGRAM_COUNTS("Net.QuicEphemeralPortsSuggested",
556 port_suggester->call_count()); 572 port_suggester->call_count());
557 if (enable_port_selection_) { 573 if (enable_port_selection) {
558 DCHECK_LE(1u, port_suggester->call_count()); 574 DCHECK_LE(1u, port_suggester->call_count());
559 } else { 575 } else {
560 DCHECK_EQ(0u, port_suggester->call_count()); 576 DCHECK_EQ(0u, port_suggester->call_count());
561 } 577 }
562 578
563 // We should adaptively set this buffer size, but for now, we'll use a size 579 // We should adaptively set this buffer size, but for now, we'll use a size
564 // that is more than large enough for a full receive window, and yet 580 // that is more than large enough for a full receive window, and yet
565 // does not consume "too much" memory. If we see bursty packet loss, we may 581 // does not consume "too much" memory. If we see bursty packet loss, we may
566 // revisit this setting and test for its impact. 582 // revisit this setting and test for its impact.
567 const int32 kSocketBufferSize(TcpReceiver::kReceiveWindowTCP); 583 const int32 kSocketBufferSize(TcpReceiver::kReceiveWindowTCP);
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 // Copy the CachedState for the canonical server from canonical_crypto_config 703 // Copy the CachedState for the canonical server from canonical_crypto_config
688 // as the initial CachedState for the server_hostname in crypto_config. 704 // as the initial CachedState for the server_hostname in crypto_config.
689 crypto_config->InitializeFrom(server_hostname, 705 crypto_config->InitializeFrom(server_hostname,
690 canonical_host_port_proxy_pair.first.host(), 706 canonical_host_port_proxy_pair.first.host(),
691 canonical_crypto_config); 707 canonical_crypto_config);
692 // Update canonical version to point at the "most recent" crypto_config. 708 // Update canonical version to point at the "most recent" crypto_config.
693 canonical_hostname_to_origin_map_[canonical_host_port] = host_port_proxy_pair; 709 canonical_hostname_to_origin_map_[canonical_host_port] = host_port_proxy_pair;
694 } 710 }
695 711
696 } // namespace net 712 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_stream_factory.h ('k') | net/quic/quic_stream_factory_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698