Skip to content

Commit 7567658

Browse files
committed
core: deletion unused image links
Problem: When creating a disk on a block storage domain (for example, FibreChannel), links to the disk are created on all active hosts that belong to the StoragePool of the disk being created. Further, when deleting a created disk, links to the disk are deleted only on the host with the SPM role, while incorrect links to the deleted disk remain on the other hosts. Solution: Added an API method on VDSM to remove unused links. When deleting a disk, the command to delete unused links is invoked for all active hosts that are associated with the StoragePool of the disk being deleted. Signed-off-by: Evgeniy Kononov <[email protected]>
1 parent 2fb96e7 commit 7567658

File tree

7 files changed

+169
-1
lines changed

7 files changed

+169
-1
lines changed

backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/RemoveImageCommand.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
1717
import org.ovirt.engine.core.bll.context.CommandContext;
1818
import org.ovirt.engine.core.bll.storage.domain.PostDeleteActionHandler;
19+
import org.ovirt.engine.core.bll.storage.utils.VdsCommandsHelper;
1920
import org.ovirt.engine.core.common.AuditLogType;
2021
import org.ovirt.engine.core.common.VdcObjectType;
2122
import org.ovirt.engine.core.common.action.ActionType;
2223
import org.ovirt.engine.core.common.action.RemoveImageParameters;
2324
import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
2425
import org.ovirt.engine.core.common.businessentities.Snapshot;
26+
import org.ovirt.engine.core.common.businessentities.VDS;
27+
import org.ovirt.engine.core.common.businessentities.VDSStatus;
2528
import org.ovirt.engine.core.common.businessentities.VM;
2629
import org.ovirt.engine.core.common.businessentities.VmDeviceId;
2730
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
@@ -30,6 +33,7 @@
3033
import org.ovirt.engine.core.common.errors.EngineError;
3134
import org.ovirt.engine.core.common.errors.EngineException;
3235
import org.ovirt.engine.core.common.vdscommands.DeleteImageGroupVDSCommandParameters;
36+
import org.ovirt.engine.core.common.vdscommands.DeleteImageUnusedLinksVDSCommandParameters;
3337
import org.ovirt.engine.core.common.vdscommands.GetImagesListVDSCommandParameters;
3438
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
3539
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
@@ -42,6 +46,7 @@
4246
import org.ovirt.engine.core.dao.ImageDao;
4347
import org.ovirt.engine.core.dao.ImageStorageDomainMapDao;
4448
import org.ovirt.engine.core.dao.SnapshotDao;
49+
import org.ovirt.engine.core.dao.VdsDao;
4550
import org.ovirt.engine.core.dao.VmDao;
4651
import org.ovirt.engine.core.dao.VmDeviceDao;
4752
import org.ovirt.engine.core.utils.ovf.OvfManager;
@@ -85,6 +90,10 @@ public class RemoveImageCommand<T extends RemoveImageParameters> extends BaseIma
8590
@Inject
8691
private VmDao vmDao;
8792

93+
@Inject
94+
private VdsCommandsHelper vdsCommandsHelper;
95+
@Inject
96+
private VdsDao vdsDao;
8897

