feat: make global default timeout 0 (infinite) instead of required 30s

DefaultTimeoutSeconds now means "no timeout" when 0/empty, and that is
the new default, rather than an invalid config forcing a positive
value. runner.RunJob avoids context.WithTimeout with a zero duration
(which would expire immediately) and instead runs on a plain
cancelable context when no timeout is configured. Per-job
TimeoutSeconds inherit semantics are unchanged.
This commit is contained in:
mixeme
2026-07-26 13:57:03 +03:00
parent 3992b40eda
commit 33a246cd13
14 changed files with 75 additions and 23 deletions
+3 -2
View File
@@ -54,7 +54,8 @@ type Config struct {
ExecutionMode ExecutionMode `json:"execution_mode,omitempty"`
OverlapPolicy OverlapPolicy `json:"overlap_policy,omitempty"`
// DefaultTimeoutSeconds is the run timeout applied to jobs that do not set
// their own Job.TimeoutSeconds. It carries the formerly hard-coded 30s guard.
// their own Job.TimeoutSeconds. 0 (the default) means no timeout: such jobs
// run to completion however long that takes.
DefaultTimeoutSeconds int `json:"default_timeout_seconds,omitempty"`
Paused bool `json:"paused,omitempty"`
// Theme selects the visual appearance. Empty is treated as ThemeDefault so
@@ -77,7 +78,7 @@ func DefaultConfig() Config {
ExecutionMode: ExecutionModeParallel,
OverlapPolicy: OverlapPolicySkip,
Theme: ThemeDefault,
DefaultTimeoutSeconds: 30,
DefaultTimeoutSeconds: 0,
}
}
+1
View File
@@ -18,5 +18,6 @@ type Job struct {
// TimeoutSeconds bounds how long a run may take before it is killed. 0 means
// "inherit the global Config.DefaultTimeoutSeconds", mirroring OverlapPolicy:
// normalizeJobs must leave 0 untouched rather than backfilling the default.
// The inherited global default may itself be 0, meaning no timeout at all.
TimeoutSeconds int `json:"timeout_seconds,omitempty"`
}