This commit is contained in:
Dominik Werder
2024-10-30 16:58:19 +01:00
parent b0d9d5f0a8
commit 2d26c5946b
+106 -126
View File
@@ -103,7 +103,6 @@ where
{ {
Ongoing(F), Ongoing(F),
Ready(<F as Future>::Output), Ready(<F as Future>::Output),
Taken,
} }
impl<F> Fst<F> impl<F> Fst<F>
@@ -111,17 +110,6 @@ where
F: Future + Unpin, F: Future + Unpin,
<F as Future>::Output: Unpin, <F as Future>::Output: Unpin,
{ {
fn take_if_ready(&mut self) -> Poll<Option<<F as Future>::Output>> {
use Poll::*;
match self {
Fst::Ongoing(_) => Pending,
Fst::Ready(_) => match core::mem::replace(self, Fst::Taken) {
Fst::Ready(x) => Ready(Some(x)),
_ => panic!(),
},
Fst::Taken => Ready(None),
}
}
} }
impl<F> Future for Fst<F> impl<F> Future for Fst<F>
@@ -142,7 +130,6 @@ where
Pending => Pending, Pending => Pending,
}, },
Fst::Ready(_) => Ready(()), Fst::Ready(_) => Ready(()),
Fst::Taken => Ready(()),
} }
} }
} }
@@ -188,19 +175,14 @@ impl Stream for ReadQueue {
for fut in self.futs.iter_mut() { for fut in self.futs.iter_mut() {
let _ = fut.poll_unpin(cx); let _ = fut.poll_unpin(cx);
} }
if let Some(Fst::Taken) = self.futs.front() { if let Some(Fst::Ready(_)) = self.futs.front() {
error!("fut in queue Taken"); if let Some(Fst::Ready(k)) = self.futs.pop_front() {
panic!() Ready(Some(k))
} else {
if let Some(Fst::Ready(_)) = self.futs.front() {
if let Some(Fst::Ready(k)) = self.futs.pop_front() {
Ready(Some(k))
} else {
panic!()
}
} else { } else {
Pending panic!()
} }
} else {
Pending
} }
} }
} }
@@ -224,7 +206,19 @@ struct ReadingBck {
} }
struct ReadingFwd { struct ReadingFwd {
reading_state: ReadingState, msp_done: bool,
msp_fut: Option<FetchMsp>,
qu: ReadQueue,
}
impl ReadingFwd {
fn new(qucap: usize) -> Self {
Self {
msp_done: false,
msp_fut: None,
qu: ReadQueue::new(qucap),
}
}
} }
enum State { enum State {
@@ -443,62 +437,29 @@ impl EventsStreamRt {
} }
fn setup_fwd_read(&mut self) { fn setup_fwd_read(&mut self) {
if let State::ReadingFwd(st2) = &self.state { self.state = State::ReadingFwd(ReadingFwd::new(self.qucap));
if let ReadingState::FetchEvents(st3) = &st2.reading_state { }
if st3.qu.has_space() {
} else {
panic!()
}
} else {
self.state = State::ReadingFwd(ReadingFwd {
reading_state: ReadingState::FetchEvents(FetchEvents {
qu: ReadQueue::new(self.qucap),
}),
});
}
} else {
self.state = State::ReadingFwd(ReadingFwd {
reading_state: ReadingState::FetchEvents(FetchEvents {
qu: ReadQueue::new(self.qucap),
}),
});
}
let qu = if let State::ReadingFwd(st2) = &mut self.state { fn redo_fwd_read(&mut self) {
if let ReadingState::FetchEvents(st3) = &mut st2.reading_state { // trace_fetch!("setup_fwd_read {} {} BEFORE", self.msp_buf.len(), qu.len());
&mut st3.qu // while qu.has_space() {
} else { // if let Some(ts) = self.msp_buf.pop_front() {
panic!() // trace_fetch!("setup_fwd_read {} FILL A SLOT", ts.fmt());
} // let jobtrace = ReadJobTrace::new();
} else { // let scyqueue = self.scyqueue.clone();
panic!() // let rt = self.rt.clone();
}; // let series = self.series.clone();
trace_fetch!("setup_fwd_read {} {} BEFORE", self.msp_buf.len(), qu.len()); // let range = self.range.clone();
while qu.has_space() { // let readopts = self.readopts.clone();
if let Some(ts) = self.msp_buf.pop_front() { // let ch_conf = self.ch_conf.clone();
trace_fetch!("setup_fwd_read {} FILL A SLOT", ts.fmt()); // let fut =
let jobtrace = ReadJobTrace::new(); // Self::make_read_events_fut(ts, false, rt, series, range, readopts, ch_conf, scyqueue, jobtrace);
let scyqueue = self.scyqueue.clone(); // qu.push(fut);
let rt = self.rt.clone(); // } else {
let series = self.series.clone(); // break;
let range = self.range.clone(); // }
let readopts = self.readopts.clone(); // }
let ch_conf = self.ch_conf.clone(); // trace_fetch!("setup_fwd_read {} {} AFTER", self.msp_buf.len(), qu.len());
let fut =
Self::make_read_events_fut(ts, false, rt, series, range, readopts, ch_conf, scyqueue, jobtrace);
qu.push(fut);
} else {
break;
}
}
trace_fetch!("setup_fwd_read {} {} AFTER", self.msp_buf.len(), qu.len());
if self.msp_buf.len() == 0 && qu.len() == 0 {
trace_msp_fetch!("setup_fwd_read no msp");
let fut = Self::make_msp_read_fut(&mut self.msp_inp);
self.state = State::ReadingFwd(ReadingFwd {
reading_state: ReadingState::FetchMsp(FetchMsp { fut }),
});
}
} }
} }
@@ -579,7 +540,9 @@ impl Stream for EventsStreamRt {
self.out_cnt += item.len() as u64; self.out_cnt += item.len() as u64;
break Ready(Some(Ok(ChannelEvents::Events(item)))); break Ready(Some(Ok(ChannelEvents::Events(item))));
} }
break match &mut self.state { let self2 = self.as_mut().get_mut();
let (state, msp_buf) = (&mut self2.state, &mut self2.msp_buf);
break match state {
State::Begin => { State::Begin => {
if self.readopts.one_before { if self.readopts.one_before {
trace_fetch!("State::Begin Bck"); trace_fetch!("State::Begin Bck");
@@ -589,10 +552,8 @@ impl Stream for EventsStreamRt {
}); });
} else { } else {
trace_fetch!("State::Begin Fwd"); trace_fetch!("State::Begin Fwd");
let fut = Self::make_msp_read_fut(&mut self.msp_inp); // let fut = Self::make_msp_read_fut(&mut self.msp_inp);
self.state = State::ReadingFwd(ReadingFwd { self.setup_fwd_read();
reading_state: ReadingState::FetchMsp(FetchMsp { fut }),
});
} }
continue; continue;
} }
@@ -667,50 +628,69 @@ impl Stream for EventsStreamRt {
Pending => Pending, Pending => Pending,
}, },
}, },
State::ReadingFwd(st) => match &mut st.reading_state { State::ReadingFwd(st) => {
ReadingState::FetchMsp(st2) => match st2.fut.poll_unpin(cx) { let mut have_pending = false;
Ready(Ok(a)) => { if let Some(fut) = st.msp_fut.as_mut() {
// trace_fetch!("ReadingFwd FetchMsp {}", ts.fmt()); match fut.fut.poll_unpin(cx) {
for x in a { Ready(_) => {
self.msp_buf.push_back(x); st.msp_fut = None;
} }
if self.msp_buf.len() == 0 { Pending => {
self.state = State::InputDone; have_pending = true;
continue;
} else {
self.setup_fwd_read();
continue;
} }
} }
Ready(Err(e)) => Ready(Some(Err(e.into()))), } else if st.msp_done == false && msp_buf.len() < 100 {
Pending => Pending, trace_msp_fetch!("create msp read fut");
}, let fut = Self::make_msp_read_fut(&mut self2.msp_inp);
ReadingState::FetchEvents(st2) => match st2.qu.poll_next_unpin(cx) { // let fut = err::todoval();
Ready(Some(x)) => match x { st.msp_fut = Some(FetchMsp { fut: fut });
Ok((evs, mut jobtrace)) => { };
jobtrace panic!()
.add_event_now(crate::events::ReadEventKind::EventsStreamRtSees(evs.len() as u32)); }
use items_2::merger::Mergeable; // State::ReadingFwd(st) => match &mut st.reading_state {
trace_fetch!("ReadingFwd {jobtrace}"); // ReadingState::FetchMsp(st2) => match st2.fut.poll_unpin(cx) {
for ts in Mergeable::tss(&evs) { // Ready(Ok(a)) => {
trace_every_event!("ReadingFwd FetchEvents ts {}", ts.fmt()); // // trace_fetch!("ReadingFwd FetchMsp {}", ts.fmt());
} // for x in a {
self.out.push_back(evs); // self.msp_buf.push_back(x);
self.setup_fwd_read(); // }
continue; // if self.msp_buf.len() == 0 {
} // self.state = State::InputDone;
Err(e) => { // continue;
self.state = State::Done; // } else {
Ready(Some(Err(e.into()))) // self.setup_fwd_read();
} // continue;
}, // }
Ready(None) => { // }
self.state = State::Done; // Ready(Err(e)) => Ready(Some(Err(e.into()))),
Ready(Some(Err(Error::ReadQueueEmptyFwd))) // Pending => Pending,
} // },
Pending => Pending, // ReadingState::FetchEvents(st2) => match st2.qu.poll_next_unpin(cx) {
}, // Ready(Some(x)) => match x {
}, // Ok((evs, mut jobtrace)) => {
// jobtrace
// .add_event_now(crate::events::ReadEventKind::EventsStreamRtSees(evs.len() as u32));
// use items_2::merger::Mergeable;
// trace_fetch!("ReadingFwd {jobtrace}");
// for ts in Mergeable::tss(&evs) {
// trace_every_event!("ReadingFwd FetchEvents ts {}", ts.fmt());
// }
// self.out.push_back(evs);
// self.setup_fwd_read();
// continue;
// }
// Err(e) => {
// self.state = State::Done;
// Ready(Some(Err(e.into())))
// }
// },
// Ready(None) => {
// self.state = State::Done;
// Ready(Some(Err(Error::ReadQueueEmptyFwd)))
// }
// Pending => Pending,
// },
// },
State::InputDone => { State::InputDone => {
if self.out.len() == 0 { if self.out.len() == 0 {
self.state = State::Done; self.state = State::Done;