1
0
mirror of https://github.com/Zygo/bees.git synced 2025-05-17 21:35:45 +02:00

Skip nocow files to speed up processing

If you have a lot of or a few big nocow files (like vm images) which
contain a lot of potential deduplication candidates, bees becomes
incredibly slow running through a lot "invalid operation" exceptions.

Let's just skip over such files to get more bang for the buck. I did no
regression testing as this patch seems trivial (and I cannot imagine any
pitfalls either). The process progresses much faster for me now.
This commit is contained in:
Kai Krakow 2017-09-12 02:09:22 +02:00
parent 703bb7c1a3
commit a5e2bdff47
3 changed files with 22 additions and 0 deletions

View File

@ -13,6 +13,10 @@
#include <sys/stat.h>
#include <fcntl.h>
// ioctl
#include <sys/ioctl.h>
#include <linux/fs.h>
// socket
#include <sys/socket.h>
@ -141,6 +145,8 @@ namespace crucible {
Stat &lstat(const string &filename);
};
int ioctl_iflags_get(int fd);
string st_mode_ntoa(mode_t mode);
// Because it's not trivial to do correctly

View File

@ -488,6 +488,14 @@ namespace crucible {
lstat(filename);
}
int
ioctl_iflags_get(int fd)
{
int attr = 0;
DIE_IF_MINUS_ONE(ioctl(fd, FS_IOC_GETFLAGS, &attr));
return attr;
}
string
readlink_or_die(const string &path)
{

View File

@ -576,6 +576,14 @@ BeesRoots::open_root_ino_nocache(uint64_t root, uint64_t ino)
break;
}
int attr = ioctl_iflags_get(rv);
if (attr & FS_NOCOW_FL) {
BEESLOG("Opening " << name_fd(root_fd) << "/" << file_path << " found incompatible flags " << attr << " (FS_NOCOW_FL)");
rv = Fd();
BEESCOUNT(open_wrong_flags);
break;
}
// Correct root?
auto file_root = btrfs_get_root_id(rv);
if (file_root != root) {