From 96c8f44e952876779d6364aa1be8f36773162d99 Mon Sep 17 00:00:00 2001 From: xuans Date: Wed, 30 Sep 2026 01:17:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B4=BB=E5=8A=A8=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=88=A0=E9=99=A4=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 扩展域名删除时的活动任务状态保护,补充 retry_wait 与 cancelling 回归测试。 --- .../internal/repository/project_domain_repository.go | 2 +- .../repository/project_domain_repository_test.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/backend/internal/repository/project_domain_repository.go b/backend/internal/repository/project_domain_repository.go index 103df0b..97b1114 100644 --- a/backend/internal/repository/project_domain_repository.go +++ b/backend/internal/repository/project_domain_repository.go @@ -113,7 +113,7 @@ func (r *SQLProjectMemberRepository) DeleteProjectDomain(ctx context.Context, ac } rows, err := tx.QueryContext(ctx, Rebind(r.driver, `SELECT id FROM tasks WHERE domain_id = ? AND task_type IN ('certificate_issue', 'certificate_validate', 'certificate_deploy', 'certificate_import', 'certificate_restore') - AND status IN ('queued', 'running')`+r.resourceWriteLock()), domainID) + AND status IN ('queued', 'running', 'retry_wait', 'cancelling')`+r.resourceWriteLock()), domainID) if err != nil { return fmt.Errorf("检查域名任务失败:%w", err) } diff --git a/backend/internal/repository/project_domain_repository_test.go b/backend/internal/repository/project_domain_repository_test.go index 23ace7e..5c5d4f5 100644 --- a/backend/internal/repository/project_domain_repository_test.go +++ b/backend/internal/repository/project_domain_repository_test.go @@ -71,6 +71,18 @@ func TestProjectDomainRepositorySQLite(t *testing.T) { t.Fatal(err) } trigger := `CREATE TRIGGER reject_project_domain_audit BEFORE INSERT ON audit_logs BEGIN SELECT RAISE(ABORT, 'audit-failure'); END` + for _, status := range []string{"retry_wait", "cancelling"} { + taskID := "domain-active-task-" + status + if err := taskRepo.CreateTask(t.Context(), Task{HistoryScope: HistoryScope{ProjectID: item.ProjectID, ScopeType: ScopeProject}, ID: taskID, DomainID: item.ID, TaskType: "certificate_deploy", Status: status}); err != nil { + t.Fatal(err) + } + if err := writer.DeleteProjectDomain(t.Context(), "domain-manager", item.ID); !errors.Is(err, ErrProjectDomainBusy) { + t.Fatalf("任务状态 %s 下删除应拒绝:%v", status, err) + } + if _, err := db.DB.ExecContext(t.Context(), Rebind(cfg.Driver, "UPDATE tasks SET status = 'partial_success' WHERE id = ?"), taskID); err != nil { + t.Fatal(err) + } + } if _, err := db.DB.ExecContext(t.Context(), trigger); err != nil { t.Fatal(err) }