Create folders for session persistence

This commit is contained in:
Igor Katson 2023-11-27 09:20:35 +00:00
parent f33346adfb
commit 1110eb8620
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
2 changed files with 17 additions and 7 deletions

View file

@ -30,5 +30,6 @@ refactor:
- [x] start from error state should be possible from UI - [x] start from error state should be possible from UI
- [ ] if the torrent was completed, not need to re-check it - [ ] 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 - [ ] .rqbit-session.json file has 0 bytes when disk full. I guess fs::rename does this when disk is full? at least on linux

View file

@ -256,6 +256,11 @@ impl Session {
}); });
if opts.persistence { 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(); let session = session.clone();
spawn( spawn(
"session persistene", "session persistene",
@ -291,11 +296,16 @@ impl Session {
} }
async fn populate_from_stored(self: &Arc<Self>) -> anyhow::Result<()> { async fn populate_from_stored(self: &Arc<Self>) -> anyhow::Result<()> {
let mut rdr = BufReader::new( let mut rdr = match std::fs::File::open(&self.persistence_filename) {
std::fs::File::open(&self.persistence_filename).with_context(|| { Ok(f) => BufReader::new(f),
format!("error opening session file {:?}", self.persistence_filename) 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 = let db: SerializedSessionDatabase =
serde_json::from_reader(&mut rdr).context("error deserializing session database")?; serde_json::from_reader(&mut rdr).context("error deserializing session database")?;
let mut futures = Vec::new(); let mut futures = Vec::new();
@ -342,7 +352,6 @@ impl Session {
let mut tmp = BufWriter::new( let mut tmp = BufWriter::new(
std::fs::OpenOptions::new() std::fs::OpenOptions::new()
.create(true) .create(true)
.create_new(true)
.truncate(true) .truncate(true)
.write(true) .write(true)
.open(&tmp_filename) .open(&tmp_filename)