diff --git a/internal/planner/planner.go b/internal/planner/planner.go index 2a09aca..221b911 100644 --- a/internal/planner/planner.go +++ b/internal/planner/planner.go @@ -456,8 +456,9 @@ func buildPlannedTask(planID, taskType string, planIndex int, params any) (seiv1 } // taskMaxRetries is the executor's retry budget per task type. Default 0 -// makes the first ExecutionFailed terminal. Wall-clock per N retries: -// 5s + 10s + 20s + 30s*(N-3) for N>=3. +// makes the first ExecutionFailed terminal. Wall-clock per N retries +// (RetryCount is incremented before retryBackoff is called): +// 10s for N=1; 10s + 20s + 30s*(N-2) for N>=2. func taskMaxRetries(taskType string) int { switch taskType { case TaskConfigureGenesis: diff --git a/internal/planner/planner_test.go b/internal/planner/planner_test.go new file mode 100644 index 0000000..d23e1d6 --- /dev/null +++ b/internal/planner/planner_test.go @@ -0,0 +1,18 @@ +package planner + +import "testing" + +func TestTaskMaxRetries(t *testing.T) { + cases := map[string]int{ + TaskConfigureGenesis: genesisConfigureMaxRetries, + TaskAssembleGenesis: groupAssemblyMaxRetries, + TaskDiscoverPeers: discoverPeersMaxRetries, + "unknown-task-type": 0, + "": 0, + } + for taskType, want := range cases { + if got := taskMaxRetries(taskType); got != want { + t.Errorf("taskMaxRetries(%q) = %d, want %d", taskType, got, want) + } + } +}