Session: add all at once

This commit is contained in:
Igor Katson 2023-11-26 09:59:44 +00:00
parent c6b4e78747
commit 7292522139
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
3 changed files with 34 additions and 25 deletions

View file

@ -30,4 +30,5 @@ 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
- [ ] checking is very slow on raspberry
- [ ] .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

@ -64,4 +64,4 @@ dashmap = "5.5.3"
[dev-dependencies]
futures = {version = "0.3"}
tracing-subscriber = "0.3"
tracing-subscriber = "0.3"

View file

@ -242,11 +242,11 @@ impl Session {
Some(dht)
};
let peer_opts = opts.peer_opts.unwrap_or_default();
let session_filename = opts
let persistence_filename = opts
.persistence_filename
.unwrap_or_else(|| output_folder.join(".rqbit-session.json"));
let session = Arc::new(Self {
persistence_filename: session_filename,
persistence_filename,
peer_id,
dht,
peer_opts,
@ -298,34 +298,42 @@ impl Session {
);
let db: SerializedSessionDatabase =
serde_json::from_reader(&mut rdr).context("error deserializing session database")?;
let mut futures = Vec::new();
for storrent in db.torrents.into_iter() {
let magnet = Magnet {
info_hash: Id20::from_str(&storrent.info_hash)
.context("error deserializing info_hash")?,
trackers: storrent.trackers.into_iter().collect(),
};
if let Err(e) = self
.add_torrent(
AddTorrent::Url(Cow::Owned(magnet.to_string())),
Some(AddTorrentOptions {
paused: storrent.is_paused,
output_folder: Some(
storrent
.output_folder
.to_str()
.context("broken path")?
.to_owned(),
),
only_files: storrent.only_files,
overwrite: true,
..Default::default()
}),
)
.await
{
error!("error adding torrent from stored session: {:?}", e)
}
futures.push({
let session = self.clone();
async move {
session
.add_torrent(
AddTorrent::Url(Cow::Owned(magnet.to_string())),
Some(AddTorrentOptions {
paused: storrent.is_paused,
output_folder: Some(
storrent
.output_folder
.to_str()
.context("broken path")?
.to_owned(),
),
only_files: storrent.only_files,
overwrite: true,
..Default::default()
}),
)
.await
.map_err(|e| {
error!("error adding torrent from stored session: {:?}", e);
e
})
}
});
}
futures::future::join_all(futures).await;
Ok(())
}