You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by nv...@apache.org on 2021/08/31 16:49:59 UTC
[cloudstack] branch 4.15 updated: server: do not remove volume from
DB if fail to expunge it from primary storage or secondary storage (#5373)
This is an automated email from the ASF dual-hosted git repository.
nvazquez pushed a commit to branch 4.15
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.15 by this push:
new 4e53997 server: do not remove volume from DB if fail to expunge it from primary storage or secondary storage (#5373)
4e53997 is described below
commit 4e53997ca2c72c0a7d8d2195708ca0a28135538b
Author: Wei Zhou <we...@apache.org>
AuthorDate: Tue Aug 31 18:48:58 2021 +0200
server: do not remove volume from DB if fail to expunge it from primary storage or secondary storage (#5373)
* server: do not remove volume from DB if fail to expunge it from primary storage or secondary storage
* server/VolumeApiServiceImpl.java: move to method
* update #5373
---
.../CloudStackPrimaryDataStoreDriverImpl.java | 4 +--
.../com/cloud/storage/VolumeApiServiceImpl.java | 34 +++++++++++++---------
2 files changed, 23 insertions(+), 15 deletions(-)
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 cb977de..e43bc46 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
@@ -138,7 +138,7 @@ public class CloudStackPrimaryDataStoreDriverImpl implements PrimaryDataStoreDri
EndPoint ep = epSelector.select(volume);
Answer answer = null;
if (ep == null) {
- String errMsg = "No remote endpoint to send DeleteCommand, check if host or ssvm is down?";
+ String errMsg = "No remote endpoint to send CreateObjectCommand, check if host or ssvm is down?";
s_logger.error(errMsg);
answer = new Answer(cmd, false, errMsg);
} else {
@@ -280,7 +280,7 @@ public class CloudStackPrimaryDataStoreDriverImpl implements PrimaryDataStoreDri
EndPoint ep = epSelector.select(srcData, destData);
Answer answer = null;
if (ep == null) {
- String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
+ String errMsg = "No remote endpoint to send CopyCommand, check if host or ssvm is down?";
s_logger.error(errMsg);
answer = new Answer(cmd, false, errMsg);
} else {
diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
index abb8265..42026ef 100644
--- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
@@ -1407,12 +1407,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
* If the volume is not in the primary storage, we do nothing here.
*/
protected void expungeVolumesInPrimaryStorageIfNeeded(VolumeVO volume) throws InterruptedException, ExecutionException {
- VolumeInfo volOnPrimary = volFactory.getVolume(volume.getId(), DataStoreRole.Primary);
- if (volOnPrimary != null) {
- s_logger.info("Expunging volume " + volume.getId() + " from primary data store");
- AsyncCallFuture<VolumeApiResult> future = volService.expungeVolumeAsync(volOnPrimary);
- future.get();
- }
+ expungeVolumesInPrimaryOrSecondary(volume, DataStoreRole.Primary);
}
/**
@@ -1420,16 +1415,29 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
* If it is, we will execute an asynchronous call to delete it there. Then, we decrement the {@link ResourceType#secondary_storage} for the account that owns the volume.
*/
protected void expungeVolumesInSecondaryStorageIfNeeded(VolumeVO volume) throws InterruptedException, ExecutionException {
- VolumeInfo volOnSecondary = volFactory.getVolume(volume.getId(), DataStoreRole.Image);
- if (volOnSecondary != null) {
- s_logger.info("Expunging volume " + volume.getId() + " from secondary data store");
- AsyncCallFuture<VolumeApiResult> future2 = volService.expungeVolumeAsync(volOnSecondary);
- future2.get();
+ expungeVolumesInPrimaryOrSecondary(volume, DataStoreRole.Image);
+ }
- _resourceLimitMgr.decrementResourceCount(volOnSecondary.getAccountId(), ResourceType.secondary_storage, volOnSecondary.getSize());
+ private void expungeVolumesInPrimaryOrSecondary(VolumeVO volume, DataStoreRole role) throws InterruptedException, ExecutionException {
+ VolumeInfo volOnStorage = volFactory.getVolume(volume.getId(), role);
+ if (volOnStorage != null) {
+ s_logger.info("Expunging volume " + volume.getId() + " from " + role + " data store");
+ AsyncCallFuture<VolumeApiResult> future = volService.expungeVolumeAsync(volOnStorage);
+ VolumeApiResult result = future.get();
+ if (result.isFailed()) {
+ String msg = "Failed to expunge the volume " + volume + " in " + role + " data store";
+ s_logger.warn(msg);
+ String details = "";
+ if (result.getResult() != null && !result.getResult().isEmpty()) {
+ details = msg + " : " + result.getResult();
+ }
+ throw new CloudRuntimeException(details);
+ }
+ if (DataStoreRole.Image.equals(role)) {
+ _resourceLimitMgr.decrementResourceCount(volOnStorage.getAccountId(), ResourceType.secondary_storage, volOnStorage.getSize());
+ }
}
}
-
/**
* Clean volumes cache entries (if they exist).
*/