mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	raidz_test: respect wall time
When timeout is specified (-t), stop worker threads in the middle of work units. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Gvozden Neskovic <neskovic@gmail.com> Issue #5180 Closes #5190
This commit is contained in:
		
							parent
							
								
									2db28197fe
								
							
						
					
					
						commit
						292d573e70
					
				| @ -369,6 +369,10 @@ run_gen_check(raidz_test_opts_t *opts) | |||||||
| 
 | 
 | ||||||
| 		for (fn = 0; fn < RAIDZ_GEN_NUM; fn++) { | 		for (fn = 0; fn < RAIDZ_GEN_NUM; fn++) { | ||||||
| 
 | 
 | ||||||
|  | 			/* Check if should stop */ | ||||||
|  | 			if (rto_opts.rto_should_stop) | ||||||
|  | 				return (err); | ||||||
|  | 
 | ||||||
| 			/* create suitable raidz_map */ | 			/* create suitable raidz_map */ | ||||||
| 			rm_test = init_raidz_map(opts, &zio_test, fn+1); | 			rm_test = init_raidz_map(opts, &zio_test, fn+1); | ||||||
| 			VERIFY(rm_test); | 			VERIFY(rm_test); | ||||||
| @ -418,6 +422,10 @@ run_rec_check_impl(raidz_test_opts_t *opts, raidz_map_t *rm, const int fn) | |||||||
| 			if (x0 >= rm->rm_cols - raidz_parity(rm)) | 			if (x0 >= rm->rm_cols - raidz_parity(rm)) | ||||||
| 				continue; | 				continue; | ||||||
| 
 | 
 | ||||||
|  | 			/* Check if should stop */ | ||||||
|  | 			if (rto_opts.rto_should_stop) | ||||||
|  | 				return (err); | ||||||
|  | 
 | ||||||
| 			LOG(D_DEBUG, "[%d] ", x0); | 			LOG(D_DEBUG, "[%d] ", x0); | ||||||
| 
 | 
 | ||||||
| 			tgtidx[2] = x0 + raidz_parity(rm); | 			tgtidx[2] = x0 + raidz_parity(rm); | ||||||
| @ -442,6 +450,10 @@ run_rec_check_impl(raidz_test_opts_t *opts, raidz_map_t *rm, const int fn) | |||||||
| 				if (x1 >= rm->rm_cols - raidz_parity(rm)) | 				if (x1 >= rm->rm_cols - raidz_parity(rm)) | ||||||
| 					continue; | 					continue; | ||||||
| 
 | 
 | ||||||
|  | 				/* Check if should stop */ | ||||||
|  | 				if (rto_opts.rto_should_stop) | ||||||
|  | 					return (err); | ||||||
|  | 
 | ||||||
| 				LOG(D_DEBUG, "[%d %d] ", x0, x1); | 				LOG(D_DEBUG, "[%d %d] ", x0, x1); | ||||||
| 
 | 
 | ||||||
| 				tgtidx[1] = x0 + raidz_parity(rm); | 				tgtidx[1] = x0 + raidz_parity(rm); | ||||||
| @ -475,6 +487,10 @@ run_rec_check_impl(raidz_test_opts_t *opts, raidz_map_t *rm, const int fn) | |||||||
| 						rm->rm_cols - raidz_parity(rm)) | 						rm->rm_cols - raidz_parity(rm)) | ||||||
| 						continue; | 						continue; | ||||||
| 
 | 
 | ||||||
|  | 					/* Check if should stop */ | ||||||
|  | 					if (rto_opts.rto_should_stop) | ||||||
|  | 						return (err); | ||||||
|  | 
 | ||||||
| 					LOG(D_DEBUG, "[%d %d %d]", x0, x1, x2); | 					LOG(D_DEBUG, "[%d %d %d]", x0, x1, x2); | ||||||
| 
 | 
 | ||||||
