Commit bfcaa907 authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: bch_acct_compression

This adds per-compression-type accounting of compressed and uncompressed
size as well as number of extents - meaning we can now see compression
ratio (without walking the whole filesystem).
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 5668e5de
...@@ -707,13 +707,18 @@ static int __trigger_extent(struct btree_trans *trans, ...@@ -707,13 +707,18 @@ static int __trigger_extent(struct btree_trans *trans,
s64 replicas_sectors = 0; s64 replicas_sectors = 0;
int ret = 0; int ret = 0;
struct disk_accounting_pos acc = { struct disk_accounting_pos acc_replicas_key = {
.type = BCH_DISK_ACCOUNTING_replicas, .type = BCH_DISK_ACCOUNTING_replicas,
.replicas.data_type = data_type, .replicas.data_type = data_type,
.replicas.nr_devs = 0, .replicas.nr_devs = 0,
.replicas.nr_required = 1, .replicas.nr_required = 1,
}; };
struct disk_accounting_pos acct_compression_key = {
.type = BCH_DISK_ACCOUNTING_compression,
};
u64 compression_acct[3] = { 1, 0, 0 };
bkey_for_each_ptr_decode(k.k, ptrs, p, entry) { bkey_for_each_ptr_decode(k.k, ptrs, p, entry) {
s64 disk_sectors = 0; s64 disk_sectors = 0;
ret = bch2_trigger_pointer(trans, btree_id, level, k, p, entry, &disk_sectors, flags); ret = bch2_trigger_pointer(trans, btree_id, level, k, p, entry, &disk_sectors, flags);
...@@ -722,15 +727,16 @@ static int __trigger_extent(struct btree_trans *trans, ...@@ -722,15 +727,16 @@ static int __trigger_extent(struct btree_trans *trans,
bool stale = ret > 0; bool stale = ret > 0;
if (p.ptr.cached && stale)
continue;
if (p.ptr.cached) { if (p.ptr.cached) {
if (!stale) {
ret = bch2_mod_dev_cached_sectors(trans, p.ptr.dev, disk_sectors, gc); ret = bch2_mod_dev_cached_sectors(trans, p.ptr.dev, disk_sectors, gc);
if (ret) if (ret)
return ret; return ret;
}
} else if (!p.has_ec) { } else if (!p.has_ec) {
replicas_sectors += disk_sectors; replicas_sectors += disk_sectors;
acc.replicas.devs[acc.replicas.nr_devs++] = p.ptr.dev; acc_replicas_key.replicas.devs[acc_replicas_key.replicas.nr_devs++] = p.ptr.dev;
} else { } else {
ret = bch2_trigger_stripe_ptr(trans, k, p, data_type, disk_sectors, flags); ret = bch2_trigger_stripe_ptr(trans, k, p, data_type, disk_sectors, flags);
if (ret) if (ret)
...@@ -741,12 +747,43 @@ static int __trigger_extent(struct btree_trans *trans, ...@@ -741,12 +747,43 @@ static int __trigger_extent(struct btree_trans *trans,
* if so they're not required for mounting if we have an * if so they're not required for mounting if we have an
* erasure coded pointer in this extent: * erasure coded pointer in this extent:
*/ */
acc.replicas.nr_required = 0; acc_replicas_key.replicas.nr_required = 0;
} }
if (acct_compression_key.compression.type &&
acct_compression_key.compression.type != p.crc.compression_type) {
if (flags & BTREE_TRIGGER_overwrite)
bch2_u64s_neg(compression_acct, ARRAY_SIZE(compression_acct));
ret = bch2_disk_accounting_mod(trans, &acct_compression_key, compression_acct,
ARRAY_SIZE(compression_acct), gc);
if (ret)
return ret;
compression_acct[0] = 1;
compression_acct[1] = 0;
compression_acct[2] = 0;
}
acct_compression_key.compression.type = p.crc.compression_type;
if (p.crc.compression_type) {
compression_acct[1] += p.crc.uncompressed_size;
compression_acct[2] += p.crc.compressed_size;
}
}
if (acc_replicas_key.replicas.nr_devs) {
ret = bch2_disk_accounting_mod(trans, &acc_replicas_key, &replicas_sectors, 1, gc);
if (ret)
return ret;
} }
if (acc.replicas.nr_devs) { if (acct_compression_key.compression.type) {
ret = bch2_disk_accounting_mod(trans, &acc, &replicas_sectors, 1, gc); if (flags & BTREE_TRIGGER_overwrite)
bch2_u64s_neg(compression_acct, ARRAY_SIZE(compression_acct));
ret = bch2_disk_accounting_mod(trans, &acct_compression_key, compression_acct,
ARRAY_SIZE(compression_acct), gc);
if (ret) if (ret)
return ret; return ret;
} }
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "btree_update.h" #include "btree_update.h"
#include "btree_write_buffer.h" #include "btree_write_buffer.h"
#include "buckets.h" #include "buckets.h"
#include "compress.h"
#include "disk_accounting.h" #include "disk_accounting.h"
#include "error.h" #include "error.h"
#include "journal_io.h" #include "journal_io.h"
...@@ -142,6 +143,9 @@ void bch2_accounting_key_to_text(struct printbuf *out, struct disk_accounting_po ...@@ -142,6 +143,9 @@ void bch2_accounting_key_to_text(struct printbuf *out, struct disk_accounting_po
prt_printf(out, "dev=%u data_type=", k->dev_data_type.dev); prt_printf(out, "dev=%u data_type=", k->dev_data_type.dev);
bch2_prt_data_type(out, k->dev_data_type.data_type); bch2_prt_data_type(out, k->dev_data_type.data_type);
break; break;
case BCH_DISK_ACCOUNTING_compression:
bch2_prt_compression_type(out, k->compression.type);
break;
} }
} }
......
...@@ -99,7 +99,8 @@ static inline bool data_type_is_hidden(enum bch_data_type type) ...@@ -99,7 +99,8 @@ static inline bool data_type_is_hidden(enum bch_data_type type)
x(nr_inodes, 0) \ x(nr_inodes, 0) \
x(persistent_reserved, 1) \ x(persistent_reserved, 1) \
x(replicas, 2) \ x(replicas, 2) \
x(dev_data_type, 3) x(dev_data_type, 3) \
x(compression, 4)
enum disk_accounting_type { enum disk_accounting_type {
#define x(f, nr) BCH_DISK_ACCOUNTING_##f = nr, #define x(f, nr) BCH_DISK_ACCOUNTING_##f = nr,
...@@ -124,6 +125,10 @@ struct bch_dev_stripe_buckets { ...@@ -124,6 +125,10 @@ struct bch_dev_stripe_buckets {
__u8 dev; __u8 dev;
}; };
struct bch_acct_compression {
__u8 type;
};
struct disk_accounting_pos { struct disk_accounting_pos {
union { union {
struct { struct {
...@@ -134,6 +139,7 @@ struct disk_accounting_pos { ...@@ -134,6 +139,7 @@ struct disk_accounting_pos {
struct bch_replicas_entry_v1 replicas; struct bch_replicas_entry_v1 replicas;
struct bch_dev_data_type dev_data_type; struct bch_dev_data_type dev_data_type;
struct bch_dev_stripe_buckets dev_stripe_buckets; struct bch_dev_stripe_buckets dev_stripe_buckets;
struct bch_acct_compression compression;
}; };
}; };
struct bpos _pad; struct bpos _pad;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment