From d99dcfffbc940e14da778564694e3dff62d24382 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Fri, 25 Apr 2025 09:47:56 +0530 Subject: [PATCH 1/3] Reset the pool id when create volume fails on the allocated pool - the pool id is persisted while creating the volume, when it fails the pool id is not reverted. On next create volume attempt, CloudStack couldn't find any suitable primary storage even there are pools available with enough capacity as the pool is already assigned to volume which is in Allocated state (and storage pool compatibility check fails). Ensure volume is not assigned to any pool if create volume fails (so the next creation job would pick the suitable pool). --- .../cloudstack/storage/volume/VolumeServiceImpl.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index aba24b6956b7..da0428a298b4 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -324,6 +324,11 @@ protected Void createVolumeCallback(AsyncCallbackDispatcher Date: Tue, 29 Apr 2025 12:26:04 +0530 Subject: [PATCH 2/3] endpoint check for resize --- .../apache/cloudstack/storage/volume/VolumeServiceImpl.java | 6 ++---- .../driver/CloudStackPrimaryDataStoreDriverImpl.java | 6 ++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index da0428a298b4..22e8dc508cb9 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -2491,7 +2491,7 @@ public AsyncCallFuture resize(VolumeInfo volume) { try { volume.processEvent(Event.ResizeRequested); } catch (Exception e) { - s_logger.debug("Failed to change state to resize", e); + s_logger.debug("Failed to change volume state to resize", e); result.setResult(e.toString()); future.complete(result); return future; @@ -2503,10 +2503,8 @@ public AsyncCallFuture resize(VolumeInfo volume) { try { volume.getDataStore().getDriver().resize(volume, caller); } catch (Exception e) { - s_logger.debug("Failed to change state to resize", e); - + s_logger.debug("Failed to resize volume", e); result.setResult(e.toString()); - future.complete(result); } diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java index a0aaab1d0aa1..d9d2e3a95e01 100644 --- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java +++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java @@ -28,6 +28,7 @@ import com.cloud.agent.api.to.DiskTO; import com.cloud.storage.VolumeVO; +import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; @@ -432,6 +433,11 @@ public void resize(DataObject data, AsyncCompletionCallback cal // if hosts are provided, they are where the VM last ran. We can use that. if (endpointsToRunResize == null || endpointsToRunResize.length == 0) { EndPoint ep = epSelector.select(data, encryptionRequired); + if (ep == null) { + String errMsg = String.format(NO_REMOTE_ENDPOINT_WITH_ENCRYPTION, encryptionRequired); + s_logger.error(errMsg); + throw new CloudRuntimeException(errMsg); + } endpointsToRunResize = new long[] {ep.getId()}; } ResizeVolumeCommand resizeCmd = new ResizeVolumeCommand(vol.getPath(), new StorageFilerTO(pool), vol.getSize(), From 8d2b008fd7a0ed723d847876101770b928695a13 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Wed, 30 Apr 2025 13:16:59 +0530 Subject: [PATCH 3/3] update the resize error through callback result instead of exception --- .../cloudstack/storage/volume/VolumeServiceImpl.java | 9 ++------- .../driver/CloudStackPrimaryDataStoreDriverImpl.java | 9 +++++---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index 22e8dc508cb9..76f55e1c4498 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -2548,7 +2548,7 @@ protected Void resizeVolumeCallback(AsyncCallbackDispatcher cal boolean encryptionRequired = anyVolumeRequiresEncryption(vol); long [] endpointsToRunResize = resizeParameter.hosts; + CreateCmdResult result = new CreateCmdResult(null, null); + // if hosts are provided, they are where the VM last ran. We can use that. if (endpointsToRunResize == null || endpointsToRunResize.length == 0) { EndPoint ep = epSelector.select(data, encryptionRequired); if (ep == null) { String errMsg = String.format(NO_REMOTE_ENDPOINT_WITH_ENCRYPTION, encryptionRequired); s_logger.error(errMsg); - throw new CloudRuntimeException(errMsg); + result.setResult(errMsg); + callback.complete(result); + return; } endpointsToRunResize = new long[] {ep.getId()}; } @@ -445,7 +448,6 @@ public void resize(DataObject data, AsyncCompletionCallback cal if (pool.getParent() != 0) { resizeCmd.setContextParam(DiskTO.PROTOCOL_TYPE, Storage.StoragePoolType.DatastoreCluster.toString()); } - CreateCmdResult result = new CreateCmdResult(null, null); try { ResizeVolumeAnswer answer = (ResizeVolumeAnswer) storageMgr.sendToPool(pool, endpointsToRunResize, resizeCmd); if (answer != null && answer.getResult()) { @@ -462,7 +464,6 @@ public void resize(DataObject data, AsyncCompletionCallback cal s_logger.debug("return a null answer, mark it as failed for unknown reason"); result.setResult("return a null answer, mark it as failed for unknown reason"); } - } catch (Exception e) { s_logger.debug("sending resize command failed", e); result.setResult(e.toString());