Include class name into struct metaslab_class

With increasing number of metaslab classes it can be helpful for
debugging to know what we are looking at.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Rob Norris <rob.norris@klarasystems.com>
Signed-off-by:	Alexander Motin <mav@FreeBSD.org>
Sponsored by:	iXsystems, Inc.
Closes #17409
This commit is contained in:
Alexander Motin 2025-06-03 11:12:59 -04:00 committed by GitHub
parent 108562344c
commit 68817d28c5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 35 additions and 17 deletions

View File

@ -102,8 +102,8 @@ void metaslab_trace_move(zio_alloc_list_t *, zio_alloc_list_t *);
void metaslab_trace_init(zio_alloc_list_t *);
void metaslab_trace_fini(zio_alloc_list_t *);
metaslab_class_t *metaslab_class_create(spa_t *, const metaslab_ops_t *,
boolean_t);
metaslab_class_t *metaslab_class_create(spa_t *, const char *,
const metaslab_ops_t *, boolean_t);
void metaslab_class_destroy(metaslab_class_t *);
void metaslab_class_validate(metaslab_class_t *);
void metaslab_class_balance(metaslab_class_t *mc, boolean_t onsync);
@ -114,6 +114,7 @@ boolean_t metaslab_class_throttle_reserve(metaslab_class_t *, int, zio_t *,
boolean_t, boolean_t *);
boolean_t metaslab_class_throttle_unreserve(metaslab_class_t *, int, zio_t *);
void metaslab_class_evict_old(metaslab_class_t *, uint64_t);
const char *metaslab_class_get_name(metaslab_class_t *);
uint64_t metaslab_class_get_alloc(metaslab_class_t *);
uint64_t metaslab_class_get_space(metaslab_class_t *);
uint64_t metaslab_class_get_dspace(metaslab_class_t *);

View File

