refactor into single method

This commit is contained in:
Sergey Dudoladov 2020-04-01 18:11:11 +02:00
parent 1182c17963
commit 38417b589b
3 changed files with 30 additions and 34 deletions

View File

@ -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

View File

@ -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

View File

@ -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)