]> git.hungrycats.org Git - bees/commitdiff
context: create a Pool of BtrfsIoctlLogicalInoArgs objects
authorZygo Blaxell <bees@furryterror.org>
Tue, 21 Feb 2023 05:04:31 +0000 (00:04 -0500)
committerZygo Blaxell <bees@furryterror.org>
Fri, 24 Feb 2023 03:45:31 +0000 (22:45 -0500)
Each object contains a 16 MiB buffer, which is very heavy for some
malloc implementations.

Keep the objects in a Pool so that their buffers are only allocated and
deallocated once in the process lifetime.

Signed-off-by: Zygo Blaxell <bees@furryterror.org>
src/bees-context.cc
src/bees.h

index 83edf30b500ef196b6b0ae62ba73c4bf2987f706..f17212c97ed0e2c306d90b57e39090f9524ab52d 100644 (file)
@@ -757,6 +757,15 @@ BeesResolveAddrResult::BeesResolveAddrResult()
 {
 }
 
+shared_ptr<BtrfsIoctlLogicalInoArgs>
+BeesContext::logical_ino(const uint64_t logical, const bool all_refs)
+{
+       const auto rv = m_logical_ino_pool();
+       rv->set_logical(logical);
+       rv->set_flags(all_refs ? BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET : 0);
+       return rv;
+}
+
 BeesResolveAddrResult
 BeesContext::resolve_addr_uncached(BeesAddress addr)
 {
@@ -768,7 +777,8 @@ BeesContext::resolve_addr_uncached(BeesAddress addr)
        // transaction latency, competing threads, and freeze/SIGSTOP
        // pausing the bees process.
 
-        BtrfsIoctlLogicalInoArgs log_ino(addr.get_physical_or_zero());
+       const auto log_ino_ptr = logical_ino(addr.get_physical_or_zero(), false);
+       auto &log_ino = *log_ino_ptr;
 
        // Time how long this takes
        Timer resolve_timer;
@@ -910,6 +920,9 @@ BeesContext::start()
        m_tmpfile_pool.generator([=]() -> shared_ptr<BeesTempFile> {
                return make_shared<BeesTempFile>(shared_from_this());
        });
+       m_logical_ino_pool.generator([]() {
+               return make_shared<BtrfsIoctlLogicalInoArgs>(0);
+       });
        m_tmpfile_pool.checkin([](const shared_ptr<BeesTempFile> &btf) {
                catch_all([&](){
                        btf->reset();
index 30175e4fa12251329c503866fdd582a8d0445268..4dbc0051ec62c43378c64e9e22e3ab6a7a3c4b85 100644 (file)
@@ -714,6 +714,7 @@ class BeesContext : public enable_shared_from_this<BeesContext> {
        shared_ptr<BeesHashTable>                       m_hash_table;
        shared_ptr<BeesRoots>                           m_roots;
        Pool<BeesTempFile>                              m_tmpfile_pool;
+       Pool<BtrfsIoctlLogicalInoArgs>                  m_logical_ino_pool;
 
        LRUCache<BeesResolveAddrResult, BeesAddress>    m_resolve_cache;
 
@@ -753,6 +754,8 @@ public:
 
        bool scan_forward(const BeesFileRange &bfr);
 
+       shared_ptr<BtrfsIoctlLogicalInoArgs> logical_ino(uint64_t bytenr, bool all_refs);
+
        bool is_root_ro(uint64_t root);
        BeesRangePair dup_extent(const BeesFileRange &src, const shared_ptr<BeesTempFile> &tmpfile);
        bool dedup(const BeesRangePair &brp);