On 4/2/20 4:40 AM, Richard W.M. Jones wrote:
with your suggestion, we'd have:
initial try fails: retry 1: original error delay retry 1 fails: retry 2: original error delay retry 2 fails: could not recover after 2 retries
where we lost the log of the errno of retry 2.
It's not printed, but also it's not lost. do_retry will immediately return false, causing the called function to return this final errno (hopefully back to the client). The reason for printing the "original errno" was because those intermediate errnos would otherwise be lost.
Good point.
Attached is my suggested patch - it's a small evolution on top of yours. The output is now:
$ rm -f /tmp/inject ; (sleep 5s; touch /tmp/inject ) & ./nbdkit -f -v -U - null size=1G --filter=retry --filter=noextents --filter=error error-rate=100% error-file=/tmp/inject --filter=delay rdelay=1 retries=3 --run 'qemu-img convert $nbd /var/tmp/out.img'
nbdkit: null[1]: error: injecting EIO error into pread nbdkit: null[1]: debug: pread failed: original errno = 5 nbdkit: null[1]: debug: retry 1: waiting 2 seconds before retrying
nbdkit: null[1]: error: injecting EIO error into pread nbdkit: null[1]: debug: pread failed: original errno = 5 nbdkit: null[1]: debug: retry 2: waiting 4 seconds before retrying
nbdkit: null[1]: error: injecting EIO error into pread nbdkit: null[1]: debug: pread failed: original errno = 5 nbdkit: null[1]: debug: retry 3: waiting 8 seconds before retrying
nbdkit: null[1]: error: injecting EIO error into pread nbdkit: null[1]: debug: could not recover after 3 retries nbdkit: null[1]: debug: sending error reply: Input/output error
Yes, this is looking better. Let's go for it. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org