fix monitor desktop unknown recovery

This commit is contained in:
2026-06-22 15:38:06 +08:00
parent 365a41597e
commit 12681105f2
8 changed files with 162 additions and 39 deletions
@@ -945,6 +945,7 @@ func (s *MonitoringCallbackService) skipTaskForInstallation(
}
skipReason := normalizeSkipReason(req.SkipReason)
skipOutcome := monitoringSkipOutcomeForReason(skipReason)
tx, err := s.monitoringPool.Begin(ctx)
if err != nil {
@@ -954,14 +955,14 @@ func (s *MonitoringCallbackService) skipTaskForInstallation(
if _, err := tx.Exec(ctx, `
UPDATE monitoring_collect_tasks
SET status = 'skipped',
SET status = $2,
callback_received_at = NOW(),
completed_at = $2,
skip_reason = $3,
error_message = $4,
completed_at = $3,
skip_reason = $4,
error_message = $5,
updated_at = NOW()
WHERE id = $1
`, task.ID, completedAt, skipReason, nullableString(req.ErrorMessage)); err != nil {
`, task.ID, skipOutcome.TaskStatus, completedAt, nullableStringPtr(skipOutcome.StoredSkipReason), nullableString(req.ErrorMessage)); err != nil {
return nil, response.ErrInternal(50041, "task_update_failed", "failed to update monitoring task skip status")
}
@@ -978,12 +979,34 @@ func (s *MonitoringCallbackService) skipTaskForInstallation(
completedAtText := completedAt.Format(time.RFC3339)
return &MonitoringSkipTaskResponse{
TaskID: task.ID,
TaskStatus: "skipped",
TaskStatus: skipOutcome.TaskStatus,
SkipReason: skipReason,
CompletedAt: &completedAtText,
}, nil
}
type monitoringSkipOutcome struct {
TaskStatus string
StoredSkipReason string
}
func monitoringSkipOutcomeForReason(skipReason string) monitoringSkipOutcome {
switch strings.TrimSpace(skipReason) {
case "runtime_unknown":
return monitoringSkipOutcome{TaskStatus: "failed"}
default:
return monitoringSkipOutcome{TaskStatus: "skipped", StoredSkipReason: strings.TrimSpace(skipReason)}
}
}
func nullableStringPtr(value string) *string {
trimmed := strings.TrimSpace(value)
if trimmed == "" {
return nil
}
return &trimmed
}
func (s *MonitoringCallbackService) CancelTaskForDesktopClient(
ctx context.Context,
client *repository.DesktopClient,
@@ -1504,7 +1527,7 @@ func (s *MonitoringCallbackService) loadActiveDesktopMonitorExecutionLease(
FROM desktop_tasks
WHERE kind = 'monitor'
AND monitor_task_id = $1
AND status IN ('queued', 'in_progress', 'unknown')
AND status IN ('queued', 'in_progress')
ORDER BY created_at DESC, id DESC
LIMIT 1
`, monitorTaskID).Scan(
@@ -2349,16 +2372,7 @@ func (s *MonitoringCallbackService) completeLinkedDesktopMonitorTask(
workspaceID int64
activeAttemptID pgtype.UUID
)
if err := tx.QueryRow(ctx, `
SELECT desktop_id, workspace_id, active_attempt_id
FROM desktop_tasks
WHERE kind = 'monitor'
AND monitor_task_id = $1
AND status IN ('in_progress', 'unknown')
ORDER BY created_at DESC, id DESC
LIMIT 1
FOR UPDATE
`, task.ID).Scan(&desktopID, &workspaceID, &activeAttemptID); err != nil {
if err := tx.QueryRow(ctx, completeLinkedDesktopMonitorTaskLookupSQL(), task.ID).Scan(&desktopID, &workspaceID, &activeAttemptID); err != nil {
if err == pgx.ErrNoRows {
return nil
}
@@ -2434,6 +2448,19 @@ func (s *MonitoringCallbackService) completeLinkedDesktopMonitorTask(
return nil
}
func completeLinkedDesktopMonitorTaskLookupSQL() string {
return `
SELECT desktop_id, workspace_id, active_attempt_id
FROM desktop_tasks
WHERE kind = 'monitor'
AND monitor_task_id = $1
AND status = 'in_progress'
ORDER BY created_at DESC, id DESC
LIMIT 1
FOR UPDATE
`
}
func (s *MonitoringCallbackService) replaceCitationFacts(ctx context.Context, tx pgx.Tx, tenantID, runID int64) error {
if _, err := tx.Exec(ctx, `
DELETE FROM monitoring_citation_facts