Files
knowledge-governance/internal/platform/postgres/monitor_removal_retry.go
T
姚章浩 1b09f7d35b
build / build (push) Successful in 1m17s
feat(monitor): 卡片概况与统一文件处理表
2026-10-27 12:14:19 +08:00

38 lines
1.9 KiB
Go

package postgres
import (
"context"
"time"
)
func (s *Store) RetryMonitorRemoval(ctx context.Context, id, actor string, now time.Time) error {
var count int
err := s.db.QueryRow(ctx, `WITH candidate AS (
SELECT p.id,j.id AS job_id FROM test_publications p
JOIN source_item_versions v ON v.id=p.source_item_version_id
JOIN source_items si ON si.id=v.source_item_id
JOIN jobs j ON j.payload->>'publication_id'=p.id AND j.type='test.remove' AND j.state='failed'
WHERE p.id=$1 AND p.superseded_at IS NULL AND p.knowledge_id<>'' AND p.retrieval_state IN ('failed','disabling') AND si.policy_state='blocked'
AND NOT EXISTS(SELECT 1 FROM jobs live WHERE live.payload->>'publication_id'=p.id AND live.state IN ('pending','running','retry'))
ORDER BY j.updated_at DESC,j.id LIMIT 1 FOR UPDATE OF p,si,j
), retried AS (
UPDATE jobs SET state='pending',attempt=0,available_at=$2,lease_owner='',lease_until=NULL,last_error='',last_error_code='',updated_at=$2
FROM candidate c WHERE jobs.id=c.job_id AND jobs.state='failed' RETURNING c.id,jobs.id AS job_id
), changed AS (
UPDATE test_publications SET retrieval_state='disabling',last_error='',retry_count=retry_count+1,updated_at=$2
FROM retried r WHERE test_publications.id=r.id RETURNING test_publications.id,r.job_id
), closed AS (
UPDATE job_failures SET state='requeued',resolved_at=$2,resolution_actor_ref=$4,resolution_reason='测试库移除重试' FROM changed c WHERE job_failures.job_id=c.job_id AND job_failures.state='open'
), audited AS (
INSERT INTO job_retry_operations(id,batch_key,publication_id,actor_ref,reason,outcome,created_at)
SELECT $3,$3,c.id,$4,'测试库移除重试','started',$2 FROM changed c
) SELECT count(*) FROM changed`, id, now, orchestrationJobID("monitor-removal-retry", id, now.String()), actor).Scan(&count)
if err != nil {
return err
}
if count != 1 {
return ErrPublicationStateConflict
}
return nil
}