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 ahadas committed Oct 26, 2022
1 parent 116ed20 commit 2adc535
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 2adc535

Please sign in to comment.