Skip to content
This repository was archived by the owner on Jan 28, 2022. It is now read-only.

Commit df6898a

Browse files
stuartleeksAzadehkhojandi
authored andcommitted
Remove time.Sleep from run controller delete (#141)
1 parent 593794c commit df6898a

File tree

3 files changed

+43
-26
lines changed

3 files changed

+43
-26
lines changed

controllers/run_controller.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,18 @@ func (r *RunReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
5959
}
6060

6161
if instance.IsBeingDeleted() {
62-
if err := r.handleFinalizer(instance); err != nil {
62+
completed, err := r.handleFinalizer(instance)
63+
if err != nil {
6364
r.Recorder.Event(instance, corev1.EventTypeWarning, "deleting finalizer", fmt.Sprintf("Failed to delete finalizer: %s", err))
6465
return ctrl.Result{}, fmt.Errorf("error when handling finalizer: %v", err)
6566
}
66-
r.Recorder.Event(instance, corev1.EventTypeNormal, "Deleted", "Object finalizer is deleted")
67-
return ctrl.Result{}, nil
67+
if completed {
68+
r.Recorder.Event(instance, corev1.EventTypeNormal, "Deleted", "Object finalizer is deleted")
69+
return ctrl.Result{}, nil
70+
}
71+
// no error but not completed removing the finalizer - requeue
72+
r.Recorder.Event(instance, corev1.EventTypeNormal, "Deleting", "Pending deletion")
73+
return ctrl.Result{RequeueAfter: 5 * time.Second}, nil
6874
}
6975

7076
if !instance.HasFinalizer(databricksv1alpha1.RunFinalizerName) {

controllers/run_controller_databricks.go

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"fmt"
2222
"reflect"
2323
"strings"
24-
"time"
2524

2625
databricksv1alpha1 "github.com/microsoft/azure-databricks-operator/api/v1alpha1"
2726
"github.com/xinsnake/databricks-sdk-golang/azure"
@@ -106,36 +105,42 @@ func (r *RunReconciler) refresh(instance *databricksv1alpha1.Run) error {
106105
return r.Update(context.Background(), instance)
107106
}
108107

109-
func (r *RunReconciler) delete(instance *databricksv1alpha1.Run) error {
108+
// delete attempts to cancel and delete a run. Returns bool indicating if complete (safe to retry if not and no error) and an error
109+
func (r *RunReconciler) delete(instance *databricksv1alpha1.Run) (bool, error) {
110110
r.Log.Info(fmt.Sprintf("Deleting run %s", instance.GetName()))
111111

112112
if instance.Status == nil {
113-
return nil
113+
return true, nil
114114
}
115115

116116
runID := instance.Status.Metadata.RunID
117117

118118
// Check if the run exists before trying to delete it
119-
if _, err := r.getRun(runID); err != nil {
119+
run, err := r.getRun(runID)
120+
if err != nil {
120121
if strings.Contains(err.Error(), "does not exist") {
121-
return nil
122+
return true, nil
122123
}
123-
return err
124+
return false, err
124125
}
125126

126-
// We will not check for error when cancelling a job,
127-
// if it fails just let it be
128-
execution := NewExecution("runs", "cancel")
129-
err := r.APIClient.Jobs().RunsCancel(runID)
130-
execution.Finish(err)
131-
132-
// It takes time for DataBricks to cancel a run
133-
time.Sleep(15 * time.Second)
134-
135-
execution = NewExecution("runs", "delete")
127+
if run.State.ResultState == nil {
128+
// We will not check for error when cancelling a job,
129+
// if it fails just let it be
130+
execution := NewExecution("runs", "cancel")
131+
err := r.APIClient.Jobs().RunsCancel(runID)
132+
execution.Finish(err)
133+
return false, nil // no error, but indicate not completed to trigger a requeue to delete once cancelled
134+
}
135+
// job has reached a terminated state
136+
execution := NewExecution("runs", "delete")
136137
err = r.APIClient.Jobs().RunsDelete(runID)
137138
execution.Finish(err)
138-
return err
139+
140+
if err != nil {
141+
return false, err
142+
}
143+
return true, nil
139144
}
140145

141146
func (r *RunReconciler) runUsingRunNow(instance *databricksv1alpha1.Run) (*dbmodels.Run, bool, error) {

controllers/run_controller_finalizer.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,20 @@ func (r *RunReconciler) addFinalizer(instance *databricksv1alpha1.Run) error {
2727
return r.Update(context.Background(), instance)
2828
}
2929

30-
func (r *RunReconciler) handleFinalizer(instance *databricksv1alpha1.Run) error {
30+
// handleFinalizer returns a bool and an error. If error is set then the attempt failed, otherwise boolean indicates whether it completed
31+
func (r *RunReconciler) handleFinalizer(instance *databricksv1alpha1.Run) (bool, error) {
3132
if !instance.HasFinalizer(databricksv1alpha1.RunFinalizerName) {
32-
return nil
33+
return true, nil
3334
}
3435

35-
if err := r.delete(instance); err != nil {
36-
return err
36+
completed, err := r.delete(instance)
37+
if err != nil {
38+
return false, err
3739
}
38-
instance.RemoveFinalizer(databricksv1alpha1.RunFinalizerName)
39-
return r.Update(context.Background(), instance)
40+
if completed {
41+
instance.RemoveFinalizer(databricksv1alpha1.RunFinalizerName)
42+
err := r.Update(context.Background(), instance)
43+
return err != nil, err
44+
}
45+
return false, nil // no error, but indicate not completed to trigger a requeue to delete once cancelled
4046
}

0 commit comments

Comments
 (0)