1
0
mirror of https://github.com/Zygo/bees.git synced 2025-05-17 21:35:45 +02:00

context: move prealloc dedupe to a separate Task

A prealloc extent reference can be deduped immediately and asynchronously.
There is no need to slow down extent scanning to do it.

Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
Zygo Blaxell 2020-10-28 13:55:26 -04:00
parent 1e7dbc6f97
commit b49d458792

View File

@ -337,19 +337,29 @@ BeesContext::scan_one_extent(const BeesFileRange &bfr, const Extent &e)
if (e.flags() & Extent::PREALLOC) { if (e.flags() & Extent::PREALLOC) {
// Prealloc is all zero and we replace it with a hole. // Prealloc is all zero and we replace it with a hole.
// No special handling is required here. Nuke it and move on. // No special handling is required here. Nuke it and move on.
BEESLOGINFO("prealloc extent " << e); Task(
// Must not extend past EOF "dedup_prealloc",
auto extent_size = min(e.end(), bfr.file_size()) - e.begin(); [m_ctx, bfr, e]() {
BeesFileRange prealloc_bfr(m_ctx->tmpfile()->make_hole(extent_size)); BEESLOGINFO("prealloc extent " << e);
BeesRangePair brp(prealloc_bfr, bfr); // Must not extend past EOF
// Raw dedup here - nothing else to do with this extent, nothing to merge with auto extent_size = min(e.end(), bfr.file_size()) - e.begin();
if (m_ctx->dedup(brp)) { // Must hold tmpfile until dedupe is done
BEESCOUNT(dedup_prealloc_hit); auto tmpfile = m_ctx->tmpfile();
BEESCOUNTADD(dedup_prealloc_bytes, e.size()); BeesFileRange prealloc_bfr(tmpfile->make_hole(extent_size));
return bfr; // Apparently they can both extend past EOF
} else { BeesFileRange copy_bfr(bfr.fd(), e.begin(), e.begin() + extent_size);
BEESCOUNT(dedup_prealloc_miss); BeesRangePair brp(prealloc_bfr, copy_bfr);
} // Raw dedup here - nothing else to do with this extent, nothing to merge with
if (m_ctx->dedup(brp)) {
BEESCOUNT(dedup_prealloc_hit);
BEESCOUNTADD(dedup_prealloc_bytes, e.size());
// return bfr;
} else {
BEESCOUNT(dedup_prealloc_miss);
}
}
).run();
return bfr; // if dedup success, which we now blindly assume
} }
// OK we need to read extent now // OK we need to read extent now