From 0e8b591232a6bd8b4213357ad050364becfad3de Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Tue, 30 Oct 2018 23:26:39 -0400 Subject: [PATCH] Revert "roots: simplify BeesRoots::transid_max_nocache" It turns out that we do need to scan all the subvols in order to find transid_max. Keep the bug fix though. This reverts commit bf6ae80eeec6afcbee505d22af8e62f60dc1c9a6. Signed-off-by: Zygo Blaxell --- src/bees-roots.cc | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/bees-roots.cc b/src/bees-roots.cc index c266e2a..2e92583 100644 --- a/src/bees-roots.cc +++ b/src/bees-roots.cc @@ -202,8 +202,38 @@ BeesRoots::transid_max_nocache() BEESNOTE("Calculating transid_max (" << rv << " as of root " << root << ")"); BEESTRACE("Calculating transid_max..."); - rv = btrfs_get_root_transid(m_ctx->root_fd()); + rv = btrfs_get_root_transid(root); + // XXX: Do we need any of this? Or is + // m_transid_re.update(btrfs_get_root_transid(BTRFS_FS_TREE_OBJECTID)) good enough? + + BtrfsIoctlSearchKey sk; + sk.tree_id = BTRFS_ROOT_TREE_OBJECTID; + sk.min_type = sk.max_type = BTRFS_ROOT_BACKREF_KEY; + sk.min_objectid = root; + + while (true) { + sk.nr_items = 1024; + sk.do_ioctl(m_ctx->root_fd()); + + if (sk.m_result.empty()) { + break; + } + + for (auto i : sk.m_result) { + sk.next_min(i); + if (i.type == BTRFS_ROOT_BACKREF_KEY) { + if (i.transid > rv) { + BEESLOGDEBUG("transid_max root " << i.objectid << " parent " << i.offset << " transid " << i.transid); + BEESCOUNT(transid_max_miss); + } + root = i.objectid; + } + if (i.transid > rv) { + rv = i.transid; + } + } + } m_transid_re.update(rv); return rv; }