From 208f410fcd52a96192be06c905a3f83412410feb Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 5 Dec 2024 10:38:14 +0100 Subject: [PATCH 1/2] upgrade: consider multiple hypervisors and secondary storages This fixes an issue during upgrade in edge case. Steps to reproduce the issue - deploy an env with ACS 4.18 - the env has multiple hypervisors: KVM and VMware - the env has multiple secondary storages: sec1 and sec2 - register the new 4.19.1 systemvm template for VMware (systemvm-vmware-4.19.1), but mistakely as a private template. - the systemvm template is downloaded to sec2 (not sec1). If it is downloaded to sec1, remove it and re-register the template. - backup the cloudstack databases by `mysqldump -R cloud` and `mysqldump -R cloud_usage` - install ACS 4.19.1.2 and start mgmt server Without this PR, got an NPE during mgmt server start ``` 2024-10-29 12:46:53,904 ERROR [c.c.u.SystemVmTemplateRegistration] (main:null) (logid:) Failed to register template for hypervisor: VMware java.lang.NullPointerException at com.cloud.upgrade.SystemVmTemplateRegistration.updateTemplateDetails(SystemVmTemplateRegistration.java:519) at com.cloud.upgrade.SystemVmTemplateRegistration.performTemplateRegistrationOperations(SystemVmTemplateRegistration.java:640) at com.cloud.upgrade.SystemVmTemplateRegistration.registerTemplate(SystemVmTemplateRegistration.java:650) at com.cloud.upgrade.SystemVmTemplateRegistration$4.doInTransactionWithoutResult(SystemVmTemplateRegistration.java:789) at com.cloud.utils.db.TransactionCallbackNoReturn.doInTransaction(TransactionCallbackNoReturn.java:25) ``` --- .../cloud/upgrade/SystemVmTemplateRegistration.java | 13 ++++++++----- .../java/com/cloud/storage/StorageManagerImpl.java | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java index 671fb8c95d53..72c2ff7ee8e3 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java @@ -794,11 +794,14 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { Long templateId = getRegisteredTemplateId(hypervisorAndTemplateName); if (templateId != null) { VMTemplateVO templateVO = vmTemplateDao.findById(templateId); - TemplateDataStoreVO templateDataStoreVO = templateDataStoreDao.findByTemplate(templateId, DataStoreRole.Image); - String installPath = templateDataStoreVO.getInstallPath(); - if (validateIfSeeded(storeUrlAndId.first(), installPath, nfsVersion)) { - continue; - } else if (templateVO != null) { + TemplateDataStoreVO templateDataStoreVO = templateDataStoreDao.findByStoreTemplate(storeUrlAndId.second(), templateId); + if (templateDataStoreVO != null) { + String installPath = templateDataStoreVO.getInstallPath(); + if (validateIfSeeded(storeUrlAndId.first(), installPath, nfsVersion)) { + continue; + } + } + if (templateVO != null) { registerTemplate(hypervisorAndTemplateName, storeUrlAndId, templateVO, templateDataStoreVO, filePath); continue; } diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index f966098c959c..36e0f582df8a 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -3441,7 +3441,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { TemplateDataStoreVO templateVO = null; if (templateId != null) { vmTemplateVO = _templateDao.findById(templateId); - templateVO = _templateStoreDao.findByTemplate(templateId, DataStoreRole.Image); + templateVO = _templateStoreDao.findByStoreTemplate(store.getId(), templateId); if (templateVO != null) { try { if (SystemVmTemplateRegistration.validateIfSeeded( From e2221b090cd3732dde61c9d7ecc0e9db351c48ce Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Wed, 8 Jan 2025 20:04:31 +0100 Subject: [PATCH 2/2] PR#10046: add Daan's changes --- .../cloud/upgrade/SystemVmTemplateRegistration.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java index 72c2ff7ee8e3..40a8cb4b11f4 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java @@ -803,6 +803,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { } if (templateVO != null) { registerTemplate(hypervisorAndTemplateName, storeUrlAndId, templateVO, templateDataStoreVO, filePath); + updateRegisteredTemplateDetails(templateId, hypervisorAndTemplateName); continue; } } @@ -826,6 +827,11 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { } private void updateRegisteredTemplateDetails(Long templateId, Map.Entry hypervisorAndTemplateName) { + Pair entry = new Pair<>(hypervisorAndTemplateName.getKey(), hypervisorAndTemplateName.getValue()); + updateRegisteredTemplateDetails(templateId, entry); + } + + private void updateRegisteredTemplateDetails(Long templateId, Pair hypervisorAndTemplateName) { VMTemplateVO templateVO = vmTemplateDao.findById(templateId); templateVO.setTemplateType(Storage.TemplateType.SYSTEM); boolean updated = vmTemplateDao.update(templateVO.getId(), templateVO); @@ -835,11 +841,11 @@ private void updateRegisteredTemplateDetails(Long templateId, Map.Entry configParams = new HashMap<>(); - configParams.put(RouterTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()), hypervisorAndTemplateName.getValue()); + configParams.put(RouterTemplateConfigurationNames.get(hypervisorAndTemplateName.first()), hypervisorAndTemplateName.second()); configParams.put("minreq.sysvmtemplate.version", getSystemVmTemplateVersion()); updateConfigurationParams(configParams); }