Martin Mucha has uploaded a new change for review. Change subject: core: altered IsoDomainListSyncronizer to refresh and return really *all* files if asked for it ......................................................................
core: altered IsoDomainListSyncronizer to refresh and return really *all* files if asked for it • formerly when asked to refresh resp. get files using org.ovirt.engine.core.common.businessentities.storage.ImageFileType#All type, only 'ISO' and 'Floppy' were refreshed resp. obtained. After this change all files are listed by vdsm and stored in db upon such request. • having no way here to identify type of files, IsoDomainListSyncronizer will store them into db with type 'Unknown' assigned. Change-Id: I85f93246f903c16e8fdf9054ab54b9d9a3184eed Signed-off-by: Martin Mucha <mmu...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java 1 file changed, 94 insertions(+), 31 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/76/41276/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java index 2e14ca7..5aac44a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java @@ -1,7 +1,9 @@ package org.ovirt.engine.core.bll; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -81,8 +83,11 @@ getGuestToolsSetupIsoPrefix(), TOOL_CLUSTER_LEVEL, TOOL_VERSION); - public static final String ISO_FILE_PATTERN = "*.iso"; - public static final String FLOPPY_FILE_PATTERN = "*.vfd"; + public static final String ISO_VDSM_FILE_PATTERN = "*.iso"; + public static final String ISO_FILE_PATTERN_REGEX = "^.*\\.iso$"; + public static final String FLOPPY_VDSM_FILE_PATTERN = "*.vfd"; + public static final String FLOPPY_FILE_PATTERN_REGEX = "^.*\\.vfd$"; + public static final String ALL_FILES_PATTERN = "*"; // Not kept as static member to enable reloading the config value public static String getGuestToolsSetupIsoPrefix() { @@ -276,29 +281,33 @@ private boolean refreshIsoDomainFileForStoragePool(Guid storageDomainId, Guid storagePoolId, ImageFileType imageType) { - boolean refreshSucceeded = false; + // Setting the indication to the indication whether the storage pool is valid. - boolean updateFromVDSMSucceeded = true; - - // If the SPM and the storage pool are valid, try to refresh the Iso list by fetching it from the SPM. - if (imageType == ImageFileType.ISO || imageType == ImageFileType.All) { - updateFromVDSMSucceeded = updateIsoListFromVDSM(storagePoolId, storageDomainId); - } - - if (imageType == ImageFileType.Floppy || imageType == ImageFileType.All) { - updateFromVDSMSucceeded = - updateFloppyListFromVDSM(storagePoolId, storageDomainId) && updateFromVDSMSucceeded; - } + boolean updateFromVDSMSucceeded = updateFileList(storageDomainId, storagePoolId, imageType); // Log if the refresh succeeded or add the storage domain to the problematic list. if (updateFromVDSMSucceeded) { - refreshSucceeded = true; log.debug("Refresh succeeded for file type '{}' at storage domain id '{}' in storage pool id '{}'.", imageType.name(), storageDomainId, storagePoolId); } - return refreshSucceeded; + + return updateFromVDSMSucceeded; + } + + private boolean updateFileList(Guid storageDomainId, Guid storagePoolId, ImageFileType imageType) { + switch (imageType) { + case All: + return updateAllFileListFromVDSM(storagePoolId, storageDomainId); + case ISO: + return updateIsoListFromVDSM(storagePoolId, storageDomainId); + case Floppy: + return updateFloppyListFromVDSM(storagePoolId, storageDomainId); + default: + log.warn("Refreshing Iso domain using unsupported imageType: {}", imageType); + return false; + } } /** @@ -648,6 +657,45 @@ return ((System.currentTimeMillis() - lastRefreshed) > isoDomainRefreshRate); } + private boolean updateAllFileListFromVDSM(Guid repoStoragePoolId, Guid repoStorageDomainId) { + VDSReturnValue fileStatsVDSReturnValue = getFileStats(repoStoragePoolId, + repoStorageDomainId, + ALL_FILES_PATTERN, + null); + + Map<String, Map<String, Object>> fileStats = fileStatsFromVDSReturnValue(fileStatsVDSReturnValue); + updateIsoListFromVDSM(repoStoragePoolId, + repoStorageDomainId, + removeFileStatsForComplyingFileNames(fileStats, ISO_FILE_PATTERN_REGEX)); + + updateFloppyListFromVDSM(repoStoragePoolId, + repoStorageDomainId, + removeFileStatsForComplyingFileNames(fileStats, FLOPPY_FILE_PATTERN_REGEX)); + + //all remaining fileStats are uncategorized, of ImageFileType.Unknown type + return refreshVdsmFileList(repoStoragePoolId, + repoStorageDomainId, + ImageFileType.Unknown, + fileStats, + null); + } + + private Map<String, Map<String, Object>> removeFileStatsForComplyingFileNames(Map<String, Map<String, Object>> fileStats, + String isoFilePatternRegex) { + + Map<String, Map<String, Object>> result = new HashMap<>(); + for (Iterator<Map.Entry<String, Map<String, Object>>> it = fileStats.entrySet().iterator(); it.hasNext(); ) { + Map.Entry<String, Map<String, Object>> entry = it.next(); + String fileName = entry.getKey(); + if (fileName.matches(isoFilePatternRegex)) { + result.put(fileName, entry.getValue()); + it.remove(); + } + } + + return result; + } + /** * Gets the Iso file list from VDSM, and if the fetch is valid refresh the Iso list in the DB. * @@ -656,14 +704,18 @@ * * @return True, if the fetch from VDSM has succeeded. False otherwise. */ - private boolean updateIsoListFromVDSM(Guid repoStoragePoolId, - Guid repoStorageDomainId) { + private boolean updateIsoListFromVDSM(Guid repoStoragePoolId, Guid repoStorageDomainId) { VDSReturnValue fileStats = getFileStats(repoStoragePoolId, repoStorageDomainId, - ISO_FILE_PATTERN, + ISO_VDSM_FILE_PATTERN, VDSCommandType.GetIsoList); + return updateIsoListFromVDSM(repoStoragePoolId, repoStorageDomainId, fileStatsFromVDSReturnValue(fileStats)); + } + + private boolean updateIsoListFromVDSM(Guid repoStoragePoolId, + Guid repoStorageDomainId, Map<String, Map<String, Object>> fileStats) { FileListRefreshed fileListRefreshed = new FileListRefreshed() { @Override public void onFileListRefreshed(Guid poolId, Set<String> isoList) { @@ -673,15 +725,14 @@ return refreshVdsmFileList(repoStoragePoolId, repoStorageDomainId, - fileListRefreshed, - ImageFileType.ISO, - fileStatsFromVDSReturnValue(fileStats)); + ImageFileType.ISO, fileStats, fileListRefreshed); } private boolean refreshVdsmFileList(Guid repoStoragePoolId, Guid repoStorageDomainId, - FileListRefreshed fileListRefreshed, - ImageFileType imageFileType, Map<String, Map<String, Object>> fileStats) { + ImageFileType imageFileType, + Map<String, Map<String, Object>> fileStats, + FileListRefreshed fileListRefreshed) { if (repoStorageDomainId == null) { return false; @@ -741,14 +792,18 @@ VDSReturnValue fileStats = getFileStats(repoStoragePoolId, repoStorageDomainId, - FLOPPY_FILE_PATTERN, + FLOPPY_VDSM_FILE_PATTERN, VDSCommandType.GetFloppyList); + return updateFloppyListFromVDSM(repoStoragePoolId, repoStorageDomainId, fileStatsFromVDSReturnValue(fileStats)); + } + + private boolean updateFloppyListFromVDSM(Guid repoStoragePoolId, + Guid repoStorageDomainId, Map<String, Map<String, Object>> fileStats) { return refreshVdsmFileList(repoStoragePoolId, repoStorageDomainId, - null, - ImageFileType.Floppy, - fileStatsFromVDSReturnValue(fileStats)); + ImageFileType.Floppy, fileStats, null + ); } private String succeededOrFailed(boolean status) { @@ -762,15 +817,23 @@ StoragePool dc = getStoragePoolDAO().get(repoStoragePoolId); VDSBrokerFrontend resourceManager = Backend.getInstance().getResourceManager(); - if (FeatureSupported.getFileStats(dc.getCompatibilityVersion())) { + boolean vdsmFileStatsSupported = FeatureSupported.getFileStats(dc.getCompatibilityVersion()); + if (vdsmFileStatsSupported) { GetFileStatsParameters parameters = new GetFileStatsParameters(repoStoragePoolId, repoStorageDomainId, filePattern, false); return resourceManager.RunVdsCommand(VDSCommandType.GetFileStats, parameters); } else { - return resourceManager.RunVdsCommand(alternateGetFileStatsCommand, - new IrsBaseVDSCommandParameters(repoStoragePoolId)); + if (alternateGetFileStatsCommand == null) { + //TODO MM: can I assume, that this need not to be 'forward' compatible and remove this? + VDSReturnValue vdsReturnValue = new VDSReturnValue(); + vdsReturnValue.setSucceeded(false); + return vdsReturnValue; + } else { + return resourceManager.RunVdsCommand(alternateGetFileStatsCommand, + new IrsBaseVDSCommandParameters(repoStoragePoolId)); + } } } -- To view, visit https://gerrit.ovirt.org/41276 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I85f93246f903c16e8fdf9054ab54b9d9a3184eed Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Martin Mucha <mmu...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches