Skip to content

Commit

Permalink
Rechannel: ignore already received block messages
Browse files Browse the repository at this point in the history
  • Loading branch information
lucaspoffo committed Sep 3, 2022
1 parent 210c752 commit 6c15cf3
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion rechannel/src/channel/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize};
use crate::{
error::ChannelError,
packet::{ChannelPacketData, Payload},
sequence_buffer::SequenceBuffer,
sequence_buffer::{SequenceBuffer, sequence_less_than},
timer::Timer,
};
use log::{debug, error, info};
Expand Down Expand Up @@ -98,6 +98,7 @@ pub struct ReceiveBlockChannel {
messages_received: VecDeque<Payload>,
slice_size: usize,
max_message_size: u64,
last_chunk_id: Option<u16>,
error: Option<ChannelError>,
}

Expand Down Expand Up @@ -358,6 +359,7 @@ impl ReceiveBlockChannel {
channel_id: config.channel_id,
receiving: Receiving::No,
messages_received: VecDeque::new(),
last_chunk_id: None,
error: None,
}
}
Expand All @@ -369,6 +371,13 @@ impl ReceiveBlockChannel {
return Err(ChannelError::InvalidSliceMessage);
}

if let Some(last_chunk_id) = self.last_chunk_id {
if (message.chunk_id == last_chunk_id) || sequence_less_than(message.chunk_id, last_chunk_id) {
// Ignore already received message
return Ok(None);
}
}

let total_size = message.num_slices as u64 * self.slice_size as u64;
if total_size > self.max_message_size {
error!(
Expand Down Expand Up @@ -465,6 +474,8 @@ impl ReceiveBlockChannel {
if *num_received_slices == *num_slices {
info!("Received all slices for chunk {}.", chunk_id);
let block = mem::take(chunk_data);
let last_chunk_id = *chunk_id;
self.last_chunk_id = Some(last_chunk_id);
self.receiving = Receiving::No;
return Ok(Some(block));
}
Expand Down

0 comments on commit 6c15cf3

Please sign in to comment.