From 43bd3a833d95a552bf94b58051e1a229b499d007 Mon Sep 17 00:00:00 2001 From: "Srivastava, Piyush" Date: Wed, 8 Apr 2026 11:30:35 +0530 Subject: [PATCH 1/3] bugfix/CSTACKEX-131: host based copy ram to storage flush fix --- .../hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java index 433e173fbbf9..ff074b7ef204 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java @@ -460,6 +460,16 @@ public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk srcDisk, String destVolu try { QemuImg q = new QemuImg(timeout); q.convert(srcFile, destFile); + // Below fix is required when vendor depends on host based copy rather than storage CAN_CREATE_VOLUME_FROM_VOLUME capability + Script flushCmd = new Script(true, "blockdev", 0, logger); + flushCmd.add("--flushbufs", destDisk.getPath()); + String flushResult = flushCmd.execute(); + if (flushResult != null) { + logger.warn("iSCSI copyPhysicalDisk: blockdev --flushbufs returned: {}", flushResult); + } + Script syncCmd = new Script(true, "sync", 0, logger); + syncCmd.execute(); + logger.info("iSCSI copyPhysicalDisk: flush/sync completed "); } catch (QemuImgException | LibvirtException ex) { String msg = "Failed to copy data from " + srcDisk.getPath() + " to " + destDisk.getPath() + ". The error was the following: " + ex.getMessage(); From 49c48e186a238a6847450bc84673083787a0feac Mon Sep 17 00:00:00 2001 From: "Srivastava, Piyush" Date: Mon, 13 Apr 2026 17:08:31 +0530 Subject: [PATCH 2/3] bugfix/CSTACKEX-131: Updated detailed comment --- .../cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java index ff074b7ef204..7673d729755d 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java @@ -461,6 +461,9 @@ public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk srcDisk, String destVolu QemuImg q = new QemuImg(timeout); q.convert(srcFile, destFile); // Below fix is required when vendor depends on host based copy rather than storage CAN_CREATE_VOLUME_FROM_VOLUME capability + // When host based template copy is triggered , small size template sits in RAM(depending on host memory and RAM) and copy is marked successful and by the time flush to storage is triggered + // disconectPhysicalDisk would disconnect the lun , hence template staying in RAM is not copied to storage lun. Below does flushing of data to storage and marking + // copy as succesful once flush is complete. Script flushCmd = new Script(true, "blockdev", 0, logger); flushCmd.add("--flushbufs", destDisk.getPath()); String flushResult = flushCmd.execute(); From e458d2bc31d98f792244914ac27b16351a6db8f1 Mon Sep 17 00:00:00 2001 From: "Srivastava, Piyush" Date: Mon, 13 Apr 2026 17:11:40 +0530 Subject: [PATCH 3/3] bugfix/CSTACKEX-131: Updated detailed comment 1 --- .../cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java index 7673d729755d..3ad32e2685fd 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java @@ -462,8 +462,8 @@ public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk srcDisk, String destVolu q.convert(srcFile, destFile); // Below fix is required when vendor depends on host based copy rather than storage CAN_CREATE_VOLUME_FROM_VOLUME capability // When host based template copy is triggered , small size template sits in RAM(depending on host memory and RAM) and copy is marked successful and by the time flush to storage is triggered - // disconectPhysicalDisk would disconnect the lun , hence template staying in RAM is not copied to storage lun. Below does flushing of data to storage and marking - // copy as succesful once flush is complete. + // disconnectPhysicalDisk would disconnect the lun , hence template staying in RAM is not copied to storage lun. Below does flushing of data to storage and marking + // copy as successful once flush is complete. Script flushCmd = new Script(true, "blockdev", 0, logger); flushCmd.add("--flushbufs", destDisk.getPath()); String flushResult = flushCmd.execute();