Skip to content

Commit 2d35c78

Browse files
committed
Respect IDONTWANT that has already been received when handling IWANT
1 parent 9907a94 commit 2d35c78

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

protocols/gossipsub/src/behaviour.rs

+7
Original file line numberDiff line numberDiff line change
@@ -1344,6 +1344,13 @@ where
13441344
"IWANT: Peer has asked for message too many times; ignoring request"
13451345
);
13461346
} else {
1347+
if let Some(peer) = self.connected_peers.get_mut(peer_id) {
1348+
if peer.dont_send.contains_key(&id) {
1349+
tracing::debug!(%peer_id, message=%id, "Peer already sent IDONTWANT for this message");
1350+
continue;
1351+
}
1352+
}
1353+
13471354
tracing::debug!(peer=%peer_id, "IWANT: Sending cached messages to peer");
13481355
self.send_message(
13491356
*peer_id,

protocols/gossipsub/src/behaviour/tests.rs

+53
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,59 @@ fn test_handle_iwant_msg_not_cached() {
11991199
);
12001200
}
12011201

1202+
#[test]
1203+
fn test_handle_iwant_msg_but_already_sent_idontwant() {
1204+
let (mut gs, peers, receivers, _) = inject_nodes1()
1205+
.peer_no(20)
1206+
.topics(Vec::new())
1207+
.to_subscribe(true)
1208+
.create_network();
1209+
1210+
let raw_message = RawMessage {
1211+
source: Some(peers[11]),
1212+
data: vec![1, 2, 3, 4],
1213+
sequence_number: Some(1u64),
1214+
topic: TopicHash::from_raw("topic"),
1215+
signature: None,
1216+
key: None,
1217+
validated: true,
1218+
};
1219+
1220+
// Transform the inbound message
1221+
let message = &gs
1222+
.data_transform
1223+
.inbound_transform(raw_message.clone())
1224+
.unwrap();
1225+
1226+
let msg_id = gs.config.message_id(message);
1227+
gs.mcache.put(&msg_id, raw_message);
1228+
1229+
// Receive IDONTWANT from Peer 1.
1230+
let rpc = Rpc {
1231+
messages: vec![],
1232+
subscriptions: vec![],
1233+
control_msgs: vec![ControlAction::IDontWant(IDontWant {
1234+
message_ids: vec![msg_id.clone()],
1235+
})],
1236+
};
1237+
gs.on_connection_handler_event(
1238+
peers[1],
1239+
ConnectionId::new_unchecked(0),
1240+
HandlerEvent::Message {
1241+
rpc,
1242+
invalid_messages: vec![],
1243+
},
1244+
);
1245+
1246+
// Receive IWANT from Peer 1.
1247+
gs.handle_iwant(&peers[1], vec![msg_id.clone()]);
1248+
1249+
// Check that no messages are sent.
1250+
receivers.iter().for_each(|(_, receiver)| {
1251+
assert!(receiver.non_priority.get_ref().is_empty());
1252+
});
1253+
}
1254+
12021255
/// tests that an event is created when a peer shares that it has a message we want
12031256
#[test]
12041257
fn test_handle_ihave_subscribed_and_msg_not_cached() {

0 commit comments

Comments
 (0)