Skip to content

Commit 0f54af6

Browse files
committed
add optional device argument
1 parent 4c7bca7 commit 0f54af6

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

bin/btrfs-blockgroup-report

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,19 @@ def parse_args():
4040
parser = argparse.ArgumentParser()
4141
parser.add_argument(
4242
'--usage',
43+
'-u',
4344
action="store_true",
4445
help="Print device blockgroup usage",
4546
)
4647
parser.add_argument(
4748
'mountpoint',
4849
help="Btrfs filesystem mountpoint",
4950
)
51+
parser.add_argument(
52+
'device',
53+
nargs='*',
54+
help="Only use specific devices (default include all)",
55+
)
5056
return parser.parse_args()
5157

5258

@@ -60,9 +66,17 @@ def safe_get_block_group(t):
6066

6167
def report_usage(args):
6268
with btrfs.FileSystem(args.mountpoint) as fs:
69+
fs_chunks = list(fs.chunks())
70+
6371
devices = fs.devices()
6472
devids = [d.devid for d in devices]
65-
fs_chunks = list(fs.chunks())
73+
if args.device:
74+
dev_infos = [fs.dev_info(id) for id in devids]
75+
selected_devids = []
76+
for dev in dev_infos:
77+
if any(d in (dev.path, dev.devid) for d in args.device):
78+
selected_devids.append(dev.devid)
79+
devids = selected_devids
6680

6781
print(args.mountpoint, '\t', fs.usage().virtual_used_str, '\t', len(fs_chunks), 'fs chunks')
6882
for devid in devids:
@@ -103,9 +117,9 @@ def report_usage(args):
103117
stats = chunk_stats[data_flag]
104118

105119
print('\t', data_flag)
106-
print('\t' * 2, 'Blockgroups at least partially on disk:', stats['count'])
107-
print('\t' * 2, 'Data-device dependance:', pretty_size(stats['size_used']))
108-
print('\t' * 2, 'Approx. blockgroup percentage packed:')
120+
print('\t' * 2, 'Data-device dependence:', pretty_size(stats['size_used']))
121+
print('\t' * 2, 'Total blockgroups:', stats['count'])
122+
print('\t' * 2, 'Blockgroup packing:')
109123

110124
grouped_stats = {}
111125
for percent in stats['percent_used']:
@@ -115,13 +129,9 @@ def report_usage(args):
115129
else:
116130
grouped_stats[group] = 1
117131

118-
min_count = min(count for _group, count in grouped_stats.items())
119132
max_count = max(count for _group, count in grouped_stats.items())
120133
for group, count in sorted(grouped_stats.items()):
121-
try:
122-
scaled_count = int(60 * (count - min_count) / (max_count - min_count))
123-
except ZeroDivisionError:
124-
scaled_count = 1
134+
scaled_count = int(60 * count / max_count) if max_count > 60 else count
125135
print(
126136
'\t' * 2,
127137
f' {str(group).rjust(3)}% packed',

0 commit comments

Comments
 (0)