Skip to content

Commit 29d55c7

Browse files
author
Ryan Moeller
committed
Add zpool properties for allocation class space
The existing zpool properties accounting pool space (size, allocated, fragmentation, expandsize, free, capacity) are based on the normal metaslab class or are cumulative properties of several classes combined. Add properties reporting the space accounting metrics for each metaslab class individually. Also introduce pool-wide AVAIL, USABLE, and USED properties reporting values corresponding to FREE, SIZE, and ALLOC deflated for raidz. Update ZTS to recognize the new properties and validate reported values. While in zpool_get_parsable.cfg, add "fragmentation" to the list of parsable properties. Sponsored-by: Klara, Inc. Signed-off-by: Ryan Moeller <ryan.moeller@klarasystems.com>
1 parent edb7d63 commit 29d55c7

File tree

14 files changed

+1042
-35
lines changed

14 files changed

+1042
-35
lines changed

cmd/zpool/zpool_main.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6960,7 +6960,19 @@ collect_vdev_prop(zpool_prop_t prop, uint64_t value, const char *str,
69606960

69616961
switch (prop) {
69626962
case ZPOOL_PROP_SIZE:
6963+
case ZPOOL_PROP_NORMAL_SIZE:
6964+
case ZPOOL_PROP_SPECIAL_SIZE:
6965+
case ZPOOL_PROP_DEDUP_SIZE:
6966+
case ZPOOL_PROP_LOG_SIZE:
6967+
case ZPOOL_PROP_ELOG_SIZE:
6968+
case ZPOOL_PROP_SELOG_SIZE:
69636969
case ZPOOL_PROP_EXPANDSZ:
6970+
case ZPOOL_PROP_NORMAL_EXPANDSZ:
6971+
case ZPOOL_PROP_SPECIAL_EXPANDSZ:
6972+
case ZPOOL_PROP_DEDUP_EXPANDSZ:
6973+
case ZPOOL_PROP_LOG_EXPANDSZ:
6974+
case ZPOOL_PROP_ELOG_EXPANDSZ:
6975+
case ZPOOL_PROP_SELOG_EXPANDSZ:
69646976
case ZPOOL_PROP_CHECKPOINT:
69656977
case ZPOOL_PROP_DEDUPRATIO:
69666978
case ZPOOL_PROP_DEDUPCACHED:
@@ -6971,6 +6983,12 @@ collect_vdev_prop(zpool_prop_t prop, uint64_t value, const char *str,
69716983
format);
69726984
break;
69736985
case ZPOOL_PROP_FRAGMENTATION:
6986+
case ZPOOL_PROP_NORMAL_FRAGMENTATION:
6987+
case ZPOOL_PROP_SPECIAL_FRAGMENTATION:
6988+
case ZPOOL_PROP_DEDUP_FRAGMENTATION:
6989+
case ZPOOL_PROP_LOG_FRAGMENTATION:
6990+
case ZPOOL_PROP_ELOG_FRAGMENTATION:
6991+
case ZPOOL_PROP_SELOG_FRAGMENTATION:
69746992
if (value == ZFS_FRAG_INVALID) {
69756993
(void) strlcpy(propval, "-", sizeof (propval));
69766994
} else if (format == ZFS_NICENUM_RAW) {
@@ -6982,6 +7000,12 @@ collect_vdev_prop(zpool_prop_t prop, uint64_t value, const char *str,
69827000
}
69837001
break;
69847002
case ZPOOL_PROP_CAPACITY:
7003+
case ZPOOL_PROP_NORMAL_CAPACITY:
7004+
case ZPOOL_PROP_SPECIAL_CAPACITY:
7005+
case ZPOOL_PROP_DEDUP_CAPACITY:
7006+
case ZPOOL_PROP_LOG_CAPACITY:
7007+
case ZPOOL_PROP_ELOG_CAPACITY:
7008+
case ZPOOL_PROP_SELOG_CAPACITY:
69857009
/* capacity value is in parts-per-10,000 (aka permyriad) */
69867010
if (format == ZFS_NICENUM_RAW)
69877011
(void) snprintf(propval, sizeof (propval), "%llu",

include/sys/fs/zfs.h

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,90 @@ typedef enum {
275275
ZPOOL_PROP_LAST_SCRUBBED_TXG,
276276
ZPOOL_PROP_DEDUPUSED,
277277
ZPOOL_PROP_DEDUPSAVED,
278+
ZPOOL_PROP_AVAILABLE,
279+
ZPOOL_PROP_USABLE,
280+
ZPOOL_PROP_USED,
281+
ZPOOL_PROP_NORMAL_SIZE,
282+
ZPOOL_PROP_NORMAL_CAPACITY,
283+
ZPOOL_PROP_NORMAL_FREE,
284+
ZPOOL_PROP_NORMAL_ALLOCATED,
285+
ZPOOL_PROP_NORMAL_AVAILABLE,
286+
ZPOOL_PROP_NORMAL_USABLE,
287+
ZPOOL_PROP_NORMAL_USED,
288+
ZPOOL_PROP_NORMAL_EXPANDSZ,
289+
ZPOOL_PROP_NORMAL_FRAGMENTATION,
290+
ZPOOL_PROP_SPECIAL_SIZE,
291+
ZPOOL_PROP_SPECIAL_CAPACITY,
292+
ZPOOL_PROP_SPECIAL_FREE,
293+
ZPOOL_PROP_SPECIAL_ALLOCATED,
294+
ZPOOL_PROP_SPECIAL_AVAILABLE,
295+
ZPOOL_PROP_SPECIAL_USABLE,
296+
ZPOOL_PROP_SPECIAL_USED,
297+
ZPOOL_PROP_SPECIAL_EXPANDSZ,
298+
ZPOOL_PROP_SPECIAL_FRAGMENTATION,
299+
ZPOOL_PROP_DEDUP_SIZE,
300+
ZPOOL_PROP_DEDUP_CAPACITY,
301+
ZPOOL_PROP_DEDUP_FREE,
302+
ZPOOL_PROP_DEDUP_ALLOCATED,
303+
ZPOOL_PROP_DEDUP_AVAILABLE,
304+
ZPOOL_PROP_DEDUP_USABLE,
305+
ZPOOL_PROP_DEDUP_USED,
306+
ZPOOL_PROP_DEDUP_EXPANDSZ,
307+
ZPOOL_PROP_DEDUP_FRAGMENTATION,
308+
ZPOOL_PROP_LOG_SIZE,
309+
ZPOOL_PROP_LOG_CAPACITY,
310+
ZPOOL_PROP_LOG_FREE,
311+
ZPOOL_PROP_LOG_ALLOCATED,
312+
ZPOOL_PROP_LOG_AVAILABLE,
313+
ZPOOL_PROP_LOG_USABLE,
314+
ZPOOL_PROP_LOG_USED,
315+
ZPOOL_PROP_LOG_EXPANDSZ,
316+
ZPOOL_PROP_LOG_FRAGMENTATION,
317+
ZPOOL_PROP_ELOG_SIZE,
318+
ZPOOL_PROP_ELOG_CAPACITY,
319+
ZPOOL_PROP_ELOG_FREE,
320+
ZPOOL_PROP_ELOG_ALLOCATED,
321+
ZPOOL_PROP_ELOG_AVAILABLE,
322+
ZPOOL_PROP_ELOG_USABLE,
323+
ZPOOL_PROP_ELOG_USED,
324+
ZPOOL_PROP_ELOG_EXPANDSZ,
325+
ZPOOL_PROP_ELOG_FRAGMENTATION,
326+
ZPOOL_PROP_SELOG_SIZE,
327+
ZPOOL_PROP_SELOG_CAPACITY,
328+
ZPOOL_PROP_SELOG_FREE,
329+
ZPOOL_PROP_SELOG_ALLOCATED,
330+
ZPOOL_PROP_SELOG_AVAILABLE,
331+
ZPOOL_PROP_SELOG_USABLE,
332+
ZPOOL_PROP_SELOG_USED,
333+
ZPOOL_PROP_SELOG_EXPANDSZ,
334+
ZPOOL_PROP_SELOG_FRAGMENTATION,
278335
ZPOOL_NUM_PROPS
279336
} zpool_prop_t;
280337

338+
/* Offsets for metaslab class properties. */
339+
typedef enum {
340+
ZPOOL_MC_PROP_SIZE,
341+
ZPOOL_MC_PROP_CAPACITY,
342+
ZPOOL_MC_PROP_FREE,
343+
ZPOOL_MC_PROP_ALLOCATED,
344+
ZPOOL_MC_PROP_AVAILABLE,
345+
ZPOOL_MC_PROP_USABLE,
346+
ZPOOL_MC_PROP_USED,
347+
ZPOOL_MC_PROP_EXPANDSZ,
348+
ZPOOL_MC_PROP_FRAGMENTATION,
349+
ZPOOL_NUM_MC_PROPS
350+
} zpool_mc_prop_t;
351+
352+
/* Offsets for metaslab class property groups. */
353+
typedef enum {
354+
ZPOOL_MC_PROPS_NORMAL = ZPOOL_PROP_NORMAL_SIZE,
355+
ZPOOL_MC_PROPS_SPECIAL = ZPOOL_PROP_SPECIAL_SIZE,
356+
ZPOOL_MC_PROPS_DEDUP = ZPOOL_PROP_DEDUP_SIZE,
357+
ZPOOL_MC_PROPS_LOG = ZPOOL_PROP_LOG_SIZE,
358+
ZPOOL_MC_PROPS_ELOG = ZPOOL_PROP_ELOG_SIZE,
359+
ZPOOL_MC_PROPS_SELOG = ZPOOL_PROP_SELOG_SIZE,
360+
} zpool_mc_props_t;
361+
281362
/* Small enough to not hog a whole line of printout in zpool(8). */
282363
#define ZPROP_MAX_COMMENT 32
283364
#define ZPROP_BOOLEAN_NA 2

lib/libzfs/libzfs.abi

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3372,7 +3372,64 @@
33723372
<enumerator name='ZPOOL_PROP_LAST_SCRUBBED_TXG' value='39'/>
33733373
<enumerator name='ZPOOL_PROP_DEDUPUSED' value='40'/>
33743374
<enumerator name='ZPOOL_PROP_DEDUPSAVED' value='41'/>
3375-
<enumerator name='ZPOOL_NUM_PROPS' value='42'/>
3375+
<enumerator name='ZPOOL_PROP_AVAILABLE' value='42'/>
3376+
<enumerator name='ZPOOL_PROP_USABLE' value='43'/>
3377+
<enumerator name='ZPOOL_PROP_USED' value='44'/>
3378+
<enumerator name='ZPOOL_PROP_NORMAL_SIZE' value='45'/>
3379+
<enumerator name='ZPOOL_PROP_NORMAL_CAPACITY' value='46'/>
3380+
<enumerator name='ZPOOL_PROP_NORMAL_FREE' value='47'/>
3381+
<enumerator name='ZPOOL_PROP_NORMAL_ALLOCATED' value='48'/>
3382+
<enumerator name='ZPOOL_PROP_NORMAL_AVAILABLE' value='49'/>
3383+
<enumerator name='ZPOOL_PROP_NORMAL_USABLE' value='50'/>
3384+
<enumerator name='ZPOOL_PROP_NORMAL_USED' value='51'/>
3385+
<enumerator name='ZPOOL_PROP_NORMAL_EXPANDSZ' value='52'/>
3386+
<enumerator name='ZPOOL_PROP_NORMAL_FRAGMENTATION' value='53'/>
3387+
<enumerator name='ZPOOL_PROP_SPECIAL_SIZE' value='54'/>
3388+
<enumerator name='ZPOOL_PROP_SPECIAL_CAPACITY' value='55'/>
3389+
<enumerator name='ZPOOL_PROP_SPECIAL_FREE' value='56'/>
3390+
<enumerator name='ZPOOL_PROP_SPECIAL_ALLOCATED' value='57'/>
3391+
<enumerator name='ZPOOL_PROP_SPECIAL_AVAILABLE' value='58'/>
3392+
<enumerator name='ZPOOL_PROP_SPECIAL_USABLE' value='59'/>
3393+
<enumerator name='ZPOOL_PROP_SPECIAL_USED' value='60'/>
3394+
<enumerator name='ZPOOL_PROP_SPECIAL_EXPANDSZ' value='61'/>
3395+
<enumerator name='ZPOOL_PROP_SPECIAL_FRAGMENTATION' value='62'/>
3396+
<enumerator name='ZPOOL_PROP_DEDUP_SIZE' value='63'/>
3397+
<enumerator name='ZPOOL_PROP_DEDUP_CAPACITY' value='64'/>
3398+
<enumerator name='ZPOOL_PROP_DEDUP_FREE' value='65'/>
3399+
<enumerator name='ZPOOL_PROP_DEDUP_ALLOCATED' value='66'/>
3400+
<enumerator name='ZPOOL_PROP_DEDUP_AVAILABLE' value='67'/>
3401+
<enumerator name='ZPOOL_PROP_DEDUP_USABLE' value='68'/>
3402+
<enumerator name='ZPOOL_PROP_DEDUP_USED' value='69'/>
3403+
<enumerator name='ZPOOL_PROP_DEDUP_EXPANDSZ' value='70'/>
3404+
<enumerator name='ZPOOL_PROP_DEDUP_FRAGMENTATION' value='71'/>
3405+
<enumerator name='ZPOOL_PROP_LOG_SIZE' value='72'/>
3406+
<enumerator name='ZPOOL_PROP_LOG_CAPACITY' value='73'/>
3407+
<enumerator name='ZPOOL_PROP_LOG_FREE' value='74'/>
3408+
<enumerator name='ZPOOL_PROP_LOG_ALLOCATED' value='75'/>
3409+
<enumerator name='ZPOOL_PROP_LOG_AVAILABLE' value='76'/>
3410+
<enumerator name='ZPOOL_PROP_LOG_USABLE' value='77'/>
3411+
<enumerator name='ZPOOL_PROP_LOG_USED' value='78'/>
3412+
<enumerator name='ZPOOL_PROP_LOG_EXPANDSZ' value='79'/>
3413+
<enumerator name='ZPOOL_PROP_LOG_FRAGMENTATION' value='80'/>
3414+
<enumerator name='ZPOOL_PROP_ELOG_SIZE' value='81'/>
3415+
<enumerator name='ZPOOL_PROP_ELOG_CAPACITY' value='82'/>
3416+
<enumerator name='ZPOOL_PROP_ELOG_FREE' value='83'/>
3417+
<enumerator name='ZPOOL_PROP_ELOG_ALLOCATED' value='84'/>
3418+
<enumerator name='ZPOOL_PROP_ELOG_AVAILABLE' value='85'/>
3419+
<enumerator name='ZPOOL_PROP_ELOG_USABLE' value='86'/>
3420+
<enumerator name='ZPOOL_PROP_ELOG_USED' value='87'/>
3421+
<enumerator name='ZPOOL_PROP_ELOG_EXPANDSZ' value='88'/>
3422+
<enumerator name='ZPOOL_PROP_ELOG_FRAGMENTATION' value='89'/>
3423+
<enumerator name='ZPOOL_PROP_SELOG_SIZE' value='90'/>
3424+
<enumerator name='ZPOOL_PROP_SELOG_CAPACITY' value='91'/>
3425+
<enumerator name='ZPOOL_PROP_SELOG_FREE' value='92'/>
3426+
<enumerator name='ZPOOL_PROP_SELOG_ALLOCATED' value='93'/>
3427+
<enumerator name='ZPOOL_PROP_SELOG_AVAILABLE' value='94'/>
3428+
<enumerator name='ZPOOL_PROP_SELOG_USABLE' value='95'/>
3429+
<enumerator name='ZPOOL_PROP_SELOG_USED' value='96'/>
3430+
<enumerator name='ZPOOL_PROP_SELOG_EXPANDSZ' value='97'/>
3431+
<enumerator name='ZPOOL_PROP_SELOG_FRAGMENTATION' value='98'/>
3432+
<enumerator name='ZPOOL_NUM_PROPS' value='99'/>
33763433
</enum-decl>
33773434
<typedef-decl name='zpool_prop_t' type-id='af1ba157' id='5d0c23fb'/>
33783435
<typedef-decl name='regoff_t' type-id='95e97e5e' id='54a2a2a8'/>

lib/libzfs/libzfs_pool.c

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,47 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
370370
zfs_fallthrough;
371371

372372
case ZPOOL_PROP_SIZE:
373+
case ZPOOL_PROP_NORMAL_SIZE:
374+
case ZPOOL_PROP_SPECIAL_SIZE:
375+
case ZPOOL_PROP_DEDUP_SIZE:
376+
case ZPOOL_PROP_LOG_SIZE:
377+
case ZPOOL_PROP_ELOG_SIZE:
378+
case ZPOOL_PROP_SELOG_SIZE:
373379
case ZPOOL_PROP_ALLOCATED:
380+
case ZPOOL_PROP_NORMAL_ALLOCATED:
381+
case ZPOOL_PROP_SPECIAL_ALLOCATED:
382+
case ZPOOL_PROP_DEDUP_ALLOCATED:
383+
case ZPOOL_PROP_LOG_ALLOCATED:
384+
case ZPOOL_PROP_ELOG_ALLOCATED:
385+
case ZPOOL_PROP_SELOG_ALLOCATED:
386+
case ZPOOL_PROP_AVAILABLE:
387+
case ZPOOL_PROP_NORMAL_AVAILABLE:
388+
case ZPOOL_PROP_SPECIAL_AVAILABLE:
389+
case ZPOOL_PROP_DEDUP_AVAILABLE:
390+
case ZPOOL_PROP_LOG_AVAILABLE:
391+
case ZPOOL_PROP_ELOG_AVAILABLE:
392+
case ZPOOL_PROP_SELOG_AVAILABLE:
374393
case ZPOOL_PROP_FREE:
394+
case ZPOOL_PROP_NORMAL_FREE:
395+
case ZPOOL_PROP_SPECIAL_FREE:
396+
case ZPOOL_PROP_DEDUP_FREE:
397+
case ZPOOL_PROP_LOG_FREE:
398+
case ZPOOL_PROP_ELOG_FREE:
399+
case ZPOOL_PROP_SELOG_FREE:
400+
case ZPOOL_PROP_USABLE:
401+
case ZPOOL_PROP_NORMAL_USABLE:
402+
case ZPOOL_PROP_SPECIAL_USABLE:
403+
case ZPOOL_PROP_DEDUP_USABLE:
404+
case ZPOOL_PROP_LOG_USABLE:
405+
case ZPOOL_PROP_ELOG_USABLE:
406+
case ZPOOL_PROP_SELOG_USABLE:
407+
case ZPOOL_PROP_USED:
408+
case ZPOOL_PROP_NORMAL_USED:
409+
case ZPOOL_PROP_SPECIAL_USED:
410+
case ZPOOL_PROP_DEDUP_USED:
411+
case ZPOOL_PROP_LOG_USED:
412+
case ZPOOL_PROP_ELOG_USED:
413+
case ZPOOL_PROP_SELOG_USED:
375414
case ZPOOL_PROP_FREEING:
376415
case ZPOOL_PROP_LEAKED:
377416
case ZPOOL_PROP_ASHIFT:
@@ -391,6 +430,12 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
391430
break;
392431

393432
case ZPOOL_PROP_EXPANDSZ:
433+
case ZPOOL_PROP_NORMAL_EXPANDSZ:
434+
case ZPOOL_PROP_SPECIAL_EXPANDSZ:
435+
case ZPOOL_PROP_DEDUP_EXPANDSZ:
436+
case ZPOOL_PROP_LOG_EXPANDSZ:
437+
case ZPOOL_PROP_ELOG_EXPANDSZ:
438+
case ZPOOL_PROP_SELOG_EXPANDSZ:
394439
case ZPOOL_PROP_CHECKPOINT:
395440
if (intval == 0) {
396441
(void) strlcpy(buf, "-", len);
@@ -403,6 +448,12 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
403448
break;
404449

405450
case ZPOOL_PROP_CAPACITY:
451+
case ZPOOL_PROP_NORMAL_CAPACITY:
452+
case ZPOOL_PROP_SPECIAL_CAPACITY:
453+
case ZPOOL_PROP_DEDUP_CAPACITY:
454+
case ZPOOL_PROP_LOG_CAPACITY:
455+
case ZPOOL_PROP_ELOG_CAPACITY:
456+
case ZPOOL_PROP_SELOG_CAPACITY:
406457
if (literal) {
407458
(void) snprintf(buf, len, "%llu",
408459
(u_longlong_t)intval);
@@ -413,7 +464,13 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
413464
break;
414465

415466
case ZPOOL_PROP_FRAGMENTATION:
416-
if (intval == UINT64_MAX) {
467+
case ZPOOL_PROP_NORMAL_FRAGMENTATION:
468+
case ZPOOL_PROP_SPECIAL_FRAGMENTATION:
469+
case ZPOOL_PROP_DEDUP_FRAGMENTATION:
470+
case ZPOOL_PROP_LOG_FRAGMENTATION:
471+
case ZPOOL_PROP_ELOG_FRAGMENTATION:
472+
case ZPOOL_PROP_SELOG_FRAGMENTATION:
473+
if (intval == ZFS_FRAG_INVALID) {
417474
(void) strlcpy(buf, "-", len);
418475
} else if (literal) {
419476
(void) snprintf(buf, len, "%llu",

0 commit comments

Comments
 (0)