Try removing delay between acks

This commit is contained in:
Kenneth Allen 2024-01-28 18:29:54 +11:00
parent 28d55aa64a
commit f0c76b9af2
2 changed files with 18 additions and 23 deletions

View File

@ -32,29 +32,26 @@ impl AckBatcher {
} }
pub async fn run(mut self) -> lapin::Result<()> { pub async fn run(mut self) -> lapin::Result<()> {
let mut not_before = Instant::now();
let mut buffer = Vec::with_capacity(ACK_BUFFER_LEN); let mut buffer = Vec::with_capacity(ACK_BUFFER_LEN);
let mut ack_sizes = vec![];
let mut time_good = true;
loop { loop {
let mut data_good = false; let mut data_good = false;
while !(time_good && data_good) { while !data_good {
select! { let num_received = self.recv.recv_many(&mut buffer, ACK_BUFFER_LEN).await;
num_received = self.recv.recv_many(&mut buffer, ACK_BUFFER_LEN) => { if num_received == 0 {
if num_received == 0 { println!("ack done"); return Ok(()); } println!("ack done {} {} {}", ack_sizes.iter().sum::<u64>(), ack_sizes.len(), (ack_sizes.iter().sum::<u64>() as f64) / (ack_sizes.len() as f64));
return Ok(());
}
for (tag, result) in buffer.drain(..) { for (tag, result) in buffer.drain(..) {
//println!("rm.insert({}..{}+1, {:?}); rm.check_invariants();", tag, tag, &result); //println!("rm.insert({}..{}+1, {:?}); rm.check_invariants();", tag, tag, &result);
self.enqueue(tag, result); self.enqueue(tag, result);
data_good = data_good || tag == self.acked + 1; data_good = data_good || tag == self.acked + 1;
} }
} }
_ = sleep_until(not_before), if !time_good => time_good = true
}
}
//println!("ack status {:?}", self.pending); //println!("ack status {:?}", self.pending);
let mut ack_count = 0; let mut ack_count = 0;
let mut max_ack_size = 0;
loop { loop {
ack_count += 1; ack_count += 1;
let (ack_range, res) = self.pending.peek_first().unwrap(); let (ack_range, res) = self.pending.peek_first().unwrap();
@ -69,13 +66,11 @@ impl AckBatcher {
Err(requeue) => self.chan.basic_nack(ack_to, BasicNackOptions { multiple: true, requeue }).await, Err(requeue) => self.chan.basic_nack(ack_to, BasicNackOptions { multiple: true, requeue }).await,
}?; }?;
max_ack_size = max_ack_size.max(ack_to - self.acked); ack_sizes.push(ack_to - self.acked);
self.acked = ack_to; self.acked = ack_to;
if !self.ready() { break; } if !self.ready() { break; }
} }
println!("ack sleep {} {}", ack_count, max_ack_size); println!("ack sleep {}", ack_count);
not_before = Instant::now() + self.max_wait;
time_good = false;
} }
} }
} }

View File

@ -43,18 +43,18 @@ async fn main() -> Result<()> {
}).await?; }).await?;
tokio::try_join!( tokio::try_join!(
async { tokio::spawn(async {
let mut proc = Processor::new(broker_connect().await?, 10_000).await?; let mut proc = Processor::new(broker_connect().await?, 65_535).await?;
for i in 0..QUEUE_COUNT { for i in 0..QUEUE_COUNT {
proc.listen(&format!("hello-{}", i), &format!("processor-{}", i), move |data| process(data, i)).await?; proc.listen(&format!("hello-{}", i), &format!("processor-{}", i), move |data| process(data, i)).await?;
} }
quit_signal.await.unwrap(); quit_signal.await.unwrap();
proc.shutdown().await proc.shutdown().await
}, }),
async { tokio::spawn(async {
let chan = conn.create_channel().await?; let chan = conn.create_channel().await?;
sender(conn, chan).await sender(conn, chan).await
}, }),
)?; )?;
Ok(()) Ok(())