fix PBS write callback with big blocks
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
parent
95fd47ecb9
commit
2821f02d70
86
debian/patches/pve/0047-pbs-handle-write-callback-with-big-blocks-correctly.patch
vendored
Normal file
86
debian/patches/pve/0047-pbs-handle-write-callback-with-big-blocks-correctly.patch
vendored
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
From: Stefan Reiter <s.reiter@proxmox.com>
|
||||||
|
Subject: PVE: handle PBS write callback with big blocks correctly
|
||||||
|
|
||||||
|
Under certain conditions QEMU will push more than the given blocksize
|
||||||
|
into the callback at once. Handle it like VMA does, by iterating the
|
||||||
|
data until all is written.
|
||||||
|
|
||||||
|
The block size is stored per backup device to be used in the callback.
|
||||||
|
This avoids relying on PROXMOX_BACKUP_DEFAULT_CHUNK_SIZE, in case it is
|
||||||
|
made configurable in the future.
|
||||||
|
|
||||||
|
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
pve-backup.c | 30 ++++++++++++++++++++++--------
|
||||||
|
1 file changed, 22 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/pve-backup.c b/pve-backup.c
|
||||||
|
index 77eb475563..40d8136f1a 100644
|
||||||
|
--- a/pve-backup.c
|
||||||
|
+++ b/pve-backup.c
|
||||||
|
@@ -67,6 +67,7 @@ opts_init(pvebackup_init);
|
||||||
|
typedef struct PVEBackupDevInfo {
|
||||||
|
BlockDriverState *bs;
|
||||||
|
size_t size;
|
||||||
|
+ uint64_t block_size;
|
||||||
|
uint8_t dev_id;
|
||||||
|
bool completed;
|
||||||
|
char targetfile[PATH_MAX];
|
||||||
|
@@ -147,17 +148,28 @@ pvebackup_co_dump_pbs_cb(
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- pbs_res = proxmox_backup_co_write_data(backup_state.pbs, di->dev_id, buf, start, size, &local_err);
|
||||||
|
- qemu_co_mutex_unlock(&backup_state.dump_callback_mutex);
|
||||||
|
+ uint64_t transferred = 0;
|
||||||
|
+ uint64_t reused = 0;
|
||||||
|
+ while (transferred < size) {
|
||||||
|
+ uint64_t left = size - transferred;
|
||||||
|
+ uint64_t to_transfer = left < di->block_size ? left : di->block_size;
|
||||||
|
|
||||||
|
- if (pbs_res < 0) {
|
||||||
|
- pvebackup_propagate_error(local_err);
|
||||||
|
- return pbs_res;
|
||||||
|
- } else {
|
||||||
|
- size_t reused = (pbs_res == 0) ? size : 0;
|
||||||
|
- pvebackup_add_transfered_bytes(size, !buf ? size : 0, reused);
|
||||||
|
+ pbs_res = proxmox_backup_co_write_data(backup_state.pbs, di->dev_id,
|
||||||
|
+ buf ? buf + transferred : NULL, start + transferred, to_transfer, &local_err);
|
||||||
|
+ transferred += to_transfer;
|
||||||
|
+
|
||||||
|
+ if (pbs_res < 0) {
|
||||||
|
+ pvebackup_propagate_error(local_err);
|
||||||
|
+ qemu_co_mutex_unlock(&backup_state.dump_callback_mutex);
|
||||||
|
+ return pbs_res;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ reused += pbs_res == 0 ? to_transfer : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ qemu_co_mutex_unlock(&backup_state.dump_callback_mutex);
|
||||||
|
+ pvebackup_add_transfered_bytes(size, !buf ? size : 0, reused);
|
||||||
|
+
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -730,6 +742,8 @@ static void coroutine_fn pvebackup_co_prepare(void *opaque)
|
||||||
|
PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
|
||||||
|
l = g_list_next(l);
|
||||||
|
|
||||||
|
+ di->block_size = dump_cb_block_size;
|
||||||
|
+
|
||||||
|
const char *devname = bdrv_get_device_name(di->bs);
|
||||||
|
|
||||||
|
BdrvDirtyBitmap *bitmap = bdrv_find_dirty_bitmap(di->bs, PBS_BITMAP_NAME);
|
||||||
|
--
|
||||||
|
2.20.1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_______________________________________________
|
||||||
|
pbs-devel mailing list
|
||||||
|
pbs-devel@lists.proxmox.com
|
||||||
|
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
|
||||||
|
|
||||||
|
|
1
debian/patches/series
vendored
1
debian/patches/series
vendored
@ -46,3 +46,4 @@ pve/0043-PVE-fixup-pbs-backup-add-compress-and-encrypt-option.patch
|
|||||||
pve/0044-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch
|
pve/0044-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch
|
||||||
pve/0045-PVE-add-query_proxmox_support-QMP-command.patch
|
pve/0045-PVE-add-query_proxmox_support-QMP-command.patch
|
||||||
pve/0046-pbs-fix-missing-crypt-and-compress-parameters.patch
|
pve/0046-pbs-fix-missing-crypt-and-compress-parameters.patch
|
||||||
|
pve/0047-pbs-handle-write-callback-with-big-blocks-correctly.patch
|
||||||
|
Loading…
Reference in New Issue
Block a user