diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 75be4660a..5cc73c04d 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -9,7 +9,6 @@ import ( "fmt" "reflect" "regexp" - "strconv" "sync" "time" @@ -680,24 +679,7 @@ func (c *Cluster) Update(oldSpec, newSpec *acidv1.Postgresql) error { }() if c.OpConfig.EnableUnusedPVCDeletion && oldSpec.Spec.NumberOfInstances > newSpec.Spec.NumberOfInstances { - c.logger.Debug("deleting pvc of shut down pods") - - for i := oldSpec.Spec.NumberOfInstances - 1; i >= newSpec.Spec.NumberOfInstances; i-- { - - // Scaling down to 0 replicas is not cluster deletion so keep the last pvc. - // Operator will remove it only when explicit "kubectl pg delete" is issued - if i == 0 { - c.logger.Info("cluster scaled down to 0 pods; skipping deletion of the last pvc") - break - } - - podIndex := strconv.Itoa(int(i)) - pvcName := "pgdata-" + c.Name + "-" + podIndex - if err := c.KubeClient.PersistentVolumeClaims(c.Namespace).Delete(context.TODO(), pvcName, c.deleteOptions); err != nil { - c.logger.Warningf("could not delete PersistentVolumeClaim: %v", err) - // failing to delete pvc does not fail the update; Sync() may also delete unused PVCs later - } - } + c.deleteUnusedPersistentVolumeClaims() } // pod disruption budget diff --git a/pkg/cluster/sync.go b/pkg/cluster/sync.go index 271c03dba..b68abfb16 100644 --- a/pkg/cluster/sync.go +++ b/pkg/cluster/sync.go @@ -3,7 +3,6 @@ package cluster import ( "context" "fmt" - "strconv" batchv1beta1 "k8s.io/api/batch/v1beta1" v1 "k8s.io/api/core/v1" @@ -114,20 +113,7 @@ func (c *Cluster) Sync(newSpec *acidv1.Postgresql) error { // remove unused PVCs in case deleting them during scale down failed; see Update() // the last pvc stays until the cluster is explicitly deleted as opposed to being scaled down to 0 pods if c.OpConfig.EnableUnusedPVCDeletion && c.getNumberOfInstances(&c.Spec) > 0 { - - // XXX that also deletes PVC of pods shut down before this change is deployed - for i := c.getNumberOfInstances(&c.Spec); ; i++ { - podIndex := strconv.Itoa(int(i)) - pvcName := "pgdata-" + c.Name + "-" + podIndex - if err := c.KubeClient.PersistentVolumeClaims(c.Namespace).Delete(context.TODO(), pvcName, c.deleteOptions); err != nil { - if k8sutil.ResourceNotFound(err) { - // no more pvcs to delete - break - } - c.logger.Warningf("could not delete PersistentVolumeClaim: %v", err) - // next Sync() or Update() will retry - } - } + c.deleteUnusedPersistentVolumeClaims() } // sync connection pooler diff --git a/pkg/cluster/volumes.go b/pkg/cluster/volumes.go index a5bfe6c2d..084bd2484 100644 --- a/pkg/cluster/volumes.go +++ b/pkg/cluster/volumes.go @@ -15,6 +15,7 @@ import ( "github.com/zalando/postgres-operator/pkg/util" "github.com/zalando/postgres-operator/pkg/util/constants" "github.com/zalando/postgres-operator/pkg/util/filesystems" + "github.com/zalando/postgres-operator/pkg/util/k8sutil" "github.com/zalando/postgres-operator/pkg/util/volumes" ) @@ -52,6 +53,33 @@ func (c *Cluster) deletePersistentVolumeClaims() error { return nil } +func (c *Cluster) deleteUnusedPersistentVolumeClaims() { + + c.logger.Debug("deleting pvc of shut down pods") + + // Scaling down to 0 replicas is not cluster deletion so keep the last pvc. + // Operator will remove it only when explicit "kubectl pg delete" is issued + if c.getNumberOfInstances(&c.Spec) == 0 { + c.logger.Info("cluster scaled down to 0 pods; skipping deletion of the last pvc") + return + } + + // XXX that also deletes PVC of pods shut down before this change is deployed + for i := c.getNumberOfInstances(&c.Spec); ; i++ { + podIndex := strconv.Itoa(int(i)) + pvcName := "pgdata-" + c.Name + "-" + podIndex + if err := c.KubeClient.PersistentVolumeClaims(c.Namespace).Delete(context.TODO(), pvcName, c.deleteOptions); err != nil { + if k8sutil.ResourceNotFound(err) { + // no more pvcs to delete + break + } + c.logger.Warningf("could not delete PersistentVolumeClaim: %v", err) + // next Sync() or Update() will retry + } + } + +} + func (c *Cluster) listPersistentVolumes() ([]*v1.PersistentVolume, error) { result := make([]*v1.PersistentVolume, 0)