Add settings for Monero rpc timeouts.

2024-05-20_merge
tecnovert 11 months ago
parent f9bc5d46af
commit 1bfb271b87
  1. 13
      basicswap/basicswap.py
  2. 24
      basicswap/interface/xmr.py
  3. 10
      basicswap/rpc_xmr.py
  4. 8
      bin/basicswap_prepare.py

@ -278,6 +278,8 @@ class BasicSwap(BaseApp):
self.min_sequence_lock_seconds = self.settings.get('min_sequence_lock_seconds', 60 if self.debug else (1 * 60 * 60)) self.min_sequence_lock_seconds = self.settings.get('min_sequence_lock_seconds', 60 if self.debug else (1 * 60 * 60))
self.max_sequence_lock_seconds = self.settings.get('max_sequence_lock_seconds', 96 * 60 * 60) self.max_sequence_lock_seconds = self.settings.get('max_sequence_lock_seconds', 96 * 60 * 60)
self._wallet_update_timeout = self.settings.get('wallet_update_timeout', 10)
self._restrict_unknown_seed_wallets = self.settings.get('restrict_unknown_seed_wallets', True) self._restrict_unknown_seed_wallets = self.settings.get('restrict_unknown_seed_wallets', True)
self._bid_expired_leeway = 5 self._bid_expired_leeway = 5
@ -492,6 +494,10 @@ class BasicSwap(BaseApp):
if self.coin_clients[coin]['connection_type'] == 'rpc': if self.coin_clients[coin]['connection_type'] == 'rpc':
if coin == Coins.XMR: if coin == Coins.XMR:
self.coin_clients[coin]['rpctimeout'] = chain_client_settings.get('rpctimeout', 60)
self.coin_clients[coin]['walletrpctimeout'] = chain_client_settings.get('walletrpctimeout', 120)
self.coin_clients[coin]['walletrpctimeoutlong'] = chain_client_settings.get('walletrpctimeoutlong', 600)
if chain_client_settings.get('automatically_select_daemon', False): if chain_client_settings.get('automatically_select_daemon', False):
self.selectXMRRemoteDaemon(coin) self.selectXMRRemoteDaemon(coin)
@ -513,6 +519,7 @@ class BasicSwap(BaseApp):
coin_settings = self.coin_clients[coin] coin_settings = self.coin_clients[coin]
rpchost: str = coin_settings['rpchost'] rpchost: str = coin_settings['rpchost']
rpcport: int = coin_settings['rpcport'] rpcport: int = coin_settings['rpcport']
timeout: int = coin_settings['rpctimeout']
proxy_host: str = self.tor_proxy_host if self.use_tor_proxy else None proxy_host: str = self.tor_proxy_host if self.use_tor_proxy else None
proxy_port: int = self.tor_proxy_port if self.use_tor_proxy else None proxy_port: int = self.tor_proxy_port if self.use_tor_proxy else None
@ -527,7 +534,7 @@ class BasicSwap(BaseApp):
self.log.info(f'Trying last used url {rpchost}:{rpcport}.') self.log.info(f'Trying last used url {rpchost}:{rpcport}.')
try: try:
rpc2 = make_xmr_rpc2_func(rpcport, daemon_login, rpchost, proxy_host=proxy_host, proxy_port=proxy_port) rpc2 = make_xmr_rpc2_func(rpcport, daemon_login, rpchost, proxy_host=proxy_host, proxy_port=proxy_port)
test = rpc2('get_height', timeout=20)['height'] test = rpc2('get_height', timeout=timeout)['height']
return True return True
except Exception as e: except Exception as e:
self.log.warning(f'Failed to set XMR remote daemon to {rpchost}:{rpcport}, {e}') self.log.warning(f'Failed to set XMR remote daemon to {rpchost}:{rpcport}, {e}')
@ -537,7 +544,7 @@ class BasicSwap(BaseApp):
try: try:
rpchost, rpcport = url.rsplit(':', 1) rpchost, rpcport = url.rsplit(':', 1)
rpc2 = make_xmr_rpc2_func(rpcport, daemon_login, rpchost, proxy_host=proxy_host, proxy_port=proxy_port) rpc2 = make_xmr_rpc2_func(rpcport, daemon_login, rpchost, proxy_host=proxy_host, proxy_port=proxy_port)
test = rpc2('get_height', timeout=20)['height'] test = rpc2('get_height', timeout=timeout)['height']
coin_settings['rpchost'] = rpchost coin_settings['rpchost'] = rpchost
coin_settings['rpcport'] = rpcport coin_settings['rpcport'] = rpcport
data = { data = {
@ -6622,7 +6629,7 @@ class BasicSwap(BaseApp):
handle = self.thread_pool.submit(self.updateWalletInfo, c) handle = self.thread_pool.submit(self.updateWalletInfo, c)
if wait_for_complete: if wait_for_complete:
try: try:
handle.result(timeout=10) handle.result(timeout=self._wallet_update_timeout)
except Exception as e: except Exception as e:
self.log.error(f'updateWalletInfo {e}') self.log.error(f'updateWalletInfo {e}')

@ -110,9 +110,13 @@ class XMRInterface(CoinInterface):
elif manage_daemon is False: elif manage_daemon is False:
self._log.info(f'Connecting to remote {self.coin_name()} daemon at {rpchost}.') self._log.info(f'Connecting to remote {self.coin_name()} daemon at {rpchost}.')
self.rpc = make_xmr_rpc_func(coin_settings['rpcport'], daemon_login, host=rpchost, proxy_host=proxy_host, proxy_port=proxy_port) self._rpctimeout = coin_settings.get('rpctimeout', 60)
self.rpc2 = make_xmr_rpc2_func(coin_settings['rpcport'], daemon_login, host=rpchost, proxy_host=proxy_host, proxy_port=proxy_port) # non-json endpoint self._walletrpctimeout = coin_settings.get('walletrpctimeout', 120)
self.rpc_wallet = make_xmr_rpc_func(coin_settings['walletrpcport'], coin_settings['walletrpcauth'], host=coin_settings.get('walletrpchost', '127.0.0.1')) self._walletrpctimeoutlong = coin_settings.get('walletrpctimeoutlong', 600)
self.rpc = make_xmr_rpc_func(coin_settings['rpcport'], daemon_login, host=rpchost, proxy_host=proxy_host, proxy_port=proxy_port, default_timeout=self._rpctimeout)
self.rpc2 = make_xmr_rpc2_func(coin_settings['rpcport'], daemon_login, host=rpchost, proxy_host=proxy_host, proxy_port=proxy_port, default_timeout=self._rpctimeout) # non-json endpoint
self.rpc_wallet = make_xmr_rpc_func(coin_settings['walletrpcport'], coin_settings['walletrpcauth'], host=coin_settings.get('walletrpchost', '127.0.0.1'), default_timeout=self._walletrpctimeout)
def checkWallets(self) -> int: def checkWallets(self) -> int:
return 1 return 1
@ -176,7 +180,7 @@ class XMRInterface(CoinInterface):
return self.rpc_wallet('get_version')['version'] return self.rpc_wallet('get_version')['version']
def getBlockchainInfo(self): def getBlockchainInfo(self):
get_height = self.rpc2('get_height', timeout=30) get_height = self.rpc2('get_height', timeout=self._rpctimeout)
rv = { rv = {
'blocks': get_height['height'], 'blocks': get_height['height'],
'verificationprogress': 0.0, 'verificationprogress': 0.0,
@ -187,7 +191,7 @@ class XMRInterface(CoinInterface):
# get_block_count returns "Internal error" if bootstrap-daemon is active # get_block_count returns "Internal error" if bootstrap-daemon is active
if get_height['untrusted'] is True: if get_height['untrusted'] is True:
rv['bootstrapping'] = True rv['bootstrapping'] = True
get_info = self.rpc2('get_info', timeout=30) get_info = self.rpc2('get_info', timeout=self._rpctimeout)
if 'height_without_bootstrap' in get_info: if 'height_without_bootstrap' in get_info:
rv['blocks'] = get_info['height_without_bootstrap'] rv['blocks'] = get_info['height_without_bootstrap']
@ -195,7 +199,7 @@ class XMRInterface(CoinInterface):
if rv['known_block_count'] > rv['blocks']: if rv['known_block_count'] > rv['blocks']:
rv['verificationprogress'] = rv['blocks'] / rv['known_block_count'] rv['verificationprogress'] = rv['blocks'] / rv['known_block_count']
else: else:
rv['known_block_count'] = self.rpc('get_block_count', timeout=30)['count'] rv['known_block_count'] = self.rpc('get_block_count', timeout=self._rpctimeout)['count']
rv['verificationprogress'] = rv['blocks'] / rv['known_block_count'] rv['verificationprogress'] = rv['blocks'] / rv['known_block_count']
except Exception as e: except Exception as e:
self._log.warning('XMR get_block_count failed with: %s', str(e)) self._log.warning('XMR get_block_count failed with: %s', str(e))
@ -204,7 +208,7 @@ class XMRInterface(CoinInterface):
return rv return rv
def getChainHeight(self): def getChainHeight(self):
return self.rpc2('get_height', timeout=30)['height'] return self.rpc2('get_height', timeout=self._rpctimeout)['height']
def getWalletInfo(self): def getWalletInfo(self):
with self._mx_wallet: with self._mx_wallet:
@ -347,7 +351,7 @@ class XMRInterface(CoinInterface):
self.createWallet(params) self.createWallet(params)
self.openWallet(address_b58) self.openWallet(address_b58)
self.rpc_wallet('refresh', timeout=600) self.rpc_wallet('refresh', timeout=self._walletrpctimeoutlong)
''' '''
# Debug # Debug
@ -382,10 +386,10 @@ class XMRInterface(CoinInterface):
def findTxnByHash(self, txid): def findTxnByHash(self, txid):
with self._mx_wallet: with self._mx_wallet:
self.openWallet(self._wallet_filename) self.openWallet(self._wallet_filename)
self.rpc_wallet('refresh', timeout=600) self.rpc_wallet('refresh', timeout=self._walletrpctimeoutlong)
try: try:
current_height = self.rpc2('get_height', timeout=30)['height'] current_height = self.rpc2('get_height', timeout=self._rpctimeout)['height']
self._log.info('findTxnByHash XMR current_height %d\nhash: %s', current_height, txid) self._log.info('findTxnByHash XMR current_height %d\nhash: %s', current_height, txid)
except Exception as e: except Exception as e:
self._log.info('rpc failed %s', str(e)) self._log.info('rpc failed %s', str(e))

@ -222,33 +222,35 @@ def callrpc_xmr2(rpc_port: int, method: str, params=None, auth=None, rpc_host='1
return r return r
def make_xmr_rpc2_func(port, auth, host='127.0.0.1', proxy_host=None, proxy_port=None): def make_xmr_rpc2_func(port, auth, host='127.0.0.1', proxy_host=None, proxy_port=None, default_timeout=120):
port = port port = port
auth = auth auth = auth
host = host host = host
transport = None transport = None
default_timeout = default_timeout
if proxy_host: if proxy_host:
transport = SocksTransport() transport = SocksTransport()
transport.set_proxy(proxy_host, proxy_port) transport.set_proxy(proxy_host, proxy_port)
def rpc_func(method, params=None, wallet=None, timeout=120): def rpc_func(method, params=None, wallet=None, timeout=default_timeout):
nonlocal port, auth, host, transport nonlocal port, auth, host, transport
return callrpc_xmr2(port, method, params, auth=auth, rpc_host=host, timeout=timeout, transport=transport) return callrpc_xmr2(port, method, params, auth=auth, rpc_host=host, timeout=timeout, transport=transport)
return rpc_func return rpc_func
def make_xmr_rpc_func(port, auth, host='127.0.0.1', proxy_host=None, proxy_port=None): def make_xmr_rpc_func(port, auth, host='127.0.0.1', proxy_host=None, proxy_port=None, default_timeout=120):
port = port port = port
auth = auth auth = auth
host = host host = host
transport = None transport = None
default_timeout = default_timeout
if proxy_host: if proxy_host:
transport = SocksTransport() transport = SocksTransport()
transport.set_proxy(proxy_host, proxy_port) transport.set_proxy(proxy_host, proxy_port)
def rpc_func(method, params=None, wallet=None, timeout=120): def rpc_func(method, params=None, wallet=None, timeout=default_timeout):
nonlocal port, auth, host, transport nonlocal port, auth, host, transport
return callrpc_xmr(port, method, params, rpc_host=host, auth=auth, timeout=timeout, transport=transport) return callrpc_xmr(port, method, params, rpc_host=host, auth=auth, timeout=timeout, transport=transport)
return rpc_func return rpc_func

@ -1456,7 +1456,7 @@ def main():
logger.warning('Not automatically setting --usetorproxy as --notorproxy is set') logger.warning('Not automatically setting --usetorproxy as --notorproxy is set')
else: else:
use_tor_proxy = True use_tor_proxy = True
logger.info(f'Automatically setting --usetorproxy') logger.info('Automatically setting --usetorproxy')
setConnectionParameters(allow_set_tor=False) setConnectionParameters(allow_set_tor=False)
@ -1572,6 +1572,9 @@ def main():
'bindir': os.path.join(bin_dir, 'monero'), 'bindir': os.path.join(bin_dir, 'monero'),
'restore_height': xmr_restore_height, 'restore_height': xmr_restore_height,
'blocks_confirmed': 3, 'blocks_confirmed': 3,
'rpctimeout': 60,
'walletrpctimeout': 120,
'walletrpctimeoutlong': 600,
}, },
'pivx': { 'pivx': {
'connection_type': 'rpc' if 'pivx' in with_coins else 'none', 'connection_type': 'rpc' if 'pivx' in with_coins else 'none',
@ -1800,7 +1803,8 @@ def main():
'max_delay_event': 50, # Max delay in seconds before reacting to an event 'max_delay_event': 50, # Max delay in seconds before reacting to an event
'check_progress_seconds': 60, 'check_progress_seconds': 60,
'check_watched_seconds': 60, 'check_watched_seconds': 60,
'check_expired_seconds': 60 'check_expired_seconds': 60,
'wallet_update_timeout': 10, # Seconds to wait for wallet page update
} }
if wshost != 'none': if wshost != 'none':

Loading…
Cancel
Save