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
90149552b1
commit
6d9bc3ec9f
|
@ -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