diff --git a/electrumx/server/controller.py b/electrumx/server/controller.py index 867a813..deb013a 100644 --- a/electrumx/server/controller.py +++ b/electrumx/server/controller.py @@ -6,18 +6,15 @@ # and warranty status of this software. import asyncio -import traceback from concurrent.futures import ThreadPoolExecutor -import pylru - -from aiorpcx import RPCError, TaskSet, _version as aiorpcx_version +from aiorpcx import TaskSet, _version as aiorpcx_version import electrumx from electrumx.lib.server_base import ServerBase from electrumx.lib.util import version_string from electrumx.server.mempool import MemPool from electrumx.server.peers import PeerManager -from electrumx.server.session import BAD_REQUEST, SessionManager +from electrumx.server.session import SessionManager class Controller(ServerBase): @@ -45,8 +42,6 @@ class Controller(ServerBase): self.coin = env.coin self.tasks = TaskSet() - self.cache_mn_height = 0 - self.mn_cache = pylru.lrucache(256) env.max_send = max(350000, env.max_send) self.loop = asyncio.get_event_loop() diff --git a/electrumx/server/session.py b/electrumx/server/session.py index 5d37bf0..4fb7cfc 100644 --- a/electrumx/server/session.py +++ b/electrumx/server/session.py @@ -115,6 +115,10 @@ class SessionManager(object): self.history_cache = pylru.lrucache(256) # Cache some idea of room to avoid recounting on each subscription self.subs_room = 0 + # Masternode stuff only for such coins + if issubclass(env.coin.SESSIONCLS, DashElectrumX): + self.mn_cache_height = 0 + self.mn_cache = [] # Event triggered when electrumx is listening for incoming requests. self.server_listening = asyncio.Event() # Set up the RPC request handlers @@ -1297,8 +1301,6 @@ class DashElectrumX(ElectrumX): if not isinstance(payees, list): raise RPCError(BAD_REQUEST, 'expected a list of payees') - result = [] - def get_masternode_payment_queue(mns): '''Returns the calculated position in the payment queue for all the valid masterernodes in the given mns list. @@ -1346,10 +1348,8 @@ class DashElectrumX(ElectrumX): # Accordingly with the masternode payment queue, a custom list # with the masternode information including the payment # position is returned. - if (self.controller.cache_mn_height != self.height() - or not self.controller.mn_cache): - self.controller.cache_mn_height = self.height() - self.controller.mn_cache.clear() + cache = self.session_mgr.mn_cache + if not cache or self.session_mgr.mn_cache_height != self.height(): full_mn_list = await self.daemon.masternode_list(['full']) mn_payment_queue = get_masternode_payment_queue(full_mn_list) mn_payment_count = len(mn_payment_queue) @@ -1374,13 +1374,12 @@ class DashElectrumX(ElectrumX): mn_info['balance'] = (sum(balance.values()) / self.coin.VALUE_PER_COIN) mn_list.append(mn_info) - self.controller.mn_cache = mn_list + cache.clear() + cache.extend(mn_list) + self.session_mgr.mn_cache_height = self.height() # If payees is an empty list the whole masternode list is returned if payees: - result = [mn for mn in self.controller.mn_cache - for address in payees if mn['payee'] == address] + return [mn for mn in cache if mn['payee'] in payees] else: - result = self.controller.mn_cache - - return result + return cache