From 89532a4b80f4041660315dcce703d6b83a8af601 Mon Sep 17 00:00:00 2001 From: "toni.zamparetti" Date: Wed, 13 May 2026 09:00:15 -0300 Subject: [PATCH] Fix in the calculation of a volume's physical size --- .../kvm/resource/LibvirtStorageVolumeDef.java | 4 ++++ .../LibvirtStorageVolumeXMLParser.java | 21 +++++++++++++++++++ .../kvm/storage/LibvirtStorageAdaptor.java | 19 ++++++++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeDef.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeDef.java index de65caeee596..9a28c5ccffe5 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeDef.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeDef.java @@ -83,6 +83,10 @@ public VolumeFormat getFormat() { return this._volFormat; } + public Long getVolSize() { + return _volSize; + } + @Override public String toString() { StringBuilder storageVolBuilder = new StringBuilder(); diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeXMLParser.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeXMLParser.java index 1b6f73039ca5..f1c30565da22 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeXMLParser.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeXMLParser.java @@ -35,6 +35,26 @@ public class LibvirtStorageVolumeXMLParser { protected Logger logger = LogManager.getLogger(getClass()); + public String getBackingFileNameIfExists(String volXML) { + try { + DocumentBuilder builder = ParserUtils.getSaferDocumentBuilderFactory().newDocumentBuilder(); + + InputSource is = new InputSource(); + is.setCharacterStream(new StringReader(volXML)); + Document doc = builder.parse(is); + + Element rootElement = doc.getDocumentElement(); + Element backingStore = (Element)rootElement.getElementsByTagName("backingStore").item(0); + if (backingStore != null) { + String[] paths = getTagValue("path", backingStore).split("/"); + return paths[paths.length-1]; + } + } catch (ParserConfigurationException | SAXException | IOException e) { + logger.error(e.toString(), e); + } + return null; + } + public LibvirtStorageVolumeDef parseStorageVolumeXML(String volXML) { DocumentBuilder builder; try { @@ -50,6 +70,7 @@ public LibvirtStorageVolumeDef parseStorageVolumeXML(String volXML) { Element target = (Element)rootElement.getElementsByTagName("target").item(0); String format = getAttrValue("type", "format", target); Long capacity = Long.parseLong(getTagValue("capacity", rootElement)); + return new LibvirtStorageVolumeDef(VolName, capacity, LibvirtStorageVolumeDef.VolumeFormat.getFormat(format), null, null); } catch (ParserConfigurationException e) { logger.debug(e.toString()); diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java index a03daeb197bf..8b9258e2e828 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java @@ -507,6 +507,12 @@ public LibvirtStoragePoolDef getStoragePoolDef(Connect conn, StoragePool pool) t return parser.parseStoragePoolXML(poolDefXML); } + public String getBackingFileOfVolumeIfExists(StorageVol vol) throws LibvirtException { + String volDefXML = vol.getXMLDesc(0); + LibvirtStorageVolumeXMLParser parser = new LibvirtStorageVolumeXMLParser(); + return parser.getBackingFileNameIfExists(volDefXML); + } + public LibvirtStorageVolumeDef getStorageVolumeDef(Connect conn, StorageVol vol) throws LibvirtException { String volDefXML = vol.getXMLDesc(0); LibvirtStorageVolumeXMLParser parser = new LibvirtStorageVolumeXMLParser(); @@ -657,6 +663,16 @@ public KVMStoragePool getStoragePool(String uuid, boolean refreshInfo) { } } + public Long getBackingFileSizes(StoragePool pool, StorageVol vol) throws LibvirtException { + long size = vol.getInfo().allocation; + String backingFileOfVolumeIfExists = getBackingFileOfVolumeIfExists(vol); + if (backingFileOfVolumeIfExists != null) { + StorageVol backingFile = getVolume(pool, backingFileOfVolumeIfExists); + size += getBackingFileSizes(pool, backingFile); + } + return size; + } + @Override public KVMPhysicalDisk getPhysicalDisk(String volumeUuid, KVMStoragePool pool) { LibvirtStoragePool libvirtPool = (LibvirtStoragePool)pool; @@ -665,8 +681,9 @@ public KVMPhysicalDisk getPhysicalDisk(String volumeUuid, KVMStoragePool pool) { StorageVol vol = getVolume(libvirtPool.getPool(), volumeUuid); KVMPhysicalDisk disk; LibvirtStorageVolumeDef voldef = getStorageVolumeDef(libvirtPool.getPool().getConnect(), vol); + Long allSizes = getBackingFileSizes(libvirtPool.getPool(), vol); disk = new KVMPhysicalDisk(vol.getPath(), vol.getName(), pool); - disk.setSize(vol.getInfo().allocation); + disk.setSize(allSizes); disk.setVirtualSize(vol.getInfo().capacity); /**