Skip to content

Commit

Permalink
core: add callback to RemoveDiskCommand
Browse files Browse the repository at this point in the history
Adding callback to RemoveDiskCommand so that it would wait for
RemoveImageCommand to finish, incl. removing the image from the DB.
This fixes an issue where RemoveDisk job was marked as FINISHED
before the image was actually removed from the DB.

Bug-Url: https://bugzilla.redhat.com/2137207
  • Loading branch information
mkemel authored and bennyz committed Oct 26, 2022
1 parent 936a8fc commit 8fc9203
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@
import java.util.concurrent.Future;
import java.util.stream.Collectors;

import javax.enterprise.inject.Instance;
import javax.inject.Inject;

import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.core.bll.CommandBase;
import org.ovirt.engine.core.bll.ConcurrentChildCommandsExecutionCallback;
import org.ovirt.engine.core.bll.DisableInPrepareMode;
import org.ovirt.engine.core.bll.LockMessage;
import org.ovirt.engine.core.bll.LockMessagesMatchUtil;
Expand All @@ -28,6 +30,7 @@
import org.ovirt.engine.core.bll.storage.disk.image.DisksFilter;
import org.ovirt.engine.core.bll.storage.disk.image.ImagesHandler;
import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.bll.validator.storage.DiskImagesValidator;
import org.ovirt.engine.core.bll.validator.storage.DiskOperationsValidator;
Expand Down Expand Up @@ -117,6 +120,8 @@ public class RemoveDiskCommand<T extends RemoveDiskParameters> extends CommandBa
private UnregisteredDisksDao unregisteredDisksDao;
@Inject
private CommandCoordinatorUtil commandCoordinatorUtil;
@Inject
private Instance<ConcurrentChildCommandsExecutionCallback> callbackProvider;

public RemoveDiskCommand(T parameters, CommandContext commandContext) {
super(parameters, commandContext);
Expand Down Expand Up @@ -398,7 +403,7 @@ private boolean canRemoveVmImageDisk() {

@Override
protected void executeCommand() {
switch (getDisk().getDiskStorageType()) {
switch (getDiskStorageType()) {
case IMAGE:
if (getDisk().getContentType() == DiskContentType.MEMORY_DUMP_VOLUME ||
getDisk().getContentType() == DiskContentType.MEMORY_METADATA_VOLUME) {
Expand Down Expand Up @@ -448,6 +453,7 @@ protected void executeCommand() {
if (getParameters().isUnregisteredDisk()) {
unregisteredDisksDao.removeUnregisteredDisk(getParameters().getDiskId(), getParameters().getStorageDomainId());
}
persistCommandIfNeeded();
}

private void removeManagedBlockStorageDisk() {
Expand Down Expand Up @@ -728,4 +734,16 @@ private Guid getQuotaId() {
@Override
public void addQuotaPermissionSubject(List<PermissionSubject> quotaPermissionList) {
}

private DiskStorageType getDiskStorageType() {
if (getParameters().getDiskStorageType() == null) {
getParameters().setDiskStorageType(getDisk().getDiskStorageType());
}
return getParameters().getDiskStorageType();
}

@Override
public CommandCallback getCallback() {
return getDiskStorageType() == DiskStorageType.IMAGE ? callbackProvider.get() : null;
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package org.ovirt.engine.core.common.action;
import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType;
import org.ovirt.engine.core.compat.Guid;

public class RemoveDiskParameters extends ActionParametersBase {

private static final long serialVersionUID = -3691440035048144457L;
private Guid diskId;
private Guid storageDomainId;
private DiskStorageType diskStorageType = null;
private boolean forceDelete;
private boolean suppressContentTypeCheck;
private boolean unregisteredDisk;
Expand Down Expand Up @@ -61,4 +63,12 @@ public boolean isUnregisteredDisk() {
public void setUnregisteredDisk(boolean unregisteredDisk) {
this.unregisteredDisk = unregisteredDisk;
}

public DiskStorageType getDiskStorageType() {
return diskStorageType;
}

public void setDiskStorageType(DiskStorageType diskStorageType) {
this.diskStorageType = diskStorageType;
}
}

0 comments on commit 8fc9203

Please sign in to comment.