Rate-limit add_peer calls randomly

Prepare 1.0.1
This commit is contained in:
Neil Booth 2017-03-22 07:57:15 +09:00
parent 294212d421
commit e0fd64d29a
4 changed files with 24 additions and 5 deletions

View File

@ -127,6 +127,16 @@ Roadmap
ChangeLog
=========
Version 1.0.1
-------------
* Rate-limit add_peer calls in a random way
* Fix discovery of base height in reorgs
* Don't permit common but invalid REPORT_HOST values
* Set reorg limit to 8000 blocks on testnet
* dogecoin / litecoin parameter fixes (erasmospunk, pooler)
* minor doc tweaks
Version 1.0
-----------

View File

@ -9,6 +9,7 @@ import asyncio
import json
import os
import ssl
import random
import time
import traceback
import warnings
@ -47,6 +48,7 @@ class Controller(util.LoggedClass):
self.executor = ThreadPoolExecutor()
self.loop.set_default_executor(self.executor)
self.start_time = time.time()
self.next_add_peer_time = self.start_time
self.coin = env.coin
self.daemon = Daemon(env.coin.daemon_urls(env.daemon_url))
self.bp = BlockProcessor(env, self, self.daemon)
@ -133,6 +135,15 @@ class Controller(util.LoggedClass):
def is_deprioritized(self, session):
return self.session_priority(session) > self.BANDS
def permit_add_peer(self):
'''To prevent lots of add_peer requests filling up the peer
table, accept only one per random time interval.'''
now = time.time()
if now < self.next_add_peer_time:
return False
self.next_add_peer_time = now + random.randrange(0, 1800)
return True
async def run_in_executor(self, func, *args):
'''Wait whilst running func in the executor.'''
return await self.loop.run_in_executor(None, func, *args)

View File

@ -45,7 +45,6 @@ class SessionBase(JSONSession):
self.bw_time = self.start_time
self.bw_interval = 3600
self.bw_used = 0
self.peer_added = False
def close_connection(self):
'''Call this to close the connection.'''
@ -196,13 +195,12 @@ class ElectrumX(SessionBase):
def add_peer(self, features):
'''Add a peer.'''
if self.peer_added:
if not self.controller.permit_add_peer():
return False
peer_mgr = self.controller.peer_mgr
peer_info = self.peer_info()
source = peer_info[0] if peer_info else 'unknown'
self.peer_added = peer_mgr.on_add_peer(features, source)
return self.peer_added
return peer_mgr.on_add_peer(features, source)
def peers_subscribe(self):
'''Return the server peers as a list of (ip, host, details) tuples.'''

View File

@ -1,5 +1,5 @@
# Server name and protocol versions
VERSION = 'ElectrumX 1.0'
VERSION = 'ElectrumX 1.0.1'
PROTOCOL_MIN = '1.0'
PROTOCOL_MAX = '1.0'