From 27c7245fed8bd156ec574b0584ac03166985d6fd Mon Sep 17 00:00:00 2001 From: Oleksii Kliukin Date: Fri, 18 May 2018 18:10:37 +0200 Subject: [PATCH] Avoid terminating delete on errors. When there is an error happening upon deletion of the Kubernetes object belonging to the cluster being removed, it makes no sense to abort the deletion: the manifest will be removed anyway, therefore all the objects after the one we aborted at will stay forever. --- pkg/cluster/cluster.go | 18 ++++++++---------- pkg/controller/postgresql.go | 4 +--- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 7f6bad25d..93966ce2c 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -628,44 +628,42 @@ func (c *Cluster) Update(oldSpec, newSpec *spec.Postgresql) error { // DCS, reuses the master's endpoint to store the leader related metadata. If we remove the endpoint // before the pods, it will be re-created by the current master pod and will remain, obstructing the // creation of the new cluster with the same name. Therefore, the endpoints should be deleted last. -func (c *Cluster) Delete() error { +func (c *Cluster) Delete() { c.mu.Lock() defer c.mu.Unlock() if err := c.deleteStatefulSet(); err != nil { - return fmt.Errorf("could not delete statefulset: %v", err) + c.logger.Warningf("could not delete statefulset: %v", err) } for _, obj := range c.Secrets { if delete, user := c.shouldDeleteSecret(obj); !delete { - c.logger.Infof("not removing secret %q for the system user %q", obj.GetName(), user) + c.logger.Warningf("not removing secret %q for the system user %q", obj.GetName(), user) continue } if err := c.deleteSecret(obj); err != nil { - return fmt.Errorf("could not delete secret: %v", err) + c.logger.Warningf("could not delete secret: %v", err) } } if err := c.deletePodDisruptionBudget(); err != nil { - return fmt.Errorf("could not delete pod disruption budget: %v", err) + c.logger.Warningf("could not delete pod disruption budget: %v", err) } for _, role := range []PostgresRole{Master, Replica} { if err := c.deleteEndpoint(role); err != nil { - return fmt.Errorf("could not delete %s endpoint: %v", role, err) + c.logger.Warningf("could not delete %s endpoint: %v", role, err) } if err := c.deleteService(role); err != nil { - return fmt.Errorf("could not delete %s service: %v", role, err) + c.logger.Warningf("could not delete %s service: %v", role, err) } } if err := c.deletePatroniClusterObjects(); err != nil { - return fmt.Errorf("could not remove leftover patroni objects; %v", err) + c.logger.Warningf("could not remove leftover patroni objects; %v", err) } - - return nil } // ReceivePodEvent is called back by the controller in order to add the cluster's pod event to the queue. diff --git a/pkg/controller/postgresql.go b/pkg/controller/postgresql.go index 8b890129b..c89a2473a 100644 --- a/pkg/controller/postgresql.go +++ b/pkg/controller/postgresql.go @@ -230,9 +230,7 @@ func (c *Controller) processEvent(event spec.ClusterEvent) { teamName := strings.ToLower(cl.Spec.TeamID) c.curWorkerCluster.Store(event.WorkerID, cl) - if err := cl.Delete(); err != nil { - lg.Errorf("could not delete cluster: %v", err) - } + cl.Delete() func() { defer c.clustersMu.Unlock()