Skip to content

Commit c34e076

Browse files
author
duanxy23
committed
fix(queue): replace Instant::now() with logical timestamp in dequeue path
1 parent e4e047d commit c34e076

2 files changed

Lines changed: 11 additions & 11 deletions

File tree

rattan-core/src/cells/bandwidth/queue/pie.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,7 @@ where
192192
rand_val < self.p
193193
}
194194

195-
fn update_avg_drate(&mut self, pkt_size: usize) {
196-
let now = Instant::now();
195+
fn update_avg_drate(&mut self, pkt_size: usize, now: Instant) {
197196
let dq_threshold = 16384; // 16 KiB
198197

199198
// Enter a measurement cycle
@@ -294,11 +293,11 @@ where
294293
self.queue.push_back(packet);
295294
}
296295

297-
fn dequeue(&mut self) -> Option<P> {
296+
fn dequeue_at(&mut self, timestamp: Instant) -> Option<P> {
298297
if let Some(packet) = self.queue.pop_front() {
299298
let pkt_size = packet.l3_length() + self.get_extra_length();
300299
self.now_bytes -= pkt_size;
301-
self.update_avg_drate(pkt_size);
300+
self.update_avg_drate(pkt_size, timestamp);
302301
Some(packet)
303302
} else {
304303
None
@@ -353,7 +352,7 @@ mod tests {
353352
assert!(!queue.is_empty());
354353
assert_eq!(queue.length(), 1);
355354

356-
let dequeued = queue.dequeue();
355+
let dequeued = queue.dequeue_at(Instant::now());
357356
assert!(dequeued.is_some());
358357
assert!(queue.is_empty());
359358
}
@@ -456,19 +455,20 @@ mod tests {
456455

457456
// First dequeue triggers start of measurement cycle
458457
assert!(queue.start_measurement.is_none());
459-
queue.dequeue(); // dequeues 10000 bytes
458+
let deq_time1 = Instant::now();
459+
queue.dequeue_at(deq_time1); // dequeues 10000 bytes
460460
assert!(queue.start_measurement.is_some());
461461
assert_eq!(queue.now_bytes, 20000);
462462

463463
// Simulate time advancing for the next measurement
464464
let mut pkt2 = create_packet(10014);
465-
pkt2.delay_until(queue.start_measurement.unwrap() + Duration::from_millis(10));
465+
pkt2.delay_until(deq_time1 + Duration::from_millis(10));
466466

467467
// Enqueue the packet with advanced timestamp to update queue state
468468
queue.enqueue(pkt2);
469469

470470
// Second dequeue triggers calculation of avg_drate
471-
queue.dequeue(); // dequeues 10000 bytes
471+
queue.dequeue_at(deq_time1 + Duration::from_millis(10)); // dequeues 10000 bytes
472472
assert!(queue.avg_drate > 0.0, "avg_drate should be calculated");
473473
assert!(
474474
queue.start_measurement.is_none(),

rattan-core/src/cells/bandwidth/queue/red.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,11 @@ where
301301
self.idle_start = None;
302302
}
303303

304-
fn dequeue(&mut self) -> Option<P> {
304+
fn dequeue_at(&mut self, timestamp: Instant) -> Option<P> {
305305
if let Some(packet) = self.queue.pop_front() {
306306
self.now_bytes -= packet.l3_length() + self.get_extra_length();
307307
if self.is_empty() {
308-
self.idle_start = Some(Instant::now());
308+
self.idle_start = Some(timestamp);
309309
}
310310
Some(packet)
311311
} else {
@@ -366,7 +366,7 @@ mod tests {
366366
assert!(!queue.is_empty());
367367
assert_eq!(queue.length(), 1);
368368

369-
let dequeued = queue.dequeue();
369+
let dequeued = queue.dequeue_at(Instant::now());
370370
assert!(dequeued.is_some());
371371
assert!(queue.is_empty());
372372
}

0 commit comments

Comments
 (0)