This is an automated email from the ASF dual-hosted git repository. rohit pushed a commit to branch 4.18 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.18 by this push: new f731fe882c5 Storage plugin support to check if volume on datastore requires access for migration (#8655) f731fe882c5 is described below commit f731fe882c5b8459a14da9a13269a8360df2743e Author: Suresh Kumar Anaparti <suresh.anapa...@shapeblue.com> AuthorDate: Mon Feb 26 20:16:31 2024 +0530 Storage plugin support to check if volume on datastore requires access for migration (#8655) * Check if volume on datastore requires access for migration, and grant/revoke volume access if requires * Updated default implementation for requiresAccessForMigration method in PrimaryDataStoreDriver --- .../subsystem/api/storage/PrimaryDataStoreDriver.java | 4 ++++ .../engine/subsystem/api/storage/VolumeService.java | 2 ++ .../cloudstack/engine/orchestration/VolumeOrchestrator.java | 8 ++++---- .../apache/cloudstack/storage/volume/VolumeServiceImpl.java | 13 +++++++++++++ .../datastore/driver/ScaleIOPrimaryDataStoreDriver.java | 5 +++++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java index 540d4f6673a..4ab88c19316 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java @@ -42,6 +42,10 @@ public interface PrimaryDataStoreDriver extends DataStoreDriver { void revokeAccess(DataObject dataObject, Host host, DataStore dataStore); + default boolean requiresAccessForMigration(DataObject dataObject) { + return false; + } + /** * intended for managed storage (cloud.storage_pool.managed = true) * if not managed, return volume.getSize() 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 2c12b70e9eb..a6ebf95a99c 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 @@ -54,6 +54,8 @@ public interface VolumeService { void revokeAccess(DataObject dataObject, Host host, DataStore dataStore); + boolean requiresAccessForMigration(DataObject dataObject, DataStore dataStore); + /** * Creates the volume based on the given criteria * 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 c3908795f7c..ec10c344157 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 @@ -1228,8 +1228,8 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati DataStore dataStore = dataStoreMgr.getDataStore(volumeForVm.getPoolId(), DataStoreRole.Primary); PrimaryDataStore primaryDataStore = (PrimaryDataStore)dataStore; - // This might impact other managed storages, grant access for PowerFlex storage pool only - if (primaryDataStore.isManaged() && primaryDataStore.getPoolType() == Storage.StoragePoolType.PowerFlex) { + // This might impact other managed storages, enable requires access for migration in relevant datastore driver (currently enabled for PowerFlex storage pool only) + if (primaryDataStore.isManaged() && volService.requiresAccessForMigration(volumeInfo, dataStore)) { volService.revokeAccess(volumeInfo, host, dataStore); } } @@ -1507,8 +1507,8 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati disk.setDetails(getDetails(volumeInfo, dataStore)); PrimaryDataStore primaryDataStore = (PrimaryDataStore)dataStore; - // This might impact other managed storages, grant access for PowerFlex storage pool only - if (primaryDataStore.isManaged() && primaryDataStore.getPoolType() == Storage.StoragePoolType.PowerFlex) { + // This might impact other managed storages, enable requires access for migration in relevant datastore driver (currently enabled for PowerFlex storage pool only) + if (primaryDataStore.isManaged() && volService.requiresAccessForMigration(volumeInfo, dataStore)) { volService.grantAccess(volFactory.getVolume(vol.getId()), dest.getHost(), dataStore); } 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 47577cc52b2..03460d0d1e5 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 @@ -266,6 +266,19 @@ public class VolumeServiceImpl implements VolumeService { } } + @Override + public boolean requiresAccessForMigration(DataObject dataObject, DataStore dataStore) { + DataStoreDriver dataStoreDriver = dataStore != null ? dataStore.getDriver() : null; + if (dataStoreDriver == null) { + return false; + } + + if (dataStoreDriver instanceof PrimaryDataStoreDriver) { + return ((PrimaryDataStoreDriver)dataStoreDriver).requiresAccessForMigration(dataObject); + } + return false; + } + @Override public AsyncCallFuture<VolumeApiResult> createVolumeAsync(VolumeInfo volume, DataStore dataStore) { AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>(); diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java index cad88dcdd15..431fddb566f 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java @@ -302,6 +302,11 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { return null; } + @Override + public boolean requiresAccessForMigration(DataObject dataObject) { + return true; + } + @Override public long getUsedBytes(StoragePool storagePool) { long usedSpaceBytes = 0;