diff --git a/Makefile b/Makefile index ff399bd..4cc6576 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ install: lib src test install_scripts: ## Install scipts install -Dm755 scripts/beesd $(PREFIX)/usr/bin/beesd install -Dm644 scripts/beesd.conf.sample $(PREFIX)/etc/bees/beesd.conf.sample - install -Dm644 scripts/beesd@.service $(PREFIX)/usr/lib/systemd/system/beesd@.service + install -Dm644 scripts/beesd@.service $(PREFIX)/lib/systemd/system/beesd@.service help: ## Show help @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##/\t/' diff --git a/lib/extentwalker.cc b/lib/extentwalker.cc index 626255a..3f6001b 100644 --- a/lib/extentwalker.cc +++ b/lib/extentwalker.cc @@ -520,25 +520,26 @@ namespace crucible { auto type = call_btrfs_get(btrfs_stack_file_extent_type, i.m_data); off_t len = -1; - switch (type) { - default: + switch (type) { + default: cerr << "Unhandled file extent type " << type << " in root " << m_tree_id << " ino " << m_stat.st_ino << endl; break; - case BTRFS_FILE_EXTENT_INLINE: + case BTRFS_FILE_EXTENT_INLINE: len = ranged_cast(call_btrfs_get(btrfs_stack_file_extent_ram_bytes, i.m_data)); e.m_flags |= FIEMAP_EXTENT_DATA_INLINE | FIEMAP_EXTENT_NOT_ALIGNED; // Inline extents are never obscured, so don't bother filling in m_physical_len, etc. - break; - case BTRFS_FILE_EXTENT_PREALLOC: + break; + case BTRFS_FILE_EXTENT_PREALLOC: e.m_flags |= Extent::PREALLOC; - case BTRFS_FILE_EXTENT_REG: { + // fallthrough + case BTRFS_FILE_EXTENT_REG: { e.m_physical = call_btrfs_get(btrfs_stack_file_extent_disk_bytenr, i.m_data); // This is the length of the full extent (decompressed) - off_t ram = ranged_cast(call_btrfs_get(btrfs_stack_file_extent_ram_bytes, i.m_data)); + off_t ram = ranged_cast(call_btrfs_get(btrfs_stack_file_extent_ram_bytes, i.m_data)); // This is the length of the part of the extent appearing in the file (decompressed) - len = ranged_cast(call_btrfs_get(btrfs_stack_file_extent_num_bytes, i.m_data)); + len = ranged_cast(call_btrfs_get(btrfs_stack_file_extent_num_bytes, i.m_data)); // This is the offset from start of on-disk extent to the part we see in the file (decompressed) // May be negative due to the kind of bug we're stuck with forever, so no cast range check diff --git a/scripts/beesd b/scripts/beesd index 6abffc4..cfe256c 100755 --- a/scripts/beesd +++ b/scripts/beesd @@ -52,16 +52,18 @@ DB_SIZE="${DB_SIZE:-$((64*AL16M))}" LOG_SHORT_PATH="${LOG_SHORT_PATH:-N}" LOG_FILTER_TIME="${LOG_FILTER_TIME:-N}" -INFO "Check: BTRFS UUID exists" -if [ ! -d "/sys/fs/btrfs/$UUID" ]; then - ERRO "Can't find BTRFS UUID: $UUID" -fi - INFO "Check: Disk exists" if [ ! -b "/dev/disk/by-uuid/$UUID" ]; then ERRO "Missing disk: /dev/disk/by-uuid/$UUID" fi +it_btrfs(){ [ "$(blkid -s TYPE -o value "$1")" == "btrfs" ]; } + +INFO "Check: Disk with btrfs" +if ! it_btrfs "/dev/disk/by-uuid/$UUID"; then + ERRO "Disk not contain btrfs: /dev/disk/by-uuid/$UUID" +fi + INFO "WORK DIR: $WORK_DIR" mkdir -p "$WORK_DIR" || exit 1 diff --git a/src/bees-context.cc b/src/bees-context.cc index ffa95d1..7b48054 100644 --- a/src/bees-context.cc +++ b/src/bees-context.cc @@ -56,6 +56,12 @@ BeesFdCache::open_root(shared_ptr ctx, uint64_t root) Fd BeesFdCache::open_root_ino(shared_ptr ctx, uint64_t root, uint64_t ino) { + if (m_file_cache_timer.age() > BEES_COMMIT_INTERVAL) { + BEESINFO("Clearing open FD cache to enable file delete"); + m_file_cache.clear(); + m_file_cache_timer.reset(); + BEESCOUNT(open_clear); + } return m_file_cache(ctx, root, ino); } diff --git a/src/bees-roots.cc b/src/bees-roots.cc index c87d7ff..012efde 100644 --- a/src/bees-roots.cc +++ b/src/bees-roots.cc @@ -735,6 +735,7 @@ BeesCrawl::fetch_extents() break; case BTRFS_FILE_EXTENT_PREALLOC: BEESCOUNT(crawl_prealloc); + // fallthrough case BTRFS_FILE_EXTENT_REG: { auto physical = call_btrfs_get(btrfs_stack_file_extent_disk_bytenr, i.m_data); auto ram = call_btrfs_get(btrfs_stack_file_extent_ram_bytes, i.m_data); diff --git a/src/bees.h b/src/bees.h index ddaeca4..f34e784 100644 --- a/src/bees.h +++ b/src/bees.h @@ -664,6 +664,7 @@ class BeesFdCache { LRUCache, uint64_t> m_root_cache; LRUCache, uint64_t, uint64_t> m_file_cache; Timer m_root_cache_timer; + Timer m_file_cache_timer; public: BeesFdCache();