Skip to content

Commit fe1ecbc

Browse files
amotinpcd1193182
authored andcommitted
Backport of Fix available space accounting for special/dedup (#18222)
Sponsored-by: Klara, Inc. Sponsored-by: OSNexus
1 parent e6befb8 commit fe1ecbc

File tree

6 files changed

+62
-32
lines changed

6 files changed

+62
-32
lines changed

include/sys/metaslab.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ boolean_t metaslab_class_throttle_reserve(metaslab_class_t *, int, int,
112112
void metaslab_class_throttle_unreserve(metaslab_class_t *, int, int, zio_t *);
113113
void metaslab_class_evict_old(metaslab_class_t *, uint64_t);
114114
uint64_t metaslab_class_get_alloc(metaslab_class_t *);
115+
uint64_t metaslab_class_get_dalloc(metaslab_class_t *);
115116
uint64_t metaslab_class_get_space(metaslab_class_t *);
116117
uint64_t metaslab_class_get_dspace(metaslab_class_t *);
117118
uint64_t metaslab_class_get_deferred(metaslab_class_t *);
118119

119-
void metaslab_space_update(vdev_t *, metaslab_class_t *,
120-
int64_t, int64_t, int64_t);
120+
void metaslab_space_update(metaslab_group_t *, int64_t, int64_t, int64_t);
121121

122122
metaslab_group_t *metaslab_group_create(metaslab_class_t *, vdev_t *, int);
123123
void metaslab_group_destroy(metaslab_group_t *);

include/sys/metaslab_impl.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,12 @@ struct metaslab_class {
196196

197197
uint64_t mc_alloc_groups; /* # of allocatable groups */
198198

199-
uint64_t mc_alloc; /* total allocated space */
200-
uint64_t mc_deferred; /* total deferred frees */
199+
uint64_t mc_alloc; /* allocated space */
200+
uint64_t mc_dalloc; /* deflated allocated space */
201+
uint64_t mc_deferred; /* deferred frees */
202+
uint64_t mc_ddeferred; /* deflated deferred frees */
201203
uint64_t mc_space; /* total space (alloc + free) */
202-
uint64_t mc_dspace; /* total deflated space */
204+
uint64_t mc_dspace; /* deflated total space */
203205
uint64_t mc_histogram[RANGE_TREE_HISTOGRAM_SIZE];
204206

205207
/*

module/zfs/metaslab.c

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -433,10 +433,12 @@ metaslab_class_destroy(metaslab_class_t *mc)
433433
{
434434
spa_t *spa = mc->mc_spa;
435435

436-
ASSERT(mc->mc_alloc == 0);
437-
ASSERT(mc->mc_deferred == 0);
438-
ASSERT(mc->mc_space == 0);
439-
ASSERT(mc->mc_dspace == 0);
436+
ASSERT0(mc->mc_alloc);
437+
ASSERT0(mc->mc_dalloc);
438+
ASSERT0(mc->mc_deferred);
439+
ASSERT0(mc->mc_ddeferred);
440+
ASSERT0(mc->mc_space);
441+
ASSERT0(mc->mc_dspace);
440442

441443
for (int i = 0; i < spa->spa_alloc_count; i++) {
442444
metaslab_class_allocator_t *mca = &mc->mc_allocator[i];
@@ -477,36 +479,48 @@ metaslab_class_validate(metaslab_class_t *mc)
477479

478480
static void
479481
metaslab_class_space_update(metaslab_class_t *mc, int64_t alloc_delta,
480-
int64_t defer_delta, int64_t space_delta, int64_t dspace_delta)
482+
int64_t dalloc_delta, int64_t deferred_delta, int64_t ddeferred_delta,
483+
int64_t space_delta, int64_t dspace_delta)
481484
{
482485
atomic_add_64(&mc->mc_alloc, alloc_delta);
483-
atomic_add_64(&mc->mc_deferred, defer_delta);
486+
atomic_add_64(&mc->mc_dalloc, dalloc_delta);
487+
atomic_add_64(&mc->mc_deferred, deferred_delta);
488+
atomic_add_64(&mc->mc_ddeferred, ddeferred_delta);
484489
atomic_add_64(&mc->mc_space, space_delta);
485490
atomic_add_64(&mc->mc_dspace, dspace_delta);
486491
}
487492

488493
uint64_t
489494
metaslab_class_get_alloc(metaslab_class_t *mc)
490495
{
491-
return (mc->mc_alloc);
496+
return (atomic_load_64(&mc->mc_alloc));
497+
}
498+
499+
uint64_t
500+
metaslab_class_get_dalloc(metaslab_class_t *mc)
501+
{
502+
return (spa_deflate(mc->mc_spa) ? atomic_load_64(&mc->mc_dalloc) :
503+
atomic_load_64(&mc->mc_alloc));
492504
}
493505

494506
uint64_t
495507
metaslab_class_get_deferred(metaslab_class_t *mc)
496508
{
497-
return (mc->mc_deferred);
509+
return (spa_deflate(mc->mc_spa) ? atomic_load_64(&mc->mc_ddeferred) :
510+
atomic_load_64(&mc->mc_deferred));
498511
}
499512

500513
uint64_t
501514
metaslab_class_get_space(metaslab_class_t *mc)
502515
{
503-
return (mc->mc_space);
516+
return (atomic_load_64(&mc->mc_space));
504517
}
505518

506519
uint64_t
507520
metaslab_class_get_dspace(metaslab_class_t *mc)
508521
{
509-
return (spa_deflate(mc->mc_spa) ? mc->mc_dspace : mc->mc_space);
522+
return (spa_deflate(mc->mc_spa) ? atomic_load_64(&mc->mc_dspace) :
523+
atomic_load_64(&mc->mc_space));
510524
}
511525

512526
void
@@ -2631,16 +2645,21 @@ metaslab_set_selected_txg(metaslab_t *msp, uint64_t txg)
26312645
}
26322646

26332647
void
2634-
metaslab_space_update(vdev_t *vd, metaslab_class_t *mc, int64_t alloc_delta,
2648+
metaslab_space_update(metaslab_group_t *mg, int64_t alloc_delta,
26352649
int64_t defer_delta, int64_t space_delta)
26362650
{
2651+
vdev_t *vd = mg->mg_vd;
2652+
int64_t dalloc_delta = vdev_deflated_space(vd, alloc_delta);
2653+
int64_t ddefer_delta = vdev_deflated_space(vd, defer_delta);
2654+
int64_t dspace_delta = vdev_deflated_space(vd, space_delta);
2655+
26372656
vdev_space_update(vd, alloc_delta, defer_delta, space_delta);
26382657

26392658
ASSERT3P(vd->vdev_spa->spa_root_vdev, ==, vd->vdev_parent);
26402659
ASSERT(vd->vdev_ms_count != 0);
26412660

2642-
metaslab_class_space_update(mc, alloc_delta, defer_delta, space_delta,
2643-
vdev_deflated_space(vd, space_delta));
2661+
metaslab_class_space_update(mg->mg_class, alloc_delta, dalloc_delta,
2662+
defer_delta, ddefer_delta, space_delta, dspace_delta);
26442663
}
26452664

26462665
int
@@ -2738,8 +2757,7 @@ metaslab_init(metaslab_group_t *mg, uint64_t id, uint64_t object,
27382757
*/
27392758
if (txg <= TXG_INITIAL) {
27402759
metaslab_sync_done(ms, 0);
2741-
metaslab_space_update(vd, mg->mg_class,
2742-
metaslab_allocated_space(ms), 0, 0);
2760+
metaslab_space_update(mg, metaslab_allocated_space(ms), 0, 0);
27432761
}
27442762

27452763
if (txg != 0) {
@@ -2801,9 +2819,8 @@ metaslab_fini(metaslab_t *msp)
28012819
* subtracted.
28022820
*/
28032821
if (!msp->ms_new) {
2804-
metaslab_space_update(vd, mg->mg_class,
2805-
-metaslab_allocated_space(msp), 0, -msp->ms_size);
2806-
2822+
metaslab_space_update(mg, -metaslab_allocated_space(msp), 0,
2823+
-msp->ms_size);
28072824
}
28082825
space_map_close(msp->ms_sm);
28092826
msp->ms_sm = NULL;
@@ -4290,7 +4307,7 @@ metaslab_sync_done(metaslab_t *msp, uint64_t txg)
42904307

42914308
if (msp->ms_new) {
42924309
/* this is a new metaslab, add its capacity to the vdev */
4293-
metaslab_space_update(vd, mg->mg_class, 0, 0, msp->ms_size);
4310+
metaslab_space_update(mg, 0, 0, msp->ms_size);
42944311

42954312
/* there should be no allocations nor frees at this point */
42964313
VERIFY0(msp->ms_allocated_this_txg);
@@ -4318,8 +4335,7 @@ metaslab_sync_done(metaslab_t *msp, uint64_t txg)
43184335
} else {
43194336
defer_delta -= range_tree_space(*defer_tree);
43204337
}
4321-
metaslab_space_update(vd, mg->mg_class, alloc_delta + defer_delta,
4322-
defer_delta, 0);
4338+
metaslab_space_update(mg, alloc_delta + defer_delta, defer_delta, 0);
43234339

43244340
if (spa_syncing_log_sm(spa) == NULL) {
43254341
/*
@@ -5253,8 +5269,16 @@ metaslab_alloc_dva(spa_t *spa, metaslab_class_t *mc, uint64_t psize,
52535269
*/
52545270
if (mca->mca_aliquot == 0 && metaslab_bias_enabled) {
52555271
vdev_stat_t *vs = &vd->vdev_stat;
5256-
int64_t vs_free = vs->vs_space - vs->vs_alloc;
5257-
int64_t mc_free = mc->mc_space - mc->mc_alloc;
5272+
uint64_t vs_space =
5273+
atomic_load_64(&vs->vs_space);
5274+
uint64_t mc_space =
5275+
atomic_load_64(&mc->mc_space);
5276+
uint64_t mc_alloc =
5277+
atomic_load_64(&mc->mc_alloc);
5278+
uint64_t vs_alloc =
5279+
atomic_load_64(&vs->vs_alloc);
5280+
int64_t vs_free = vs_space - vs_alloc;
5281+
int64_t mc_free = mc_space - mc_alloc;
52585282
int64_t ratio;
52595283

52605284
/*

module/zfs/spa.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6349,6 +6349,7 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
63496349
spa->spa_removing_phys.sr_removing_vdev = -1;
63506350
spa->spa_removing_phys.sr_prev_indirect_vdev = -1;
63516351
spa->spa_indirect_vdevs_loaded = B_TRUE;
6352+
spa->spa_deflate = (version >= SPA_VERSION_RAIDZ_DEFLATE);
63526353

63536354
/*
63546355
* Create "The Godfather" zio to hold all async IOs
@@ -6478,7 +6479,6 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
64786479

64796480
/* Newly created pools with the right version are always deflated. */
64806481
if (version >= SPA_VERSION_RAIDZ_DEFLATE) {
6481-
spa->spa_deflate = TRUE;
64826482
if (zap_add(spa->spa_meta_objset,
64836483
DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
64846484
sizeof (uint64_t), 1, &spa->spa_deflate, tx) != 0) {

module/zfs/spa_log_spacemap.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,10 +1253,9 @@ spa_ld_log_sm_data(spa_t *spa)
12531253
range_tree_space(m->ms_unflushed_allocs) -
12541254
range_tree_space(m->ms_unflushed_frees);
12551255

1256-
vdev_t *vd = m->ms_group->mg_vd;
1257-
metaslab_space_update(vd, m->ms_group->mg_class,
1256+
metaslab_space_update(m->ms_group,
12581257
range_tree_space(m->ms_unflushed_allocs), 0, 0);
1259-
metaslab_space_update(vd, m->ms_group->mg_class,
1258+
metaslab_space_update(m->ms_group,
12601259
-range_tree_space(m->ms_unflushed_frees), 0, 0);
12611260

12621261
ASSERT0(m->ms_weight & METASLAB_ACTIVE_MASK);

module/zfs/spa_misc.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1899,6 +1899,11 @@ spa_update_dspace(spa_t *spa)
18991899
ASSERT3U(spa->spa_dspace, >=, spa->spa_nonallocating_dspace);
19001900
spa->spa_dspace -= spa->spa_nonallocating_dspace;
19011901
}
1902+
spa->spa_dspace = spa->spa_dspace +
1903+
metaslab_class_get_dalloc(spa_special_class(spa)) +
1904+
metaslab_class_get_dalloc(spa_dedup_class(spa)) +
1905+
ddt_get_dedup_dspace(spa) +
1906+
brt_get_dspace(spa);
19021907
}
19031908

19041909
/*

0 commit comments

Comments
 (0)