From 1110eb8620a28c59266d517c14e2b7ae3d9088bf Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Mon, 27 Nov 2023 09:20:35 +0000 Subject: [PATCH] Create folders for session persistence --- TODO.md | 3 ++- crates/librqbit/src/session.rs | 21 +++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/TODO.md b/TODO.md index 0bb33c0..154b1eb 100644 --- a/TODO.md +++ b/TODO.md @@ -30,5 +30,6 @@ refactor: - [x] start from error state should be possible from UI - [ ] if the torrent was completed, not need to re-check it -- [ ] checking is very slow on raspberry +- [x] checking is very slow on raspberry + checked. nothing much can be done here. Even if raspberry's own libssl.so is used it's still super slow (sha1) - [ ] .rqbit-session.json file has 0 bytes when disk full. I guess fs::rename does this when disk is full? at least on linux \ No newline at end of file diff --git a/crates/librqbit/src/session.rs b/crates/librqbit/src/session.rs index 700fd2b..d4a56bf 100644 --- a/crates/librqbit/src/session.rs +++ b/crates/librqbit/src/session.rs @@ -256,6 +256,11 @@ impl Session { }); if opts.persistence { + if let Some(parent) = session.persistence_filename.parent() { + std::fs::create_dir_all(parent).with_context(|| { + format!("couldn't create directory {:?} for session storage", parent) + })?; + } let session = session.clone(); spawn( "session persistene", @@ -291,11 +296,16 @@ impl Session { } async fn populate_from_stored(self: &Arc) -> anyhow::Result<()> { - let mut rdr = BufReader::new( - std::fs::File::open(&self.persistence_filename).with_context(|| { - format!("error opening session file {:?}", self.persistence_filename) - })?, - ); + let mut rdr = match std::fs::File::open(&self.persistence_filename) { + Ok(f) => BufReader::new(f), + Err(e) if e.kind() == std::io::ErrorKind::NotFound => return Ok(()), + Err(e) => { + return Err(e).context(format!( + "error opening session file {:?}", + self.persistence_filename + )) + } + }; let db: SerializedSessionDatabase = serde_json::from_reader(&mut rdr).context("error deserializing session database")?; let mut futures = Vec::new(); @@ -342,7 +352,6 @@ impl Session { let mut tmp = BufWriter::new( std::fs::OpenOptions::new() .create(true) - .create_new(true) .truncate(true) .write(true) .open(&tmp_filename)