···1919serde_bytes = "0.11.19"
2020serde_ipld_dagcbor = "0.6.4"
2121thiserror = "2.0.17"
2222-tokio = { version = "1.47.1", features = ["rt"] }
2222+tokio = { version = "1.47.1", features = ["rt", "sync"] }
23232424[dev-dependencies]
2525clap = { version = "4.5.48", features = ["derive"] }
+27-17
src/drive.rs
···215215 .await
216216 .unwrap()?;
217217218218+ let (tx, mut rx) = tokio::sync::mpsc::channel::<Vec<(Cid, MaybeProcessedBlock<T>)>>(2);
219219+220220+ let access_worker = tokio::task::spawn_blocking(move || {
221221+ let mut writer = access.get_writer()?;
222222+223223+ while let Some(chunk) = rx.blocking_recv() {
224224+ let kvs = chunk
225225+ .into_iter()
226226+ .map(|(k, v)| (k.to_bytes(), encode(v).unwrap()));
227227+ writer.put_many(kvs)?;
228228+ }
229229+230230+ drop(writer); // cannot outlive access
231231+ Ok::<_, DiskDriveError>(access)
232232+ }); // await later
233233+218234 // dump the rest to disk (in chunks)
235235+ log::debug!("dumping the rest of the stream...");
219236 loop {
220220- let mut chunk = vec![];
221237 let mut mem_size = 0;
238238+ let mut chunk = vec![];
222239 loop {
223240 let Some((cid, data)) = self.car.next_block().await? else {
224241 break;
···239256 mem_size += std::mem::size_of::<Cid>() + maybe_processed.get_size();
240257 chunk.push((cid, maybe_processed));
241258 if mem_size >= self.max_size {
259259+ // soooooo if we're setting the db cache to max_size and then letting
260260+ // multiple chunks in the queue that are >= max_size, then at any time
261261+ // we might be using some multiple of max_size?
242262 break;
243263 }
244264 }
245265 if chunk.is_empty() {
246266 break;
247267 }
248248-249249- // move access in and back out so we can manage lifetimes
250250- // dump mem blocks into the store
251251- access = tokio::task::spawn_blocking(move || {
252252- let mut writer = access.get_writer()?;
253253-254254- let kvs = chunk
255255- .into_iter()
256256- .map(|(k, v)| (k.to_bytes(), encode(v).unwrap()));
268268+ tx.send(chunk).await.unwrap();
269269+ }
270270+ drop(tx);
271271+ log::debug!("done. waiting for worker to finish...");
257272258258- writer.put_many(kvs)?;
273273+ access = access_worker.await.unwrap()?;
259274260260- drop(writer); // cannot outlive access
261261- Ok::<_, DiskDriveError>(access)
262262- })
263263- .await
264264- .unwrap()?; // TODO
265265- }
275275+ log::debug!("worker finished.");
266276267277 let commit = self.commit.ok_or(DiskDriveError::MissingCommit)?;
268278