@@ -24,7 +24,6 @@ package resources
2424
2525import (
2626 "context"
27- "fmt"
2827 "time"
2928
3029 "github.com/rs/zerolog"
@@ -103,90 +102,19 @@ func (r *Resources) inspectFinalizerPodAgencyServing(ctx context.Context, log ze
103102// inspectFinalizerPodDrainDBServer checks the finalizer condition for drain-dbserver.
104103// It returns nil if the finalizer can be removed.
105104func (r * Resources ) inspectFinalizerPodDrainDBServer (ctx context.Context , log zerolog.Logger , p * v1.Pod , memberStatus api.MemberStatus , updateMember func (api.MemberStatus ) error ) error {
106- // Inspect member phase
107- if memberStatus .Phase .IsFailed () {
108- log .Debug ().Msg ("Pod is already failed, safe to remove drain dbserver finalizer" )
109- return nil
110- }
111- // Inspect deployment deletion state
112- apiObject := r .context .GetAPIObject ()
113- if apiObject .GetDeletionTimestamp () != nil {
114- log .Debug ().Msg ("Entire deployment is being deleted, safe to remove drain dbserver finalizer" )
115- return nil
116- }
117-
118- // Check node the pod is scheduled on
119- dbserverDataWillBeGone := false
120- if p .Spec .NodeName != "" {
121- node , err := r .context .GetKubeCli ().CoreV1 ().Nodes ().Get (p .Spec .NodeName , metav1.GetOptions {})
122- if err != nil {
123- log .Warn ().Err (err ).Msg ("Failed to get node for member" )
124- return maskAny (err )
125- }
126- if node .Spec .Unschedulable {
127- dbserverDataWillBeGone = true
128- }
129- }
130-
131- // Check PVC
132- pvcs := r .context .GetKubeCli ().CoreV1 ().PersistentVolumeClaims (apiObject .GetNamespace ())
133- pvc , err := pvcs .Get (memberStatus .PersistentVolumeClaimName , metav1.GetOptions {})
134- if err != nil {
135- log .Warn ().Err (err ).Msg ("Failed to get PVC for member" )
105+ if err := r .prepareDBServerPodTermination (ctx , log , p , memberStatus , updateMember ); err != nil {
106+ // Pod cannot be terminated yet
136107 return maskAny (err )
137108 }
138- if k8sutil .IsPersistentVolumeClaimMarkedForDeletion (pvc ) {
139- dbserverDataWillBeGone = true
140- }
141-
142- // Is this a simple pod restart?
143- if ! dbserverDataWillBeGone {
144- log .Debug ().Msg ("Pod is just being restarted, safe to remove drain dbserver finalizer" )
145- return nil
146- }
147109
148- // Inspect cleaned out state
149- log .Debug ().Msg ("DBServer data is being deleted, so we will cleanout the dbserver first" )
150- c , err := r .context .GetDatabaseClient (ctx )
151- if err != nil {
152- log .Debug ().Err (err ).Msg ("Failed to create member client" )
153- return maskAny (err )
154- }
155- cluster , err := c .Cluster (ctx )
156- if err != nil {
157- log .Debug ().Err (err ).Msg ("Failed to access cluster" )
158- return maskAny (err )
159- }
160- cleanedOut , err := cluster .IsCleanedOut (ctx , memberStatus .ID )
161- if err != nil {
110+ // Remaining agents are healthy, we can remove this one and trigger a delete of the PVC
111+ pvcs := r .context .GetKubeCli ().CoreV1 ().PersistentVolumeClaims (r .context .GetNamespace ())
112+ if err := pvcs .Delete (memberStatus .PersistentVolumeClaimName , & metav1.DeleteOptions {}); err != nil && ! k8sutil .IsNotFound (err ) {
113+ log .Warn ().Err (err ).Msg ("Failed to delete PVC for member" )
162114 return maskAny (err )
115+ } else {
116+ log .Debug ().Str ("pvc-name" , memberStatus .PersistentVolumeClaimName ).Msg ("Removed PVC of member" )
163117 }
164- if cleanedOut {
165- // Cleanout completed
166- if memberStatus .Conditions .Update (api .ConditionTypeCleanedOut , true , "CleanedOut" , "" ) {
167- if err := updateMember (memberStatus ); err != nil {
168- return maskAny (err )
169- }
170- }
171- // Trigger PVC removal
172- if err := pvcs .Delete (memberStatus .PersistentVolumeClaimName , & metav1.DeleteOptions {}); err != nil {
173- log .Warn ().Err (err ).Msg ("Failed to delete PVC for member" )
174- return maskAny (err )
175- }
176118
177- log .Debug ().Msg ("Server is cleaned out. Save to remove drain dbserver finalizer" )
178- return nil
179- }
180- // Not cleaned out yet, check member status
181- if memberStatus .Conditions .IsTrue (api .ConditionTypeTerminated ) {
182- log .Warn ().Msg ("Member is already terminated before it could be cleaned out. Not good, but removing drain dbserver finalizer because we cannot do anything further" )
183- return nil
184- }
185- // Ensure the cleanout is triggered
186- log .Debug ().Msg ("Server is not yet clean out. Triggering a clean out now" )
187- if err := cluster .CleanOutServer (ctx , memberStatus .ID ); err != nil {
188- log .Debug ().Err (err ).Msg ("Failed to clean out server" )
189- return maskAny (err )
190- }
191- return maskAny (fmt .Errorf ("Server is not yet cleaned out" ))
119+ return nil
192120}
0 commit comments