From 93de4e2050cfac514f740068b3f72151487c72f3 Mon Sep 17 00:00:00 2001 From: Tvion Date: Fri, 10 Jul 2026 20:12:25 +0500 Subject: [PATCH] fix: [PSUPCLCAP-4782] Support case of major and collation upgrade --- operator/pkg/helper/patroni_core_helper.go | 10 ++----- operator/pkg/reconciler/patroni.go | 35 +++++++++++++++++----- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/operator/pkg/helper/patroni_core_helper.go b/operator/pkg/helper/patroni_core_helper.go index 9de7bff5..4cf85f8f 100644 --- a/operator/pkg/helper/patroni_core_helper.go +++ b/operator/pkg/helper/patroni_core_helper.go @@ -44,7 +44,7 @@ import ( var ( pHelper *PatroniHelper = nil - + secretFilePath = "/var/run/secrets/postgresql/" replicatorPasswordPath = secretFilePath + "replicator-credentials/" ) @@ -663,17 +663,13 @@ func (ph *PatroniHelper) GetPGVersionFromPod(podName string) string { } return strings.TrimSpace(version) } -func (ph *PatroniHelper) GetLocaleVersion(podName string) string { +func (ph *PatroniHelper) EnsureLocaleVersion(podName string) string { versionCM, err := util.FindCmInNamespaceByName(namespace, "deployment-info") if err != nil || versionCM.Data["locale-version"] == "" { version := ph.GetLocaleVersionFromPod(podName) if version != "" { - versionCM.Data["locale-version"] = version - _, err := ph.CreateOrUpdateConfigMap(versionCM) - if err != nil { - logger.Error("Failed to create or update config map deployment-info", zap.Error(err)) - } + ph.StoreDataToCM("locale-version", version) } return version } diff --git a/operator/pkg/reconciler/patroni.go b/operator/pkg/reconciler/patroni.go index e3c0d401..82ee03d1 100644 --- a/operator/pkg/reconciler/patroni.go +++ b/operator/pkg/reconciler/patroni.go @@ -80,12 +80,33 @@ func (r *PatroniReconciler) Reconcile() error { isStandbyClusterPresent := patroni.IsStandbyClusterConfigurationExist(cr) isPgbackrestUsed := cr.Spec.PgBackRest != nil + masterPod, err := r.helper.GetPodsByLabel(r.cluster.PatroniMasterSelectors) + if err != nil && !errors.IsNotFound(err) { + return err + } + + if len(masterPod.Items) != 0 { + // save locale version to config map + r.helper.EnsureLocaleVersion(masterPod.Items[0].Name) + } + if cr.Upgrade != nil && cr.Upgrade.Enabled { - logger.Info("Starting an upgrade procedure") - time.Sleep(30 * time.Second) - if err := r.upgrade.ProceedUpgrade(cr, r.cluster); err != nil { - logger.Error("Cannot upgrade patroni", zap.Error(err)) - return err + if len(masterPod.Items) == 0 { + logger.Info("Skipping upgrade procedure: master pod is not available") + return fmt.Errorf("master pod is not available, cannot perform major upgrade") + } else if !r.upgrade.CheckUpgrade(cr, r.cluster) { + logger.Info("Major upgrade is enabled but PostgreSQL version is not changed, skipping upgrade procedure") + if err := r.upgrade.UpdateUpgradeToDone(); err != nil { + logger.Error("Cannot reset upgrade flag", zap.Error(err)) + return err + } + } else { + logger.Info("Starting an upgrade procedure") + time.Sleep(30 * time.Second) + if err := r.upgrade.ProceedUpgrade(cr, r.cluster); err != nil { + logger.Error("Cannot upgrade patroni", zap.Error(err)) + return err + } } } @@ -138,7 +159,7 @@ func (r *PatroniReconciler) Reconcile() error { // find possible deployments by pods // try to get master pod - masterPod, err := r.helper.GetPodsByLabel(r.cluster.PatroniMasterSelectors) + masterPod, err = r.helper.GetPodsByLabel(r.cluster.PatroniMasterSelectors) if err != nil { if !errors.IsNotFound(err) { return err @@ -192,7 +213,7 @@ func (r *PatroniReconciler) Reconcile() error { if _, err := r.helper.IsHealthyWithTimeoutDuringUpdate(3*time.Minute, r.cluster.PatroniUrl, r.cluster.PgHost, statefulCount); err == nil { // check locale version, because different versions can affect postgres data - localeVersion := r.helper.GetLocaleVersion(masterPod.Items[0].Name) + localeVersion := r.helper.EnsureLocaleVersion(masterPod.Items[0].Name) replicaPods, err := r.helper.GetPodsByLabel(r.cluster.PatroniReplicasSelector) if err != nil {