diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-01-08 01:22:29 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-01-08 01:22:29 +0100 |
commit | 11689d2a021d95a8447d938180e0962cd9439763 (patch) | |
tree | 83e4e1a10a219bd6344e995f445b4fe95ed54acb /src/journal/journal-file.c | |
parent | 3c4230a5afb27faec2176d4642c0e2e145971b5c (diff) |
journald: turn off COW for journal files on btrfs
btrfs' COW logic results in heavily fragment journal files, which is
detrimental for perfomance. Hence, turn off COW for journal files as we
create them.
Turning off COW comes at the cost of data integrity guarantees, but this
should be acceptable, given that we do our own checksumming, and
generally have a pretty conservative write pattern.
Also see discussion on linux-btrfs:
http://www.spinics.net/lists/linux-btrfs/msg41001.html
Diffstat (limited to 'src/journal/journal-file.c')
-rw-r--r-- | src/journal/journal-file.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c index c9030c56ad..c20af5d9bf 100644 --- a/src/journal/journal-file.c +++ b/src/journal/journal-file.c @@ -26,6 +26,7 @@ #include <sys/statvfs.h> #include <fcntl.h> #include <stddef.h> +#include <linux/fs.h> #include "btrfs-util.h" #include "journal-def.h" @@ -141,8 +142,17 @@ void journal_file_close(JournalFile *f) { if (f->mmap && f->fd >= 0) mmap_cache_close_fd(f->mmap, f->fd); - if (f->fd >= 0 && f->defrag_on_close) - btrfs_defrag_fd(f->fd); + if (f->fd >= 0 && f->defrag_on_close) { + + /* Be friendly to btrfs: turn COW back on again now, + * and defragment the file. We won't write to the file + * ever again, hence remove all fragmentation, and + * reenable all the good bits COW usually provides + * (such as data checksumming). */ + + (void) chattr_fd(f->fd, false, FS_NOCOW_FL); + (void) btrfs_defrag_fd(f->fd); + } safe_close(f->fd); free(f->path); @@ -2591,6 +2601,18 @@ int journal_file_open( goto fail; if (f->last_stat.st_size == 0 && f->writable) { + + /* Before we write anything, turn off COW logic. Given + * our write pattern that is quite unfriendly to COW + * file systems this should greatly improve + * performance on COW file systems, such as btrfs, at + * the expense of data integrity features (which + * shouldn't be too bad, given that we do our own + * checksumming). */ + r = chattr_fd(f->fd, true, FS_NOCOW_FL); + if (r < 0) + log_warning_errno(errno, "Failed to set file attributes: %m"); + /* Let's attach the creation time to the journal file, * so that the vacuuming code knows the age of this * file even if the file might end up corrupted one @@ -2808,6 +2830,8 @@ int journal_file_open_reliably( /* btrfs doesn't cope well with our write pattern and * fragments heavily. Let's defrag all files we rotate */ + + (void) chattr_path(p, false, FS_NOCOW_FL); (void) btrfs_defrag(p); log_warning("File %s corrupted or uncleanly shut down, renaming and replacing.", fname); |