Skip to content

Commit 09971e7

Browse files
author
Vaibhaav
committed
fix: allow project removal with incomplete session handles
1 parent e727565 commit 09971e7

2 files changed

Lines changed: 25 additions & 0 deletions

File tree

backend/internal/service/session/service.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,13 +366,24 @@ func (s *Service) TeardownProject(ctx context.Context, project domain.ProjectID)
366366
continue
367367
}
368368
if _, err := s.Kill(ctx, rec.ID); err != nil {
369+
if isIncompleteHandleError(err) {
370+
continue
371+
}
369372
return err
370373
}
371374
}
372375
_, err = s.Cleanup(ctx, project)
373376
return err
374377
}
375378

379+
func isIncompleteHandleError(err error) bool {
380+
if errors.Is(err, sessionmanager.ErrIncompleteHandle) {
381+
return true
382+
}
383+
var apiErr *apierr.Error
384+
return errors.As(err, &apiErr) && apiErr.Code == "SESSION_INCOMPLETE_HANDLE"
385+
}
386+
376387
// List returns sessions as enriched display models after applying API filters.
377388
func (s *Service) List(ctx context.Context, filter ListFilter) ([]domain.Session, error) {
378389
recs, err := s.listRecords(ctx, filter.ProjectID)

backend/internal/service/session/service_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,20 @@ func TestTeardownProjectStopsOnKillError(t *testing.T) {
235235
}
236236
}
237237

238+
func TestTeardownProjectContinuesOnIncompleteHandle(t *testing.T) {
239+
st := newFakeStore()
240+
st.sessions["mer-1"] = domain.SessionRecord{ID: "mer-1", ProjectID: "mer"}
241+
fc := &fakeCommander{killErr: sessionmanager.ErrIncompleteHandle}
242+
svc := &Service{manager: fc, store: st}
243+
244+
if err := svc.TeardownProject(context.Background(), "mer"); err != nil {
245+
t.Fatalf("TeardownProject: %v", err)
246+
}
247+
if len(fc.cleanupProjects) != 1 || fc.cleanupProjects[0] != "mer" {
248+
t.Fatalf("cleanup projects = %#v, want [mer]", fc.cleanupProjects)
249+
}
250+
}
251+
238252
func TestSpawnOrchestratorCleanKillsActiveOrchestratorsBeforeSpawn(t *testing.T) {
239253
st := newFakeStore()
240254
st.projects["mer"] = domain.ProjectRecord{ID: "mer"}

0 commit comments

Comments
 (0)