Skip to content

Commit 2c2bd82

Browse files
committed
Delete session properly
Signed-off-by: Trung Nguyen <trung.nguyen@docker.com>
1 parent 5822d9b commit 2c2bd82

1 file changed

Lines changed: 39 additions & 14 deletions

File tree

pkg/server/server.go

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,13 @@ import (
3838
)
3939

4040
type Server struct {
41-
e *echo.Echo
42-
runtimes map[string]runtime.Runtime
43-
sessionStore session.Store
44-
agentsDir string
45-
runConfig config.RuntimeConfig
46-
teams map[string]*team.Team
41+
e *echo.Echo
42+
runtimes map[string]runtime.Runtime
43+
runtimeCancels map[string]context.CancelFunc
44+
sessionStore session.Store
45+
agentsDir string
46+
runConfig config.RuntimeConfig
47+
teams map[string]*team.Team
4748
}
4849

4950
type Opt func(*Server)
@@ -66,11 +67,12 @@ func New(sessionStore session.Store, runConfig config.RuntimeConfig, teams map[s
6667
e.Use(middleware.CORS())
6768
e.Use(middleware.Logger())
6869
s := &Server{
69-
e: e,
70-
runtimes: make(map[string]runtime.Runtime),
71-
sessionStore: sessionStore,
72-
runConfig: runConfig,
73-
teams: teams,
70+
e: e,
71+
runtimes: make(map[string]runtime.Runtime),
72+
runtimeCancels: make(map[string]context.CancelFunc),
73+
sessionStore: sessionStore,
74+
runConfig: runConfig,
75+
teams: teams,
7476
}
7577

7678
for _, opt := range opts {
@@ -871,8 +873,24 @@ func (s *Server) resumeSession(c echo.Context) error {
871873
}
872874

873875
func (s *Server) deleteSession(c echo.Context) error {
874-
if err := s.sessionStore.DeleteSession(c.Request().Context(), c.Param("id")); err != nil {
875-
slog.Error("Failed to delete session", "session_id", c.Param("id"), "error", err)
876+
sessionID := c.Param("id")
877+
878+
// Cancel the runtime context if it's still running
879+
if cancel, exists := s.runtimeCancels[sessionID]; exists {
880+
slog.Debug("Cancelling runtime for session", "session_id", sessionID)
881+
cancel()
882+
delete(s.runtimeCancels, sessionID)
883+
}
884+
885+
// Clean up the runtime
886+
if _, exists := s.runtimes[sessionID]; exists {
887+
slog.Debug("Removing runtime for session", "session_id", sessionID)
888+
delete(s.runtimes, sessionID)
889+
}
890+
891+
// Delete the session from storage
892+
if err := s.sessionStore.DeleteSession(c.Request().Context(), sessionID); err != nil {
893+
slog.Error("Failed to delete session", "session_id", sessionID, "error", err)
876894
return c.JSON(http.StatusInternalServerError, map[string]string{"error": "failed to delete session"})
877895
}
878896

@@ -955,7 +973,14 @@ func (s *Server) runAgent(c echo.Context) error {
955973
c.Response().Header().Set("Connection", "keep-alive")
956974
c.Response().WriteHeader(http.StatusOK)
957975

958-
streamChan := rt.RunStream(c.Request().Context(), sess)
976+
// Create a cancellable context for this stream
977+
streamCtx, cancel := context.WithCancel(c.Request().Context())
978+
s.runtimeCancels[sess.ID] = cancel
979+
defer func() {
980+
delete(s.runtimeCancels, sess.ID)
981+
}()
982+
983+
streamChan := rt.RunStream(streamCtx, sess)
959984
for event := range streamChan {
960985
data, err := json.Marshal(event)
961986
if err != nil {

0 commit comments

Comments
 (0)