diff --git a/deltachat-jsonrpc/src/api.rs b/deltachat-jsonrpc/src/api.rs index 50aecfd23..2ab1f4fad 100644 --- a/deltachat-jsonrpc/src/api.rs +++ b/deltachat-jsonrpc/src/api.rs @@ -227,8 +227,9 @@ impl CommandApi { /// Get a list of all configured accounts. async fn get_all_accounts(&self) -> Result> { let mut accounts = Vec::new(); - for id in self.accounts.read().await.get_all() { - let context_option = self.accounts.read().await.get_account(id); + let accounts_lock = self.accounts.read().await; + for id in accounts_lock.get_all() { + let context_option = accounts_lock.get_account(id); if let Some(ctx) = context_option { accounts.push(Account::from_context(&ctx, id).await?) } diff --git a/deltachat-rpc-client/tests/test_something.py b/deltachat-rpc-client/tests/test_something.py index db59ac23f..4ba5fc7be 100644 --- a/deltachat-rpc-client/tests/test_something.py +++ b/deltachat-rpc-client/tests/test_something.py @@ -797,3 +797,11 @@ def test_rename_group(acfactory): alice_group.set_name(name) bob.wait_for_incoming_msg_event() assert bob_chat.get_basic_snapshot().name == name + + +def test_get_all_accounts_deadlock(rpc): + """Regression test for get_all_accounts deadlock.""" + for _ in range(100): + all_accounts = rpc.get_all_accounts.future() + rpc.add_account() + all_accounts()