mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Fix occasional rsend test crashes
We have occasional crashes in the rsend tests. Debugging revealed that this is because the send_worker thread is getting EINTR from splice(). This happens when a non-fatal signal is received during the syscall. We should retry the syscall, rather than exiting failure. Tweak the loop to only break if the splice is finished or we receive a non-EINTR error. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> Signed-off-by: Paul Dagnelie <pcd@delphix.com> Closes #15273
This commit is contained in:
		
							parent
							
								
									3af63683fe
								
							
						
					
					
						commit
						729507d309
					
				| @ -650,10 +650,12 @@ send_worker(void *arg) | |||||||
| 	unsigned int bufsiz = max_pipe_buffer(ctx->from); | 	unsigned int bufsiz = max_pipe_buffer(ctx->from); | ||||||
| 	ssize_t rd; | 	ssize_t rd; | ||||||
| 
 | 
 | ||||||
| 	while ((rd = splice(ctx->from, NULL, ctx->to, NULL, bufsiz, | 	for (;;) { | ||||||
| 	    SPLICE_F_MOVE | SPLICE_F_MORE)) > 0) | 		rd = splice(ctx->from, NULL, ctx->to, NULL, bufsiz, | ||||||
| 		; | 		    SPLICE_F_MOVE | SPLICE_F_MORE); | ||||||
| 
 | 		if ((rd == -1 && errno != EINTR) || rd == 0) | ||||||
|  | 			break; | ||||||
|  | 	} | ||||||
| 	int err = (rd == -1) ? errno : 0; | 	int err = (rd == -1) ? errno : 0; | ||||||
| 	close(ctx->from); | 	close(ctx->from); | ||||||
| 	return ((void *)(uintptr_t)err); | 	return ((void *)(uintptr_t)err); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Paul Dagnelie
						Paul Dagnelie