Limit connections to 512 by default

This commit is contained in:
shortcutme 2018-01-27 12:20:40 +01:00
parent 18d3e8905e
commit 4afb6b3d9c
No known key found for this signature in database
GPG key ID: 5B63BAE6CB9613AE
2 changed files with 28 additions and 0 deletions

View file

@ -201,6 +201,7 @@ class Config(object):
self.parser.add_argument('--size_limit', help='Default site size limit in MB', default=10, type=int, metavar='limit') self.parser.add_argument('--size_limit', help='Default site size limit in MB', default=10, type=int, metavar='limit')
self.parser.add_argument('--file_size_limit', help='Maximum per file size limit in MB', default=10, type=int, metavar='limit') self.parser.add_argument('--file_size_limit', help='Maximum per file size limit in MB', default=10, type=int, metavar='limit')
self.parser.add_argument('--connected_limit', help='Max connected peer per site', default=8, type=int, metavar='connected_limit') self.parser.add_argument('--connected_limit', help='Max connected peer per site', default=8, type=int, metavar='connected_limit')
self.parser.add_argument('--global_connected_limit', help='Max connections', default=512, type=int, metavar='global_connected_limit')
self.parser.add_argument('--workers', help='Download workers per site', default=5, type=int, metavar='workers') self.parser.add_argument('--workers', help='Download workers per site', default=5, type=int, metavar='workers')
self.parser.add_argument('--fileserver_ip', help='FileServer bind address', default="*", metavar='ip') self.parser.add_argument('--fileserver_ip', help='FileServer bind address', default="*", metavar='ip')

View file

@ -8,6 +8,7 @@ import msgpack
from gevent.server import StreamServer from gevent.server import StreamServer
from gevent.pool import Pool from gevent.pool import Pool
import util
from Debug import Debug from Debug import Debug
from Connection import Connection from Connection import Connection
from Config import config from Config import config
@ -158,6 +159,10 @@ class ConnectionServer:
except Exception, err: except Exception, err:
connection.close("%s Connect error: %s" % (ip, Debug.formatException(err))) connection.close("%s Connect error: %s" % (ip, Debug.formatException(err)))
raise err raise err
if len(self.connections) > config.global_connected_limit:
gevent.spawn(self.checkMaxConnections)
return connection return connection
else: else:
return None return None
@ -256,6 +261,28 @@ class ConnectionServer:
if time.time() - s > 0.01: if time.time() - s > 0.01:
self.log.debug("Connection cleanup in %.3fs" % (time.time() - s)) self.log.debug("Connection cleanup in %.3fs" % (time.time() - s))
@util.Noparallel(blocking=False)
def checkMaxConnections(self):
if len(self.connections) < config.global_connected_limit:
return 0
s = time.time()
num_connected_before = len(self.connections)
self.connections.sort(key=lambda connection: connection.sites)
num_closed = 0
for connection in self.connections:
idle = time.time() - max(connection.last_recv_time, connection.start_time, connection.last_message_time)
if idle > 60:
connection.close("Connection limit reached")
num_closed += 1
if num_closed > config.global_connected_limit * 0.1:
break
self.log.debug("Closed %s connections of %s after reached limit %s in %.3fs" % (
num_closed, num_connected_before, config.global_connected_limit, time.time() - s
))
return num_closed
def onInternetOnline(self): def onInternetOnline(self):
self.log.info("Internet online") self.log.info("Internet online")