From 6bd518676d4de13643e5472f130fdc923a593f0e Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Sat, 16 Oct 2021 12:51:17 +0100 Subject: [PATCH] Truncate files at the start to required length --- crates/librqbit/src/torrent_manager.rs | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/crates/librqbit/src/torrent_manager.rs b/crates/librqbit/src/torrent_manager.rs index 683c5e1..7e35c1d 100644 --- a/crates/librqbit/src/torrent_manager.rs +++ b/crates/librqbit/src/torrent_manager.rs @@ -14,7 +14,7 @@ use librqbit_core::{ id20::Id20, lengths::Lengths, peer_id::generate_peer_id, speed_estimator::SpeedEstimator, torrent_metainfo::TorrentMetaV1Info, }; -use log::{debug, info}; +use log::{debug, info, warn}; use parking_lot::Mutex; use reqwest::Url; use sha1w::Sha1; @@ -152,6 +152,10 @@ fn make_lengths>( Lengths::new(total_length, torrent.piece_length, None) } +fn ensure_file_length(file: &mut File, length: u64) -> anyhow::Result<()> { + Ok(file.set_len(length)?) +} + impl TorrentManager { fn start>( info: TorrentMetaV1Info, @@ -209,6 +213,27 @@ impl TorrentManager { SF::new(initial_check_results.needed_bytes) ); + spawner.spawn_block_in_place(|| { + for (file, (name, length)) in + files.iter().zip(info.iter_filenames_and_lengths().unwrap()) + { + let now = Instant::now(); + if let Err(err) = ensure_file_length(&mut file.lock(), length) { + warn!( + "Error setting length for file {:?} to {}: {:#?}", + name, length, err + ); + } else { + info!( + "Set length for file {:?} to {} in {:?}", + name, + SF::new(length), + now.elapsed() + ); + } + } + }); + let chunk_tracker = ChunkTracker::new( initial_check_results.needed_pieces, initial_check_results.have_pieces,