Commit 91f44781 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Convert bch2_compression_stats_to_text() to new accounting



We no longer have to walk the whole btree to calculate compression
stats.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent bfcaa907
Loading
Loading
Loading
Loading
+19 −67
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include "buckets.h"
#include "clock.h"
#include "compress.h"
#include "disk_accounting.h"
#include "disk_groups.h"
#include "ec.h"
#include "inode.h"
@@ -255,91 +256,42 @@ static size_t bch2_btree_cache_size(struct bch_fs *c)

static int bch2_compression_stats_to_text(struct printbuf *out, struct bch_fs *c)
{
	struct btree_trans *trans;
	enum btree_id id;
	struct compression_type_stats {
		u64		nr_extents;
		u64		sectors_compressed;
		u64		sectors_uncompressed;
	} s[BCH_COMPRESSION_TYPE_NR];
	u64 compressed_incompressible = 0;
	int ret = 0;

	memset(s, 0, sizeof(s));

	if (!test_bit(BCH_FS_started, &c->flags))
		return -EPERM;

	trans = bch2_trans_get(c);

	for (id = 0; id < BTREE_ID_NR; id++) {
		if (!btree_type_has_ptrs(id))
			continue;

		ret = for_each_btree_key(trans, iter, id, POS_MIN,
					 BTREE_ITER_all_snapshots, k, ({
			struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(k);
			struct bch_extent_crc_unpacked crc;
			const union bch_extent_entry *entry;
			bool compressed = false, incompressible = false;

			bkey_for_each_crc(k.k, ptrs, crc, entry) {
				incompressible	|= crc.compression_type == BCH_COMPRESSION_TYPE_incompressible;
				compressed	|= crc_is_compressed(crc);

				if (crc_is_compressed(crc)) {
					s[crc.compression_type].nr_extents++;
					s[crc.compression_type].sectors_compressed += crc.compressed_size;
					s[crc.compression_type].sectors_uncompressed += crc.uncompressed_size;
				}
			}

			compressed_incompressible += compressed && incompressible;

			if (!compressed) {
				unsigned t = incompressible ? BCH_COMPRESSION_TYPE_incompressible : 0;

				s[t].nr_extents++;
				s[t].sectors_compressed += k.k->size;
				s[t].sectors_uncompressed += k.k->size;
			}
			0;
		}));
	}

	bch2_trans_put(trans);

	if (ret)
		return ret;

	prt_str(out, "type");
	printbuf_tabstop_push(out, 12);
	printbuf_tabstop_push(out, 16);
	printbuf_tabstop_push(out, 16);
	printbuf_tabstop_push(out, 24);
	prt_printf(out, "type\tcompressed\runcompressed\raverage extent size\r\n");

	for (unsigned i = 0; i < ARRAY_SIZE(s); i++) {
	for (unsigned i = 1; i < BCH_COMPRESSION_TYPE_NR; i++) {
		struct disk_accounting_pos a = {
			.type			= BCH_DISK_ACCOUNTING_compression,
			.compression.type	= i,
		};
		struct bpos p = disk_accounting_pos_to_bpos(&a);
		u64 v[3];
		bch2_accounting_mem_read(c, p, v, ARRAY_SIZE(v));

		u64 nr_extents			= v[0];
		u64 sectors_uncompressed	= v[1];
		u64 sectors_compressed		= v[2];

		bch2_prt_compression_type(out, i);
		prt_tab(out);

		prt_human_readable_u64(out, s[i].sectors_compressed << 9);
		prt_human_readable_u64(out, sectors_compressed << 9);
		prt_tab_rjust(out);

		prt_human_readable_u64(out, s[i].sectors_uncompressed << 9);
		prt_human_readable_u64(out, sectors_uncompressed << 9);
		prt_tab_rjust(out);

		prt_human_readable_u64(out, s[i].nr_extents
				       ? div_u64(s[i].sectors_uncompressed << 9, s[i].nr_extents)
		prt_human_readable_u64(out, nr_extents
				       ? div_u64(sectors_uncompressed << 9, nr_extents)
				       : 0);
		prt_tab_rjust(out);
		prt_newline(out);
	}

	if (compressed_incompressible) {
		prt_printf(out, "%llu compressed & incompressible extents", compressed_incompressible);
		prt_newline(out);
	}

	return 0;
}