Skip to content

Commit 1854ad3

Browse files
committed
[ws-daemon9 Check freshness
1 parent 6815f8c commit 1854ad3

File tree

3 files changed

+71
-48
lines changed

3 files changed

+71
-48
lines changed

components/ws-daemon/pkg/controller/workspace_controller.go

Lines changed: 63 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
"google.golang.org/protobuf/proto"
2525
corev1 "k8s.io/api/core/v1"
26+
"k8s.io/apimachinery/pkg/api/errors"
2627
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2728
"k8s.io/apimachinery/pkg/types"
2829
"k8s.io/apimachinery/pkg/util/wait"
@@ -119,14 +120,18 @@ func (wsc *WorkspaceController) Reconcile(ctx context.Context, req ctrl.Request)
119120
return ctrl.Result{}, client.IgnoreNotFound(err)
120121
}
121122

123+
if !wsc.isRecent(ctx, &workspace) {
124+
return ctrl.Result{Requeue: true}, nil
125+
}
126+
122127
glog.WithField("workspaceID", workspace.Name).WithField("phase", workspace.Status.Phase).Debug("Reconcile workspace")
123128

124129
glog.Info("RECONCILE")
125130
if workspace.Status.Phase == workspacev1.WorkspacePhaseCreating ||
126-
workspace.Status.Phase == workspacev1.WorkspacePhaseInitializing ||
127-
workspace.Status.Phase == workspacev1.WorkspacePhaseRunning {
131+
workspace.Status.Phase == workspacev1.WorkspacePhaseInitializing {
128132

129133
result, err = wsc.handleWorkspaceInit(ctx, &workspace, req)
134+
glog.Infof("RETURNING FROM INIT WITH STATUS %v", workspace.Status)
130135
return result, err
131136
}
132137

@@ -138,63 +143,76 @@ func (wsc *WorkspaceController) Reconcile(ctx context.Context, req ctrl.Request)
138143
return ctrl.Result{}, nil
139144
}
140145

146+
func (wsc *WorkspaceController) isRecent(ctx context.Context, ws *workspacev1.Workspace) bool {
147+
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
148+
Type: "Refresh",
149+
Status: metav1.ConditionFalse,
150+
LastTransitionTime: metav1.Now(),
151+
})
152+
153+
err := wsc.Client.Status().Update(ctx, ws)
154+
return !errors.IsConflict(err)
155+
}
156+
141157
func (wsc *WorkspaceController) handleWorkspaceInit(ctx context.Context, ws *workspacev1.Workspace, req ctrl.Request) (result ctrl.Result, err error) {
142158
log := log.FromContext(ctx)
143159
span, ctx := opentracing.StartSpanFromContext(ctx, "handleWorkspaceInit")
144160
defer tracing.FinishSpan(span, &err)
145161

146-
if c := wsk8s.GetCondition(ws.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady)); c == nil {
147-
init, err := wsc.prepareInitializer(ctx, ws)
148-
if err != nil {
149-
return ctrl.Result{}, err
150-
}
162+
if c := wsk8s.GetCondition(ws.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady)); c != nil {
163+
return ctrl.Result{}, nil
164+
}
151165

152-
glog.Info("START WORKSPACE INIT")
153-
initStart := time.Now()
154-
failure, initErr := wsc.operations.InitWorkspaceContent(ctx, InitContentOptions{
155-
Meta: WorkspaceMeta{
156-
Owner: ws.Spec.Ownership.Owner,
157-
WorkspaceId: ws.Spec.Ownership.WorkspaceID,
158-
InstanceId: ws.Name,
159-
},
160-
Initializer: init,
161-
Headless: ws.IsHeadless(),
162-
})
166+
log.Info("workspace status", "status", ws)
163167

