@@ -10,7 +10,9 @@ import (
1010 "golang.org/x/sync/errgroup"
1111
1212 "github.com/GoYoko/web"
13+ "github.com/google/uuid"
1314
15+ "github.com/chaitin/MonkeyCode/backend/biz/task/service"
1416 "github.com/chaitin/MonkeyCode/backend/consts"
1517 "github.com/chaitin/MonkeyCode/backend/domain"
1618 "github.com/chaitin/MonkeyCode/backend/middleware"
@@ -130,6 +132,9 @@ func (h *TaskHandler) Control(c *web.Context, req domain.TaskControlReq) error {
130132
131133 logger := h .logger .With ("task_id" , task .ID , "fn" , "task.control" )
132134 taskID := task .ID .String ()
135+ if err := h .taskActivity .Refresh (c .Request ().Context (), task .ID ); err != nil {
136+ logger .WarnContext (c .Request ().Context (), "failed to refresh task last active on control connect" , "error" , err )
137+ }
133138
134139 // 连接建立:刷新空闲计时器
135140 if vm := task .VirtualMachine ; vm != nil {
@@ -182,7 +187,7 @@ func (h *TaskHandler) Control(c *web.Context, req domain.TaskControlReq) error {
182187 // 定期刷新空闲计时器,保持 VM 活跃
183188 if vm := task .VirtualMachine ; vm != nil {
184189 g .Go (func () error {
185- return h .controlKeepAlive (ctx , vm .ID )
190+ return h .controlKeepAlive (ctx , task . ID , vm .ID )
186191 })
187192 }
188193
@@ -211,17 +216,30 @@ func (h *TaskHandler) controlPing(ctx context.Context, wsConn *ws.WebsocketManag
211216}
212217
213218// controlKeepAlive 定期刷新空闲计时器,防止 VM 被误判空闲
214- func (h * TaskHandler ) controlKeepAlive (ctx context.Context , vmID string ) error {
215- ticker := time .NewTicker (1 * time .Minute )
216- defer ticker .Stop ()
219+ func (h * TaskHandler ) controlKeepAlive (ctx context.Context , taskID uuid.UUID , vmID string ) error {
220+ if err := h .idleRefresher .Refresh (ctx , vmID ); err != nil {
221+ h .logger .WarnContext (ctx , "keepalive refresh failed" , "vmID" , vmID , "error" , err )
222+ }
223+ if err := h .taskActivity .Refresh (ctx , taskID ); err != nil {
224+ h .logger .WarnContext (ctx , "task activity refresh failed" , "taskID" , taskID , "error" , err )
225+ }
226+
227+ idleTicker := time .NewTicker (1 * time .Minute )
228+ activityTicker := time .NewTicker (service .TaskActivityRefreshInterval )
229+ defer idleTicker .Stop ()
230+ defer activityTicker .Stop ()
217231 for {
218232 select {
219233 case <- ctx .Done ():
220234 return ctx .Err ()
221- case <- ticker .C :
235+ case <- idleTicker .C :
222236 if err := h .idleRefresher .Refresh (ctx , vmID ); err != nil {
223237 h .logger .WarnContext (ctx , "keepalive refresh failed" , "vmID" , vmID , "error" , err )
224238 }
239+ case <- activityTicker .C :
240+ if err := h .taskActivity .Refresh (ctx , taskID ); err != nil {
241+ h .logger .WarnContext (ctx , "task activity refresh failed" , "taskID" , taskID , "error" , err )
242+ }
225243 }
226244 }
227245}
0 commit comments