Skip to content

Commit c595e4d

Browse files
committed
b
1 parent 18458e2 commit c595e4d

File tree

6 files changed

+58
-22
lines changed

6 files changed

+58
-22
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ func (wsc *WorkspaceController) Reconcile(ctx context.Context, req ctrl.Request)
121121

122122
glog.WithField("workspaceID", workspace.Name).WithField("phase", workspace.Status.Phase).Debug("Reconcile workspace")
123123

124+
glog.Info("RECONCILE")
124125
if workspace.Status.Phase == workspacev1.WorkspacePhaseCreating ||
125126
workspace.Status.Phase == workspacev1.WorkspacePhaseInitializing {
126127

@@ -147,6 +148,7 @@ func (wsc *WorkspaceController) handleWorkspaceInit(ctx context.Context, ws *wor
147148
return ctrl.Result{}, err
148149
}
149150

151+
glog.Info("START WORKSPACE INIT")
150152
initStart := time.Now()
151153
failure, initErr := wsc.operations.InitWorkspaceContent(ctx, InitContentOptions{
152154
Meta: WorkspaceMeta{

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,15 @@ type DisposeOptions struct {
6868
SnapshotName string
6969
}
7070

71-
func NewWorkspaceOperations(config content.Config, store *WorkspaceProvider, reg prometheus.Registerer) (*WorkspaceOperations, error) {
71+
func NewWorkspaceOperations(config content.Config, provider *WorkspaceProvider, reg prometheus.Registerer) (*WorkspaceOperations, error) {
7272
waitingTimeHist, waitingTimeoutCounter, err := content.RegisterConcurrentBackupMetrics(reg, "_mk2")
7373
if err != nil {
7474
return nil, err
7575
}
7676

7777
return &WorkspaceOperations{
78-
config: config,
79-
//store: store,
78+
config: config,
79+
provider: provider,
8080
metrics: &content.Metrics{
8181
BackupWaitingTimeHist: waitingTimeHist,
8282
BackupWaitingTimeoutCounter: waitingTimeoutCounter,
@@ -87,6 +87,8 @@ func NewWorkspaceOperations(config content.Config, store *WorkspaceProvider, reg
8787
}
8888

8989
func (wso *WorkspaceOperations) InitWorkspaceContent(ctx context.Context, options InitContentOptions) (string, error) {
90+
glog.Infof("ENTERING INIT: %v", wso.provider.Location)
91+
9092
ws, err := wso.provider.Create(ctx, options.Meta.InstanceId, filepath.Join(wso.provider.Location, options.Meta.InstanceId),
9193
wso.creator(options.Meta.Owner, options.Meta.WorkspaceId, options.Meta.InstanceId, options.Initializer, false))
9294

@@ -164,6 +166,7 @@ func (wso *WorkspaceOperations) creator(owner, workspaceId, instanceId string, i
164166
FullWorkspaceBackup: false,
165167
PersistentVolumeClaim: false,
166168
RemoteStorageDisabled: storageDisabled,
169+
IsMk2: true,
167170

168171
ServiceLocDaemon: filepath.Join(wso.config.WorkingArea, serviceDirName),
169172
ServiceLocNode: filepath.Join(wso.config.WorkingAreaNode, serviceDirName),
@@ -174,7 +177,7 @@ func (wso *WorkspaceOperations) creator(owner, workspaceId, instanceId string, i
174177
func (wso *WorkspaceOperations) DisposeWorkspace(ctx context.Context, opts DisposeOptions) (*csapi.GitStatus, error) {
175178
ws, err := wso.provider.Get(ctx, opts.Meta.InstanceId)
176179
if err != nil {
177-
return nil, fmt.Errorf("cannot find workspace %s during DisposeWorkspace", opts.Meta.InstanceId)
180+
return nil, fmt.Errorf("cannot find workspace %s during DisposeWorkspace: %w", opts.Meta.InstanceId, err)
178181
}
179182

180183
if ws.RemoteStorageDisabled {
@@ -207,7 +210,7 @@ func (wso *WorkspaceOperations) DisposeWorkspace(ctx context.Context, opts Dispo
207210
}
208211
}
209212

210-
if err = ws.Dispose(ctx); err != nil {
213+
if err = ws.Dispose(ctx, wso.provider.hooks); err != nil {
211214
glog.WithError(err).Error("cannot dispose session")
212215
}
213216

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

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func NewWorkspaceProvider(hooks map[session.WorkspaceState][]session.WorkspaceLi
3131
}
3232

3333
func (wf *WorkspaceProvider) Create(ctx context.Context, instanceID, location string, create session.WorkspaceFactory) (ws *session.Workspace, err error) {
34-
span, ctx := opentracing.StartSpanFromContext(ctx, "Store.NewWorkspace")
34+
span, ctx := opentracing.StartSpanFromContext(ctx, "WorkspaceProvider.Create")
3535
tracing.ApplyOWI(span, log.OWI("", "", instanceID))
3636
defer tracing.FinishSpan(span, &err)
3737

@@ -40,22 +40,40 @@ func (wf *WorkspaceProvider) Create(ctx context.Context, instanceID, location st
4040
return nil, err
4141
}
4242

43+
if ws.NonPersistentAttrs == nil {
44+
ws.NonPersistentAttrs = make(map[string]interface{})
45+
}
46+
4347
err = wf.runLifecycleHooks(ctx, ws, session.WorkspaceInitializing)
4448
if err != nil {
4549
return nil, err
4650
}
4751

48-
return nil, nil
52+
return ws, nil
4953
}
5054

5155
func (wf *WorkspaceProvider) Get(ctx context.Context, instanceID string) (*session.Workspace, error) {
5256
path := filepath.Join(wf.Location, fmt.Sprintf("%s.workspace.json", instanceID))
53-
return loadWorkspace(ctx, path)
57+
ws, err := loadWorkspace(ctx, path)
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
if ws.NonPersistentAttrs == nil {
63+
ws.NonPersistentAttrs = make(map[string]interface{})
64+
}
65+
66+
err = wf.runLifecycleHooks(ctx, ws, session.WorkspaceReady)
67+
if err != nil {
68+
return nil, err
69+
}
70+
71+
return ws, nil
5472
}
5573

5674
func (s *WorkspaceProvider) runLifecycleHooks(ctx context.Context, ws *session.Workspace, state session.WorkspaceState) error {
5775
hooks := s.hooks[state]
58-
log.WithFields(ws.OWI()).WithField("state", state).WithField("hooks", len(hooks)).Debug("running lifecycle hooks")
76+
log.WithFields(ws.OWI()).WithField("state", state).WithField("hooks", len(hooks)).Info("running lifecycle hooks")
5977

6078
for _, h := range hooks {
6179
err := h(ctx, ws)
@@ -75,10 +93,11 @@ func loadWorkspace(ctx context.Context, path string) (ws *session.Workspace, err
7593
return nil, fmt.Errorf("cannot load session file: %w", err)
7694
}
7795

78-
err = json.Unmarshal(fc, ws)
96+
var workspace session.Workspace
97+
err = json.Unmarshal(fc, &workspace)
7998
if err != nil {
8099
return nil, fmt.Errorf("cannot unmarshal session file: %w", err)
81100
}
82101

83-
return ws, nil
102+
return &workspace, nil
84103
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (s *Store) Delete(ctx context.Context, name string) (err error) {
147147
}
148148
defer delete(s.workspaces, name)
149149

150-
err = session.Dispose(ctx)
150+
err = session.Dispose(ctx, nil)
151151
if err != nil {
152152
return xerrors.Errorf("cannot delete session for workspace %s: %w", session.InstanceID, err)
153153
}

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

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ type Workspace struct {
7575

7676
XFSProjectID int `json:"xfsProjectID"`
7777

78+
IsMk2 bool `json:"isMk2,omitempty"`
79+
7880
NonPersistentAttrs map[string]interface{} `json:"-"`
7981

8082
store *Store
@@ -198,7 +200,7 @@ func (s *Workspace) WaitOrMarkForDisposal(ctx context.Context) (done bool, repo
198200
}
199201

200202
// Dispose marks the workspace as disposed and clears it from disk
201-
func (s *Workspace) Dispose(ctx context.Context) (err error) {
203+
func (s *Workspace) Dispose(ctx context.Context, hooks map[WorkspaceState][]WorkspaceLivecycleHook) (err error) {
202204
//nolint:ineffassign,staticcheck
203205
span, ctx := opentracing.StartSpanFromContext(ctx, "workspace.Dispose")
204206
defer tracing.FinishSpan(span, &err)
@@ -215,14 +217,20 @@ func (s *Workspace) Dispose(ctx context.Context) (err error) {
215217
}
216218
}
217219

218-
s.stateLock.Lock()
219-
s.state = WorkspaceDisposed
220-
s.operatingCondition.Broadcast()
221-
s.stateLock.Unlock()
220+
if !s.IsMk2 {
221+
s.stateLock.Lock()
222+
s.state = WorkspaceDisposed
223+
s.operatingCondition.Broadcast()
224+
s.stateLock.Unlock()
225+
}
222226

223-
err = s.store.runLifecycleHooks(ctx, s)
224-
if err != nil {
225-
return err
227+
if hooks != nil {
228+
229+
} else {
230+
err = s.store.runLifecycleHooks(ctx, s)
231+
if err != nil {
232+
return err
233+
}
226234
}
227235

228236
if s.PersistentVolumeClaim {
@@ -343,6 +351,10 @@ type persistentWorkspace struct {
343351
}
344352

345353
func (s *Workspace) persistentStateLocation() string {
354+
if s.IsMk2 {
355+
return filepath.Join(filepath.Dir(s.Location), fmt.Sprintf("%s.workspace.json", s.InstanceID))
356+
}
357+
346358
return filepath.Join(s.store.Location, fmt.Sprintf("%s.workspace.json", s.InstanceID))
347359
}
348360

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ func TestWaitOrMarkForDisposalRace(t *testing.T) {
222222

223223
time.Sleep(1 * time.Second)
224224
t.Logf("num go routines: %03d", runtime.NumGoroutine())
225-
ws.Dispose(ctx)
225+
ws.Dispose(ctx, nil)
226226
}
227227
}()
228228
}
@@ -296,7 +296,7 @@ func TestWaitOrMarkForDisposal(t *testing.T) {
296296

297297
<-time.After(500 * time.Millisecond) // just for good measure
298298

299-
err := ws.Dispose(context.Background())
299+
err := ws.Dispose(context.Background(), nil)
300300
if err != nil {
301301
t.Errorf("%s: Dispose returned an error: %v", test.Desc, err)
302302
}

0 commit comments

Comments
 (0)