From 94776fbfd030528feccacdfc2d1ed85a38858f3f Mon Sep 17 00:00:00 2001 From: Khosrow Moossavi <372575+khos2ow@users.noreply.github.com> Date: Tue, 6 Feb 2018 14:09:40 -0500 Subject: [PATCH 1/3] CLOUDSTACK-10222: Clean snaphosts from primary storage when taking new (#2398) When user creates a snapshot (manual or recurring), snapshot remains on the primary storage, even if the snapshot is transferred successfully to secondary storage. This is causing issues because XenServer can only hold a limited number of snapshots in its VDI chain, preventing the user from creating new snapshots after some time, when too many old snapshots are present on the primary storage. --- .../resource/XenServerStorageProcessor.java | 2 +- .../resource/Xenserver625StorageProcessor.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java index 257c6a23e41..b575fdb4f02 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java @@ -1071,7 +1071,7 @@ public class XenServerStorageProcessor implements StorageProcessor { return false; } - private boolean destroySnapshotOnPrimaryStorage(final Connection conn, final String lastSnapshotUuid) { + protected boolean destroySnapshotOnPrimaryStorage(final Connection conn, final String lastSnapshotUuid) { try { final VDI snapshot = getVDIbyUuid(conn, lastSnapshotUuid); if (snapshot == null) { diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java index ca58e4a4154..dea1752abd7 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java @@ -559,12 +559,12 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { physicalSize = Long.parseLong(tmp[1]); finalPath = folder + File.separator + snapshotBackupUuid + ".vhd"; } - - final String volumeUuid = snapshotTO.getVolume().getPath(); - - destroySnapshotOnPrimaryStorageExceptThis(conn, volumeUuid, snapshotUuid); } + // remove every snapshot except this one from primary storage + final String volumeUuid = snapshotTO.getVolume().getPath(); + destroySnapshotOnPrimaryStorageExceptThis(conn, volumeUuid, snapshotUuid); + final SnapshotObjectTO newSnapshot = new SnapshotObjectTO(); newSnapshot.setPath(finalPath); newSnapshot.setPhysicalSize(physicalSize); @@ -577,12 +577,13 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { s_logger.info("New snapshot physical utilization: "+physicalSize); return new CopyCmdAnswer(newSnapshot); - } catch (final Types.XenAPIException e) { - details = "BackupSnapshot Failed due to " + e.toString(); - s_logger.warn(details, e); } catch (final Exception e) { - details = "BackupSnapshot Failed due to " + e.getMessage(); + final String reason = e instanceof Types.XenAPIException ? e.toString() : e.getMessage(); + details = "BackupSnapshot Failed due to " + reason; s_logger.warn(details, e); + + // remove last bad primary snapshot when exception happens + destroySnapshotOnPrimaryStorage(conn, snapshotUuid); } return new CopyCmdAnswer(details); From 123c20dc57d809f89bc1b012303e71b6892c8729 Mon Sep 17 00:00:00 2001 From: dahn Date: Wed, 7 Feb 2018 10:48:51 +0100 Subject: [PATCH 2/3] CLOUDSTACK-10146 checksum in java instead of script (#2405) * CLOUDSTACK-10146 checksum in java instead of script * root cause passing --- .../DirectTemplateDownloaderImpl.java | 39 ++++++------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java index 3b6bc9a6dd3..e120d847b17 100644 --- a/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java +++ b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java @@ -20,10 +20,13 @@ package com.cloud.agent.direct.download; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.script.Script; -import org.apache.cloudstack.utils.security.ChecksumValue; +import org.apache.cloudstack.utils.security.DigestHelper; import org.apache.commons.lang.StringUtils; import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.NoSuchAlgorithmException; import java.util.UUID; public abstract class DirectTemplateDownloaderImpl implements DirectTemplateDownloader { @@ -149,36 +152,16 @@ public abstract class DirectTemplateDownloaderImpl implements DirectTemplateDown return new DirectTemplateInformation(installPath, size, checksum); } - /** - * Return checksum command from algorithm - */ - private String getChecksumCommandFromAlgorithm(String algorithm) { - if (algorithm.equalsIgnoreCase("MD5")) { - return "md5sum"; - } else if (algorithm.equalsIgnoreCase("SHA-1")) { - return "sha1sum"; - } else if (algorithm.equalsIgnoreCase("SHA-224")) { - return "sha224sum"; - } else if (algorithm.equalsIgnoreCase("SHA-256")) { - return "sha256sum"; - } else if (algorithm.equalsIgnoreCase("SHA-384")) { - return "sha384sum"; - } else if (algorithm.equalsIgnoreCase("SHA-512")) { - return "sha512sum"; - } else { - throw new CloudRuntimeException("Unknown checksum algorithm: " + algorithm); - } - } - @Override public boolean validateChecksum() { if (StringUtils.isNotBlank(checksum)) { - ChecksumValue providedChecksum = new ChecksumValue(checksum); - String algorithm = providedChecksum.getAlgorithm(); - String checksumCommand = "echo '%s %s' | %s -c --quiet"; - String cmd = String.format(checksumCommand, providedChecksum.getChecksum(), downloadedFilePath, getChecksumCommandFromAlgorithm(algorithm)); - int result = Script.runSimpleBashScriptForExitValue(cmd); - return result == 0; + try { + return DigestHelper.check(checksum, new FileInputStream(downloadedFilePath)); + } catch (IOException e) { + throw new CloudRuntimeException("could not check sum for file: " + downloadedFilePath,e); + } catch (NoSuchAlgorithmException e) { + throw new CloudRuntimeException("Unknown checksum algorithm: " + checksum, e); + } } return true; } From 0befb2cceb8e2634adf796cd99ed89342ad03bf3 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Fri, 9 Feb 2018 09:49:23 +0100 Subject: [PATCH 3/3] CLOUDSTACK-10269: On deletion of role set name to null (#2444) During deletion of role, set name to null. This fixes concurrent exception issue where previously it would rename the deleted role with a timestamp. Signed-off-by: Rohit Yadav --- server/src/org/apache/cloudstack/acl/RoleManagerImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/org/apache/cloudstack/acl/RoleManagerImpl.java b/server/src/org/apache/cloudstack/acl/RoleManagerImpl.java index 5b3998e8de8..5557aff71e0 100644 --- a/server/src/org/apache/cloudstack/acl/RoleManagerImpl.java +++ b/server/src/org/apache/cloudstack/acl/RoleManagerImpl.java @@ -18,7 +18,6 @@ package org.apache.cloudstack.acl; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.List; import javax.inject.Inject; @@ -172,7 +171,7 @@ public class RoleManagerImpl extends ManagerBase implements RoleService, Configu } if (roleDao.remove(role.getId())) { RoleVO roleVO = roleDao.findByIdIncludingRemoved(role.getId()); - roleVO.setName(role.getName() + "-deleted-" + new Date()); + roleVO.setName(null); return roleDao.update(role.getId(), roleVO); } return false;