@ -181,7 +181,8 @@ typedef struct metaslab_class_allocator {
struct metaslab_class {
kmutex_t mc_lock;
spa_t *mc_spa;
const metaslab_ops_t *mc_ops;
const char *mc_name;
const metaslab_ops_t *mc_ops;
/*
* Track the number of metaslab groups that have been initialized

View File

@ -412,7 +412,8 @@ metaslab_stat_fini(void)
* ==========================================================================
*/
metaslab_class_t *
metaslab_class_create(spa_t *spa, const metaslab_ops_t *ops, boolean_t is_log)
metaslab_class_create(spa_t *spa, const char *name,
const metaslab_ops_t *ops, boolean_t is_log)
{
metaslab_class_t *mc;
@ -420,6 +421,7 @@ metaslab_class_create(spa_t *spa, const metaslab_ops_t *ops, boolean_t is_log)
mc_allocator[spa->spa_alloc_count]), KM_SLEEP);
mc->mc_spa = spa;
mc->mc_name = name;
mc->mc_ops = ops;
mc->mc_is_log = is_log;
mc->mc_alloc_io_size = SPA_OLD_MAXBLOCKSIZE;
@ -689,6 +691,12 @@ metaslab_class_space_update(metaslab_class_t *mc, int64_t alloc_delta,
atomic_add_64(&mc->mc_dspace, dspace_delta);
}
const char *
metaslab_class_get_name(metaslab_class_t *mc)
{
return (mc->mc_name);
}
uint64_t
metaslab_class_get_alloc(metaslab_class_t *mc)
{
@ -2631,7 +2639,7 @@ metaslab_load_impl(metaslab_t *msp)
ASSERT3U(max_size, <=, msp->ms_max_size);
hrtime_t load_end = gethrtime();
msp->ms_load_time = load_end;
zfs_dbgmsg("metaslab_load: txg %llu, spa %s, vdev_id %llu, "
zfs_dbgmsg("metaslab_load: txg %llu, spa %s, class %s, vdev_id %llu, "
"ms_id %llu, smp_length %llu, "
"unflushed_allocs %llu, unflushed_frees %llu, "
"freed %llu, defer %llu + %llu, unloaded time %llu ms, "
@ -2639,6 +2647,7 @@ metaslab_load_impl(metaslab_t *msp)
"max size error %lld, "
"old_weight %llx, new_weight %llx",
(u_longlong_t)spa_syncing_txg(spa), spa_name(spa),
msp->ms_group->mg_class->mc_name,
(u_longlong_t)msp->ms_group->mg_vd->vdev_id,
(u_longlong_t)msp->ms_id,
(u_longlong_t)space_map_length(msp->ms_sm),
@ -2744,11 +2753,12 @@ metaslab_unload(metaslab_t *msp)
multilist_sublist_unlock(mls);
spa_t *spa = msp->ms_group->mg_vd->vdev_spa;
zfs_dbgmsg("metaslab_unload: txg %llu, spa %s, vdev_id %llu, "
"ms_id %llu, weight %llx, "
zfs_dbgmsg("metaslab_unload: txg %llu, spa %s, class %s, "
"vdev_id %llu, ms_id %llu, weight %llx, "
"selected txg %llu (%llu s ago), alloc_txg %llu, "
"loaded %llu ms ago, max_size %llu",
(u_longlong_t)spa_syncing_txg(spa), spa_name(spa),
msp->ms_group->mg_class->mc_name,
(u_longlong_t)msp->ms_group->mg_vd->vdev_id,
(u_longlong_t)msp->ms_id,
(u_longlong_t)msp->ms_weight,

View File

@ -1687,11 +1687,15 @@ spa_activate(spa_t *spa, spa_mode_t mode)
spa->spa_mode = mode;
spa->spa_read_spacemaps = spa_mode_readable_spacemaps;
spa->spa_normal_class = metaslab_class_create(spa, msp, B_FALSE);
spa->spa_log_class = metaslab_class_create(spa, msp, B_TRUE);
spa->spa_embedded_log_class = metaslab_class_create(spa, msp, B_TRUE);
spa->spa_special_class = metaslab_class_create(spa, msp, B_FALSE);
spa->spa_dedup_class = metaslab_class_create(spa, msp, B_FALSE);
spa->spa_normal_class = metaslab_class_create(spa, "normal",
msp, B_FALSE);
spa->spa_log_class = metaslab_class_create(spa, "log", msp, B_TRUE);
spa->spa_embedded_log_class = metaslab_class_create(spa,
"embedded_log", msp, B_TRUE);
spa->spa_special_class = metaslab_class_create(spa, "special",
msp, B_FALSE);
spa->spa_dedup_class = metaslab_class_create(spa, "dedup",
msp, B_FALSE);
/* Try to create a covering process */
mutex_enter(&spa->spa_proc_lock);

View File

@ -4221,7 +4221,7 @@ again:
zfs_dbgmsg("%s[%llu]: %s class spilling, req size %llu, "
"%llu allocated of %llu",
spa_name(spa), (u_longlong_t)zio->io_txg,
mc == spa_dedup_class(spa) ? "dedup" : "special",
metaslab_class_get_name(mc),
(u_longlong_t)zio->io_size,
(u_longlong_t)metaslab_class_get_alloc(mc),
(u_longlong_t)metaslab_class_get_space(mc));
@ -4245,10 +4245,12 @@ again:
}
if (zfs_flags & ZFS_DEBUG_METASLAB_ALLOC) {
zfs_dbgmsg("%s: metaslab allocation failure, "
"trying fallback: zio %px, size %llu, error %d",
spa_name(spa), zio, (u_longlong_t)zio->io_size,
error);
zfs_dbgmsg("%s: metaslab allocation failure in %s "
"class, trying fallback to %s class: zio %px, "
"size %llu, error %d", spa_name(spa),
metaslab_class_get_name(mc),
metaslab_class_get_name(newmc),
zio, (u_longlong_t)zio->io_size, error);
}
zio->io_metaslab_class = mc = newmc;
ZIOSTAT_BUMP(ziostat_alloc_class_fallbacks);