From 966814b07d438c3d9eac415c54c1b4bdbf1911f9 Mon Sep 17 00:00:00 2001 From: Syed Date: Thu, 15 Dec 2016 14:12:59 -0500 Subject: [PATCH 1/4] Fix HVM VM restart bug in XenServer --- .../hypervisor/xenserver/resource/CitrixResourceBase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index 2865e56fd30..574653647d3 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -1149,8 +1149,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe vbdr.unpluggable = (volume.getType() == Volume.Type.ROOT) ? false : true; vbdr.userdevice = "autodetect"; final Long deviceId = volume.getDiskSeq(); - if (deviceId != null && !isDeviceUsed(conn, vm, deviceId)) { - vbdr.userdevice = deviceId.toString(); + if (deviceId != null && (!isDeviceUsed(conn, vm, deviceId) || deviceId > 3)) { + vbdr.userdevice = deviceId.toString(); } } final VBD vbd = VBD.create(conn, vbdr); From ca84fd4ffd5d80aef9c7624365d29d7b2aeb3225 Mon Sep 17 00:00:00 2001 From: Anshul Gangwar Date: Fri, 24 Jul 2015 14:45:20 +0530 Subject: [PATCH 2/4] CLOUDSTACK-8663: Fixed various issues to allow VM snapshots and volume snapshots to exist together Reverting VM to disk only snapshot in Xenserver corrupts VM Stale NFS secondary storage on XS leads to volume creation failure from snapshot --- .../resource/CitrixResourceBase.java | 30 +++++++++++++++++++ .../resource/XenServerStorageProcessor.java | 2 +- .../Xenserver625StorageProcessor.java | 2 +- .../cloud/storage/VolumeApiServiceImpl.java | 7 ----- .../vm/snapshot/VMSnapshotManagerImpl.java | 5 ---- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index 2865e56fd30..da465639507 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -29,6 +29,8 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.nio.charset.Charset; + +import org.apache.commons.collections.MapUtils; import org.joda.time.Duration; import java.util.ArrayList; import java.util.Date; @@ -1415,6 +1417,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe vbdr.userdevice = "autodetect"; vbdr.mode = Types.VbdMode.RW; vbdr.type = Types.VbdType.DISK; + Long deviceId = volumeTO.getDeviceId(); + if (deviceId != null && (!isDeviceUsed(conn, vm, deviceId) || deviceId > 3)) { + vbdr.userdevice = deviceId.toString(); + } VBD.create(conn, vbdr); } return vm; @@ -4350,6 +4356,30 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } + protected void skipOrRemoveSR(Connection conn, SR sr) { + if (sr == null) { + return; + } + if (s_logger.isDebugEnabled()) { + s_logger.debug(logX(sr, "Removing SR")); + } + try { + Set vdis = sr.getVDIs(conn); + for (VDI vdi : vdis) { + if (MapUtils.isEmpty(vdi.getCurrentOperations(conn))) { + continue; + } + return; + } + removeSR(conn, sr); + return; + } catch (XenAPIException | XmlRpcException e) { + s_logger.warn(logX(sr, "Unable to get current opertions " + e.toString()), e); + } + String msg = "Remove SR failed"; + s_logger.warn(msg); + } + public void removeSR(final Connection conn, final SR sr) { if (sr == null) { return; 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 bcf997fe2ca..1144276f711 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 @@ -1199,7 +1199,7 @@ public class XenServerStorageProcessor implements StorageProcessor { final Set snapshots = volume.getSnapshots(conn); for (final VDI snapshot : snapshots) { try { - if (!snapshot.getUuid(conn).equals(avoidSnapshotUuid) && snapshot.getSnapshotTime(conn).before(avoidSnapshot.getSnapshotTime(conn))) { + if (!snapshot.getUuid(conn).equals(avoidSnapshotUuid) && snapshot.getSnapshotTime(conn).before(avoidSnapshot.getSnapshotTime(conn)) && snapshot.getVBDs(conn).isEmpty()) { snapshot.destroy(conn); } } catch (final Exception e) { 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 e3c3beb01bb..b70057dda9c 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 @@ -738,7 +738,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { s_logger.warn(details, e); } finally { if (srcSr != null) { - hypervisorResource.removeSR(conn, srcSr); + hypervisorResource.skipOrRemoveSR(conn, srcSr); } if (!result && destVdi != null) { try { diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java index 77ecc2a0406..2a9f02d7b5c 100644 --- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java @@ -2146,13 +2146,6 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic throw new InvalidParameterValueException("Can't find zone by id " + volume.getDataCenterId()); } - if (volume.getInstanceId() != null) { - // Check that Vm to which this volume is attached does not have VM Snapshots - if (_vmSnapshotDao.findByVm(volume.getInstanceId()).size() > 0) { - throw new InvalidParameterValueException("Volume snapshot is not allowed, please detach it from VM with VM Snapshots"); - } - } - if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(caller.getId())) { throw new PermissionDeniedException("Cannot perform this operation, Zone is currently disabled: " + zone.getName()); } diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java index bb1536d2810..5e6ec1c5a7d 100644 --- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java +++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java @@ -263,11 +263,6 @@ public class VMSnapshotManagerImpl extends MutualExclusiveIdsManagerBase impleme throw new InvalidParameterValueException("Creating VM snapshot failed due to VM:" + vmId + " is a system VM or does not exist"); } - if (_snapshotDao.listByInstanceId(vmId, Snapshot.State.BackedUp).size() > 0) { - throw new InvalidParameterValueException( - "VM snapshot for this VM is not allowed. This VM has volumes attached which has snapshots, please remove all snapshots before taking VM snapshot"); - } - // VM snapshot with memory is not supported for VGPU Vms if (snapshotMemory && _serviceOfferingDetailsDao.findDetail(userVmVo.getServiceOfferingId(), GPU.Keys.vgpuType.toString()) != null) { throw new InvalidParameterValueException("VM snapshot with MEMORY is not supported for vGPU enabled VMs."); From c883e294d36f64d09bed2f7e22086ab413f28d33 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 16 Feb 2017 12:01:44 +0100 Subject: [PATCH 3/4] CLOUDSTACK-9788: Fix exception listNetworks with pagesize=0 --- utils/src/main/java/com/cloud/utils/StringUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/src/main/java/com/cloud/utils/StringUtils.java b/utils/src/main/java/com/cloud/utils/StringUtils.java index 71cebe16fef..9554e87c35e 100644 --- a/utils/src/main/java/com/cloud/utils/StringUtils.java +++ b/utils/src/main/java/com/cloud/utils/StringUtils.java @@ -296,8 +296,8 @@ public class StringUtils { public static List applyPagination(final List originalList, final Long startIndex, final Long pageSizeVal) { // Most likely pageSize will never exceed int value, and we need integer to partition the listToReturn final boolean applyPagination = startIndex != null && pageSizeVal != null - && startIndex <= Integer.MAX_VALUE && startIndex >= Integer.MIN_VALUE && pageSizeVal <= Integer.MAX_VALUE - && pageSizeVal >= Integer.MIN_VALUE; + && startIndex <= Integer.MAX_VALUE && startIndex >= 0 && pageSizeVal <= Integer.MAX_VALUE + && pageSizeVal > 0; List listWPagination = null; if (applyPagination) { listWPagination = new ArrayList<>(); From 5604b4c59e73472d3aa14d08c27a9e1bf1a7948b Mon Sep 17 00:00:00 2001 From: Joakim Sernbrant Date: Tue, 21 Feb 2017 16:39:42 +0100 Subject: [PATCH 4/4] CLOUDSTACK-9746 system-vm: logrotate config causes critical failures * rotate both daily and by size by using maxsize in stead of size * decrease the max size to 10M for rsyslog files * remove delaycompress for rsyslog files * increase rotate to 10 for cloud.log --- systemvm/patches/debian/config/etc/logrotate.d/apache2 | 2 +- systemvm/patches/debian/config/etc/logrotate.d/cloud | 4 ++-- systemvm/patches/debian/config/etc/logrotate.d/conntrackd | 2 +- systemvm/patches/debian/config/etc/logrotate.d/dnsmasq | 2 +- systemvm/patches/debian/config/etc/logrotate.d/haproxy | 2 +- systemvm/patches/debian/config/etc/logrotate.d/ppp | 2 +- systemvm/patches/debian/config/etc/logrotate.d/rsyslog | 6 ++---- 7 files changed, 9 insertions(+), 11 deletions(-) diff --git a/systemvm/patches/debian/config/etc/logrotate.d/apache2 b/systemvm/patches/debian/config/etc/logrotate.d/apache2 index 3932c274825..58ddb4dede5 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/apache2 +++ b/systemvm/patches/debian/config/etc/logrotate.d/apache2 @@ -4,6 +4,6 @@ rotate 3 compress dateext - size 10M + maxsize 10M notifempty } diff --git a/systemvm/patches/debian/config/etc/logrotate.d/cloud b/systemvm/patches/debian/config/etc/logrotate.d/cloud index 420fce23e18..bf0ec747c4d 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/cloud +++ b/systemvm/patches/debian/config/etc/logrotate.d/cloud @@ -15,9 +15,9 @@ # specific language governing permissions and limitations # under the License. /var/log/cloud.log { - rotate 4 + rotate 10 daily - size 10M + maxsize 10M missingok notifempty compress diff --git a/systemvm/patches/debian/config/etc/logrotate.d/conntrackd b/systemvm/patches/debian/config/etc/logrotate.d/conntrackd index 0229cd7e8c5..89f560d1b95 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/conntrackd +++ b/systemvm/patches/debian/config/etc/logrotate.d/conntrackd @@ -1,6 +1,6 @@ /var/log/conntrackd-stats.log { daily - size 10M + maxsize 10M rotate 2 missingok compress diff --git a/systemvm/patches/debian/config/etc/logrotate.d/dnsmasq b/systemvm/patches/debian/config/etc/logrotate.d/dnsmasq index 2f917855190..9fb70f02fc8 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/dnsmasq +++ b/systemvm/patches/debian/config/etc/logrotate.d/dnsmasq @@ -1,6 +1,6 @@ /var/log/dnsmasq.log { daily - size 10M + maxsize 10M missingok rotate 5 notifempty diff --git a/systemvm/patches/debian/config/etc/logrotate.d/haproxy b/systemvm/patches/debian/config/etc/logrotate.d/haproxy index 858fe2a1c3a..1c8110bd751 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/haproxy +++ b/systemvm/patches/debian/config/etc/logrotate.d/haproxy @@ -3,7 +3,7 @@ rotate 5 missingok notifempty - size 10M + maxsize 10M postrotate /bin/kill -HUP `cat /var/run/rsyslog.pid 2> /dev/null` 2> /dev/null || true endscript diff --git a/systemvm/patches/debian/config/etc/logrotate.d/ppp b/systemvm/patches/debian/config/etc/logrotate.d/ppp index 2004e77ff0f..2d70f6aef49 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/ppp +++ b/systemvm/patches/debian/config/etc/logrotate.d/ppp @@ -1,6 +1,6 @@ /var/log/ppp-connect-errors { daily - size 10M + maxsize 10M rotate 5 missingok notifempty diff --git a/systemvm/patches/debian/config/etc/logrotate.d/rsyslog b/systemvm/patches/debian/config/etc/logrotate.d/rsyslog index 5803c43d875..9397f41d04a 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/rsyslog +++ b/systemvm/patches/debian/config/etc/logrotate.d/rsyslog @@ -2,10 +2,9 @@ { rotate 7 daily - size 50M + maxsize 10M missingok notifempty - delaycompress compress postrotate /usr/sbin/invoke-rc.d rsyslog rotate > /dev/null @@ -27,11 +26,10 @@ { rotate 10 daily - size 50M + maxsize 10M missingok notifempty compress - delaycompress sharedscripts postrotate /usr/sbin/invoke-rc.d rsyslog rotate > /dev/null