Select the types of activity you want to include in your feed.
back to interleaved loading/walking but better
yay
the walker knows which block it needs to be able to continue, so we pass that to the driver, and have it load until that block is reached before trying to walk again.
···123123async fn drive_ahead<E: Error + 'static, S: Stream<Item = CarBlock<E>> + Unpin, T: Clone>(
124124 vehicle: &mut Vehicle<E, S, T>,
125125) -> Result<Option<(Rkey, T)>, DriveError> {
126126- // trying smth: load all blocks first
127127- if !vehicle.walked_out {
128128- // stopped at a rest, try to load more blocks first
126126+127127+ 'outer: loop {
128128+ // walk until we can't load a block
129129+ let cid_needed = loop {
130130+ // walk as far as we can until we run out of blocks or find a record
131131+ match vehicle.walker.walk(&mut vehicle.blocks, vehicle.process)? {
132132+ Step::Rest(cid) => {
133133+ log::trace!("walker is resting, get another block");
134134+ // panic!("we should have had all blocks already");
135135+ // vehicle.walked_out = true;
136136+ break cid;
137137+ }
138138+ Step::Finish => {
139139+ log::trace!("walker finished");
140140+ return Ok(None);
141141+ }
142142+ Step::Step { rkey, data } => {
143143+ return Ok(Some((Rkey(rkey), data)));
144144+ }
145145+ }
146146+ };
147147+148148+ let mut found_any = false;
149149+ // load blocks until we reach that cid
129150 while let Some((cid, data)) = vehicle
130151 .block_stream
131152 .try_next()
132153 .await
133154 .map_err(|e| DriveError::CarBlockError(e.into()))?
134155 {
156156+ found_any = true;
135157 let val = if Node::could_be(&data) {
136158 MaybeProcessedBlock::Raw(data)
137159 } else {
138160 MaybeProcessedBlock::Processed((vehicle.process)(&data))
139161 };
140162 vehicle.blocks.insert(cid, val);
141141- };
142142- vehicle.walked_out = true;
143143- // pause to let macos activity monitor's memory stat update, definitely the best way to do this
144144- // tokio::time::sleep(std::time::Duration::from_secs(30)).await;
145145- }
146146- loop {
147163148148- // walk as far as we can until we run out of blocks or find a record
149149- match vehicle.walker.walk(&mut vehicle.blocks, vehicle.process)? {
150150- Step::Rest => {
151151- log::trace!("walker is resting, get another block");
152152- panic!("we should have had all blocks already");
153153- // vehicle.walked_out = true;
154154- }
155155- Step::Finish => {
156156- log::trace!("walker finished");
157157- return Ok(None);
158158- }
159159- Step::Step { rkey, data } => {
160160- return Ok(Some((Rkey(rkey), data)));
164164+ if cid == cid_needed {
165165+ continue 'outer;
161166 }
167167+ };
168168+169169+ if !found_any {
170170+ panic!("walker unfinished but no more blocks to load");
162171 }
163172 }
173173+174174+ // pause to let macos activity monitor's memory stat update, definitely the best way to do this
175175+ // tokio::time::sleep(std::time::Duration::from_secs(30)).await;
164176}
+1-1
src/mst.rs
···7171 ];
7272 let bytes = bytes.as_ref();
7373 bytes.starts_with(&NODE_FINGERPRINT)
7474- && bytes.get(3).map(|b| b & 0xF0 == 0x80).unwrap_or(false)
7474+ // && bytes.get(3).map(|b| b & 0xF0 == 0x80).unwrap_or(false)
7575 }
7676}
7777
+3-3
src/walk.rs
···24242525#[derive(Debug)]
2626pub enum Step<T> {
2727- Rest,
2727+ Rest(Cid),
2828 Finish,
2929 Step { rkey: String, data: T },
3030}
···197197 log::trace!("need node {cid:?}");
198198 let Some(block) = blocks.remove(cid) else {
199199 log::trace!("node not found, resting");
200200- return Ok(Step::Rest);
200200+ return Ok(Step::Rest(*cid));
201201 };
202202203203 let MaybeProcessedBlock::Raw(data) = block else {
···216216 log::trace!("need record {cid:?}");
217217 let Some(data) = blocks.get(cid) else {
218218 log::trace!("record block not found, resting");
219219- return Ok(Step::Rest);
219219+ return Ok(Step::Rest(*cid));
220220 };
221221 let rkey = rkey.clone();
222222 let data = match data {