From c0dabdc181c378ebd6e963aea4e1adf8a5fb89a8 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Thu, 14 Aug 2025 16:24:16 +0530 Subject: [PATCH 1/4] server: enable KVM volume and VM snapshot by default Given EL6/EL7 is deprecated now and most modern supported KVM distros ship newer versions of qemu, KVM volume and VM snapshot can be enabled by default. Fixes #11445 Signed-off-by: Rohit Yadav --- server/src/main/java/com/cloud/configuration/Config.java | 2 +- .../main/java/com/cloud/storage/snapshot/SnapshotManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/com/cloud/configuration/Config.java b/server/src/main/java/com/cloud/configuration/Config.java index d728c251af78..dc33d80be063 100644 --- a/server/src/main/java/com/cloud/configuration/Config.java +++ b/server/src/main/java/com/cloud/configuration/Config.java @@ -405,7 +405,7 @@ public enum Config { "300", "The time interval in seconds when the management server polls for snapshots to be scheduled.", null), - KVMSnapshotEnabled("Hidden", SnapshotManager.class, Boolean.class, "kvm.snapshot.enabled", "false", "Whether volume snapshot is enabled on running instances on a KVM host", null), + KVMSnapshotEnabled("Hidden", SnapshotManager.class, Boolean.class, "kvm.snapshot.enabled", "true", "Whether volume snapshot is enabled on running instances on a KVM host", null), // Advanced EventPurgeInterval( diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java index 6e2059e57761..be59083e5b5d 100644 --- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java +++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java @@ -53,7 +53,7 @@ public interface SnapshotManager extends Configurable { public static final ConfigKey BackupRetryInterval = new ConfigKey(Integer.class, "backup.retry.interval", "Advanced", "300", "Time in seconds between retries in backing up snapshot to secondary", false, ConfigKey.Scope.Global, null); - public static final ConfigKey VmStorageSnapshotKvm = new ConfigKey<>(Boolean.class, "kvm.vmstoragesnapshot.enabled", "Snapshots", "false", "For live snapshot of virtual machine instance on KVM hypervisor without memory. Requires qemu version 1.6+ (on NFS or Local file system) and qemu-guest-agent installed on guest VM", true, ConfigKey.Scope.Global, null); + public static final ConfigKey VmStorageSnapshotKvm = new ConfigKey<>(Boolean.class, "kvm.vmstoragesnapshot.enabled", "Snapshots", "true", "For live snapshot of virtual machine instance on KVM hypervisor without memory. Requires qemu version 1.6+ (on NFS or Local file system) and qemu-guest-agent installed on guest VM", true, ConfigKey.Scope.Global, null); ConfigKey kvmIncrementalSnapshot = new ConfigKey<>(Boolean.class, "kvm.incremental.snapshot", "Snapshots", "false", "Whether differential snapshots are enabled for" + " KVM or not. When this is enabled, all KVM snapshots will be incremental. Bear in mind that it will generate a new full snapshot when the snapshot chain reaches the limit defined in snapshot.delta.max.", true, ConfigKey.Scope.Cluster, null); From 7f8ae20bc59fd06a5686ae9511a61830a8b56983 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Thu, 14 Aug 2025 16:28:32 +0530 Subject: [PATCH 2/4] server: fix upper to lowercase for query/usage Signed-off-by: Rohit Yadav --- server/src/main/java/com/cloud/server/ManagementServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index 1b96cd4ef15b..1e8edba65463 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -4684,7 +4684,7 @@ public Map listCapabilities(final ListCapabilitiesCmd cmd) { final long diskOffMinSize = VolumeOrchestrationService.CustomDiskOfferingMinSize.value(); final long diskOffMaxSize = VolumeOrchestrationService.CustomDiskOfferingMaxSize.value(); - KVMSnapshotEnabled = Boolean.parseBoolean(_configDao.getValue("KVM.snapshot.enabled")); + KVMSnapshotEnabled = Boolean.parseBoolean(_configDao.getValue("kvm.snapshot.enabled")); final boolean userPublicTemplateEnabled = TemplateManager.AllowPublicUserTemplates.valueIn(caller.getId()); From 0d5c58c40cfd2901ad1210482d7d3c15894cd342 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 3 Sep 2025 15:18:50 +0530 Subject: [PATCH 3/4] Move kvm.snapshot.enabled to ConfigKey --- server/src/main/java/com/cloud/configuration/Config.java | 1 - .../src/main/java/com/cloud/server/ManagementServerImpl.java | 4 ++-- .../main/java/com/cloud/storage/snapshot/SnapshotManager.java | 3 +++ .../java/com/cloud/storage/snapshot/SnapshotManagerImpl.java | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/server/src/main/java/com/cloud/configuration/Config.java b/server/src/main/java/com/cloud/configuration/Config.java index dc33d80be063..3e039e44c0c4 100644 --- a/server/src/main/java/com/cloud/configuration/Config.java +++ b/server/src/main/java/com/cloud/configuration/Config.java @@ -405,7 +405,6 @@ public enum Config { "300", "The time interval in seconds when the management server polls for snapshots to be scheduled.", null), - KVMSnapshotEnabled("Hidden", SnapshotManager.class, Boolean.class, "kvm.snapshot.enabled", "true", "Whether volume snapshot is enabled on running instances on a KVM host", null), // Advanced EventPurgeInterval( diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index 1e8edba65463..a84dfc139331 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -789,6 +789,7 @@ import com.cloud.storage.GuestOSVO; import com.cloud.storage.GuestOsCategory; import com.cloud.storage.ScopeType; +import com.cloud.storage.snapshot.SnapshotManager; import com.cloud.storage.Storage; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; @@ -4667,7 +4668,6 @@ public Map listCapabilities(final ListCapabilitiesCmd cmd) { final boolean isCallerAdmin = _accountService.isAdmin(caller.getId()); boolean securityGroupsEnabled = false; boolean elasticLoadBalancerEnabled; - boolean KVMSnapshotEnabled; String supportELB = "false"; final List networks = networkDao.listSecurityGroupEnabledNetworks(); if (networks != null && !networks.isEmpty()) { @@ -4684,7 +4684,7 @@ public Map listCapabilities(final ListCapabilitiesCmd cmd) { final long diskOffMinSize = VolumeOrchestrationService.CustomDiskOfferingMinSize.value(); final long diskOffMaxSize = VolumeOrchestrationService.CustomDiskOfferingMaxSize.value(); - KVMSnapshotEnabled = Boolean.parseBoolean(_configDao.getValue("kvm.snapshot.enabled")); + final boolean KVMSnapshotEnabled = SnapshotManager.KVMSnapshotEnabled.value(); final boolean userPublicTemplateEnabled = TemplateManager.AllowPublicUserTemplates.valueIn(caller.getId()); diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java index be59083e5b5d..b245a3719694 100644 --- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java +++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java @@ -55,6 +55,9 @@ public interface SnapshotManager extends Configurable { public static final ConfigKey VmStorageSnapshotKvm = new ConfigKey<>(Boolean.class, "kvm.vmstoragesnapshot.enabled", "Snapshots", "true", "For live snapshot of virtual machine instance on KVM hypervisor without memory. Requires qemu version 1.6+ (on NFS or Local file system) and qemu-guest-agent installed on guest VM", true, ConfigKey.Scope.Global, null); + ConfigKey KVMSnapshotEnabled = new ConfigKey<>(Boolean.class, "kvm.snapshot.enabled", "Snapshots", "true", "Whether volume snapshot is enabled on running instances " + + "on a KVM hosts", false, ConfigKey.Scope.Global, null); + ConfigKey kvmIncrementalSnapshot = new ConfigKey<>(Boolean.class, "kvm.incremental.snapshot", "Snapshots", "false", "Whether differential snapshots are enabled for" + " KVM or not. When this is enabled, all KVM snapshots will be incremental. Bear in mind that it will generate a new full snapshot when the snapshot chain reaches the limit defined in snapshot.delta.max.", true, ConfigKey.Scope.Cluster, null); diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java index a27885527d44..911119700a36 100755 --- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -298,7 +298,7 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { return new ConfigKey[] {BackupRetryAttempts, BackupRetryInterval, SnapshotHourlyMax, SnapshotDailyMax, SnapshotMonthlyMax, SnapshotWeeklyMax, usageSnapshotSelection, - SnapshotInfo.BackupSnapshotAfterTakingSnapshot, VmStorageSnapshotKvm, kvmIncrementalSnapshot, snapshotDeltaMax, snapshotShowChainSize, UseStorageReplication}; + SnapshotInfo.BackupSnapshotAfterTakingSnapshot, VmStorageSnapshotKvm, kvmIncrementalSnapshot, snapshotDeltaMax, snapshotShowChainSize, UseStorageReplication, KVMSnapshotEnabled}; } @Override @@ -1510,7 +1510,7 @@ private boolean hostSupportsSnapsthotForVolume(HostVO host, VolumeInfo volume, b if (vmId != null) { VMInstanceVO vm = _vmDao.findById(vmId); if (vm.getState() != VirtualMachine.State.Stopped && vm.getState() != VirtualMachine.State.Destroyed) { - boolean snapshotEnabled = Boolean.parseBoolean(_configDao.getValue("kvm.snapshot.enabled")); + boolean snapshotEnabled = KVMSnapshotEnabled.value(); if (!snapshotEnabled && !isFromVmSnapshot) { logger.debug("Snapshot is not supported on host " + host + " for the volume " + volume + " attached to the vm " + vm); return false; From 129f6c709e8491c73823999ef681b0b4e2542460 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Fri, 10 Oct 2025 09:36:12 +0530 Subject: [PATCH 4/4] enable kvm.snaphot.enabled in old upgrade path Signed-off-by: Rohit Yadav --- .../schema/src/main/resources/META-INF/db/schema-410to420.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-410to420.sql b/engine/schema/src/main/resources/META-INF/db/schema-410to420.sql index 35f73b35d3ca..d62a9bb93034 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-410to420.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-410to420.sql @@ -2305,7 +2305,7 @@ CREATE TABLE `cloud_usage`.`usage_vmsnapshot` ( ) ENGINE=InnoDB CHARSET=utf8; INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'healthcheck.update.interval', '600', 'Time Interval to fetch the LB health check states (in sec)'); -INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Snapshots', 'DEFAULT', 'SnapshotManager', 'kvm.snapshot.enabled', 'false', 'whether snapshot is enabled for KVM hosts'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Snapshots', 'DEFAULT', 'SnapshotManager', 'kvm.snapshot.enabled', 'true', 'whether snapshot is enabled for KVM hosts'); INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'eip.use.multiple.netscalers', 'false', 'Should be set to true, if there will be multiple NetScaler devices providing EIP service in a zone'); INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Snapshots', 'DEFAULT', 'SnapshotManager', 'snapshot.backup.rightafter', 'true', 'backup snapshot right after snapshot is taken');