| 					tgtidx[0] = x0 + raidz_parity(rm); | 					tgtidx[0] = x0 + raidz_parity(rm); | ||||||
| @ -620,20 +636,19 @@ sweep_thread(void *arg) | |||||||
| static int | static int | ||||||
| run_sweep(void) | run_sweep(void) | ||||||
| { | { | ||||||
| 	static const size_t dcols_v[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; | 	static const size_t dcols_v[] = { 1, 2, 3, 4, 5, 6, 7, 8, 12, 15, 16 }; | ||||||
| 	static const size_t ashift_v[] = { 9, 12 }; | 	static const size_t ashift_v[] = { 9, 12, 14 }; | ||||||
| 	static const size_t offset_cnt = 4; |  | ||||||
| 	static const size_t size_v[] = { 1 << 9, 21 * (1 << 9), 13 * (1 << 12), | 	static const size_t size_v[] = { 1 << 9, 21 * (1 << 9), 13 * (1 << 12), | ||||||
| 		1 << 17, (1 << 20) - (1 << 12), SPA_MAXBLOCKSIZE }; | 		1 << 17, (1 << 20) - (1 << 12), SPA_MAXBLOCKSIZE }; | ||||||
| 
 | 
 | ||||||
| 	(void) setvbuf(stdout, NULL, _IONBF, 0); | 	(void) setvbuf(stdout, NULL, _IONBF, 0); | ||||||
| 
 | 
 | ||||||
| 	ulong_t total_comb = ARRAY_SIZE(size_v) * ARRAY_SIZE(ashift_v) * | 	ulong_t total_comb = ARRAY_SIZE(size_v) * ARRAY_SIZE(ashift_v) * | ||||||
| 	    ARRAY_SIZE(dcols_v) * offset_cnt; | 	    ARRAY_SIZE(dcols_v); | ||||||
| 	ulong_t tried_comb = 0; | 	ulong_t tried_comb = 0; | ||||||
| 	hrtime_t time_diff, start_time = gethrtime(); | 	hrtime_t time_diff, start_time = gethrtime(); | ||||||
| 	raidz_test_opts_t *opts; | 	raidz_test_opts_t *opts; | ||||||
| 	int a, d, o, s; | 	int a, d, s; | ||||||
| 
 | 
 | ||||||
| 	max_free_slots = free_slots = MAX(2, boot_ncpus); | 	max_free_slots = free_slots = MAX(2, boot_ncpus); | ||||||
| 
 | 
 | ||||||
| @ -642,11 +657,9 @@ run_sweep(void) | |||||||
| 
 | 
 | ||||||
| 	for (s = 0; s < ARRAY_SIZE(size_v); s++) | 	for (s = 0; s < ARRAY_SIZE(size_v); s++) | ||||||
| 	for (a = 0; a < ARRAY_SIZE(ashift_v); a++) | 	for (a = 0; a < ARRAY_SIZE(ashift_v); a++) | ||||||
| 	for (o = 0; o < offset_cnt; o++) |  | ||||||
| 	for (d = 0; d < ARRAY_SIZE(dcols_v); d++) { | 	for (d = 0; d < ARRAY_SIZE(dcols_v); d++) { | ||||||
| 
 | 
 | ||||||
| 		if ((size_v[s] < (1 << ashift_v[a]) * o) || | 		if (size_v[s] < (1 << ashift_v[a])) { | ||||||
| 		    (size_v[s] < (1 << ashift_v[a]) * dcols_v[d])) { |  | ||||||
| 			total_comb--; | 			total_comb--; | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| @ -664,6 +677,7 @@ run_sweep(void) | |||||||
| 			if (rto_opts.rto_sweep_timeout > 0 && | 			if (rto_opts.rto_sweep_timeout > 0 && | ||||||
| 			    time_diff >= rto_opts.rto_sweep_timeout) { | 			    time_diff >= rto_opts.rto_sweep_timeout) { | ||||||
| 				sweep_state = SWEEP_TIMEOUT; | 				sweep_state = SWEEP_TIMEOUT; | ||||||
|  | 				rto_opts.rto_should_stop = B_TRUE; | ||||||
| 				mutex_exit(&sem_mtx); | 				mutex_exit(&sem_mtx); | ||||||
| 				goto exit; | 				goto exit; | ||||||
| 			} | 			} | ||||||
| @ -686,7 +700,7 @@ run_sweep(void) | |||||||
| 		opts = umem_zalloc(sizeof (raidz_test_opts_t), UMEM_NOFAIL); | 		opts = umem_zalloc(sizeof (raidz_test_opts_t), UMEM_NOFAIL); | ||||||
| 		opts->rto_ashift = ashift_v[a]; | 		opts->rto_ashift = ashift_v[a]; | ||||||
| 		opts->rto_dcols = dcols_v[d]; | 		opts->rto_dcols = dcols_v[d]; | ||||||
| 		opts->rto_offset = (1 << ashift_v[a]) * o; | 		opts->rto_offset = (1 << ashift_v[a]) * rand(); | ||||||
| 		opts->rto_dsize = size_v[s]; | 		opts->rto_dsize = size_v[s]; | ||||||
| 		opts->rto_v = 0; /* be quiet */ | 		opts->rto_v = 0; /* be quiet */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -49,6 +49,9 @@ typedef struct raidz_test_opts { | |||||||
| 	size_t rto_sanity; | 	size_t rto_sanity; | ||||||
| 	size_t rto_gdb; | 	size_t rto_gdb; | ||||||
| 
 | 
 | ||||||
|  | 	/* non-user options */ | ||||||
|  | 	boolean_t rto_should_stop; | ||||||
|  | 
 | ||||||
| 	zio_t *zio_golden; | 	zio_t *zio_golden; | ||||||
| 	raidz_map_t *rm_golden; | 	raidz_map_t *rm_golden; | ||||||
| } raidz_test_opts_t; | } raidz_test_opts_t; | ||||||
| @ -62,7 +65,8 @@ static const raidz_test_opts_t rto_opts_defaults = { | |||||||
| 	.rto_sweep = 0, | 	.rto_sweep = 0, | ||||||
| 	.rto_benchmark = 0, | 	.rto_benchmark = 0, | ||||||
| 	.rto_sanity = 0, | 	.rto_sanity = 0, | ||||||
| 	.rto_gdb = 0 | 	.rto_gdb = 0, | ||||||
|  | 	.rto_should_stop = B_FALSE | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| extern raidz_test_opts_t rto_opts; | extern raidz_test_opts_t rto_opts; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Gvozden Neskovic
						Gvozden Neskovic