Skip to content

Commit 01243f9

Browse files
committed
init
1 parent 2a7e088 commit 01243f9

File tree

4 files changed

+66
-8
lines changed

4 files changed

+66
-8
lines changed

controllers/workloads/instance_controller_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,11 @@ var _ = Describe("Instance Controller", func() {
248248
Consistently(testapps.CheckObj(&testCtx, pvcKey, func(g Gomega, pvc *corev1.PersistentVolumeClaim) {
249249
g.Expect(pvc.DeletionTimestamp).Should(BeNil())
250250
})).Should(Succeed())
251+
Eventually(testapps.CheckObj(&testCtx, pvcKey, func(g Gomega, pvc *corev1.PersistentVolumeClaim) {
252+
// verify owner references are cleared to prevent garbage collection
253+
ownerRefs := pvc.GetOwnerReferences()
254+
g.Expect(ownerRefs).Should(HaveLen(0), "Owner references should be cleared when retention policy is Retain")
255+
})).Should(Succeed())
251256
})
252257
})
253258

controllers/workloads/instanceset_controller_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,11 @@ var _ = Describe("InstanceSet Controller", func() {
345345
Consistently(testapps.CheckObj(&testCtx, pvcKey, func(g Gomega, pvc *corev1.PersistentVolumeClaim) {
346346
g.Expect(pvc.DeletionTimestamp).Should(BeNil())
347347
})).Should(Succeed())
348+
Eventually(testapps.CheckObj(&testCtx, pvcKey, func(g Gomega, pvc *corev1.PersistentVolumeClaim) {
349+
// verify owner references are cleared to prevent garbage collection
350+
ownerRefs := pvc.GetOwnerReferences()
351+
g.Expect(ownerRefs).Should(HaveLen(0), "Owner references should be cleared when retention policy is Retain")
352+
})).Should(Succeed())
348353
})
349354

350355
It("when scaled - delete", func() {
@@ -406,6 +411,10 @@ var _ = Describe("InstanceSet Controller", func() {
406411
}
407412
Consistently(testapps.CheckObj(&testCtx, pvcKey, func(g Gomega, pvc *corev1.PersistentVolumeClaim) {
408413
g.Expect(pvc.DeletionTimestamp).Should(BeNil())
414+
// verify owner references still exist since InstanceSet is not deleted
415+
ownerRefs := pvc.GetOwnerReferences()
416+
g.Expect(ownerRefs).Should(HaveLen(1), "Owner references should still exist when scaling down and retention policy is Retain")
417+
g.Expect(ownerRefs[0].Kind).Should(Equal("InstanceSet"))
409418
})).Should(Succeed())
410419
})
411420
})

pkg/controller/instance/reconciler_deletion.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"maps"
2424

2525
corev1 "k8s.io/api/core/v1"
26+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2627
"k8s.io/utils/ptr"
2728

2829
appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
@@ -59,7 +60,7 @@ func (r *deletionReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuild
5960
}
6061

6162
// delete secondary objects first
62-
if has, err := r.deleteSecondaryObjects(tree, retainPVC); has {
63+
if has, err := r.deleteSecondaryObjects(tree, inst, retainPVC); has {
6364
return kubebuilderx.Continue, err
6465
}
6566

@@ -68,13 +69,34 @@ func (r *deletionReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuild
6869
return kubebuilderx.Continue, nil
6970
}
7071

71-
func (r *deletionReconciler) deleteSecondaryObjects(tree *kubebuilderx.ObjectTree, retainPVC bool) (bool, error) {
72+
func (r *deletionReconciler) deleteSecondaryObjects(tree *kubebuilderx.ObjectTree, inst *workloads.Instance, retainPVC bool) (bool, error) {
7273
// secondary objects to be deleted
7374
secondaryObjects := maps.Clone(tree.GetSecondaryObjects())
7475
if retainPVC {
75-
// exclude PVCs from them
76+
// exclude PVCs from them and clear their owner references
7677
pvcList := tree.List(&corev1.PersistentVolumeClaim{})
77-
for _, pvc := range pvcList {
78+
for _, pvcObj := range pvcList {
79+
pvc, ok := pvcObj.(*corev1.PersistentVolumeClaim)
80+
if !ok {
81+
continue
82+
}
83+
// Clear owner references to prevent garbage collection when Instance is deleted
84+
ownerRefs := pvc.GetOwnerReferences()
85+
if len(ownerRefs) > 0 {
86+
// Filter out owner references that belong to this Instance
87+
filteredRefs := make([]metav1.OwnerReference, 0, len(ownerRefs))
88+
for _, ref := range ownerRefs {
89+
if ref.UID != inst.UID {
90+
filteredRefs = append(filteredRefs, ref)
91+
}
92+
}
93+
if len(filteredRefs) != len(ownerRefs) {
94+
pvc.SetOwnerReferences(filteredRefs)
95+
if err := tree.Update(pvc); err != nil {
96+
return true, err
97+
}
98+
}
99+
}
78100
name, err := model.GetGVKName(pvc)
79101
if err != nil {
80102
return true, err

pkg/controller/instanceset/reconciler_deletion.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"maps"
2424

2525
corev1 "k8s.io/api/core/v1"
26+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2627

2728
kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
2829
workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
@@ -49,7 +50,7 @@ func (r *deletionReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuild
4950
retainPVC := pvcRetentionPolicy != nil && pvcRetentionPolicy.WhenDeleted == kbappsv1.RetainPersistentVolumeClaimRetentionPolicyType
5051

5152
// delete secondary objects first
52-
if has, err := r.deleteSecondaryObjects(tree, retainPVC); has {
53+
if has, err := r.deleteSecondaryObjects(tree, its, retainPVC); has {
5354
return kubebuilderx.Continue, err
5455
}
5556

@@ -58,13 +59,34 @@ func (r *deletionReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuild
5859
return kubebuilderx.Continue, nil
5960
}
6061

61-
func (r *deletionReconciler) deleteSecondaryObjects(tree *kubebuilderx.ObjectTree, retainPVC bool) (bool, error) {
62+
func (r *deletionReconciler) deleteSecondaryObjects(tree *kubebuilderx.ObjectTree, its *workloads.InstanceSet, retainPVC bool) (bool, error) {
6263
// secondary objects to be deleted
6364
secondaryObjects := maps.Clone(tree.GetSecondaryObjects())
6465
if retainPVC {
65-
// exclude PVCs from them
66+
// exclude PVCs from them and remove InstanceSet's owner references
6667
pvcList := tree.List(&corev1.PersistentVolumeClaim{})
67-
for _, pvc := range pvcList {
68+
for _, pvcObj := range pvcList {
69+
pvc, ok := pvcObj.(*corev1.PersistentVolumeClaim)
70+
if !ok {
71+
continue
72+
}
73+
// Remove InstanceSet's owner references to prevent garbage collection
74+
ownerRefs := pvc.GetOwnerReferences()
75+
if len(ownerRefs) > 0 {
76+
// Filter out owner references that belong to this InstanceSet
77+
filteredRefs := make([]metav1.OwnerReference, 0, len(ownerRefs))
78+
for _, ref := range ownerRefs {
79+
if ref.UID != its.UID {
80+
filteredRefs = append(filteredRefs, ref)
81+
}
82+
}
83+
if len(filteredRefs) != len(ownerRefs) {
84+
pvc.SetOwnerReferences(filteredRefs)
85+
if err := tree.Update(pvc); err != nil {
86+
return true, err
87+
}
88+
}
89+
}
6890
name, err := model.GetGVKName(pvc)
6991
if err != nil {
7092
return true, err

0 commit comments

Comments
 (0)