mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-08-23 17:47:31 +00:00
cosigner pool: use single thread to send messages
ServerProxy does not seem to be thread-safe. For e.g. a 2of3 multisig wallet, which would send two messages, one msg would get sent but the other might error out. See trace: E | plugins.cosigner_pool.qt.Plugin | on_failure Traceback (most recent call last): File "...\electrum\electrum\gui\qt\util.py", line 832, in run result = task.task() File "...\electrum\electrum\plugins\cosigner_pool\qt.py", line 199, in <lambda> task = lambda: server.put(_hash, message) File "...\Python38\lib\xmlrpc\client.py", line 1109, in __call__ return self.__send(self.__name, args) File "...\Python38\lib\xmlrpc\client.py", line 1450, in __request response = self.__transport.request( File "...\Python38\lib\xmlrpc\client.py", line 1153, in request return self.single_request(host, handler, request_body, verbose) File "...\Python38\lib\xmlrpc\client.py", line 1165, in single_request http_conn = self.send_request(host, handler, request_body, verbose) File "...\Python38\lib\xmlrpc\client.py", line 1271, in send_request connection.putrequest("POST", handler, skip_accept_encoding=True) File "...\Python38\lib\http\client.py", line 1088, in putrequest raise CannotSendRequest(self.__state) http.client.CannotSendRequest: Request-sent
This commit is contained in:
parent
1a9e6a434f
commit
7a6ec23b6e
1 changed files with 15 additions and 5 deletions
|
@ -188,17 +188,27 @@ class Plugin(BasePlugin):
|
||||||
except OSError: pass
|
except OSError: pass
|
||||||
window.show_error(_("Failed to send transaction to cosigning pool") + ':\n' + repr(e))
|
window.show_error(_("Failed to send transaction to cosigning pool") + ':\n' + repr(e))
|
||||||
|
|
||||||
|
buffer = []
|
||||||
|
some_window = None
|
||||||
|
# construct messages
|
||||||
for window, xpub, K, _hash in self.cosigner_list:
|
for window, xpub, K, _hash in self.cosigner_list:
|
||||||
if not self.cosigner_can_sign(tx, xpub):
|
if not self.cosigner_can_sign(tx, xpub):
|
||||||
continue
|
continue
|
||||||
# construct message
|
some_window = window
|
||||||
raw_tx_bytes = tx.serialize_as_bytes()
|
raw_tx_bytes = tx.serialize_as_bytes()
|
||||||
public_key = ecc.ECPubkey(K)
|
public_key = ecc.ECPubkey(K)
|
||||||
message = public_key.encrypt_message(raw_tx_bytes).decode('ascii')
|
message = public_key.encrypt_message(raw_tx_bytes).decode('ascii')
|
||||||
# send message
|
buffer.append((_hash, message))
|
||||||
task = lambda: server.put(_hash, message)
|
if not buffer:
|
||||||
msg = _('Sending transaction to cosigning pool...')
|
return
|
||||||
WaitingDialog(window, msg, task, on_success, on_failure)
|
|
||||||
|
# send messages
|
||||||
|
# note: we send all messages sequentially on the same thread
|
||||||
|
def send_messages_task():
|
||||||
|
for _hash, message in buffer:
|
||||||
|
server.put(_hash, message)
|
||||||
|
msg = _('Sending transaction to cosigning pool...')
|
||||||
|
WaitingDialog(some_window, msg, send_messages_task, on_success, on_failure)
|
||||||
|
|
||||||
def on_receive(self, keyhash, message):
|
def on_receive(self, keyhash, message):
|
||||||
self.logger.info(f"signal arrived for {keyhash}")
|
self.logger.info(f"signal arrived for {keyhash}")
|
||||||
|
|
Loading…
Add table
Reference in a new issue