8998
public RemoveImageCommand(T parameters, CommandContext cmdContext) {
9099
super(parameters, cmdContext);
@@ -335,11 +344,48 @@ protected VDSReturnValue performDeleteImageVdsmOperation() {
335344
ImageStatus.ILLEGAL,
336345
getCompensationContext());
337346
}
338-
return runVdsCommand(VDSCommandType.DeleteImageGroup,
347+
final VDSReturnValue vdsReturnValue = runVdsCommand(VDSCommandType.DeleteImageGroup,
339348
postDeleteActionHandler.fixParameters(
340349
new DeleteImageGroupVDSCommandParameters(getDiskImage().getStoragePoolId(),
341350
getStorageDomainId(), getDiskImage().getId(),
342351
getDiskImage().isWipeAfterDelete(), getStorageDomain().getDiscardAfterDelete(),
343352
getParameters().isForceDelete())));
353+
354+
if (vdsReturnValue.getSucceeded()) {
355+
performDeleteImageUnusedLinks();
356+
}
357+
358+
return vdsReturnValue;
359+
}
360+
361+
protected void performDeleteImageUnusedLinks() {
362+
List<Guid> vdsForExecute = vdsDao.getAllForStoragePoolAndStatus(getDiskImage().getStoragePoolId(), VDSStatus.Up)
363+
.stream()
364+
.map(VDS::getId)
365+
.collect(Collectors.toList());
366+
367+
log.info("Deleting unused image links on hosts: [{}].", vdsForExecute);
368+
369+
for (Guid vdsId : vdsForExecute) {
370+
try {
371+
log.info("Start deleting unused image links on host '{}'. Image '{}', storage domain '{}', "
372+
+ "storage pool '{}'",
373+
vdsId, getDiskImage().getId(), getStorageDomainId(), getDiskImage().getStoragePoolId());
374+
375+
vdsCommandsHelper.runVdsCommandWithoutFailover(
376+
VDSCommandType.DeleteImageUnusedLinks,
377+
new DeleteImageUnusedLinksVDSCommandParameters(vdsId, getStorageDomainId(),
378+
getDiskImage().getStoragePoolId(), getDiskImage().getId()),
379+
getDiskImage().getStoragePoolId(), null);
380+
381+
log.info("Unused image links were successfully deleted on host '{}'. Image '{}', storage domain '{}', "
382+
+ "storage pool '{}'",
383+
vdsId, getDiskImage().getId(), getStorageDomainId(), getDiskImage().getStoragePoolId());
384+
} catch (EngineException e) {
385+
log.error("Error while deleting unused image links on host '{}'. Image '{}', storage domain '{}', "
386+
+ "storage pool '{}', exception = {}",
387+
vdsId, getDiskImage().getId(), getStorageDomainId(), getDiskImage().getStoragePoolId(), e);
388+
}
389+
}
344390
}
345391
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package org.ovirt.engine.core.common.vdscommands;
2+
3+
import org.ovirt.engine.core.common.utils.ToStringBuilder;
4+
import org.ovirt.engine.core.compat.Guid;
5+
6+
public class DeleteImageUnusedLinksVDSCommandParameters extends VdsIdVDSCommandParametersBase {
7+
8+
/**
9+
* ID storage domain.
10+
*/
11+
private Guid sdUUID;
12+
13+
/**
14+
* ID storage pool.
15+
*/
16+
private Guid spUUID;
17+
18+
/**
19+
* ID image.
20+
*/
21+
private Guid imgUUID;
22+
23+
public DeleteImageUnusedLinksVDSCommandParameters() {
24+
}
25+
26+
public DeleteImageUnusedLinksVDSCommandParameters(Guid vdsId, Guid sdUUID, Guid spUUID, Guid imgUUID) {
27+
super(vdsId);
28+
this.sdUUID = sdUUID;
29+
this.spUUID = spUUID;
30+
this.imgUUID = imgUUID;
31+
}
32+
33+
public Guid getSdUUID() {
34+
return sdUUID;
35+
}
36+
37+
public void setSdUUID(Guid sdUUID) {
38+
this.sdUUID = sdUUID;
39+
}
40+
41+
public Guid getSpUUID() {
42+
return spUUID;
43+
}
44+
45+
public void setSpUUID(Guid spUUID) {
46+
this.spUUID = spUUID;
47+
}
48+
49+
public Guid getImgUUID() {
50+
return imgUUID;
51+
}
52+
53+
public void setImgUUID(Guid imgUUID) {
54+
this.imgUUID = imgUUID;
55+
}
56+
57+
@Override
58+
protected ToStringBuilder appendAttributes(ToStringBuilder tsb) {
59+
return super.appendAttributes(tsb)
60+
.append("sdUUID", getSdUUID())
61+
.append("spUUID", getSpUUID())
62+
.append("imgUUID", getImgUUID());
63+
}
64+
}

backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public enum VDSCommandType {
9090
GetStoragePoolInfo("org.ovirt.engine.core.vdsbroker.irsbroker"),
9191
DestroyStoragePool("org.ovirt.engine.core.vdsbroker.irsbroker"),
9292
DeleteImageGroup("org.ovirt.engine.core.vdsbroker.irsbroker"),
93+
DeleteImageUnusedLinks("org.ovirt.engine.core.vdsbroker.vdsbroker"),
9394
MoveImageGroup("org.ovirt.engine.core.vdsbroker.irsbroker"),
9495
CloneImageGroupStructure("org.ovirt.engine.core.vdsbroker.irsbroker"),
9596
SyncImageGroupData("org.ovirt.engine.core.vdsbroker.irsbroker"),

backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2695,4 +2695,16 @@ public ScreenshotInfoReturn createScreenshot(String vmId) {
26952695
Map<String, Object> response = new FutureMap(this.client, request).withIgnoreResponseKey();
26962696
return new ScreenshotInfoReturn(response);
26972697
}
2698+
2699+
@Override
2700+
public StatusOnlyReturn deleteImageUnusedLinks(String sdUUID, String spUUID, String imgUUID) {
2701+
JsonRpcRequest request =
2702+
new RequestBuilder("Image.deleteUnusedLinks")
2703+
.withParameter("storagedomainID", sdUUID)
2704+
.withParameter("storagepoolID", spUUID)
2705+
.withParameter("imageID", imgUUID)
2706+
.build();
2707+
Map<String, Object> response = new FutureMap(this.client, request);
2708+
return new StatusOnlyReturn(response);
2709+
}
26982710
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.ovirt.engine.core.vdsbroker.vdsbroker;
2+
3+
import org.ovirt.engine.core.common.vdscommands.DeleteImageUnusedLinksVDSCommandParameters;
4+
5+
public class DeleteImageUnusedLinksVDSCommand<P extends DeleteImageUnusedLinksVDSCommandParameters>
6+
extends VdsBrokerCommand<P> {
7+
8+
protected StatusOnlyReturn statusReturn;
9+
10+
public DeleteImageUnusedLinksVDSCommand(P parameters) {
11+
super(parameters);
12+
}
13+
14+
@Override
15+
protected Status getReturnStatus() {
16+
return statusReturn.status;
17+
}
18+
19+
@Override
20+
protected Object getReturnValueFromBroker() {
21+
return statusReturn;
22+
}
23+
24+
@Override
25+
public Object getReturnValue() {
26+
return statusReturn;
27+
}
28+
29+
@Override
30+
protected void executeVdsBrokerCommand() {
31+
DeleteImageUnusedLinksVDSCommandParameters params = getParameters();
32+
statusReturn = getBroker().deleteImageUnusedLinks(
33+
params.getSdUUID().toString(),
34+
params.getSpUUID().toString(),
35+
params.getImgUUID().toString());
36+
37+
proceedProxyReturnValue();
38+
}
39+
}

backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,4 +610,5 @@ StatusOnlyReturn glusterVolumeResetBrickCommitForce(String volumeName,
610610

611611
ScreenshotInfoReturn createScreenshot(String vmId);
612612

613+
StatusOnlyReturn deleteImageUnusedLinks(String sdUUID, String spUUID, String imgUUID);
613614
}

backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/NullVdsServer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,4 +1109,9 @@ public GlusterVolumeGlobalOptionsInfoReturn glusterVolumeGlobalOptionsGet() {
11091109
public ScreenshotInfoReturn createScreenshot(String vmId) {
11101110
return null;
11111111
}
1112+
1113+
@Override
1114+
public StatusOnlyReturn deleteImageUnusedLinks(String sdUUID, String spUUID, String imgUUID) {
1115+
return null;
1116+
}
11121117
}

0 commit comments

Comments
 (0)