Fix extra race

Conrad Irwin created

Change summary

crates/call/src/call.rs                      | 18 ++++++++++++++++++
crates/collab/src/tests/integration_tests.rs | 14 ++------------
2 files changed, 20 insertions(+), 12 deletions(-)

Detailed changes

crates/call/src/call.rs 🔗

@@ -60,6 +60,12 @@ impl OneAtATime {
             }
         })
     }
+
+    fn running(&self) -> bool {
+        self.cancel
+            .as_ref()
+            .is_some_and(|cancel| !cancel.is_canceled())
+    }
 }
 
 /// Singleton global maintaining the user's participation in a room across workspaces.
@@ -170,6 +176,10 @@ impl ActiveCall {
         }
         cx.notify();
 
+        if self._join_debouncer.running() {
+            return Task::ready(Ok(()));
+        }
+
         let room = if let Some(room) = self.room().cloned() {
             Some(Task::ready(Ok(room)).shared())
         } else {
@@ -286,6 +296,10 @@ impl ActiveCall {
             return Task::ready(Err(anyhow!("no incoming call")));
         };
 
+        if self.pending_room_creation.is_some() {
+            return Task::ready(Ok(()));
+        }
+
         let room_id = call.room_id.clone();
         let client = self.client.clone();
         let user_store = self.user_store.clone();
@@ -331,6 +345,10 @@ impl ActiveCall {
             }
         }
 
+        if self.pending_room_creation.is_some() {
+            return Task::ready(Ok(None));
+        }
+
         let client = self.client.clone();
         let user_store = self.user_store.clone();
         let join = self._join_debouncer.spawn(cx, move |cx| async move {

crates/collab/src/tests/integration_tests.rs 🔗

@@ -540,7 +540,7 @@ async fn test_joining_channels_and_calling_multiple_users_simultaneously(
 
     b_invite.await.unwrap();
     c_invite.await.unwrap();
-    assert!(join_channel.await.is_err());
+    join_channel.await.unwrap();
 
     let room_a = active_call_a.read_with(cx_a, |call, _| call.room().unwrap().clone());
     deterministic.run_until_parked();
@@ -578,18 +578,8 @@ async fn test_joining_channels_and_calling_multiple_users_simultaneously(
     b_invite.await.unwrap();
     c_invite.await.unwrap();
 
-    let room_a = active_call_a.read_with(cx_a, |call, _| call.room().unwrap().clone());
+    active_call_a.read_with(cx_a, |call, _| call.room().unwrap().clone());
     deterministic.run_until_parked();
-
-    assert_eq!(
-        room_participants(&room_a, cx_a),
-        RoomParticipants {
-            remote: Default::default(),
-            pending: vec!["user_b".to_string(), "user_c".to_string()]
-        }
-    );
-
-    assert_eq!(channel_id(&room_a, cx_a), Some(channel_1));
 }
 
 #[gpui::test(iterations = 10)]