Skip to content

Commit 95abbc7

Browse files
ihoroamotin
authored andcommitted
range_tree: Provide more debug details upon unexpected add/remove
Sponsored-by: Klara, Inc. Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Alexander Motin <[email protected]> Signed-off-by: Igor Ostapenko <[email protected]> Closes #17581
1 parent fc658b9 commit 95abbc7

File tree

13 files changed

+227
-87
lines changed

13 files changed

+227
-87
lines changed

cmd/zdb/zdb.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -619,8 +619,9 @@ livelist_metaslab_validate(spa_t *spa)
619619
metaslab_calculate_range_tree_type(vd, m,
620620
&start, &shift);
621621
metaslab_verify_t mv;
622-
mv.mv_allocated = zfs_range_tree_create(NULL,
623-
type, NULL, start, shift);
622+
mv.mv_allocated = zfs_range_tree_create_flags(
623+
NULL, type, NULL, start, shift,
624+
0, "livelist_metaslab_validate:mv_allocated");
624625
mv.mv_vdid = vd->vdev_id;
625626
mv.mv_msid = m->ms_id;
626627
mv.mv_start = m->ms_start;
@@ -6320,8 +6321,9 @@ zdb_claim_removing(spa_t *spa, zdb_cb_t *zcb)
63206321

63216322
ASSERT0(zfs_range_tree_space(svr->svr_allocd_segs));
63226323

