Clean up controller interface with other parts
This commit is contained in:
parent
bd636a75ad
commit
41e734caeb
@ -49,11 +49,10 @@ class Controller(ServerBase):
|
|||||||
'''Start the RPC server and wait for the mempool to synchronize. Then
|
'''Start the RPC server and wait for the mempool to synchronize. Then
|
||||||
start the peer manager and serving external clients.
|
start the peer manager and serving external clients.
|
||||||
'''
|
'''
|
||||||
await self.session_mgr.start_rpc_server()
|
self.session_mgr.start_rpc_server()
|
||||||
await self.chain_state.wait_for_mempool()
|
await self.chain_state.wait_for_mempool()
|
||||||
self.tasks.create_task(self.peer_mgr.main_loop())
|
self.peer_mgr.start_peer_discovery()
|
||||||
self.tasks.create_task(self.session_mgr.start_serving())
|
self.session_mgr.start_serving()
|
||||||
self.tasks.create_task(self.session_mgr.housekeeping())
|
|
||||||
|
|
||||||
async def shutdown(self):
|
async def shutdown(self):
|
||||||
'''Perform the shutdown sequence.'''
|
'''Perform the shutdown sequence.'''
|
||||||
|
|||||||
@ -483,20 +483,21 @@ class PeerManager(object):
|
|||||||
None.'''
|
None.'''
|
||||||
return self.proxy.peername if self.proxy else None
|
return self.proxy.peername if self.proxy else None
|
||||||
|
|
||||||
async def main_loop(self):
|
def start_peer_discovery(self):
|
||||||
|
if self.env.peer_discovery == self.env.PD_ON:
|
||||||
|
self.logger.info(f'beginning peer discovery. Force use of '
|
||||||
|
f'proxy: {self.env.force_proxy}')
|
||||||
|
self.tasks.create_task(self.peer_discovery_loop())
|
||||||
|
else:
|
||||||
|
self.logger.info('peer discovery is disabled')
|
||||||
|
|
||||||
|
async def peer_discovery_loop(self):
|
||||||
'''Main loop performing peer maintenance. This includes
|
'''Main loop performing peer maintenance. This includes
|
||||||
|
|
||||||
1) Forgetting unreachable peers.
|
1) Forgetting unreachable peers.
|
||||||
2) Verifying connectivity of new peers.
|
2) Verifying connectivity of new peers.
|
||||||
3) Retrying old peers at regular intervals.
|
3) Retrying old peers at regular intervals.
|
||||||
'''
|
'''
|
||||||
if self.env.peer_discovery != self.env.PD_ON:
|
|
||||||
self.logger.info('peer discovery is disabled')
|
|
||||||
return
|
|
||||||
|
|
||||||
self.logger.info('beginning peer discovery. Force use of proxy: {}'
|
|
||||||
.format(self.env.force_proxy))
|
|
||||||
|
|
||||||
self.import_peers()
|
self.import_peers()
|
||||||
await self.maybe_detect_proxy()
|
await self.maybe_detect_proxy()
|
||||||
|
|
||||||
|
|||||||
@ -175,6 +175,30 @@ class SessionManager(object):
|
|||||||
if server:
|
if server:
|
||||||
server.close()
|
server.close()
|
||||||
|
|
||||||
|
async def _housekeeping(self):
|
||||||
|
'''Regular housekeeping checks.'''
|
||||||
|
n = 0
|
||||||
|
while True:
|
||||||
|
n += 1
|
||||||
|
await asyncio.sleep(15)
|
||||||
|
if n % 10 == 0:
|
||||||
|
self._clear_stale_sessions()
|
||||||
|
|
||||||
|
# Start listening for incoming connections if paused and
|
||||||
|
# session count has fallen
|
||||||
|
if (self.state == self.PAUSED and
|
||||||
|
len(self.sessions) <= self.low_watermark):
|
||||||
|
await self._start_external_servers()
|
||||||
|
|
||||||
|
# Periodically log sessions
|
||||||
|
if self.env.log_sessions and time.time() > self.next_log_sessions:
|
||||||
|
if self.next_log_sessions:
|
||||||
|
data = self._session_data(for_log=True)
|
||||||
|
for line in text.sessions_lines(data):
|
||||||
|
self.logger.info(line)
|
||||||
|
self.logger.info(json.dumps(self._get_info()))
|
||||||
|
self.next_log_sessions = time.time() + self.env.log_sessions
|
||||||
|
|
||||||
def _group_map(self):
|
def _group_map(self):
|
||||||
group_map = defaultdict(list)
|
group_map = defaultdict(list)
|
||||||
for session in self.sessions:
|
for session in self.sessions:
|
||||||
@ -368,7 +392,13 @@ class SessionManager(object):
|
|||||||
|
|
||||||
# --- External Interface
|
# --- External Interface
|
||||||
|
|
||||||
async def start_serving(self):
|
def start_rpc_server(self):
|
||||||
|
'''Start the RPC server if enabled.'''
|
||||||
|
if self.env.rpc_port is not None:
|
||||||
|
self.tasks.create_task(self._start_server(
|
||||||
|
'RPC', self.env.cs_host(for_rpc=True), self.env.rpc_port))
|
||||||
|
|
||||||
|
def start_serving(self):
|
||||||
'''Start TCP and SSL servers.'''
|
'''Start TCP and SSL servers.'''
|
||||||
self.logger.info('max session count: {:,d}'.format(self.max_sessions))
|
self.logger.info('max session count: {:,d}'.format(self.max_sessions))
|
||||||
self.logger.info('session timeout: {:,d} seconds'
|
self.logger.info('session timeout: {:,d} seconds'
|
||||||
@ -384,12 +414,8 @@ class SessionManager(object):
|
|||||||
if self.env.drop_client is not None:
|
if self.env.drop_client is not None:
|
||||||
self.logger.info('drop clients matching: {}'
|
self.logger.info('drop clients matching: {}'
|
||||||
.format(self.env.drop_client.pattern))
|
.format(self.env.drop_client.pattern))
|
||||||
await self._start_external_servers()
|
self.tasks.create_task(self._start_external_servers())
|
||||||
|
self.tasks.create_task(self._housekeeping())
|
||||||
async def start_rpc_server(self):
|
|
||||||
if self.env.rpc_port is not None:
|
|
||||||
await self._start_server('RPC', self.env.cs_host(for_rpc=True),
|
|
||||||
self.env.rpc_port)
|
|
||||||
|
|
||||||
async def shutdown(self):
|
async def shutdown(self):
|
||||||
'''Close servers and sessions.'''
|
'''Close servers and sessions.'''
|
||||||
@ -417,30 +443,6 @@ class SessionManager(object):
|
|||||||
if session_touched is not None:
|
if session_touched is not None:
|
||||||
self.tasks.create_task(session.notify_async(session_touched))
|
self.tasks.create_task(session.notify_async(session_touched))
|
||||||
|
|
||||||
async def housekeeping(self):
|
|
||||||
'''Regular housekeeping checks.'''
|
|
||||||
n = 0
|
|
||||||
while True:
|
|
||||||
n += 1
|
|
||||||
await asyncio.sleep(15)
|
|
||||||
if n % 10 == 0:
|
|
||||||
self._clear_stale_sessions()
|
|
||||||
|
|
||||||
# Start listening for incoming connections if paused and
|
|
||||||
# session count has fallen
|
|
||||||
if (self.state == self.PAUSED and
|
|
||||||
len(self.sessions) <= self.low_watermark):
|
|
||||||
await self._start_external_servers()
|
|
||||||
|
|
||||||
# Periodically log sessions
|
|
||||||
if self.env.log_sessions and time.time() > self.next_log_sessions:
|
|
||||||
if self.next_log_sessions:
|
|
||||||
data = self._session_data(for_log=True)
|
|
||||||
for line in text.sessions_lines(data):
|
|
||||||
self.logger.info(line)
|
|
||||||
self.logger.info(json.dumps(self._get_info()))
|
|
||||||
self.next_log_sessions = time.time() + self.env.log_sessions
|
|
||||||
|
|
||||||
def add_session(self, session):
|
def add_session(self, session):
|
||||||
self.sessions.add(session)
|
self.sessions.add(session)
|
||||||
if (len(self.sessions) >= self.max_sessions
|
if (len(self.sessions) >= self.max_sessions
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user