Don't maintain a sub_count in controller
Just do a tally occasionally. It's too tricky to keep it accurate as it double-counts resubscribing to the same address, for example
This commit is contained in:
parent
112e0a12a9
commit
766da5ed79
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2016, Neil Booth
|
# Copyright (c) 2016-2017, Neil Booth
|
||||||
#
|
#
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2016, Neil Booth
|
# Copyright (c) 2016-2017, Neil Booth
|
||||||
#
|
#
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2016, Neil Booth
|
# Copyright (c) 2016-2017, Neil Booth
|
||||||
#
|
#
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2016, Neil Booth
|
# Copyright (c) 2016-2017, Neil Booth
|
||||||
#
|
#
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
|
|||||||
@ -73,7 +73,8 @@ class Controller(util.LoggedClass):
|
|||||||
self.max_sessions = env.max_sessions
|
self.max_sessions = env.max_sessions
|
||||||
self.low_watermark = self.max_sessions * 19 // 20
|
self.low_watermark = self.max_sessions * 19 // 20
|
||||||
self.max_subs = env.max_subs
|
self.max_subs = env.max_subs
|
||||||
self.subscription_count = 0
|
# Cache some idea of room to avoid recounting on each subscription
|
||||||
|
self.subs_room = 0
|
||||||
self.next_stale_check = 0
|
self.next_stale_check = 0
|
||||||
self.history_cache = pylru.lrucache(256)
|
self.history_cache = pylru.lrucache(256)
|
||||||
self.header_cache = pylru.lrucache(8)
|
self.header_cache = pylru.lrucache(8)
|
||||||
@ -374,7 +375,6 @@ class Controller(util.LoggedClass):
|
|||||||
gid = self.sessions.pop(session)
|
gid = self.sessions.pop(session)
|
||||||
assert gid in self.groups
|
assert gid in self.groups
|
||||||
self.groups[gid].remove(session)
|
self.groups[gid].remove(session)
|
||||||
self.subscription_count -= session.sub_count()
|
|
||||||
|
|
||||||
def close_session(self, session):
|
def close_session(self, session):
|
||||||
'''Close the session's transport and cancel its future.'''
|
'''Close the session's transport and cancel its future.'''
|
||||||
@ -436,10 +436,13 @@ class Controller(util.LoggedClass):
|
|||||||
'peers': len(self.irc.peers),
|
'peers': len(self.irc.peers),
|
||||||
'requests': sum(s.requests_remaining() for s in self.sessions),
|
'requests': sum(s.requests_remaining() for s in self.sessions),
|
||||||
'sessions': self.session_count(),
|
'sessions': self.session_count(),
|
||||||
'subs': self.subscription_count,
|
'subs': self.sub_count(),
|
||||||
'txs_sent': self.txs_sent,
|
'txs_sent': self.txs_sent,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def sub_count(self):
|
||||||
|
return sum(s.sub_count() for s in self.sessions)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def text_lines(method, data):
|
def text_lines(method, data):
|
||||||
if method == 'sessions':
|
if method == 'sessions':
|
||||||
@ -642,10 +645,12 @@ class Controller(util.LoggedClass):
|
|||||||
raise RPCError('daemon error: {}'.format(e))
|
raise RPCError('daemon error: {}'.format(e))
|
||||||
|
|
||||||
async def new_subscription(self, address):
|
async def new_subscription(self, address):
|
||||||
if self.subscription_count >= self.max_subs:
|
if self.subs_room <= 0:
|
||||||
raise RPCError('server subscription limit {:,d} reached'
|
self.subs_room = self.max_subs - self.sub_count()
|
||||||
.format(self.max_subs))
|
if self.subs_room <= 0:
|
||||||
self.subscription_count += 1
|
raise RPCError('server subscription limit {:,d} reached'
|
||||||
|
.format(self.max_subs))
|
||||||
|
self.subs_room -= 1
|
||||||
hashX = self.address_to_hashX(address)
|
hashX = self.address_to_hashX(address)
|
||||||
status = await self.address_status(hashX)
|
status = await self.address_status(hashX)
|
||||||
return hashX, status
|
return hashX, status
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user