return m_inode_locks(inode);
}
-void
+bool
BeesContext::scan_forward(const BeesFileRange &bfr_in)
{
BEESTRACE("scan_forward " << bfr_in);
// Silently filter out blacklisted files
if (is_blacklisted(bfr_in.fid())) {
BEESCOUNT(scan_blacklisted);
- return;
+ return false;
}
// Reconstitute FD
if (!bfr.fd()) {
// BEESLOGINFO("No FD in " << root_path() << " for " << bfr);
BEESCOUNT(scan_no_fd);
- return;
+ return false;
}
// Sanity check
if (bfr.begin() >= bfr.file_size()) {
BEESLOGWARN("past EOF: " << bfr);
BEESCOUNT(scan_eof);
- return;
+ return false;
}
BtrfsExtentWalker ew(bfr.fd(), bfr.begin(), root_fd());
// BEESLOGDEBUG("Deferring extent bytenr " << to_hex(extent_bytenr) << " from " << bfr);
BEESCOUNT(scanf_deferred_extent);
start_over = true;
- return;
}
Timer one_extent_timer;
scan_one_extent(bfr, e);
BEESCOUNTADD(scanf_total_ms, scan_timer.age() * 1000);
BEESCOUNT(scanf_total);
- return;
+ return start_over;
}
BeesResolveAddrResult::BeesResolveAddrResult()
// It might be corrupted data, the file might have been deleted or truncated,
// or we might hit some other recoverable error. We'll try again with
// the next extent.
+ bool scanned_ok = false;
catch_all([&]() {
BEESNOTE("scan_forward " << bfr);
// BEESLOGDEBUG("scan_forward #" << Task::current_task().id() << " " << bfr);
- m_ctx->scan_forward(bfr);
+ scanned_ok = m_ctx->scan_forward(bfr);
// BEESLOGDEBUG("done_forward #" << Task::current_task().id() << " " << bfr);
} );
- m_hold = new_holder;
+ if (scanned_ok) {
+ m_hold = new_holder;
+ } else {
+ BEESLOGDEBUG("retrying lock for extent at " << bfr);
+ BEESCOUNT(crawl_restart);
+ return true;
+ }
}
} else {
BEESCOUNT(crawl_hole);
Fd home_fd();
string root_path() const { return m_root_path; }
- void scan_forward(const BeesFileRange &bfr);
+ bool scan_forward(const BeesFileRange &bfr);
bool is_root_ro(uint64_t root);
BeesRangePair dup_extent(const BeesFileRange &src, const shared_ptr<BeesTempFile> &tmpfile);