Skip to content

Commit 3dc21ef

Browse files
committed
order chunks for uncache
1 parent 129bc6a commit 3dc21ef

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

lib/rlib/rcache.cpp

+23-14
Original file line numberDiff line numberDiff line change
@@ -47,34 +47,43 @@ auto RCache::add(RChunk const& chunk, std::span<char const> data) -> bool {
4747
auto RCache::contains(ChunkID chunkId) const noexcept -> bool { return bundle_.lookup.contains(chunkId); }
4848

4949
auto RCache::uncache(std::vector<RChunk::Dst> chunks, RChunk::Dst::data_cb on_data) const -> std::vector<RChunk::Dst> {
50-
sort_by<&RChunk::Dst::chunkId, &RChunk::Dst::uncompressed_offset>(chunks.begin(), chunks.end());
51-
auto lastId = ChunkID::None;
52-
auto dst = std::span<char const>{};
53-
remove_if(chunks, [&](RChunk::Dst const& chunk) mutable {
50+
auto found = std::vector<RChunk::Dst>{};
51+
found.reserve(chunks.size());
52+
remove_if(chunks, [&](RChunk::Dst& chunk) mutable {
5453
if (chunk.chunkId == ChunkID::None) {
5554
return false;
5655
}
57-
if (chunk.chunkId == lastId) {
58-
on_data(chunk, dst);
59-
return true;
60-
}
6156
auto i = bundle_.lookup.find(chunk.chunkId);
6257
if (i == bundle_.lookup.end()) {
6358
return false;
6459
}
6560
auto const& c = i->second;
6661
rlib_assert(c.uncompressed_size == chunk.uncompressed_size);
62+
chunk.compressed_offset = c.compressed_offset;
63+
chunk.compressed_size = c.compressed_size;
64+
found.push_back(chunk);
65+
return true;
66+
});
67+
68+
sort_by<&RChunk::Dst::compressed_offset, &RChunk::Dst::uncompressed_offset>(found.begin(), found.end());
69+
70+
auto lastId = ChunkID::None;
71+
auto dst = std::span<char const>{};
72+
for (RChunk::Dst const& chunk : found) {
73+
if (chunk.chunkId == lastId) {
74+
on_data(chunk, dst);
75+
continue;
76+
}
6777
auto src = std::span(buffer_);
68-
if (c.compressed_offset > bundle_.toc_offset) {
69-
src = src.subspan(c.compressed_offset - bundle_.toc_offset, c.compressed_size);
78+
if (chunk.compressed_offset > bundle_.toc_offset) {
79+
src = src.subspan(chunk.compressed_offset - bundle_.toc_offset, chunk.compressed_size);
7080
} else {
71-
src = file_.copy(c.compressed_offset, c.compressed_size);
81+
src = file_.copy(chunk.compressed_offset, chunk.compressed_size);
7282
}
73-
dst = zstd_decompress(src, c.uncompressed_size);
83+
dst = zstd_decompress(src, chunk.uncompressed_size);
7484
on_data(chunk, dst);
7585
lastId = chunk.chunkId;
76-
return true;
77-
});
86+
}
7887
return std::move(chunks);
7988
}
8089

0 commit comments

Comments
 (0)