Daniel Erez has uploaded a new change for review. Change subject: core: DiskImageDAO - introduce getAllSnapshotsForLeaf ......................................................................
core: DiskImageDAO - introduce getAllSnapshotsForLeaf Introducing a recursive stored procedure for retrieving a snapshot chain by a leaf image. It is required for ensuring data integrity when querying GetAllDisksByVmId (i.e. avoid race while removing a disk/etc). Change-Id: Ib6068be44fd5e5c47eed2064d87f506d3e3be444 Bug-Url: https://bugzilla.redhat.com/1113087 Signed-off-by: Daniel Erez <de...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetAllDisksByVmIdQuery.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfDataUpdater.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommandTest.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DiskImageDAOTest.java M packaging/dbscripts/disk_images_sp.sql 13 files changed, 63 insertions(+), 24 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/00/31500/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java index 8104612..ae9e442 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java @@ -303,7 +303,7 @@ } protected List<DiskImage> getAllImageSnapshots(DiskImage diskImage) { - return ImagesHandler.getAllImageSnapshots(diskImage.getImageId(), diskImage.getImageTemplateId()); + return ImagesHandler.getAllImageSnapshots(diskImage.getImageId()); } /** diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java index 87dee58..aaee8d4 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java @@ -162,7 +162,7 @@ } protected List<DiskImage> getAllImageSnapshots(DiskImage diskImage) { - return ImagesHandler.getAllImageSnapshots(diskImage.getImageId(), diskImage.getImageTemplateId()); + return ImagesHandler.getAllImageSnapshots(diskImage.getImageId()); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetAllDisksByVmIdQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetAllDisksByVmIdQuery.java index b3f1592..9024a9b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetAllDisksByVmIdQuery.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetAllDisksByVmIdQuery.java @@ -46,7 +46,7 @@ } protected List<DiskImage> getAllImageSnapshots(DiskImage diskImage) { - return ImagesHandler.getAllImageSnapshots(diskImage.getImageId(), diskImage.getImageTemplateId()); + return ImagesHandler.getAllImageSnapshots(diskImage.getImageId()); } private Map<Guid, VmDevice> getDisksVmDeviceMap() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java index e925f4c..d9353c5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java @@ -364,18 +364,10 @@ * be trybackfrom image * * @param imageId - * @param imageTemplateId * @return */ - public static ArrayList<DiskImage> getAllImageSnapshots(Guid imageId, Guid imageTemplateId) { - ArrayList<DiskImage> snapshots = new ArrayList<DiskImage>(); - Guid curImage = imageId; - while (!imageTemplateId.equals(curImage) && !curImage.equals(Guid.Empty)) { - DiskImage curDiskImage = DbFacade.getInstance().getDiskImageDao().getSnapshotById(curImage); - snapshots.add(curDiskImage); - curImage = curDiskImage.getParentId(); - } - return snapshots; + public static List<DiskImage> getAllImageSnapshots(Guid imageId) { + return DbFacade.getInstance().getDiskImageDao().getAllSnapshotsForLeaf(imageId); } public static String cdPathWindowsToLinux(String windowsPath, Guid storagePoolId, Guid vdsId) { @@ -520,8 +512,7 @@ if (disk.getDiskStorageType() == DiskStorageType.IMAGE) { DiskImage diskImage = (DiskImage) disk; diskImage.getSnapshots().addAll( - ImagesHandler.getAllImageSnapshots(diskImage.getImageId(), - diskImage.getImageTemplateId())); + ImagesHandler.getAllImageSnapshots(diskImage.getImageId())); } } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java index ad7b83d..eedc36b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java @@ -168,8 +168,8 @@ return false; } - private List<DiskImage> getAllImageSnapshots() { - return ImagesHandler.getAllImageSnapshots(getImage().getImageId(), getImage().getImageTemplateId()); + protected List<DiskImage> getAllImageSnapshots() { + return ImagesHandler.getAllImageSnapshots(getImage().getImageId()); } protected boolean checkIfNeedToBeOverride() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfDataUpdater.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfDataUpdater.java index 7b4af53..105cfcb 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfDataUpdater.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfDataUpdater.java @@ -490,9 +490,8 @@ } } - protected ArrayList<DiskImage> getAllImageSnapshots(DiskImage diskImage) { - return ImagesHandler.getAllImageSnapshots(diskImage.getImageId(), - diskImage.getImageTemplateId()); + protected List<DiskImage> getAllImageSnapshots(DiskImage diskImage) { + return ImagesHandler.getAllImageSnapshots(diskImage.getImageId()); } protected String generateVmMetadata(VM vm, ArrayList<DiskImage> AllVmImages) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java index 58f646c..47c6ca7 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfHelper.java @@ -101,8 +101,7 @@ List<DiskImage> filteredDisks = ImagesHandler.filterImageDisks(vm.getDiskList(), false, true, true); for (DiskImage diskImage : filteredDisks) { - List<DiskImage> images = ImagesHandler.getAllImageSnapshots(diskImage.getImageId(), - diskImage.getImageTemplateId()); + List<DiskImage> images = ImagesHandler.getAllImageSnapshots(diskImage.getImageId()); AllVmImages.addAll(images); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java index 0de7a35..dcead5b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java @@ -409,9 +409,8 @@ } for (DiskImage diskImage : disksList) { - Guid templateId = diskImage.getImageTemplateId(); List<DiskImage> allImageSnapshots = - ImagesHandler.getAllImageSnapshots(diskImage.getImageId(), templateId); + ImagesHandler.getAllImageSnapshots(diskImage.getImageId()); diskImage.getSnapshots().addAll(allImageSnapshots); } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommandTest.java index c5850fd..9afc2b0 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommandTest.java @@ -135,6 +135,7 @@ initSrcStorageDomain(); initDestStorageDomain(); doReturn(vmDeviceDao).when(command).getVmDeviceDAO(); + doReturn(new ArrayList<DiskImage>()).when(command).getAllImageSnapshots(); assertFalse(command.canDoAction()); assertTrue(command.getReturnValue() .getCanDoActionMessages() @@ -183,6 +184,7 @@ initSrcStorageDomain(); initDestStorageDomain(); doReturn(mockStorageDomainValidatorWithoutSpace()).when(command).createStorageDomainValidator(); + doReturn(new ArrayList<DiskImage>()).when(command).getAllImageSnapshots(); CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN); } @@ -194,6 +196,7 @@ initSrcStorageDomain(); initDestStorageDomain(); doReturn(mockStorageDomainValidatorWithSpace()).when(command).createStorageDomainValidator(); + doReturn(new ArrayList<DiskImage>()).when(command).getAllImageSnapshots(); CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command); } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java index 1dbbd0d..f0a4787 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAO.java @@ -31,6 +31,16 @@ List<DiskImage> getAllSnapshotsForParent(Guid id); /** + * Retrieves all snapshots by a given image id + * (ordered by the images chain). + * + * @param id + * the parent id + * @return the list of snapshots + */ + List<DiskImage> getAllSnapshotsForLeaf(Guid id); + + /** * Retrieves all snapshots associated with the given storage domain. * * @param id diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java index 281fca2..7368bd2 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskImageDAODbFacadeImpl.java @@ -51,6 +51,15 @@ } @Override + public List<DiskImage> getAllSnapshotsForLeaf(Guid id) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() + .addValue("image_guid", id); + return getCallsHandler().executeReadList("GetSnapshotByLeafGuid", + DiskImageRowMapper.instance, + parameterSource); + } + + @Override public List<DiskImage> getAllSnapshotsForStorageDomain(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("storage_domain_id", id); diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DiskImageDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DiskImageDAOTest.java index 64ebaed..664950b 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DiskImageDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DiskImageDAOTest.java @@ -148,4 +148,11 @@ assertNotNull(result); assertTrue(result.isEmpty()); } + + @Test + public void testGetAllSnapshotsForLeaf() { + List<DiskImage> images = dao.getAllSnapshotsForLeaf(FixturesTool.IMAGE_ID); + + assertFalse(images.isEmpty()); + } } diff --git a/packaging/dbscripts/disk_images_sp.sql b/packaging/dbscripts/disk_images_sp.sql index 3254c34..d2d7904 100644 --- a/packaging/dbscripts/disk_images_sp.sql +++ b/packaging/dbscripts/disk_images_sp.sql @@ -88,6 +88,28 @@ +Create or replace FUNCTION GetSnapshotByLeafGuid(v_image_guid UUID) +RETURNS SETOF images_storage_domain_view STABLE + AS $procedure$ +BEGIN + RETURN QUERY WITH RECURSIVE image_list AS ( + SELECT * + FROM images_storage_domain_view + WHERE image_guid = v_image_guid + UNION ALL + SELECT images_storage_domain_view.* + FROM images_storage_domain_view + JOIN image_list ON + image_list.parentid = images_storage_domain_view.image_guid AND + image_list.image_group_id = images_storage_domain_view.image_group_id + ) + SELECT * + FROM image_list; +END; $procedure$ +LANGUAGE plpgsql; + + + Create or replace FUNCTION GetVmImageByImageGuid(v_image_guid UUID) RETURNS SETOF vm_images_view STABLE -- To view, visit http://gerrit.ovirt.org/31500 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib6068be44fd5e5c47eed2064d87f506d3e3be444 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <de...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches