summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2023-10-07 14:52:46 +0800
committerchenzizhan <[email protected]>2023-10-07 14:52:46 +0800
commit7f90cad8b0556bb40d39a8505344c0efe98bf7f4 (patch)
treea777165d99d2d14bb04ad1c3fcb481b846812689
parent32da8ea6bc4a3afdbdcb34bb282349c63b73156f (diff)
no timeout
-rw-r--r--src/session/segment_buffer.rs141
1 files changed, 58 insertions, 83 deletions
diff --git a/src/session/segment_buffer.rs b/src/session/segment_buffer.rs
index f0ca20e..6e6ceae 100644
--- a/src/session/segment_buffer.rs
+++ b/src/session/segment_buffer.rs
@@ -5,7 +5,6 @@ use std::num::Wrapping;
pub enum Description {
Ok,
TooManyPacket,
- Timeout,
WindowFull,
}
@@ -36,10 +35,8 @@ pub struct Stream {
max_packets: usize,
window_size: usize,
- timeout: u64,
used_window_size: usize,
- last_ts: Option<u64>,
// todo: 完全抽象,不要timestamp,window size 和 max packets 改名。next rel seq改名。
// todo: 起始偏移量一定是0. isn 不要了
@@ -49,18 +46,16 @@ pub struct Stream {
}
impl Stream {
- pub fn new(window_size: usize, max_packets: usize, timeout: u64) -> Self { // todo: 删掉isn,重命名,不要timeout
+ pub fn new(window_size: usize, max_packets: usize) -> Self { // todo: 删掉isn,重命名,不要timeout
Stream {
next_offset: Wrapping(0),
segments: BTreeMap::new(),
max_packets,
window_size,
- timeout,
used_window_size: 0,
- last_ts: None,
}
}
- pub fn update(&mut self, offset: u32, payload: &[u8], time_stamp: u64) -> Description {
+ pub fn update(&mut self, offset: u32, payload: &[u8]) -> Description {
if self.segments.len() >= self.max_packets {
return Description::TooManyPacket;
}
@@ -69,17 +64,6 @@ impl Stream {
return Description::WindowFull;
}
- if self.last_ts.is_none() {
- self.last_ts = Some(time_stamp);
- } else {
- let last_ts = self.last_ts.unwrap();
- if (time_stamp > last_ts) && (time_stamp - last_ts > self.timeout) {
- return Description::Timeout;
- }
- }
-
- self.last_ts = Some(std::cmp::max(self.last_ts.unwrap(), time_stamp));
-
if payload.is_empty() {
return Description::Ok;
}
@@ -163,10 +147,10 @@ mod tests {
#[test]
fn several_ordered_segments() {
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(0, &[1, 2, 3], 0), Description::Ok);
- assert_eq!(s.update(3, &[4, 5], 0), Description::Ok);
- assert_eq!(s.update(5, &[6], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(0, &[1, 2, 3]), Description::Ok);
+ assert_eq!(s.update(3, &[4, 5]), Description::Ok);
+ assert_eq!(s.update(5, &[6]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[1, 2, 3, 4, 5, 6]);
assert_eq!(s.clear(), Vec::<Vec<u8>>::new());
@@ -174,10 +158,10 @@ mod tests {
#[test]
fn several_unordered_segments() {
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(5, &[6], 0), Description::Ok);
- assert_eq!(s.update(0, &[1, 2, 3], 0), Description::Ok);
- assert_eq!(s.update(3, &[4, 5], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(5, &[6]), Description::Ok);
+ assert_eq!(s.update(0, &[1, 2, 3]), Description::Ok);
+ assert_eq!(s.update(3, &[4, 5]), Description::Ok);
let expected_clear = vec![vec![1, 2, 3, 4, 5, 6]];
assert_eq!(s.clear(), expected_clear);
@@ -185,11 +169,11 @@ mod tests {
#[test]
fn with_hole() {
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(0, &[1, 2], 0), Description::Ok); // miss 3
- assert_eq!(s.update(3, &[4, 5], 0), Description::Ok);
- assert_eq!(s.update(5, &[6], 0), Description::Ok); // miss 7
- assert_eq!(s.update(7, &[8, 9], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(0, &[1, 2]), Description::Ok); // miss 3
+ assert_eq!(s.update(3, &[4, 5]), Description::Ok);
+ assert_eq!(s.update(5, &[6]), Description::Ok); // miss 7
+ assert_eq!(s.update(7, &[8, 9]), Description::Ok);
let expected_clear = vec![vec![1, 2], vec![4, 5, 6], vec![8, 9]];
assert_eq!(s.clear(), expected_clear);
@@ -197,10 +181,10 @@ mod tests {
#[test]
fn duplicate_packet() {
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(0, &[1, 2, 3], 0), Description::Ok);
- assert_eq!(s.update(0, &[1, 2, 3], 0), Description::Ok);
- assert_eq!(s.update(3, &[4, 5], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(0, &[1, 2, 3]), Description::Ok);
+ assert_eq!(s.update(0, &[1, 2, 3]), Description::Ok);
+ assert_eq!(s.update(3, &[4, 5]), Description::Ok);
let expected_clear = vec![vec![1, 2, 3, 4, 5]];
assert_eq!(s.clear(), expected_clear);
@@ -208,21 +192,21 @@ mod tests {
#[test]
fn pop_empty() {
- let mut s = Stream::new(10000, 100, 10000);
+ let mut s = Stream::new(10000, 100);
assert_eq!(s.pullup(), None);
}
#[test]
fn pop_blocked_by_hole() {
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(0, &[1, 2], 0), Description::Ok); // miss 3
- assert_eq!(s.update(3, &[4, 5], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(0, &[1, 2]), Description::Ok); // miss 3
+ assert_eq!(s.update(3, &[4, 5]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[1, 2]);
assert_eq!(s.pullup(), None);
assert_eq!(s.pullup(), None);
- assert_eq!(s.update(2, &[3], 0), Description::Ok);
+ assert_eq!(s.update(2, &[3]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[3, 4, 5]);
}
@@ -230,10 +214,10 @@ mod tests {
fn overlap_when_popped() {
// [1,2,3] -> popped
// [3,4,5,6] -> [4,5,6]
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(0, &[1, 2, 3], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(0, &[1, 2, 3]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[1, 2, 3]);
- assert_eq!(s.update(2, &[3, 4, 5, 6], 0), Description::Ok);
+ assert_eq!(s.update(2, &[3, 4, 5, 6]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[4, 5, 6]);
}
@@ -241,10 +225,10 @@ mod tests {
fn overlap_as_old_packet() {
// [1,2,3,4,5,6] -> popped
// [2,3,4] -> drop(description: old packet)
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(0, &[1, 2, 3, 4, 5, 6], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(0, &[1, 2, 3, 4, 5, 6]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[1, 2, 3, 4, 5, 6]);
- assert_eq!(s.update(1, &[2, 3, 4], 0), Description::Ok);
+ assert_eq!(s.update(1, &[2, 3, 4]), Description::Ok);
assert_eq!(s.pullup(), None);
}
@@ -253,12 +237,12 @@ mod tests {
// [2,3,4] -> wait
// [3,4,5] -> wait(join the first as [2,3,4,5])
// [1] -> send [1 2,3,4,5]
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(1, &[2, 3, 4], 0), Description::Ok);
- assert_eq!(s.update(2, &[3, 4, 5], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(1, &[2, 3, 4]), Description::Ok);
+ assert_eq!(s.update(2, &[3, 4, 5]), Description::Ok);
assert!(s.pullup().is_none());
- assert_eq!(s.update(0, &[1], 0), Description::Ok);
+ assert_eq!(s.update(0, &[1]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[1, 2, 3, 4, 5]);
}
@@ -267,12 +251,12 @@ mod tests {
// [2,3,4,5] -> wait
// [3,4,5] -> del(overlapped)
// [1,2,3] -> send [1,2,3,4,5]
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(1, &[2, 3, 4, 5], 0), Description::Ok);
- assert_eq!(s.update(2, &[3, 4, 5], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(1, &[2, 3, 4, 5]), Description::Ok);
+ assert_eq!(s.update(2, &[3, 4, 5]), Description::Ok);
assert!(s.pullup().is_none());
- assert_eq!(s.update(0, &[1, 2, 3], 0), Description::Ok);
+ assert_eq!(s.update(0, &[1, 2, 3]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[1, 2, 3, 4, 5]);
}
@@ -281,12 +265,12 @@ mod tests {
// [2] -> wait
// [3] -> wait
// [1,2,3,4] -> send [1,2,3,4]
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(1, &[2], 0), Description::Ok);
- assert_eq!(s.update(2, &[3], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(1, &[2]), Description::Ok);
+ assert_eq!(s.update(2, &[3]), Description::Ok);
assert!(s.pullup().is_none());
- assert_eq!(s.update(0, &[1, 2, 3, 4], 0), Description::Ok);
+ assert_eq!(s.update(0, &[1, 2, 3, 4]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[1, 2, 3, 4]);
}
@@ -295,51 +279,42 @@ mod tests {
// [2,3,4] -> wait
// [3,4,5] -> clear ( return [2,3,4,5] )
// [1] -> send [1]
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(1, &[2, 3, 4], 0), Description::Ok);
- assert_eq!(s.update(2, &[3, 4, 5], 0), Description::Ok);
+ let mut s = Stream::new(10000, 100);
+ assert_eq!(s.update(1, &[2, 3, 4]), Description::Ok);
+ assert_eq!(s.update(2, &[3, 4, 5]), Description::Ok);
assert_eq!(s.clear(), vec![vec![2, 3, 4, 5]]);
- assert_eq!(s.update(0, &[1], 0), Description::Ok);
+ assert_eq!(s.update(0, &[1]), Description::Ok);
assert_eq!(s.pullup().unwrap(), &[1]);
}
#[test]
- fn timeout() {
- let mut s = Stream::new(10000, 100, 10000);
- assert_eq!(s.update(0, &[1, 2, 3, 4], 10001), Description::Ok);
- assert_eq!(s.update(4, &[2, 3, 4, 5], 20002), Description::Timeout);
-
- assert_eq!(s.clear(), vec![vec![1, 2, 3, 4]]);
- }
-
- #[test]
fn full_window() {
- let mut s = Stream::new(10, 100, 10000);
+ let mut s = Stream::new(10, 100);
- assert_eq!(s.update(0, &[1, 2, 3, 4], 0), Description::Ok);
- assert_eq!(s.update(4, &[5, 6, 7, 8], 0), Description::Ok);
- assert_eq!(s.update(8, &[2, 3, 4, 5], 0), Description::WindowFull);
+ assert_eq!(s.update(0, &[1, 2, 3, 4]), Description::Ok);
+ assert_eq!(s.update(4, &[5, 6, 7, 8]), Description::Ok);
+ assert_eq!(s.update(8, &[2, 3, 4, 5]), Description::WindowFull);
assert_eq!(s.pullup().unwrap(), &[1, 2, 3, 4, 5, 6, 7, 8]); // pop will clear window size
let v:Vec<_> = (1..=10).collect();
- assert_eq!(s.update(8, v.as_slice(), 0), Description::Ok);
- assert_eq!(s.update(18, &[1], 0), Description::WindowFull);
+ assert_eq!(s.update(8, v.as_slice()), Description::Ok);
+ assert_eq!(s.update(18, &[1]), Description::WindowFull);
}
#[test]
fn too_many_packet() {
- let mut s = Stream::new(10000, 2, 10000);
+ let mut s = Stream::new(10000, 2);
- assert_eq!(s.update(0, &[1, 2, 3, 4], 0), Description::Ok);
- assert_eq!(s.update(5, &[6, 7, 8], 0), Description::Ok); // hole
- assert_eq!(s.update(8, &[2, 3, 4, 5], 0), Description::TooManyPacket);
+ assert_eq!(s.update(0, &[1, 2, 3, 4]), Description::Ok);
+ assert_eq!(s.update(5, &[6, 7, 8]), Description::Ok); // hole
+ assert_eq!(s.update(8, &[2, 3, 4, 5]), Description::TooManyPacket);
assert_eq!(s.pullup().unwrap(), &[1, 2, 3, 4]); // pop 1
- assert_eq!(s.update(8, &[11], 0), Description::Ok);
- assert_eq!(s.update(9, &[12], 0), Description::TooManyPacket);
+ assert_eq!(s.update(8, &[11]), Description::Ok);
+ assert_eq!(s.update(9, &[12]), Description::TooManyPacket);
assert_eq!(s.clear(), vec![vec![6, 7, 8, 11]]);
}
}