|
@ -20,15 +20,15 @@ from collections import defaultdict |
|
|
from functools import partial |
|
|
from functools import partial |
|
|
|
|
|
|
|
|
from aiorpcx import ( |
|
|
from aiorpcx import ( |
|
|
ServerSession, JSONRPCAutoDetect, TaskGroup, handler_invocation, |
|
|
ServerSession, JSONRPCAutoDetect, JSONRPCConnection, |
|
|
RPCError, Request, ignore_after |
|
|
TaskGroup, handler_invocation, RPCError, Request, ignore_after |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
import electrumx |
|
|
import electrumx |
|
|
import electrumx.lib.text as text |
|
|
import electrumx.lib.text as text |
|
|
import electrumx.lib.util as util |
|
|
import electrumx.lib.util as util |
|
|
from electrumx.lib.hash import (sha256, hash_to_hex_str, hex_str_to_hash, |
|
|
from electrumx.lib.hash import (sha256, hash_to_hex_str, hex_str_to_hash, |
|
|
HASHX_LEN) |
|
|
HASHX_LEN, Base58Error) |
|
|
from electrumx.lib.peer import Peer |
|
|
from electrumx.lib.peer import Peer |
|
|
from electrumx.server.daemon import DaemonError |
|
|
from electrumx.server.daemon import DaemonError |
|
|
from electrumx.server.peers import PeerManager |
|
|
from electrumx.server.peers import PeerManager |
|
@ -259,7 +259,7 @@ class SessionManager(object): |
|
|
# Give the sockets some time to close gracefully |
|
|
# Give the sockets some time to close gracefully |
|
|
async with TaskGroup() as group: |
|
|
async with TaskGroup() as group: |
|
|
for session in stale_sessions: |
|
|
for session in stale_sessions: |
|
|
await group.spawn(session.close(force_after=30)) |
|
|
await group.spawn(session.close()) |
|
|
|
|
|
|
|
|
# Consolidate small groups |
|
|
# Consolidate small groups |
|
|
bw_limit = self.env.bandwidth_limit |
|
|
bw_limit = self.env.bandwidth_limit |
|
@ -391,7 +391,10 @@ class SessionManager(object): |
|
|
|
|
|
|
|
|
async def rpc_query(self, items, limit): |
|
|
async def rpc_query(self, items, limit): |
|
|
'''Return a list of data about server peers.''' |
|
|
'''Return a list of data about server peers.''' |
|
|
return await self.chain_state.query(items, limit) |
|
|
try: |
|
|
|
|
|
return await self.chain_state.query(items, limit) |
|
|
|
|
|
except Base58Error as e: |
|
|
|
|
|
raise RPCError(BAD_REQUEST, e.args[0]) from None |
|
|
|
|
|
|
|
|
async def rpc_sessions(self): |
|
|
async def rpc_sessions(self): |
|
|
'''Return statistics about connected sessions.''' |
|
|
'''Return statistics about connected sessions.''' |
|
@ -434,8 +437,8 @@ class SessionManager(object): |
|
|
await self._start_external_servers() |
|
|
await self._start_external_servers() |
|
|
# Peer discovery should start after the external servers |
|
|
# Peer discovery should start after the external servers |
|
|
# because we connect to ourself |
|
|
# because we connect to ourself |
|
|
async with TaskGroup(wait=object) as group: |
|
|
async with TaskGroup() as group: |
|
|
await group.spawn(self.peer_mgr.discover_peers(group)) |
|
|
await group.spawn(self.peer_mgr.discover_peers()) |
|
|
await group.spawn(self._clear_stale_sessions()) |
|
|
await group.spawn(self._clear_stale_sessions()) |
|
|
await group.spawn(self._log_sessions()) |
|
|
await group.spawn(self._log_sessions()) |
|
|
await group.spawn(self._restart_if_paused()) |
|
|
await group.spawn(self._restart_if_paused()) |
|
@ -445,7 +448,7 @@ class SessionManager(object): |
|
|
await self._close_servers(list(self.servers.keys())) |
|
|
await self._close_servers(list(self.servers.keys())) |
|
|
async with TaskGroup() as group: |
|
|
async with TaskGroup() as group: |
|
|
for session in list(self.sessions): |
|
|
for session in list(self.sessions): |
|
|
await group.spawn(session.close(force_after=0.1)) |
|
|
await group.spawn(session.close(force_after=1)) |
|
|
|
|
|
|
|
|
def session_count(self): |
|
|
def session_count(self): |
|
|
'''The number of connections that we've sent something to.''' |
|
|
'''The number of connections that we've sent something to.''' |
|
@ -516,7 +519,8 @@ class SessionBase(ServerSession): |
|
|
session_counter = itertools.count() |
|
|
session_counter = itertools.count() |
|
|
|
|
|
|
|
|
def __init__(self, session_mgr, chain_state, mempool, peer_mgr, kind): |
|
|
def __init__(self, session_mgr, chain_state, mempool, peer_mgr, kind): |
|
|
super().__init__(protocol=JSONRPCAutoDetect) |
|
|
connection = JSONRPCConnection(JSONRPCAutoDetect) |
|
|
|
|
|
super().__init__(connection=connection) |
|
|
self.logger = util.class_logger(__name__, self.__class__.__name__) |
|
|
self.logger = util.class_logger(__name__, self.__class__.__name__) |
|
|
self.session_mgr = session_mgr |
|
|
self.session_mgr = session_mgr |
|
|
self.chain_state = chain_state |
|
|
self.chain_state = chain_state |
|
@ -620,7 +624,7 @@ class ElectrumX(SessionBase): |
|
|
self.subscribe_headers = False |
|
|
self.subscribe_headers = False |
|
|
self.subscribe_headers_raw = False |
|
|
self.subscribe_headers_raw = False |
|
|
self.notified_height = None |
|
|
self.notified_height = None |
|
|
self.connection._max_response_size = self.env.max_send |
|
|
self.connection.max_response_size = self.env.max_send |
|
|
self.max_subs = self.env.max_session_subs |
|
|
self.max_subs = self.env.max_session_subs |
|
|
self.hashX_subs = {} |
|
|
self.hashX_subs = {} |
|
|
self.sv_seen = False |
|
|
self.sv_seen = False |
|
@ -658,13 +662,6 @@ class ElectrumX(SessionBase): |
|
|
def protocol_version_string(self): |
|
|
def protocol_version_string(self): |
|
|
return util.version_string(self.protocol_tuple) |
|
|
return util.version_string(self.protocol_tuple) |
|
|
|
|
|
|
|
|
# FIXME: make this the aiorpcx API for version 0.7 |
|
|
|
|
|
async def close(self, force_after=30): |
|
|
|
|
|
'''Close the connection and return when closed.''' |
|
|
|
|
|
async with ignore_after(force_after): |
|
|
|
|
|
await super().close() |
|
|
|
|
|
self.abort() |
|
|
|
|
|
|
|
|
|
|
|
async def daemon_request(self, method, *args): |
|
|
async def daemon_request(self, method, *args): |
|
|
'''Catch a DaemonError and convert it to an RPCError.''' |
|
|
'''Catch a DaemonError and convert it to an RPCError.''' |
|
|
try: |
|
|
try: |
|
|