Rate-limit add_peer calls randomly
Prepare 1.0.1
This commit is contained in:
parent
294212d421
commit
e0fd64d29a
10
README.rst
10
README.rst
@ -127,6 +127,16 @@ Roadmap
|
|||||||
ChangeLog
|
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
|
Version 1.0
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import asyncio
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import ssl
|
import ssl
|
||||||
|
import random
|
||||||
import time
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
import warnings
|
import warnings
|
||||||
@ -47,6 +48,7 @@ class Controller(util.LoggedClass):
|
|||||||
self.executor = ThreadPoolExecutor()
|
self.executor = ThreadPoolExecutor()
|
||||||
self.loop.set_default_executor(self.executor)
|
self.loop.set_default_executor(self.executor)
|
||||||
self.start_time = time.time()
|
self.start_time = time.time()
|
||||||
|
self.next_add_peer_time = self.start_time
|
||||||
self.coin = env.coin
|
self.coin = env.coin
|
||||||
self.daemon = Daemon(env.coin.daemon_urls(env.daemon_url))
|
self.daemon = Daemon(env.coin.daemon_urls(env.daemon_url))
|
||||||
self.bp = BlockProcessor(env, self, self.daemon)
|
self.bp = BlockProcessor(env, self, self.daemon)
|
||||||
@ -133,6 +135,15 @@ class Controller(util.LoggedClass):
|
|||||||
def is_deprioritized(self, session):
|
def is_deprioritized(self, session):
|
||||||
return self.session_priority(session) > self.BANDS
|
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):
|
async def run_in_executor(self, func, *args):
|
||||||
'''Wait whilst running func in the executor.'''
|
'''Wait whilst running func in the executor.'''
|
||||||
return await self.loop.run_in_executor(None, func, *args)
|
return await self.loop.run_in_executor(None, func, *args)
|
||||||
|
|||||||
@ -45,7 +45,6 @@ class SessionBase(JSONSession):
|
|||||||
self.bw_time = self.start_time
|
self.bw_time = self.start_time
|
||||||
self.bw_interval = 3600
|
self.bw_interval = 3600
|
||||||
self.bw_used = 0
|
self.bw_used = 0
|
||||||
self.peer_added = False
|
|
||||||
|
|
||||||
def close_connection(self):
|
def close_connection(self):
|
||||||
'''Call this to close the connection.'''
|
'''Call this to close the connection.'''
|
||||||
@ -196,13 +195,12 @@ class ElectrumX(SessionBase):
|
|||||||
|
|
||||||
def add_peer(self, features):
|
def add_peer(self, features):
|
||||||
'''Add a peer.'''
|
'''Add a peer.'''
|
||||||
if self.peer_added:
|
if not self.controller.permit_add_peer():
|
||||||
return False
|
return False
|
||||||
peer_mgr = self.controller.peer_mgr
|
peer_mgr = self.controller.peer_mgr
|
||||||
peer_info = self.peer_info()
|
peer_info = self.peer_info()
|
||||||
source = peer_info[0] if peer_info else 'unknown'
|
source = peer_info[0] if peer_info else 'unknown'
|
||||||
self.peer_added = peer_mgr.on_add_peer(features, source)
|
return peer_mgr.on_add_peer(features, source)
|
||||||
return self.peer_added
|
|
||||||
|
|
||||||
def peers_subscribe(self):
|
def peers_subscribe(self):
|
||||||
'''Return the server peers as a list of (ip, host, details) tuples.'''
|
'''Return the server peers as a list of (ip, host, details) tuples.'''
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# Server name and protocol versions
|
# Server name and protocol versions
|
||||||
|
|
||||||
VERSION = 'ElectrumX 1.0'
|
VERSION = 'ElectrumX 1.0.1'
|
||||||
PROTOCOL_MIN = '1.0'
|
PROTOCOL_MIN = '1.0'
|
||||||
PROTOCOL_MAX = '1.0'
|
PROTOCOL_MAX = '1.0'
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user