164-
err = retry.RetryOnConflict(retryParams, func() error {
165-
if err := wsc.Get(ctx, req.NamespacedName, ws); err != nil {
166-
return err
167-
}
168+
init, err := wsc.prepareInitializer(ctx, ws)
169+
if err != nil {
170+
return ctrl.Result{}, err
171+
}
168172

169-
if failure != "" {
170-
log.Error(initErr, "could not initialize workspace", "name", ws.Name)
171-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
172-
Type: string(workspacev1.WorkspaceConditionContentReady),
173-
Status: metav1.ConditionFalse,
174-
Message: failure,
175-
Reason: "InitializationFailure",
176-
LastTransitionTime: metav1.Now(),
177-
})
178-
} else {
179-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
180-
Type: string(workspacev1.WorkspaceConditionContentReady),
181-
Status: metav1.ConditionTrue,
182-
Reason: "InitializationSuccess",
183-
LastTransitionTime: metav1.Now(),
184-
})
185-
}
173+
glog.Info("START WORKSPACE INIT")
174+
initStart := time.Now()
175+
failure, initErr := wsc.operations.InitWorkspaceContent(ctx, InitContentOptions{
176+
Meta: WorkspaceMeta{
177+
Owner: ws.Spec.Ownership.Owner,
178+
WorkspaceId: ws.Spec.Ownership.WorkspaceID,
179+
InstanceId: ws.Name,
180+
},
181+
Initializer: init,
182+
Headless: ws.IsHeadless(),
183+
})
186184

187-
return wsc.Status().Update(ctx, ws)
188-
})
185+
err = retry.RetryOnConflict(retryParams, func() error {
186+
if err := wsc.Get(ctx, req.NamespacedName, ws); err != nil {
187+
return err
188+
}
189189

190-
if err == nil {
191-
wsc.metrics.recordInitializeTime(time.Since(initStart).Seconds(), ws)
190+
if failure != "" {
191+
log.Error(initErr, "could not initialize workspace", "name", ws.Name)
192+
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
193+
Type: string(workspacev1.WorkspaceConditionContentReady),
194+
Status: metav1.ConditionFalse,
195+
Message: failure,
196+
Reason: "InitializationFailure",
197+
LastTransitionTime: metav1.Now(),
198+
})
199+
} else {
200+
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
201+
Type: string(workspacev1.WorkspaceConditionContentReady),
202+
Status: metav1.ConditionTrue,
203+
Reason: "InitializationSuccess",
204+
LastTransitionTime: metav1.Now(),
205+
})
192206
}
193207

194-
return ctrl.Result{}, err
208+
return wsc.Status().Update(ctx, ws)
209+
})
210+
211+
if err == nil {
212+
wsc.metrics.recordInitializeTime(time.Since(initStart).Seconds(), ws)
195213
}
196214

197-
return ctrl.Result{}, nil
215+
return ctrl.Result{}, err
198216
}
199217

200218
func (wsc *WorkspaceController) handleWorkspaceStop(ctx context.Context, ws *workspacev1.Workspace, req ctrl.Request) (result ctrl.Result, err error) {

components/ws-daemon/pkg/controller/workspace_operations.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ func (wso *WorkspaceOperations) DisposeWorkspace(ctx context.Context, opts Dispo
210210
}
211211
}
212212

213-
if err = ws.Dispose(ctx, wso.provider.hooks); err != nil {
213+
if err = ws.Dispose(ctx, wso.provider.hooks[session.WorkspaceDisposed]); err != nil {
214214
glog.WithError(err).Error("cannot dispose session")
215215
}
216216

components/ws-daemon/pkg/internal/session/workspace.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ func (s *Workspace) WaitOrMarkForDisposal(ctx context.Context) (done bool, repo
200200
}
201201

202202
// Dispose marks the workspace as disposed and clears it from disk
203-
func (s *Workspace) Dispose(ctx context.Context, hooks map[WorkspaceState][]WorkspaceLivecycleHook) (err error) {
203+
func (s *Workspace) Dispose(ctx context.Context, hooks []WorkspaceLivecycleHook) (err error) {
204204
//nolint:ineffassign,staticcheck
205205
span, ctx := opentracing.StartSpanFromContext(ctx, "workspace.Dispose")
206206
defer tracing.FinishSpan(span, &err)
@@ -225,7 +225,12 @@ func (s *Workspace) Dispose(ctx context.Context, hooks map[WorkspaceState][]Work
225225
}
226226

227227
if hooks != nil {
228-
228+
for _, h := range hooks {
229+
err := h(ctx, s)
230+
if err != nil {
231+
return err
232+
}
233+
}
229234
} else {
230235
err = s.store.runLifecycleHooks(ctx, s)
231236
if err != nil {

0 commit comments

Comments
 (0)