various small pve backup co-routine related fixes
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
219fbf03ff
commit
22ff24871d
27
debian/patches/pve/0038-pvebackup_co_dump_cb-do-not-call-job-cancel.patch
vendored
Normal file
27
debian/patches/pve/0038-pvebackup_co_dump_cb-do-not-call-job-cancel.patch
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Dietmar Maurer <dietmar@proxmox.com>
|
||||
Date: Wed, 30 Oct 2019 12:15:44 +0100
|
||||
Subject: [PATCH] pvebackup_co_dump_cb: do not call job->cancel()
|
||||
|
||||
The backup loop will automatically abort if we return an error.
|
||||
---
|
||||
blockdev.c | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 786921da0a..a36c4ce23d 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3254,10 +3254,8 @@ static int coroutine_fn pvebackup_co_dump_cb(void *opaque, BlockBackend *target,
|
||||
if (!backup_state.error) {
|
||||
vma_writer_error_propagate(backup_state.vmaw, &backup_state.error);
|
||||
}
|
||||
- if (di->bs && di->bs->job) {
|
||||
- job_cancel(&di->bs->job->job, true);
|
||||
- }
|
||||
- break;
|
||||
+ qemu_co_mutex_unlock(&backup_state.backup_mutex);
|
||||
+ return ret;
|
||||
} else {
|
||||
backup_state.zero_bytes += zero_bytes;
|
||||
if (remaining >= VMA_CLUSTER_SIZE) {
|
44
debian/patches/pve/0039-fix-backup-job-completion.patch
vendored
Normal file
44
debian/patches/pve/0039-fix-backup-job-completion.patch
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Dietmar Maurer <dietmar@proxmox.com>
|
||||
Date: Wed, 30 Oct 2019 12:15:45 +0100
|
||||
Subject: [PATCH] fix backup job completion
|
||||
|
||||
With recent changes, pvebackup_co_run_next_job cancels the job async,
|
||||
so we need to run pvebackup_co_cleanup in the completion handler
|
||||
instead. We call pvebackup_co_run_next as long as there are
|
||||
jobs in the list.
|
||||
---
|
||||
blockdev.c | 9 ++++-----
|
||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index a36c4ce23d..421240fbb8 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3339,12 +3339,14 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
backup_state.di_list = g_list_remove(backup_state.di_list, di);
|
||||
g_free(di);
|
||||
|
||||
- bool cancel = backup_state.cancel;
|
||||
+ int pending_jobs = g_list_length(backup_state.di_list);
|
||||
|
||||
qemu_co_mutex_unlock(&backup_state.backup_mutex);
|
||||
|
||||
- if (!cancel) {
|
||||
+ if (pending_jobs > 0) {
|
||||
pvebackup_co_run_next_job();
|
||||
+ } else {
|
||||
+ pvebackup_co_cleanup();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3490,9 +3492,6 @@ static void coroutine_fn pvebackup_co_run_next_job(void)
|
||||
}
|
||||
}
|
||||
qemu_co_mutex_unlock(&backup_state.backup_mutex);
|
||||
-
|
||||
- // no more jobs, run the cleanup
|
||||
- pvebackup_co_cleanup();
|
||||
}
|
||||
|
||||
typedef struct QmpBackupTask {
|
43
debian/patches/pve/0040-pvebackup_complete_cb-avoid-poll-loop-if-already-ins.patch
vendored
Normal file
43
debian/patches/pve/0040-pvebackup_complete_cb-avoid-poll-loop-if-already-ins.patch
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Dietmar Maurer <dietmar@proxmox.com>
|
||||
Date: Wed, 30 Oct 2019 12:15:46 +0100
|
||||
Subject: [PATCH] pvebackup_complete_cb: avoid poll loop if already inside
|
||||
coroutine
|
||||
|
||||
---
|
||||
blockdev.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 421240fbb8..e889bd13d5 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3169,6 +3169,8 @@ static void coroutine_fn block_on_coroutine_wrapper(void *opaque)
|
||||
|
||||
static void block_on_coroutine_fn(CoroutineEntry *entry, void *entry_arg)
|
||||
{
|
||||
+ assert(!qemu_in_coroutine());
|
||||
+
|
||||
AioContext *ctx = qemu_get_current_aio_context();
|
||||
BlockOnCoroutineWrapper wrapper = {
|
||||
.finished = false,
|
||||
@@ -3352,13 +3354,17 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
|
||||
static void pvebackup_complete_cb(void *opaque, int ret)
|
||||
{
|
||||
- // This always called from the main loop
|
||||
+ // This can be called from the main loop, or from a coroutine
|
||||
PVEBackupCompeteCallbackData cb_data = {
|
||||
.di = opaque,
|
||||
.result = ret,
|
||||
};
|
||||
|
||||
- block_on_coroutine_fn(pvebackup_co_complete_cb, &cb_data);
|
||||
+ if (qemu_in_coroutine()) {
|
||||
+ pvebackup_co_complete_cb(&cb_data);
|
||||
+ } else {
|
||||
+ block_on_coroutine_fn(pvebackup_co_complete_cb, &cb_data);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void coroutine_fn pvebackup_co_cancel(void *opaque)
|
3
debian/patches/series
vendored
3
debian/patches/series
vendored
@ -36,3 +36,6 @@ pve/0034-vma_writer_close-avoid-call-to-aio_poll-acquire-flus.patch
|
||||
pve/0035-backup_job_create-pass-cluster-size-for-dump.patch
|
||||
pve/0036-avoid-calling-dump_cb-with-NULL-data-pointer-for-sma.patch
|
||||
pve/0037-rename-config_to_vma-into-pvebackup_co_add_config.patch
|
||||
pve/0038-pvebackup_co_dump_cb-do-not-call-job-cancel.patch
|
||||
pve/0039-fix-backup-job-completion.patch
|
||||
pve/0040-pvebackup_complete_cb-avoid-poll-loop-if-already-ins.patch
|
||||
|
Loading…
Reference in New Issue
Block a user