mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 02:49:32 +03:00
Tinker with slop space accounting with dedup
* Tinker with slop space accounting with dedup Do not include the deduplicated space usage in the slop space reservation, it leads to surprising outcomes. * Update spa_dedup_dspace sometimes Sometimes, we get into spa_get_slop_space() with spa_dedup_dspace=~0ULL, AKA "unset", while spa_dspace is correctly set. So call the code to update it before we use it if we hit that case. Reviewed-by: Matthew Ahrens <mahrens@delphix.com> Reviewed-by: Mark Maybee <mark.maybee@delphix.com> Signed-off-by: Rich Ercolani <rincebrain@gmail.com> Closes #12271
This commit is contained in:
parent
f7de776da2
commit
1325434b2d
@ -503,7 +503,7 @@ ddt_get_dedup_histogram(spa_t *spa, ddt_histogram_t *ddh)
|
|||||||
{
|
{
|
||||||
for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
|
for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
|
||||||
ddt_t *ddt = spa->spa_ddt[c];
|
ddt_t *ddt = spa->spa_ddt[c];
|
||||||
for (enum ddt_type type = 0; type < DDT_TYPES; type++) {
|
for (enum ddt_type type = 0; type < DDT_TYPES && ddt; type++) {
|
||||||
for (enum ddt_class class = 0; class < DDT_CLASSES;
|
for (enum ddt_class class = 0; class < DDT_CLASSES;
|
||||||
class++) {
|
class++) {
|
||||||
ddt_histogram_add(ddh,
|
ddt_histogram_add(ddh,
|
||||||
|
@ -1786,8 +1786,22 @@ spa_get_worst_case_asize(spa_t *spa, uint64_t lsize)
|
|||||||
uint64_t
|
uint64_t
|
||||||
spa_get_slop_space(spa_t *spa)
|
spa_get_slop_space(spa_t *spa)
|
||||||
{
|
{
|
||||||
uint64_t space = spa_get_dspace(spa);
|
uint64_t space = 0;
|
||||||
uint64_t slop = MIN(space >> spa_slop_shift, spa_max_slop);
|
uint64_t slop = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure spa_dedup_dspace has been set.
|
||||||
|
*/
|
||||||
|
if (spa->spa_dedup_dspace == ~0ULL)
|
||||||
|
spa_update_dspace(spa);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* spa_get_dspace() includes the space only logically "used" by
|
||||||
|
* deduplicated data, so since it's not useful to reserve more
|
||||||
|
* space with more deduplicated data, we subtract that out here.
|
||||||
|
*/
|
||||||
|
space = spa_get_dspace(spa) - spa->spa_dedup_dspace;
|
||||||
|
slop = MIN(space >> spa_slop_shift, spa_max_slop);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Subtract the embedded log space, but no more than half the (3.2%)
|
* Subtract the embedded log space, but no more than half the (3.2%)
|
||||||
|
Loading…
Reference in New Issue
Block a user