Skip to content

Commit 2f76972

Browse files
committed
matrix-sdk: prevent dupplicated members requests
1 parent 31dd031 commit 2f76972

File tree

2 files changed

+39
-16
lines changed

2 files changed

+39
-16
lines changed

matrix_sdk/src/client.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,15 @@ use matrix_sdk_common::{
8888
};
8989

9090
#[cfg(feature = "encryption")]
91-
use matrix_sdk_common::{
92-
api::r0::{
93-
keys::{get_keys, upload_keys, upload_signing_keys::Request as UploadSigningKeysRequest},
94-
to_device::send_event_to_device::{
95-
Request as RumaToDeviceRequest, Response as ToDeviceResponse,
96-
},
91+
use matrix_sdk_common::api::r0::{
92+
keys::{get_keys, upload_keys, upload_signing_keys::Request as UploadSigningKeysRequest},
93+
to_device::send_event_to_device::{
94+
Request as RumaToDeviceRequest, Response as ToDeviceResponse,
9795
},
98-
locks::Mutex,
9996
};
10097

98+
use matrix_sdk_common::locks::Mutex;
99+
101100
use crate::{
102101
error::HttpError,
103102
http_client::{client_with_config, HttpClient, HttpSend},
@@ -138,6 +137,7 @@ pub struct Client {
138137
#[cfg(feature = "encryption")]
139138
/// Lock making sure we're only doing one key claim request at a time.
140139
key_claim_lock: Arc<Mutex<()>>,
140+
pub(crate) members_request_locks: DashMap<RoomId, Arc<Mutex<()>>>,
141141
}
142142

143143
#[cfg(not(tarpaulin_include))]
@@ -393,6 +393,7 @@ impl Client {
393393
group_session_locks: DashMap::new(),
394394
#[cfg(feature = "encryption")]
395395
key_claim_lock: Arc::new(Mutex::new(())),
396+
members_request_locks: DashMap::new(),
396397
})
397398
}
398399

matrix_sdk/src/room/common.rs

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ use matrix_sdk_common::api::r0::{
22
membership::{get_member_events, join_room_by_id, leave_room},
33
message::get_message_events,
44
};
5-
use std::ops::Deref;
5+
use matrix_sdk_common::locks::Mutex;
6+
7+
use std::{ops::Deref, sync::Arc};
68

79
use crate::{Client, Result, Room, RoomMember};
810

@@ -96,14 +98,34 @@ impl Common {
9698
}
9799

98100
pub(crate) async fn request_members(&self) -> Result<()> {
99-
// TODO: don't send a request if a request is being sent
100-
let request = get_member_events::Request::new(self.inner.room_id());
101-
let response = self.client.send(request, None).await?;
102-
103-
self.client
104-
.base_client
105-
.receive_members(self.inner.room_id(), &response)
106-
.await?;
101+
#[allow(clippy::map_clone)]
102+
if let Some(mutex) = self
103+
.client
104+
.members_request_locks
105+
.get(self.inner.room_id())
106+
.map(|m| m.clone())
107+
{
108+
mutex.lock().await;
109+
} else {
110+
let mutex = Arc::new(Mutex::new(()));
111+
self.client
112+
.members_request_locks
113+
.insert(self.inner.room_id().clone(), mutex.clone());
114+
115+
let _guard = mutex.lock().await;
116+
117+
let request = get_member_events::Request::new(self.inner.room_id());
118+
let response = self.client.send(request, None).await?;
119+
120+
self.client
121+
.base_client
122+
.receive_members(self.inner.room_id(), &response)
123+
.await?;
124+
125+
self.client
126+
.members_request_locks
127+
.remove(self.inner.room_id());
128+
}
107129

108130
Ok(())
109131
}

0 commit comments

Comments
 (0)