Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 1a3cf0b

Browse files
montekkigavofyork
authored andcommitted
Fixes a flaky test (#675)
* Fixes a flaky test * Renames a var * Do not unit the errors in tests
1 parent 7871740 commit 1a3cf0b

File tree

1 file changed

+32
-6
lines changed

1 file changed

+32
-6
lines changed

availability-store/src/worker.rs

+32-6
Original file line numberDiff line numberDiff line change
@@ -794,21 +794,33 @@ mod tests {
794794
use super::*;
795795
use std::time::Duration;
796796
use futures::{stream, channel::mpsc, Stream};
797-
use std::sync::{Arc, Mutex};
797+
use std::sync::{Arc, Mutex, Condvar};
798798
use std::pin::Pin;
799799
use tokio::runtime::Runtime;
800800

801801
// Just contains topic->channel mapping to give to outer code on `gossip_messages_for` calls.
802802
struct TestGossipMessages {
803-
messages: Arc<Mutex<HashMap<Hash, mpsc::UnboundedReceiver<(Hash, Hash, ErasureChunk)>>>>,
803+
messages: Arc<Mutex<HashMap<
804+
Hash,
805+
(
806+
Arc<(Mutex<bool>, Condvar)>,
807+
mpsc::UnboundedReceiver<(Hash, Hash, ErasureChunk)>,
808+
),
809+
>>>,
804810
}
805811

806812
impl ProvideGossipMessages for TestGossipMessages {
807813
fn gossip_messages_for(&self, topic: Hash)
808814
-> Pin<Box<dyn Stream<Item = (Hash, Hash, ErasureChunk)> + Send>>
809815
{
810816
match self.messages.lock().unwrap().remove(&topic) {
811-
Some(receiver) => receiver.boxed(),
817+
Some((pair, receiver)) => {
818+
let (lock, cvar) = &*pair;
819+
let mut consumed = lock.lock().unwrap();
820+
*consumed = true;
821+
cvar.notify_one();
822+
receiver.boxed()
823+
},
812824
None => stream::iter(vec![]).boxed(),
813825
}
814826
}
@@ -851,9 +863,10 @@ mod tests {
851863

852864
let topic = erasure_coding_topic(relay_parent, erasure_root, local_id);
853865

866+
let pair = Arc::new((Mutex::new(false), Condvar::new()));
854867
let messages = TestGossipMessages {
855868
messages: Arc::new(Mutex::new(vec![
856-
(topic, gossip_receiver)
869+
(topic, (pair.clone(), gossip_receiver))
857870
].into_iter().collect()))
858871
};
859872

@@ -961,11 +974,14 @@ mod tests {
961974
let topic_1 = erasure_coding_topic(relay_parent, erasure_root_1, local_id);
962975
let topic_2 = erasure_coding_topic(relay_parent, erasure_root_2, local_id);
963976

977+
let cvar_pair1 = Arc::new((Mutex::new(false), Condvar::new()));
978+
let cvar_pair2 = Arc::new((Mutex::new(false), Condvar::new()));
979+
964980
let messages = TestGossipMessages {
965981
messages: Arc::new(Mutex::new(
966982
vec![
967-
(topic_1, gossip_receiver_1),
968-
(topic_2, gossip_receiver_2),
983+
(topic_1, (cvar_pair1.clone(), gossip_receiver_1)),
984+
(topic_2, (cvar_pair2, gossip_receiver_2)),
969985
].into_iter().collect()))
970986
};
971987

@@ -1000,6 +1016,16 @@ mod tests {
10001016
handle.sender.unbounded_send(listen_msg_1).unwrap();
10011017
runtime.block_on(r1).unwrap().unwrap();
10021018

1019+
// Here, we are racing against the worker thread that might have not yet
1020+
// reached the point when it requests the gossip messages for `topic_2`
1021+
// which will get them removed from `TestGossipMessages`. Therefore, the
1022+
// `Condvar` is used to wait for that event.
1023+
let (lock, cvar1) = &*cvar_pair1;
1024+
let mut gossip_stream_consumed = lock.lock().unwrap();
1025+
while !*gossip_stream_consumed {
1026+
gossip_stream_consumed = cvar1.wait(gossip_stream_consumed).unwrap();
1027+
}
1028+
10031029
// The gossip sender taken => listener registered.
10041030
assert!(!messages.messages.lock().unwrap().contains_key(&topic_1));
10051031
}

0 commit comments

Comments
 (0)