Skip to content

Commit

Permalink
Fix deadlock in subscriber undeclaration (#1649)
Browse files Browse the repository at this point in the history
* Fix deadlock

* Only update matching listener status for last remote subscriber

* Remove unnecessary drop after changes

* Add unit test for undeclare deadlock
  • Loading branch information
oteffahi authored Dec 10, 2024
1 parent b5ca078 commit fb2d2bc
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 10 deletions.
30 changes: 20 additions & 10 deletions zenoh/src/api/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1574,19 +1574,29 @@ impl SessionInner {
},
}),
});
#[cfg(feature = "unstable")]
{
let state = zread!(self.state);
self.update_matching_status(
&state,
&sub_state.key_expr,
MatchingStatusType::Subscribers,
false,
)
}
}
} else {
drop(state);
}
#[cfg(feature = "unstable")]
{
let state = zread!(self.state);
self.update_matching_status(
&state,
&sub_state.key_expr,
MatchingStatusType::Subscribers,
false,
)
#[cfg(feature = "unstable")]
{
let state = zread!(self.state);
self.update_matching_status(
&state,
&sub_state.key_expr,
MatchingStatusType::Subscribers,
false,
)
}
}
}
SubscriberKind::LivelinessSubscriber => {
Expand Down
12 changes: 12 additions & 0 deletions zenoh/tests/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -430,3 +430,15 @@ async fn zenoh_session_close_in_background() {
};
ztimeout!(close_all);
}

#[cfg(feature = "unstable")]
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn test_undeclare_subscribers_same_keyexpr() {
let key_expr = "test/undeclare/subscribers";
let session = zenoh::open(zenoh::Config::default()).await.unwrap();
let sub1 = session.declare_subscriber(key_expr).await.unwrap();
let sub2 = session.declare_subscriber(key_expr).await.unwrap();
tokio::time::sleep(SLEEP).await;
ztimeout!(sub1.undeclare()).unwrap();
ztimeout!(sub2.undeclare()).unwrap();
}

0 comments on commit fb2d2bc

Please sign in to comment.