mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +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
							
								
									61ae6c99f7
								
							
						
					
					
						commit
						ccf6d0a59b
					
				| @ -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, | ||||||
|  | |||||||
| @ -1789,8 +1789,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); | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Slop space should be at least spa_min_slop, but no more than half | 	 * Slop space should be at least spa_min_slop, but no more than half | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Rich Ercolani
						Rich Ercolani