From d7b229b29c742a3b87667dc0be527d6ec026c647 Mon Sep 17 00:00:00 2001 From: Evgeny Snitko Date: Mon, 10 Aug 2026 18:36:24 +0400 Subject: [PATCH 1/2] fullRepoName --- src/lib/scaleSetPoller/poller.go | 8 +++++--- src/server/handlers/statusHandler.go | 9 ++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/lib/scaleSetPoller/poller.go b/src/lib/scaleSetPoller/poller.go index 43c4ae5..914932e 100644 --- a/src/lib/scaleSetPoller/poller.go +++ b/src/lib/scaleSetPoller/poller.go @@ -169,9 +169,11 @@ func (cs *catteryScaler) HandleJobStarted(ctx context.Context, jobInfo *scaleset jobID, _ := strconv.ParseInt(jobInfo.JobID, 10, 64) workflowName := parseWorkflowName(jobInfo.JobWorkflowRef) - repo := fullRepoName(jobInfo.OwnerName, jobInfo.RepositoryName) - tray, err := cs.poller.trayManager.SetJob(ctx, jobInfo.RunnerName, jobID, jobInfo.WorkflowRunID, repo, jobInfo.JobDisplayName, workflowName) + // The tray stores the bare repository name: the restarter passes it to + // GitHub API calls that take the owner separately. Storing the full name + // here broke the restarter (duplicated owner in the API URL). + tray, err := cs.poller.trayManager.SetJob(ctx, jobInfo.RunnerName, jobID, jobInfo.WorkflowRunID, jobInfo.RepositoryName, jobInfo.JobDisplayName, workflowName) if err != nil { cs.poller.logger.Errorf("Failed to set job on tray %s: %v", jobInfo.RunnerName, err) return err @@ -186,7 +188,7 @@ func (cs *catteryScaler) HandleJobStarted(ctx context.Context, jobInfo *scaleset Time: time.Now(), Kind: MessageKindJobStarted, TrayType: cs.poller.trayType.Name, - Repository: repo, + Repository: fullRepoName(jobInfo.OwnerName, jobInfo.RepositoryName), WorkflowRunID: jobInfo.WorkflowRunID, JobID: jobID, JobDisplayName: jobInfo.JobDisplayName, diff --git a/src/server/handlers/statusHandler.go b/src/server/handlers/statusHandler.go index 96d3fb1..55011e4 100644 --- a/src/server/handlers/statusHandler.go +++ b/src/server/handlers/statusHandler.go @@ -10,6 +10,7 @@ import ( "fmt" "html/template" "net/http" + "strings" "time" log "github.com/sirupsen/logrus" @@ -193,7 +194,13 @@ func buildJobURL(repo string, workflowRunID int64) string { } func jobURL(t *trays.Tray) string { - return buildJobURL(t.Repository, t.WorkflowRunId) + // The tray stores the bare repository name; trays written by Cattery + // 0.3.0-0.3.2 may still hold the full "owner/repo" one. + repo := t.Repository + if repo != "" && !strings.Contains(repo, "/") { + repo = t.GitHubOrgName + "/" + repo + } + return buildJobURL(repo, t.WorkflowRunId) } func messageJobURL(m *scaleSetPoller.Message) string { From c51742f596eb7de113560d0fcfdcbb6de163eaf4 Mon Sep 17 00:00:00 2001 From: Evgeny Snitko Date: Tue, 11 Aug 2026 01:43:05 +0400 Subject: [PATCH 2/2] restart requestTTL --- src/lib/restarter/workflowRestarter.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/restarter/workflowRestarter.go b/src/lib/restarter/workflowRestarter.go index e0904f9..1eb5b3a 100644 --- a/src/lib/restarter/workflowRestarter.go +++ b/src/lib/restarter/workflowRestarter.go @@ -32,7 +32,9 @@ func (wr *WorkflowRestarter) RequestRestart(ctx context.Context, workflowRunId i // requests and triggers restarts when workflows have completed with failure. func (wr *WorkflowRestarter) StartPoller(ctx context.Context) { const pollInterval = 30 * time.Second - const requestTTL = 1 * time.Hour + // Must exceed the longest expected workflow run: a job preempted early in + // a run can only be re-run after the whole run completes. + const requestTTL = 6 * time.Hour logger := log.WithField("component", "restarterPoller")