6323-
zfs_range_tree_t *allocs = zfs_range_tree_create(NULL, ZFS_RANGE_SEG64,
6324-
NULL, 0, 0);
6324+
zfs_range_tree_t *allocs = zfs_range_tree_create_flags(
6325+
NULL, ZFS_RANGE_SEG64, NULL, 0, 0,
6326+
0, "zdb_claim_removing:allocs");
63256327
for (uint64_t msi = 0; msi < vd->vdev_ms_count; msi++) {
63266328
metaslab_t *msp = vd->vdev_ms[msi];
63276329

@@ -8449,8 +8451,9 @@ dump_zpool(spa_t *spa)
84498451

84508452
if (dump_opt['d'] || dump_opt['i']) {
84518453
spa_feature_t f;
8452-
mos_refd_objs = zfs_range_tree_create(NULL, ZFS_RANGE_SEG64,
8453-
NULL, 0, 0);
8454+
mos_refd_objs = zfs_range_tree_create_flags(
8455+
NULL, ZFS_RANGE_SEG64, NULL, 0, 0,
8456+
0, "dump_zpool:mos_refd_objs");
84548457
dump_objset(dp->dp_meta_objset);
84558458

84568459
if (dump_opt['d'] >= 3) {

include/sys/metaslab_impl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,8 @@ typedef struct metaslab_unflushed_phys {
568568
uint64_t msp_unflushed_txg;
569569
} metaslab_unflushed_phys_t;
570570

571+
char *metaslab_rt_name(metaslab_group_t *, metaslab_t *, const char *);
572+
571573
#ifdef __cplusplus
572574
}
573575
#endif

include/sys/range_tree.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ typedef enum zfs_range_seg_type {
4949
ZFS_RANGE_SEG_NUM_TYPES,
5050
} zfs_range_seg_type_t;
5151

52+
#define ZFS_RT_NAME(rt) (((rt)->rt_name != NULL) ? (rt)->rt_name : "")
53+
#define ZFS_RT_F_DYN_NAME (1ULL << 0) /* if rt_name must be freed */
54+
5255
/*
5356
* Note: the range_tree may not be accessed concurrently; consumers
5457
* must provide external locking if required.
@@ -68,6 +71,9 @@ typedef struct zfs_range_tree {
6871
void *rt_arg;
6972
uint64_t rt_gap; /* allowable inter-segment gap */
7073

74+
uint64_t rt_flags;
75+
const char *rt_name; /* details for debugging */
76+
7177
/*
7278
* The rt_histogram maintains a histogram of ranges. Each bucket,
7379
* rt_histogram[i], contains the number of ranges whose size is:
@@ -281,6 +287,9 @@ zfs_range_tree_t *zfs_range_tree_create_gap(const zfs_range_tree_ops_t *ops,
281287
uint64_t gap);
282288
zfs_range_tree_t *zfs_range_tree_create(const zfs_range_tree_ops_t *ops,
283289
zfs_range_seg_type_t type, void *arg, uint64_t start, uint64_t shift);
290+
zfs_range_tree_t *zfs_range_tree_create_flags(const zfs_range_tree_ops_t *ops,
291+
zfs_range_seg_type_t type, void *arg, uint64_t start, uint64_t shift,
292+
uint64_t flags, const char *name);
284293
void zfs_range_tree_destroy(zfs_range_tree_t *rt);
285294
boolean_t zfs_range_tree_contains(zfs_range_tree_t *rt, uint64_t start,
286295
uint64_t size);

include/sys/vdev_impl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,7 @@ uint64_t vdev_best_ashift(uint64_t logical, uint64_t a, uint64_t b);
651651
int param_get_raidz_impl(char *buf, zfs_kernel_param_t *kp);
652652
#endif
653653
int param_set_raidz_impl(ZFS_MODULE_PARAM_ARGS);
654+
char *vdev_rt_name(vdev_t *vd, const char *name);
654655

655656
/*
656657
* Vdev ashift optimization tunables

module/zfs/dnode.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,19 @@ int zfs_default_ibs = DN_MAX_INDBLKSHIFT;
8686
static kmem_cbrc_t dnode_move(void *, void *, size_t, void *);
8787
#endif /* _KERNEL */
8888

89+
static char *
90+
rt_name(dnode_t *dn, const char *name)
91+
{
92+
struct objset *os = dn->dn_objset;
93+
94+
return (kmem_asprintf("{spa=%s objset=%llu obj=%llu %s}",
95+
spa_name(os->os_spa),
96+
(u_longlong_t)(os->os_dsl_dataset ?
97+
os->os_dsl_dataset->ds_object : DMU_META_OBJSET),
98+
(u_longlong_t)dn->dn_object,
99+
name));
100+
}
101+
89102
static int
90103
dbuf_compare(const void *x1, const void *x2)
91104
{
@@ -2436,8 +2449,10 @@ dnode_free_range(dnode_t *dn, uint64_t off, uint64_t len, dmu_tx_t *tx)
24362449
{
24372450
int txgoff = tx->tx_txg & TXG_MASK;
24382451
if (dn->dn_free_ranges[txgoff] == NULL) {
2439-
dn->dn_free_ranges[txgoff] = zfs_range_tree_create(NULL,
2440-
ZFS_RANGE_SEG64, NULL, 0, 0);
2452+
dn->dn_free_ranges[txgoff] =
2453+
zfs_range_tree_create_flags(
2454+
NULL, ZFS_RANGE_SEG64, NULL, 0, 0,
2455+
ZFS_RT_F_DYN_NAME, rt_name(dn, "dn_free_ranges"));
24412456
}
24422457
zfs_range_tree_clear(dn->dn_free_ranges[txgoff], blkid, nblks);
24432458
zfs_range_tree_add(dn->dn_free_ranges[txgoff], blkid, nblks);

module/zfs/metaslab.c

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,16 @@ static metaslab_stats_t metaslab_stats = {
370370
#define METASLABSTAT_BUMP(stat) \
371371
atomic_inc_64(&metaslab_stats.stat.value.ui64);
372372

373+
char *
374+
metaslab_rt_name(metaslab_group_t *mg, metaslab_t *ms, const char *name)
375+
{
376+
return (kmem_asprintf("{spa=%s vdev_guid=%llu ms_id=%llu %s}",
377+
spa_name(mg->mg_vd->vdev_spa),
378+
(u_longlong_t)mg->mg_vd->vdev_guid,
379+
(u_longlong_t)ms->ms_id,
380+
name));
381+
}
382+
373383

374384
static kstat_t *metaslab_ksp;
375385

@@ -2757,30 +2767,43 @@ metaslab_init(metaslab_group_t *mg, uint64_t id, uint64_t object,
27572767
zfs_range_seg_type_t type =
27582768
metaslab_calculate_range_tree_type(vd, ms, &start, &shift);
27592769

2760-
ms->ms_allocatable = zfs_range_tree_create(NULL, type, NULL, start,
2761-
shift);
2770+
ms->ms_allocatable = zfs_range_tree_create_flags(
2771+
NULL, type, NULL, start, shift,
2772+
ZFS_RT_F_DYN_NAME, metaslab_rt_name(mg, ms, "ms_allocatable"));
27622773
for (int t = 0; t < TXG_SIZE; t++) {
2763-
ms->ms_allocating[t] = zfs_range_tree_create(NULL, type,
2764-
NULL, start, shift);
2765-
}
2766-
ms->ms_freeing = zfs_range_tree_create(NULL, type, NULL, start, shift);
2767-
ms->ms_freed = zfs_range_tree_create(NULL, type, NULL, start, shift);
2774+
ms->ms_allocating[t] = zfs_range_tree_create_flags(
2775+
NULL, type, NULL, start, shift,
2776+
ZFS_RT_F_DYN_NAME,
2777+
metaslab_rt_name(mg, ms, "ms_allocating"));
2778+
}
2779+
ms->ms_freeing = zfs_range_tree_create_flags(
2780+
NULL, type, NULL, start, shift,
2781+
ZFS_RT_F_DYN_NAME, metaslab_rt_name(mg, ms, "ms_freeing"));
2782+
ms->ms_freed = zfs_range_tree_create_flags(
2783+
NULL, type, NULL, start, shift,
2784+
ZFS_RT_F_DYN_NAME, metaslab_rt_name(mg, ms, "ms_freed"));
27682785
for (int t = 0; t < TXG_DEFER_SIZE; t++) {
2769-
ms->ms_defer[t] = zfs_range_tree_create(NULL, type, NULL,
2770-
start, shift);
2786+
ms->ms_defer[t] = zfs_range_tree_create_flags(
2787+
NULL, type, NULL, start, shift,
2788+
ZFS_RT_F_DYN_NAME, metaslab_rt_name(mg, ms, "ms_defer"));
27712789
}
2772-
ms->ms_checkpointing =
2773-
zfs_range_tree_create(NULL, type, NULL, start, shift);
2774-
ms->ms_unflushed_allocs =
2775-
zfs_range_tree_create(NULL, type, NULL, start, shift);
2790+
ms->ms_checkpointing = zfs_range_tree_create_flags(
2791+
NULL, type, NULL, start, shift,
2792+
ZFS_RT_F_DYN_NAME, metaslab_rt_name(mg, ms, "ms_checkpointing"));
2793+
ms->ms_unflushed_allocs = zfs_range_tree_create_flags(
2794+
NULL, type, NULL, start, shift,
2795+
ZFS_RT_F_DYN_NAME, metaslab_rt_name(mg, ms, "ms_unflushed_allocs"));
27762796

27772797
metaslab_rt_arg_t *mrap = kmem_zalloc(sizeof (*mrap), KM_SLEEP);
27782798
mrap->mra_bt = &ms->ms_unflushed_frees_by_size;
27792799
mrap->mra_floor_shift = metaslab_by_size_min_shift;
2780-
ms->ms_unflushed_frees = zfs_range_tree_create(&metaslab_rt_ops,
2781-
type, mrap, start, shift);
2800+
ms->ms_unflushed_frees = zfs_range_tree_create_flags(
2801+
&metaslab_rt_ops, type, mrap, start, shift,
2802+
ZFS_RT_F_DYN_NAME, metaslab_rt_name(mg, ms, "ms_unflushed_frees"));
27822803

2783-
ms->ms_trim = zfs_range_tree_create(NULL, type, NULL, start, shift);
2804+
ms->ms_trim = zfs_range_tree_create_flags(
2805+
NULL, type, NULL, start, shift,
2806+
ZFS_RT_F_DYN_NAME, metaslab_rt_name(mg, ms, "ms_trim"));
27842807

27852808
metaslab_group_add(mg, ms);
27862809
metaslab_set_fragmentation(ms, B_FALSE);
@@ -3754,7 +3777,10 @@ metaslab_condense(metaslab_t *msp, dmu_tx_t *tx)
37543777
type = metaslab_calculate_range_tree_type(msp->ms_group->mg_vd, msp,
37553778
&start, &shift);
37563779

3757-
condense_tree = zfs_range_tree_create(NULL, type, NULL, start, shift);
3780+
condense_tree = zfs_range_tree_create_flags(
3781+
NULL, type, NULL, start, shift,
3782+
ZFS_RT_F_DYN_NAME,
3783+
metaslab_rt_name(msp->ms_group, msp, "condense_tree"));
37583784

37593785
for (int t = 0; t < TXG_DEFER_SIZE; t++) {
37603786
zfs_range_tree_walk(msp->ms_defer[t],
@@ -3811,8 +3837,10 @@ metaslab_condense(metaslab_t *msp, dmu_tx_t *tx)
38113837
* followed by FREES (due to space_map_write() in metaslab_sync()) for
38123838
* sync pass 1.
38133839
*/
3814-
zfs_range_tree_t *tmp_tree = zfs_range_tree_create(NULL, type, NULL,
3815-
start, shift);
3840+
zfs_range_tree_t *tmp_tree = zfs_range_tree_create_flags(
3841+
NULL, type, NULL, start, shift,
3842+
ZFS_RT_F_DYN_NAME,
3843+
metaslab_rt_name(msp->ms_group, msp, "tmp_tree"));
38163844
zfs_range_tree_add(tmp_tree, msp->ms_start, msp->ms_size);
38173845
space_map_write(sm, tmp_tree, SM_ALLOC, SM_NO_VDEVID, tx);
38183846
space_map_write(sm, msp->ms_allocatable, SM_FREE, SM_NO_VDEVID, tx);

0 commit comments

Comments
 (0)