Limit connections to 512 by default
This commit is contained in:
parent
18d3e8905e
commit
4afb6b3d9c
2 changed files with 28 additions and 0 deletions
|
@ -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')
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue