[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for-6.2 v3 00/12] mirror: Handle errors after READY cancel
From: |
Max Reitz |
Subject: |
[PATCH for-6.2 v3 00/12] mirror: Handle errors after READY cancel |
Date: |
Fri, 6 Aug 2021 11:38:47 +0200 |
Hi,
v1 cover letter:
https://lists.nongnu.org/archive/html/qemu-block/2021-07/msg00705.html
v2 cover letter:
https://lists.nongnu.org/archive/html/qemu-block/2021-07/msg00747.html
Changes in v3:
- Patch 1: After adding patch 11, I got a failed assertion in
tests/unit/test-block-iothread (failing qemu_mutex_unlock_impl()).
That is because before patch 11, for zero-length source devices,
mirror clears .cancelled unconditionally before exiting. So even
force-cancelled jobs are considered to be completed normally, which
doesn’t seem quite right.
Anyway, test-block-iothread does some iothread switching, and
cancelling jobs is not really prepared for that. This patch fixes
that (I hope...).
- Patch 4: Split off from patch 5
- Patch 7:
- Added a long section in the commit message detailing every choice
for every job_is_cancelled() invocation
- Use job_cancel_requested() in the assertion in
job_completed_txn_abort(), because it is not quite clear whether
soft-cancelled mirror jobs can end up in this path (it seems like a
bug if that happens, but I think that’s something to fix in some
other series)
- Patch 8: Added: This is kind of preparation for patch 9, but also just
a bug fix in itself, I believe
- Patch 9: Moved the job_is_cancelled() check after the last yield point
before the mirror_iteration() call
- Patch 10: Added: If force-cancelled jobs should not generate new I/O
requests at all (except for forwarding something to the source
device), then we need to stop doing active mirroring once the mirror
job is force-cancelled
- Patch 11: Added: Clearing .cancelled seemed like a hack, so getting
rid of it seems like a good thing to do
(And only with this patch, I can assert that .force_cancel can only be
true when .cancelled is true also; if we tried it before this patch,
tests/unit/test-block-iothread would fail.)
The discussion around v2 has shown that there are probably more bugs in
the job code, but I think this series is becoming long enough that we
should tackle those in a different series.
git-backport-diff against v1:
Key:
[----] : patches are identical
[####] : number of functional differences between upstream/downstream patch
[down] : patch is downstream-only
The flags [FC] indicate (F)unctional and (C)ontextual differences, respectively
001/12:[down] 'job: Context changes in job_completed_txn_abort()'
002/12:[----] [--] 'mirror: Keep s->synced on error'
003/12:[----] [--] 'mirror: Drop s->synced'
004/12:[down] 'job: Force-cancel jobs in a failed transaction'
005/12:[0007] [FC] 'job: @force parameter for job_cancel_sync{,_all}()'
006/12:[----] [--] 'jobs: Give Job.force_cancel more meaning'
007/12:[0002] [FC] 'job: Add job_cancel_requested()'
008/12:[down] 'mirror: Use job_is_cancelled()'
009/12:[0007] [FC] 'mirror: Check job_is_cancelled() earlier'
010/12:[down] 'mirror: Stop active mirroring after force-cancel'
011/12:[down] 'mirror: Do not clear .cancelled'
012/12:[----] [--] 'iotests: Add mirror-ready-cancel-error test'
Max Reitz (12):
job: Context changes in job_completed_txn_abort()
mirror: Keep s->synced on error
mirror: Drop s->synced
job: Force-cancel jobs in a failed transaction
job: @force parameter for job_cancel_sync{,_all}()
jobs: Give Job.force_cancel more meaning
job: Add job_cancel_requested()
mirror: Use job_is_cancelled()
mirror: Check job_is_cancelled() earlier
mirror: Stop active mirroring after force-cancel
mirror: Do not clear .cancelled
iotests: Add mirror-ready-cancel-error test
include/qemu/job.h | 29 +++-
block/backup.c | 3 +-
block/mirror.c | 56 ++++---
block/replication.c | 4 +-
blockdev.c | 4 +-
job.c | 67 ++++++--
qemu-nbd.c | 2 +-
softmmu/runstate.c | 2 +-
storage-daemon/qemu-storage-daemon.c | 2 +-
tests/unit/test-block-iothread.c | 2 +-
tests/unit/test-blockjob.c | 2 +-
tests/qemu-iotests/109.out | 60 +++-----
.../tests/mirror-ready-cancel-error | 143 ++++++++++++++++++
.../tests/mirror-ready-cancel-error.out | 5 +
tests/qemu-iotests/tests/qsd-jobs.out | 2 +-
15 files changed, 292 insertions(+), 91 deletions(-)
create mode 100755 tests/qemu-iotests/tests/mirror-ready-cancel-error
create mode 100644 tests/qemu-iotests/tests/mirror-ready-cancel-error.out
--
2.31.1
- [PATCH for-6.2 v3 00/12] mirror: Handle errors after READY cancel,
Max Reitz <=
- [PATCH for-6.2 v3 01/12] job: Context changes in job_completed_txn_abort(), Max Reitz, 2021/08/06
- [PATCH for-6.2 v3 02/12] mirror: Keep s->synced on error, Max Reitz, 2021/08/06
- [PATCH for-6.2 v3 03/12] mirror: Drop s->synced, Max Reitz, 2021/08/06
- [PATCH for-6.2 v3 04/12] job: Force-cancel jobs in a failed transaction, Max Reitz, 2021/08/06
- [PATCH for-6.2 v3 06/12] jobs: Give Job.force_cancel more meaning, Max Reitz, 2021/08/06
- [PATCH for-6.2 v3 05/12] job: @force parameter for job_cancel_sync{, _all}(), Max Reitz, 2021/08/06