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:
Paul Dagnelie 2023-09-20 16:39:38 -07:00 committed by GitHub
parent 90149552b1
commit 6d9bc3ec9f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 6 additions and 4 deletions

View File

@ -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);