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 <[email protected]>
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).
*/