This is an automated email from the ASF dual-hosted git repository. harikrishna pushed a commit to branch CheckVolumeAPI in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit e08aac037b7c52f5536632343882353858eddddc Author: Harikrishna Patnala <[email protected]> AuthorDate: Fri Jan 12 13:33:41 2024 +0530 Added volume check and repair changes only during VM start and volume attach operations --- .../subsystem/api/storage/VolumeService.java | 2 ++ .../engine/orchestration/VolumeOrchestrator.java | 6 ++--- .../storage/volume/VolumeServiceImpl.java | 29 +++++++++++----------- .../com/cloud/storage/VolumeApiServiceImpl.java | 6 +++++ 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java index 4350e264125..be5ca340b6f 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java @@ -117,4 +117,6 @@ public interface VolumeService { void moveVolumeOnSecondaryStorageToAnotherAccount(Volume volume, Account sourceAccount, Account destAccount); Pair<String, String> checkAndRepairVolume(VolumeInfo volume); + + void checkAndRepairVolumeBasedOnConfig(DataObject dataObject, Host host); } diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java index bf82c468dbe..4e157303b71 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java @@ -1916,13 +1916,11 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati } } } else { - // For unmanaged storage this is not a mandatory step but this is kept here so that volume can be checked and repaired if needed based on the - // global setting volume.check.and.repair.before.use Host host = _hostDao.findById(vm.getVirtualMachine().getHostId()); try { - volService.grantAccess(volFactory.getVolume(vol.getId()), host, (DataStore)pool); + volService.checkAndRepairVolumeBasedOnConfig(volFactory.getVolume(vol.getId()), host); } catch (Exception e) { - s_logger.debug(String.format("Unable to grant access to volume [%s] on host [%s], due to %s.", volToString, host, e.getMessage())); + s_logger.debug(String.format("Unable to check and repair volume [%s] on host [%s], due to %s.", volToString, host, e.getMessage())); } } } else if (task.type == VolumeTaskType.MIGRATE) { 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 fad413d3635..c0628007326 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 @@ -251,20 +251,7 @@ public class VolumeServiceImpl implements VolumeService { DataStoreDriver dataStoreDriver = dataStore != null ? dataStore.getDriver() : null; if (dataStoreDriver instanceof PrimaryDataStoreDriver) { - boolean result = ((PrimaryDataStoreDriver)dataStoreDriver).grantAccess(dataObject, host, dataStore); - - if (HypervisorType.KVM.equals(host.getHypervisorType()) && DataObjectType.VOLUME.equals(dataObject.getType())) { - if (com.cloud.storage.VolumeApiServiceImpl.AllowVolumeCheckAndRepair.value()) { - s_logger.info(String.format("Trying to check and repair the volume %d", dataObject.getId())); - String repair = CheckVolumeAndRepairCmd.RepairValues.leaks.name(); - CheckAndRepairVolumePayload payload = new CheckAndRepairVolumePayload(repair); - VolumeInfo volumeInfo = volFactory.getVolume(dataObject.getId()); - volumeInfo.addPayload(payload); - checkAndRepairVolume(volumeInfo); - } - } - - return result; + return ((PrimaryDataStoreDriver)dataStoreDriver).grantAccess(dataObject, host, dataStore); } return false; @@ -2778,6 +2765,20 @@ public class VolumeServiceImpl implements VolumeService { return snapshot; } + @Override + public void checkAndRepairVolumeBasedOnConfig(DataObject dataObject, Host host) { + if (HypervisorType.KVM.equals(host.getHypervisorType()) && DataObjectType.VOLUME.equals(dataObject.getType())) { + if (com.cloud.storage.VolumeApiServiceImpl.AllowVolumeCheckAndRepair.value()) { + s_logger.info(String.format("Trying to check and repair the volume %d", dataObject.getId())); + String repair = CheckVolumeAndRepairCmd.RepairValues.leaks.name(); + CheckAndRepairVolumePayload payload = new CheckAndRepairVolumePayload(repair); + VolumeInfo volumeInfo = volFactory.getVolume(dataObject.getId()); + volumeInfo.addPayload(payload); + checkAndRepairVolume(volumeInfo); + } + } + } + @Override public Pair<String, String> checkAndRepairVolume(VolumeInfo volume) { Long poolId = volume.getPoolId(); diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index 6df17ca4dda..e58dd110afd 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -4396,6 +4396,12 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic try { // if we don't have a host, the VM we are attaching the disk to has never been started before if (host != null) { + try { + volService.checkAndRepairVolumeBasedOnConfig(volFactory.getVolume(volumeToAttach.getId()), host); + } catch (Exception e) { + s_logger.debug(String.format("Unable to check and repair volume [%s] on host [%s], due to %s.", volumeToAttach.getName(), host, e.getMessage())); + } + try { volService.grantAccess(volFactory.getVolume(volumeToAttach.getId()), host, dataStore); } catch (Exception e) {
