From b549d069050953e12a806d8dea58f2bb526dc56e Mon Sep 17 00:00:00 2001 From: "zhong.zhou" Date: Wed, 22 Jul 2026 21:48:44 +0800 Subject: [PATCH 1/3] [zbs]: align encrypted volume size for legacy ZBS Normalize encrypted logical sizes to the ZBS allocation unit and size image clones from the larger of request and source. Resolves: ZSV-12767 Change-Id: I179ef0052095a0caf9f6c4aae8984c09b5f58f22 --- .../storage/zbs/ZbsStorageController.java | 17 ++++++++++++++--- .../encrypt/ZbsEncryptedVolumeCloner.java | 18 +++++++++--------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 593bc1ea820..638c57e0d9d 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -600,12 +600,19 @@ private ZbsVolumeEncryptionBackend encryptionBackend() { return new ZbsVolumeEncryptionBackendImpl(this, self.getUuid(), addonInfo, config); } + private void alignEncryptedVolumeSize(CreateVolumeSpec spec) { + if (spec.getSize() > 0) { + spec.setSize(alignSize(spec.getSize())); + } + } + @Override public void createVolume(CreateVolumeSpec v, ReturnValueCompletion comp) { reloadDbInfo(); if (v.isEncrypted()) { try { + alignEncryptedVolumeSize(v); getVolumeEncryptionExtension().createEncryptedEmptyVolume(encryptionBackend(), v, comp); } catch (OperationFailureException e) { comp.fail(e.getErrorCode()); @@ -657,7 +664,9 @@ public void trashVolume(String installPath, Completion comp) { public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { if (dst.isEncrypted()) { try { - getVolumeEncryptionExtension().cloneEncryptedVolumeFromImage(encryptionBackend(), srcInstallPath, dst, comp); + ZbsVolumeEncryptionBackend backend = encryptionBackend(); + alignEncryptedVolumeSize(dst); + getVolumeEncryptionExtension().cloneEncryptedVolumeFromImage(backend, srcInstallPath, dst, comp); } catch (OperationFailureException e) { comp.fail(e.getErrorCode()); } @@ -750,7 +759,9 @@ public void handle(ErrorCode errCode, Map data) { public void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { if (dst.isEncrypted()) { try { - getVolumeEncryptionExtension().copyEncryptedVolumeFromSnapshot(encryptionBackend(), srcInstallPath, dst, comp); + ZbsVolumeEncryptionBackend backend = encryptionBackend(); + alignEncryptedVolumeSize(dst); + getVolumeEncryptionExtension().copyEncryptedVolumeFromSnapshot(backend, srcInstallPath, dst, comp); } catch (OperationFailureException e) { comp.fail(e.getErrorCode()); } @@ -880,7 +891,7 @@ public void expandVolume(VolumeInventory volume, long size, ReturnValueCompletio comp.fail(operr("cannot find ZBS volume encryption extension")); return; } - exts.get(0).resizeEncryptedVolume(self.getUuid(), volume, size, comp); + exts.get(0).resizeEncryptedVolume(self.getUuid(), volume, alignSize(size), comp); return; } diff --git a/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java b/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java index 44e69e2fc1f..f43cf21ebec 100644 --- a/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java +++ b/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java @@ -142,15 +142,9 @@ public void fail(ErrorCode errorCode) { private void resolveCloneVirtualSize(ZbsVolumeEncryptionBackend backend, String srcInstallPath, String resolvedSrcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion completion) { - if (dst.getSize() > 0) { - completion.success(dst.getSize()); - return; - } - Long dbSize = findSourceVirtualSizeInDb(backend, srcInstallPath); if (dbSize != null && dbSize > 0) { - dst.setSize(dbSize); - completion.success(dbSize); + completeCloneVirtualSize(dst, dbSize, completion); return; } @@ -165,8 +159,7 @@ public void success(VolumeStats stats) { return; } - dst.setSize(size); - completion.success(size); + completeCloneVirtualSize(dst, size, completion); } @Override @@ -176,6 +169,13 @@ public void fail(ErrorCode errorCode) { }); } + private void completeCloneVirtualSize(CreateVolumeSpec dst, long sourceSize, + ReturnValueCompletion completion) { + long virtualSize = Math.max(dst.getSize(), sourceSize); + dst.setSize(virtualSize); + completion.success(virtualSize); + } + private Long findSourceVirtualSizeInDb(ZbsVolumeEncryptionBackend backend, String srcInstallPath) { VolumeSnapshotVO snapshot = Q.New(VolumeSnapshotVO.class) .eq(VolumeSnapshotVO_.primaryStorageUuid, backend.getPrimaryStorageUuid()) From 58c341cedf1f9f9a9bd8147c210e26584d87566c Mon Sep 17 00:00:00 2001 From: "zhong.zhou" Date: Thu, 23 Jul 2026 11:20:35 +0800 Subject: [PATCH 2/3] [zbs]: inline encrypted clone size resolution Resolves: ZSV-12767 Change-Id: I729e06615adea4854dc8bdb769ef5618e074a687 --- .../storage/encrypt/ZbsEncryptedVolumeCloner.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java b/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java index f43cf21ebec..c475df30815 100644 --- a/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java +++ b/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java @@ -144,7 +144,9 @@ private void resolveCloneVirtualSize(ZbsVolumeEncryptionBackend backend, String ReturnValueCompletion completion) { Long dbSize = findSourceVirtualSizeInDb(backend, srcInstallPath); if (dbSize != null && dbSize > 0) { - completeCloneVirtualSize(dst, dbSize, completion); + long virtualSize = Math.max(dst.getSize(), dbSize); + dst.setSize(virtualSize); + completion.success(virtualSize); return; } @@ -159,7 +161,9 @@ public void success(VolumeStats stats) { return; } - completeCloneVirtualSize(dst, size, completion); + long virtualSize = Math.max(dst.getSize(), size); + dst.setSize(virtualSize); + completion.success(virtualSize); } @Override @@ -169,13 +173,6 @@ public void fail(ErrorCode errorCode) { }); } - private void completeCloneVirtualSize(CreateVolumeSpec dst, long sourceSize, - ReturnValueCompletion completion) { - long virtualSize = Math.max(dst.getSize(), sourceSize); - dst.setSize(virtualSize); - completion.success(virtualSize); - } - private Long findSourceVirtualSizeInDb(ZbsVolumeEncryptionBackend backend, String srcInstallPath) { VolumeSnapshotVO snapshot = Q.New(VolumeSnapshotVO.class) .eq(VolumeSnapshotVO_.primaryStorageUuid, backend.getPrimaryStorageUuid()) From 87a318756807661c6b08568f5446c06f66f4bbf3 Mon Sep 17 00:00:00 2001 From: "zhong.zhou" Date: Thu, 23 Jul 2026 11:28:17 +0800 Subject: [PATCH 3/3] [zbs]: simplify encrypted size alignment Resolves: ZSV-12767 Change-Id: I51d2c10538f9451bba9931d85d8670f5fa592d02 --- .../org/zstack/storage/zbs/ZbsStorageController.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 638c57e0d9d..a322d5741bc 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -600,19 +600,13 @@ private ZbsVolumeEncryptionBackend encryptionBackend() { return new ZbsVolumeEncryptionBackendImpl(this, self.getUuid(), addonInfo, config); } - private void alignEncryptedVolumeSize(CreateVolumeSpec spec) { - if (spec.getSize() > 0) { - spec.setSize(alignSize(spec.getSize())); - } - } - @Override public void createVolume(CreateVolumeSpec v, ReturnValueCompletion comp) { reloadDbInfo(); if (v.isEncrypted()) { try { - alignEncryptedVolumeSize(v); + v.setSize(alignSize(v.getSize())); getVolumeEncryptionExtension().createEncryptedEmptyVolume(encryptionBackend(), v, comp); } catch (OperationFailureException e) { comp.fail(e.getErrorCode()); @@ -665,7 +659,7 @@ public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValue if (dst.isEncrypted()) { try { ZbsVolumeEncryptionBackend backend = encryptionBackend(); - alignEncryptedVolumeSize(dst); + dst.setSize(alignSize(dst.getSize())); getVolumeEncryptionExtension().cloneEncryptedVolumeFromImage(backend, srcInstallPath, dst, comp); } catch (OperationFailureException e) { comp.fail(e.getErrorCode()); @@ -760,7 +754,7 @@ public void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueC if (dst.isEncrypted()) { try { ZbsVolumeEncryptionBackend backend = encryptionBackend(); - alignEncryptedVolumeSize(dst); + dst.setSize(alignSize(dst.getSize())); getVolumeEncryptionExtension().copyEncryptedVolumeFromSnapshot(backend, srcInstallPath, dst, comp); } catch (OperationFailureException e) { comp.fail(e.getErrorCode());