Browse Source

session.py: close sessions hitting the hard limit

patch-2
Neil Booth 6 years ago
parent
commit
4f65e3423f
  1. 10
      docs/rpc-interface.rst
  2. 14
      electrumx/server/session.py

10
docs/rpc-interface.rst

@ -203,11 +203,11 @@ sessions
Return a list of all current sessions. Takes no arguments:: Return a list of all current sessions. Takes no arguments::
ID Flags Client Proto Cost XCost Reqs Txs Subs Recv Recv KB Sent Sent KB Time Peer ID Flags Client Proto Cost XCost Reqs Txs Subs Recv Recv KB Sent Sent KB Time Peer
1 S6 1.1.1 1.4 0 16 0 0 0 3 0 3 0 05m42s 165.255.191.213:22349 1 S6 1.1.1 1.4 0 16 0 0 0 3 0 3 0 05m42s 165.255.191.213:22349
2 S6 all_seeing_eye 1.4 0 16 0 0 0 2 0 2 0 05m40s 67.170.52.226:24995 2 S6 all_seeing_eye 1.4 0 16 0 0 0 2 0 2 0 05m40s 67.170.52.226:24995
4 S6 3.3.2 1.4 0 16 0 0 34 45 5 45 3 05m40s 185.220.100.252:40463 4 S6 3.3.2 1.4 0 16 0 0 34 45 5 45 3 05m40s 185.220.100.252:40463
3 S6 1.1.2 1.4 0 16 0 0 0 3 0 3 0 05m40s 89.17.142.28:59241 3 S6 1.1.2 1.4 0 16 0 0 0 3 0 3 0 05m40s 89.17.142.28:59241
The columns show information by session: the session ID, flags (see below), how the client The columns show information by session: the session ID, flags (see below), how the client
identifies itself - typically the Electrum client version, the protocol version identifies itself - typically the Electrum client version, the protocol version

14
electrumx/server/session.py

@ -234,11 +234,15 @@ class SessionManager(object):
session_class = self.env.coin.SESSIONCLS session_class = self.env.coin.SESSIONCLS
while True: while True:
await sleep(100) await sleep(100)
for session in sorted(self.sessions, key=lambda s: s.cost, reverse=True): async with TaskGroup() as group:
# Subs have an on-going cost so decay more slowly with more subs for session in sorted(self.sessions, key=lambda s: s.cost, reverse=True):
session.cost_decay_per_sec = ( # Subs have an on-going cost so decay more slowly with more subs
session_class.cost_hard_limit / (10000 + 5 * session.sub_count())) session.cost_decay_per_sec = (
session.recalc_concurrency() session_class.cost_hard_limit / (10000 + 5 * session.sub_count()))
try:
session.recalc_concurrency()
except FinalRPCError:
await group.spawn(session.close())
def _get_info(self): def _get_info(self):
'''A summary of server state.''' '''A summary of server state.'''

Loading…
Cancel
Save