Chunk blobs into window size to avoid window overrun

Fixes #447
This commit is contained in:
Stephen Akridge
2018-06-25 13:29:53 -07:00
committed by Greg Fitzgerald
parent 1919ec247b
commit b48a8c0555

View File

@ -446,22 +446,33 @@ fn broadcast(
while let Ok(mut nq) = r.try_recv() { while let Ok(mut nq) = r.try_recv() {
dq.append(&mut nq); dq.append(&mut nq);
} }
let mut blobs: Vec<_> = dq.into_iter().collect();
// flatten deque to vec
let blobs_vec: Vec<_> = dq.into_iter().collect();
// We could receive more blobs than window slots so
// break them up into window-sized chunks to process
let blobs_chunked: Vec<_> = blobs_vec
.chunks(WINDOW_SIZE)
.map(|x| x.to_vec())
.collect();
print_window(window, *receive_index as usize); print_window(window, *receive_index as usize);
for mut blobs in blobs_chunked {
// Insert the coding blobs into the blob stream // Insert the coding blobs into the blob stream
#[cfg(feature = "erasure")] #[cfg(feature = "erasure")]
erasure::add_coding_blobs(recycler, &mut blobs, *receive_index); erasure::add_coding_blobs(recycler, &mut blobs, *receive_index);
let blobs_len = blobs.len(); let blobs_len = blobs.len();
info!("broadcast blobs.len: {}", blobs_len); debug!("broadcast blobs.len: {}", blobs_len);
// Index the blobs // Index the blobs
Crdt::index_blobs(crdt, &blobs, receive_index)?; Crdt::index_blobs(crdt, &blobs, receive_index)?;
// keep the cache of blobs that are broadcast // keep the cache of blobs that are broadcast
{ {
let mut win = window.write().unwrap(); let mut win = window.write().unwrap();
assert!(blobs.len() <= win.len());
for b in &blobs { for b in &blobs {
let ix = b.read().unwrap().get_index().expect("blob index"); let ix = b.read().unwrap().get_index().expect("blob index");
let pos = (ix as usize) % WINDOW_SIZE; let pos = (ix as usize) % WINDOW_SIZE;
@ -489,20 +500,18 @@ fn broadcast(
// Fill in the coding blob data from the window data blobs // Fill in the coding blob data from the window data blobs
#[cfg(feature = "erasure")] #[cfg(feature = "erasure")]
{ {
if erasure::generate_coding( erasure::generate_coding(
&mut window.write().unwrap(), &mut window.write().unwrap(),
*receive_index as usize, *receive_index as usize,
blobs_len, blobs_len,
).is_err() ).map_err(|_| Error::GenericError)?;
{
return Err(Error::GenericError);
}
} }
*receive_index += blobs_len as u64; *receive_index += blobs_len as u64;
// Send blobs out from the window // Send blobs out from the window
Crdt::broadcast(crdt, &window, &sock, transmit_index, *receive_index)?; Crdt::broadcast(crdt, &window, &sock, transmit_index, *receive_index)?;
}
Ok(()) Ok(())
} }