Skip to content

Commit 648c5f6

Browse files
committed
add OwnerReference for Statefulsets
1 parent f675884 commit 648c5f6

4 files changed

Lines changed: 63 additions & 2 deletions

File tree

docs/hugo/content/en/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ date: 2024-03-11T14:26:51+01:00
44
draft: false
55
weight: 1
66
---
7-
Current Release: 0.9.0 (xx.10.2025) [Release Notes](release_notes)
7+
Current Release: 0.9.0 (31.10.2025) [Release Notes](release_notes)
88

99
<img src="https://raw.githubusercontent.com/cybertec-postgresql/CYBERTEC-pg-operator/fac724618ea1395ed49cb1db7f3429f5b4324337/docs/diagrams/cpo_logo.svg" alt="drawing" width="350" />
1010

pkg/cluster/cluster.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ func (c *Cluster) createOwnerReference() []metav1.OwnerReference {
184184
Name: c.Name,
185185
UID: c.UID,
186186
Controller: util.True(),
187-
BlockOwnerDeletion: util.True(),
187+
BlockOwnerDeletion: util.False(),
188188
},
189189
}
190190
}
@@ -664,6 +664,15 @@ func (c *Cluster) compareStatefulSetWith(oldSts, newSts *appsv1.StatefulSet) *co
664664
return &compareStatefulsetResult{match: match, reasons: reasons, rollingUpdate: needsRollUpdate, replace: needsReplace}
665665
}
666666

667+
func (c *Cluster) compareOwnerReferenceFromStatefulSet(current *appsv1.StatefulSet) bool {
668+
for _, ref := range current.OwnerReferences {
669+
if ref.UID == c.UID && ref.Controller != nil && *ref.Controller {
670+
return true
671+
}
672+
}
673+
return false
674+
}
675+
667676
type containerCondition func(a, b v1.Container) bool
668677

669678
type containerCheck struct {

pkg/cluster/resources.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cluster
22

33
import (
44
"context"
5+
"encoding/json"
56
"fmt"
67
"strconv"
78
"strings"
@@ -172,6 +173,39 @@ func (c *Cluster) preScaleDown(newStatefulSet *appsv1.StatefulSet) error {
172173
return nil
173174
}
174175

176+
func (c *Cluster) patchOwnerReference(sts *appsv1.StatefulSet) (*appsv1.StatefulSet, error) {
177+
c.setProcessName("patching ownerReference")
178+
179+
if sts == nil {
180+
return nil, fmt.Errorf("there is no statefulset in the cluster")
181+
}
182+
183+
statefulSetName := util.NameFromMeta(sts.ObjectMeta)
184+
ownerRefs := c.createOwnerReference()
185+
186+
patchData, err := json.Marshal(map[string]interface{}{
187+
"metadata": map[string]interface{}{
188+
"ownerReferences": ownerRefs,
189+
},
190+
})
191+
if err != nil {
192+
return nil, fmt.Errorf("could not marshal patch for ownerReference: %w", err)
193+
}
194+
195+
patched, err := c.KubeClient.StatefulSets(sts.Namespace).Patch(
196+
context.TODO(),
197+
sts.Name,
198+
types.MergePatchType,
199+
patchData,
200+
metav1.PatchOptions{},
201+
)
202+
if err != nil {
203+
return nil, fmt.Errorf("could not patch ownerReference for StatefulSet %q: %w", statefulSetName, err)
204+
}
205+
206+
return patched, nil
207+
}
208+
175209
func (c *Cluster) updateStatefulSet(newStatefulSet *appsv1.StatefulSet) error {
176210
c.setProcessName("updating statefulset")
177211
if c.Statefulset == nil {

pkg/cluster/sync.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,15 @@ func (c *Cluster) syncStatefulSet() error {
582582
c.applyRestoreStatefulSetSyncOverrides(desiredSts, c.Statefulset)
583583
}
584584

585+
// Check if OwnerReference still up to date - if not patch it
586+
if !c.compareOwnerReferenceFromStatefulSet(c.Statefulset) {
587+
patched, err := c.patchOwnerReference(c.Statefulset)
588+
if err != nil {
589+
return err
590+
}
591+
c.Statefulset = patched
592+
}
593+
585594
cmp := c.compareStatefulSetWith(c.Statefulset, desiredSts)
586595
if !cmp.match {
587596
if cmp.rollingUpdate {
@@ -1602,6 +1611,15 @@ func (c *Cluster) syncPgbackrestRepoHostConfig(spec *cpov1.PostgresSpec) error {
16021611
return fmt.Errorf("could not generate pgbackrest repo-host statefulset: %v", err)
16031612
}
16041613

1614+
// Check if OwnerReference still up to date - if not patch it
1615+
if !c.compareOwnerReferenceFromStatefulSet(curSts) {
1616+
patched, err := c.patchOwnerReference(curSts)
1617+
if err != nil {
1618+
return err
1619+
}
1620+
curSts = patched
1621+
}
1622+
16051623
cmp := c.compareStatefulSetWith(curSts, desiredSts)
16061624
if !cmp.match {
16071625
c.logStatefulSetChanges(curSts, desiredSts, false, cmp.reasons)

0 commit comments

Comments
 (0)