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
|
||||
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:
|
||||
if not self.cosigner_can_sign(tx, xpub):
|
||||
continue
|
||||
# construct message
|
||||
some_window = window
|
||||
raw_tx_bytes = tx.serialize_as_bytes()
|
||||
public_key = ecc.ECPubkey(K)
|
||||
message = public_key.encrypt_message(raw_tx_bytes).decode('ascii')
|
||||
# send message
|
||||
task = lambda: server.put(_hash, message)
|
||||
buffer.append((_hash, message))
|
||||
if not buffer:
|
||||
return
|
||||
|
||||
# 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(window, msg, task, on_success, on_failure)
|
||||
WaitingDialog(some_window, msg, send_messages_task, on_success, on_failure)
|
||||
|
||||
def on_receive(self, keyhash, message):
|
||||
self.logger.info(f"signal arrived for {keyhash}")
|
||||
|
|
Loading…
Add table
Reference in a new issue