38 lines
1.9 KiB
Go
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
|
|
}
|