at the same time can lead to a kernel hang. The workaround is
to reduce the thread count to 1 with `-c1`.
-* **Tree mod log issues**: bees will detect that a btrfs balance is
- running, and pause bees activity until the balance is done. This avoids
- running both the `LOGICAL_INO` ioctl and btrfs balance at the same time,
- which avoids kernel crashes on old kernel versions.
-
- The numbers for "tree mod log issue #" in the above table are arbitrary.
- There are a lot of them, and they all behave fairly similarly.
-
- This workaround is less necessary for kernels 5.4.19 and later.
-
* **Slow backrefs** (aka toxic extents): Under certain conditions,
if the number of references to a single shared extent grows too
high, the kernel consumes more and more CPU while also holding locks
{
}
-void
-BeesContext::wait_for_balance()
-{
- if (!BEES_SERIALIZE_BALANCE) {
- return;
- }
-
- Timer balance_timer;
- BEESNOTE("WORKAROUND: waiting for balance to stop");
- while (true) {
- btrfs_ioctl_balance_args args {};
- const int ret = ioctl(root_fd(), BTRFS_IOC_BALANCE_PROGRESS, &args);
- if (ret < 0) {
- // Either can't get balance status or not running, exit either way
- break;
- }
-
- if (!(args.state & BTRFS_BALANCE_STATE_RUNNING)) {
- // Balance not running, doesn't matter if paused or cancelled
- break;
- }
-
- BEESLOGDEBUG("WORKAROUND: Waiting " << balance_timer << "s for balance to stop");
- nanosleep(BEES_BALANCE_POLL_INTERVAL);
- }
-}
-
BeesResolveAddrResult
BeesContext::resolve_addr_uncached(BeesAddress addr)
{
// transaction latency, competing threads, and freeze/SIGSTOP
// pausing the bees process.
- // Wait for the balance to finish before we run LOGICAL_INO
- wait_for_balance();
-
BtrfsIoctlLogicalInoArgs log_ino(addr.get_physical_or_zero());
// Time how long this takes
// Wait this many transids between crawls
const size_t BEES_TRANSID_FACTOR = 10;
-// Wait this long for a balance to stop
-const double BEES_BALANCE_POLL_INTERVAL = 60.0;
-
-// Workaround for tree mod log bugs
-const bool BEES_SERIALIZE_BALANCE = false;
-
// Workaround for silly dedupe / ineffective readahead behavior
const size_t BEES_READAHEAD_SIZE = 1024 * 1024;
void set_root_fd(Fd fd);
BeesResolveAddrResult resolve_addr_uncached(BeesAddress addr);
- void wait_for_balance();
BeesFileRange scan_one_extent(const BeesFileRange &bfr, const Extent &e);
void rewrite_file_range(const BeesFileRange &bfr);