This is an automated email from the ASF dual-hosted git repository.
rohit pushed a commit to branch 4.19
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.19 by this push:
new 001c769054b Linstor 4.19 fix selecting non enabled hosts (#8653)
001c769054b is described below
commit 001c769054b85c8aad92540d06f5f94a72516d83
Author: Rene Peinthor <[email protected]>
AuthorDate: Fri Mar 8 09:22:49 2024 +0100
Linstor 4.19 fix selecting non enabled hosts (#8653)
* linstor: cleanup resource if copy from template failed
* linstor: do not use non enabled hosts for copy operations
---
.../driver/LinstorPrimaryDataStoreDriverImpl.java | 27 ++++++++-------
.../storage/datastore/util/LinstorUtil.java | 38 ++++++++++++++--------
2 files changed, 37 insertions(+), 28 deletions(-)
diff --git
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
index ca98dc3dd46..328b3d21d0a 100644
---
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
+++
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
@@ -59,6 +59,7 @@ import
com.cloud.api.storage.LinstorRevertBackupSnapshotCommand;
import com.cloud.configuration.Config;
import com.cloud.host.Host;
import com.cloud.host.dao.HostDao;
+import com.cloud.resource.ResourceState;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.ResizeVolumePayload;
import com.cloud.storage.SnapshotVO;
@@ -214,6 +215,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements
PrimaryDataStoreDriver
}
throw new CloudRuntimeException("Linstor: Unable to delete
resource definition: " + rscDefName);
}
+ s_logger.info(String.format("Linstor: Deleted resource %s",
rscDefName));
} catch (ApiException apiEx)
{
s_logger.error("Linstor: ApiEx - " + apiEx.getMessage());
@@ -865,7 +867,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements
PrimaryDataStoreDriver
Host host = null;
for (String nodeName : linstorNodeNames) {
host = _hostDao.findByName(nodeName);
- if (host != null) {
+ if (host != null && host.getResourceState() ==
ResourceState.Enabled) {
s_logger.info(String.format("Linstor: Make resource %s
available on node %s ...", rscName, nodeName));
ApiCallRcList answers =
api.resourceMakeAvailableOnNode(rscName, nodeName, new ResourceMakeAvailable());
if (!answers.hasError()) {
@@ -892,21 +894,16 @@ public class LinstorPrimaryDataStoreDriverImpl implements
PrimaryDataStoreDriver
}
private Optional<RemoteHostEndPoint> getDiskfullEP(DevelopersApi api,
String rscName) throws ApiException {
- com.linbit.linstor.api.model.StoragePool linSP =
- LinstorUtil.getDiskfulStoragePool(api, rscName);
- if (linSP != null)
- {
- Host host = _hostDao.findByName(linSP.getNodeName());
- if (host == null)
- {
- s_logger.error("Linstor: Host '" + linSP.getNodeName() + "'
not found.");
- return Optional.empty();
- }
- else
- {
- return
Optional.of(RemoteHostEndPoint.getHypervisorHostEndPoint(host));
+ List<com.linbit.linstor.api.model.StoragePool> linSPs =
LinstorUtil.getDiskfulStoragePools(api, rscName);
+ if (linSPs != null) {
+ for (com.linbit.linstor.api.model.StoragePool sp : linSPs) {
+ Host host = _hostDao.findByName(sp.getNodeName());
+ if (host != null && host.getResourceState() ==
ResourceState.Enabled) {
+ return
Optional.of(RemoteHostEndPoint.getHypervisorHostEndPoint(host));
+ }
}
}
+ s_logger.error("Linstor: No diskfull host found.");
return Optional.empty();
}
@@ -958,9 +955,11 @@ public class LinstorPrimaryDataStoreDriverImpl implements
PrimaryDataStoreDriver
}
else {
answer = new Answer(cmd, false, "Unable to get matching
Linstor endpoint.");
+ deleteResourceDefinition(pool, rscName);
}
} catch (ApiException exc) {
s_logger.error("copy template failed: ", exc);
+ deleteResourceDefinition(pool, rscName);
throw new CloudRuntimeException(exc.getBestMessage());
}
return answer;
diff --git
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
index e953c94db22..33cbea0996d 100644
---
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
+++
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
@@ -77,16 +77,16 @@ public class LinstorUtil {
return nodes.stream().map(Node::getName).collect(Collectors.toList());
}
- public static com.linbit.linstor.api.model.StoragePool
- getDiskfulStoragePool(@Nonnull DevelopersApi api, @Nonnull String rscName)
throws ApiException
+ public static List<com.linbit.linstor.api.model.StoragePool>
+ getDiskfulStoragePools(@Nonnull DevelopersApi api, @Nonnull String
rscName) throws ApiException
{
List<ResourceWithVolumes> resources = api.viewResources(
- Collections.emptyList(),
- Collections.singletonList(rscName),
- Collections.emptyList(),
- Collections.emptyList(),
- null,
- null);
+ Collections.emptyList(),
+ Collections.singletonList(rscName),
+ Collections.emptyList(),
+ Collections.emptyList(),
+ null,
+ null);
String nodeName = null;
String storagePoolName = null;
@@ -107,13 +107,23 @@ public class LinstorUtil {
}
List<com.linbit.linstor.api.model.StoragePool> sps =
api.viewStoragePools(
- Collections.singletonList(nodeName),
- Collections.singletonList(storagePoolName),
- Collections.emptyList(),
- null,
- null
+ Collections.singletonList(nodeName),
+ Collections.singletonList(storagePoolName),
+ Collections.emptyList(),
+ null,
+ null
);
- return !sps.isEmpty() ? sps.get(0) : null;
+ return sps != null ? sps : Collections.emptyList();
+ }
+
+ public static com.linbit.linstor.api.model.StoragePool
+ getDiskfulStoragePool(@Nonnull DevelopersApi api, @Nonnull String rscName)
throws ApiException
+ {
+ List<com.linbit.linstor.api.model.StoragePool> sps =
getDiskfulStoragePools(api, rscName);
+ if (sps != null) {
+ return !sps.isEmpty() ? sps.get(0) : null;
+ }
+ return null;
}
public static String
getSnapshotPath(com.linbit.linstor.api.model.StoragePool sp, String rscName,
String snapshotName) {