From bee7de3fb76dc93c14ad9ac3ec9ce759ade97888 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Wed, 10 Jul 2024 11:26:47 +0200 Subject: [PATCH] sequential strat now respects ReadHeadHint --- solanaceae/ngc_ft1_sha1/chunk_picker.cpp | 28 +++++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/solanaceae/ngc_ft1_sha1/chunk_picker.cpp b/solanaceae/ngc_ft1_sha1/chunk_picker.cpp index 96e1e5d..17899b5 100644 --- a/solanaceae/ngc_ft1_sha1/chunk_picker.cpp +++ b/solanaceae/ngc_ft1_sha1/chunk_picker.cpp @@ -20,15 +20,16 @@ struct PickerStrategySequential { const BitSet& chunk_candidates; const size_t total_chunks; - // TODO: optimize sequential and start at first chunk we dont have size_t i {0u}; PickerStrategySequential( const BitSet& chunk_candidates_, - const size_t total_chunks_ + const size_t total_chunks_, + const size_t start_offset_ = 0u ) : chunk_candidates(chunk_candidates_), - total_chunks(total_chunks_) + total_chunks(total_chunks_), + i(start_offset_) {} @@ -94,10 +95,11 @@ struct PickerStrategyRandomSequential { PickerStrategyRandomSequential( const BitSet& chunk_candidates_, const size_t total_chunks_, - std::minstd_rand& rng_ + std::minstd_rand& rng_, + const size_t start_offset_ = 0u ) : psr(chunk_candidates_, total_chunks_, rng_), - pssf(chunk_candidates_, total_chunks_) + pssf(chunk_candidates_, total_chunks_, start_offset_) {} bool gen(size_t& out_chunk_idx) { @@ -271,7 +273,8 @@ std::vector ChunkPicker::updateChunkRequests( } else { chunk_candidates.invert(); } - const auto total_chunks = o.get().chunks.size(); + const auto& info = o.get(); + const auto total_chunks = info.chunks.size(); auto& requested_chunks = o.get_or_emplace().chunks; // TODO: trim off round up to 8, since they are now always set @@ -287,9 +290,18 @@ std::vector ChunkPicker::updateChunkRequests( // - arbitrary priority maps/functions (and combine with above in rations) // TODO: configurable - //PickerStrategySimpleFirst ps(chunk_candidates, total_chunks); + size_t start_offset {0u}; + if (o.all_of()) { + const auto byte_offset = o.get().offset_into_file; + if (byte_offset <= info.file_size) { + start_offset = o.get().offset_into_file/info.chunk_size; + } else { + // error? + } + } + //PickerStrategySequential ps(chunk_candidates, total_chunks, start_offset); //PickerStrategyRandom ps(chunk_candidates, total_chunks, _rng); - PickerStrategyRandomSequential ps(chunk_candidates, total_chunks, _rng); + PickerStrategyRandomSequential ps(chunk_candidates, total_chunks, _rng, start_offset); size_t out_chunk_idx {0}; while (ps.gen(out_chunk_idx) && req_ret.size() < num_requests) { // out_chunk_idx is a potential candidate we can request form peer