It fully works!
This commit is contained in:
parent
2fee0ca8c2
commit
29c46f2579
2 changed files with 26 additions and 10 deletions
|
|
@ -181,7 +181,11 @@ impl BitVFactory for JsonSessionPersistenceStore {
|
|||
async fn load(&self, id: TorrentIdOrHash) -> anyhow::Result<Option<Box<dyn BitV>>> {
|
||||
let h = self.to_hash(id).await?;
|
||||
let filename = self.bitv_filename(&h);
|
||||
let f = match std::fs::OpenOptions::new().write(true).open(&filename) {
|
||||
let f = match std::fs::OpenOptions::new()
|
||||
.read(true)
|
||||
.write(true)
|
||||
.open(&filename)
|
||||
{
|
||||
Ok(f) => f,
|
||||
Err(e) => match e.kind() {
|
||||
std::io::ErrorKind::NotFound => return Ok(None),
|
||||
|
|
@ -203,18 +207,23 @@ impl BitVFactory for JsonSessionPersistenceStore {
|
|||
.write(true)
|
||||
.create(true)
|
||||
.truncate(true)
|
||||
.open(&filename)
|
||||
.open(&tmp_filename)
|
||||
.await
|
||||
.with_context(|| format!("error opening {filename:?}"))?;
|
||||
tokio::io::copy(&mut b.as_raw_slice(), &mut dst)
|
||||
.await
|
||||
.context("error writing bitslice to {filename:?}")?;
|
||||
tokio::fs::rename(tmp_filename, &filename).await?;
|
||||
tokio::fs::rename(&tmp_filename, &filename)
|
||||
.await
|
||||
.with_context(|| format!("error renaming {tmp_filename:?} to {filename:?}"))?;
|
||||
let f = std::fs::OpenOptions::new()
|
||||
.read(true)
|
||||
.write(true)
|
||||
.open(&filename)
|
||||
.with_context(|| format!("error opening {filename:?}"))?;
|
||||
Ok(MmapBitV::new(f)?.into_dyn())
|
||||
Ok(MmapBitV::new(f)
|
||||
.with_context(|| format!("error constructing MmapBitV from file {filename:?}"))?
|
||||
.into_dyn())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -241,11 +250,15 @@ impl SessionPersistenceStore for JsonSessionPersistenceStore {
|
|||
if let Some(t) = removed {
|
||||
debug!(?id, "deleted from in-memory db, flushing");
|
||||
self.flush().await?;
|
||||
let tf = self.torrent_bytes_filename(&t.info_hash);
|
||||
if let Err(e) = tokio::fs::remove_file(&tf).await {
|
||||
warn!(error=?e, filename=?tf, "error removing torrent file");
|
||||
} else {
|
||||
debug!(filename=?tf, "removed");
|
||||
for tf in [
|
||||
self.torrent_bytes_filename(&t.info_hash),
|
||||
self.bitv_filename(&t.info_hash),
|
||||
] {
|
||||
if let Err(e) = tokio::fs::remove_file(&tf).await {
|
||||
warn!(error=?e, filename=?tf, "error removing");
|
||||
} else {
|
||||
debug!(filename=?tf, "removed");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
bail!("error deleting: didn't find torrent id={id}")
|
||||
|
|
|
|||
|
|
@ -99,7 +99,10 @@ impl TorrentStateInitializing {
|
|||
)
|
||||
.initial_check(&self.checked_bytes)
|
||||
})?;
|
||||
bitv_factory.store_initial_check(id, have_pieces).await?
|
||||
bitv_factory
|
||||
.store_initial_check(id, have_pieces)
|
||||
.await
|
||||
.context("error storing initial check bitfield")?
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue