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

Unified Diff: net/tools/quic/quic_dispatcher.cc

Issue 2310543002: Limits only 16 new QUIC connections can be opened per epoll event. (Closed)
Patch Set: Limits only 16 new QUIC connections can be opened per epoll event. Created 4 years, 3 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
« no previous file with comments | « net/tools/quic/quic_dispatcher.h ('k') | net/tools/quic/quic_dispatcher_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/tools/quic/quic_dispatcher.cc
diff --git a/net/tools/quic/quic_dispatcher.cc b/net/tools/quic/quic_dispatcher.cc
index 2d4cfaa29d5754a14b2dfb4b595b1578ea8e3220..486aea70a3eb36947b0af412b27756a54ab86fd7 100644
--- a/net/tools/quic/quic_dispatcher.cc
+++ b/net/tools/quic/quic_dispatcher.cc
@@ -21,6 +21,7 @@
#include "net/tools/quic/stateless_rejector.h"
using base::StringPiece;
+using std::list;
using std::string;
namespace net {
@@ -210,7 +211,8 @@ QuicDispatcher::QuicDispatcher(
framer_(GetSupportedVersions(),
/*unused*/ QuicTime::Zero(),
Perspective::IS_SERVER),
- last_error_(QUIC_NO_ERROR) {
+ last_error_(QUIC_NO_ERROR),
+ new_sessions_allowed_per_event_loop_(0u) {
framer_.set_visitor(this);
}
@@ -604,6 +606,29 @@ void QuicDispatcher::OnExpiredPackets(
connection_id, framer_.version(), false, nullptr);
}
+void QuicDispatcher::ProcessBufferedChlos(size_t max_connections_to_create) {
+ // Reset the counter before starting creating connections.
+ new_sessions_allowed_per_event_loop_ = max_connections_to_create;
+ for (; new_sessions_allowed_per_event_loop_ > 0;
+ --new_sessions_allowed_per_event_loop_) {
+ QuicConnectionId connection_id;
+ list<BufferedPacket> packets =
+ buffered_packets_.DeliverPacketsForNextConnection(&connection_id);
+ if (packets.empty()) {
+ return;
+ }
+ QuicServerSessionBase* session =
+ CreateQuicSession(connection_id, packets.front().client_address);
+ DVLOG(1) << "Created new session for " << connection_id;
+ session_map_.insert(std::make_pair(connection_id, session));
+ DeliverPacketsToSession(packets, session);
+ }
+}
+
+bool QuicDispatcher::HasChlosBuffered() const {
+ return buffered_packets_.HasChlosBuffered();
+}
+
void QuicDispatcher::OnNewConnectionAdded(QuicConnectionId connection_id) {
VLOG(1) << "Received packet from new connection " << connection_id;
}
@@ -636,7 +661,7 @@ void QuicDispatcher::BufferEarlyPacket(QuicConnectionId connection_id) {
bool is_new_connection = !buffered_packets_.HasBufferedPackets(connection_id);
EnqueuePacketResult rs = buffered_packets_.EnqueuePacket(
connection_id, *current_packet_, current_server_address_,
- current_client_address_);
+ current_client_address_, /*is_chlo=*/false);
if (rs != EnqueuePacketResult::SUCCESS) {
OnBufferPacketFailure(rs, connection_id);
} else if (is_new_connection) {
@@ -645,6 +670,33 @@ void QuicDispatcher::BufferEarlyPacket(QuicConnectionId connection_id) {
}
void QuicDispatcher::ProcessChlo() {
+ QUIC_BUG_IF(!FLAGS_quic_buffer_packet_till_chlo &&
+ FLAGS_quic_limit_num_new_sessions_per_epoll_loop)
+ << "Try to limit connection creation per epoll event while not "
+ "supporting packet buffer. "
+ "--quic_limit_num_new_sessions_per_epoll_loop = true "
+ "--quic_buffer_packet_till_chlo = false";
+
+ if (FLAGS_quic_limit_num_new_sessions_per_epoll_loop &&
+ FLAGS_quic_buffer_packet_till_chlo &&
+ new_sessions_allowed_per_event_loop_ <= 0) {
+ // Can't create new session any more. Wait till next event loop.
+ if (!buffered_packets_.HasChloForConnection(current_connection_id_)) {
+ // Only buffer one CHLO per connection.
+ bool is_new_connection =
+ !buffered_packets_.HasBufferedPackets(current_connection_id_);
+ EnqueuePacketResult rs = buffered_packets_.EnqueuePacket(
+ current_connection_id_, *current_packet_, current_server_address_,
+ current_client_address_, /*is_chlo=*/true);
+ if (rs != EnqueuePacketResult::SUCCESS) {
+ OnBufferPacketFailure(rs, current_connection_id_);
+ } else if (is_new_connection) {
+ OnNewConnectionAdded(current_connection_id_);
+ }
+ }
+ return;
+ }
+
// Creates a new session and process all buffered packets for this connection.
QuicServerSessionBase* session =
CreateQuicSession(current_connection_id_, current_client_address_);
@@ -669,6 +721,10 @@ void QuicDispatcher::ProcessChlo() {
// Do this even when flag is off because there might be still some packets
// buffered in the store before flag is turned off.
DeliverPacketsToSession(packets, session);
+ if (FLAGS_quic_limit_num_new_sessions_per_epoll_loop &&
+ FLAGS_quic_buffer_packet_till_chlo) {
+ --new_sessions_allowed_per_event_loop_;
+ }
}
bool QuicDispatcher::HandlePacketForTimeWait(
« no previous file with comments | « net/tools/quic/quic_dispatcher.h ('k') | net/tools/quic/quic_dispatcher_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698