Skip to content

Commit fd54766

Browse files
authored
fix: deadlock when stream was removed (#1424)
1 parent 5c3c59a commit fd54766

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

libs/collab-stream/src/awareness_gossip.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::error::StreamError;
22
use crate::model::AwarenessStreamUpdate;
3+
use dashmap::mapref::entry::Entry;
34
use dashmap::DashMap;
45
use redis::aio::MultiplexedConnection;
56
use redis::{AsyncCommands, Client, RedisError, Value};
@@ -64,21 +65,18 @@ impl AwarenessGossip {
6465
awareness_update: AwarenessStreamUpdate,
6566
) {
6667
// try new per-workspace awareness stream
67-
if let Some(channel) = workspaces.get(&workspace_id) {
68-
let channel = channel.value();
68+
if let Entry::Occupied(e) = workspaces.entry(workspace_id) {
69+
let channel = e.get();
6970
if channel.send((object_id, awareness_update)).is_err() {
70-
workspaces.remove(&workspace_id);
71+
e.remove();
7172
}
7273
} else {
7374
// fallback to per-collab awareness stream
74-
let dropped = if let Some(channel) = collabs.get(&object_id) {
75-
let channel = channel.value();
76-
channel.send(awareness_update).is_err()
77-
} else {
78-
false
79-
};
80-
if dropped {
81-
collabs.remove(&object_id);
75+
if let Entry::Occupied(e) = collabs.entry(object_id) {
76+
let channel = e.get();
77+
if channel.send(awareness_update).is_err() {
78+
collabs.remove(&object_id);
79+
}
8280
}
8381
}
8482
}

0 commit comments

Comments
 (0)