{"record":{"id":"e37e4ef62344fe0d","repo":"hashicorp/nomad","slug":"stdout-repeat-duration-v-not-a-valid-duration-v","errorCode":null,"errorMessage":"stdout_repeat_duration %v not a valid duration: %v","messagePattern":"stdout_repeat_duration (.+?) not a valid duration: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/mock/driver.go","lineNumber":416,"sourceCode":"\t\tstartedAt:       taskState.StartedAt,\n\t\tkill:            killCancel,\n\t\tkillCh:          killCtx.Done(),\n\t\tRecovered:       true,\n\t}\n\n\td.tasks.Set(handle.Config.ID, h)\n\tgo h.run()\n\treturn nil\n}\n\nfunc (c *Command) parseDurations() error {\n\tvar err error\n\tif c.runForDuration, err = parseDuration(c.RunFor); err != nil {\n\t\treturn fmt.Errorf(\"run_for %v not a valid duration: %v\", c.RunFor, err)\n\t}\n\n\tif c.stdoutRepeatDuration, err = parseDuration(c.StdoutRepeatDur); err != nil {\n\t\treturn fmt.Errorf(\"stdout_repeat_duration %v not a valid duration: %v\", c.stdoutRepeatDuration, err)\n\t}\n\n\tif c.stderrRepeatDuration, err = parseDuration(c.StderrRepeatDur); err != nil {\n\t\treturn fmt.Errorf(\"stderr_repeat_duration %v not a valid duration: %v\", c.stderrRepeatDuration, err)\n\t}\n\n\treturn nil\n}\n\nfunc parseDriverConfig(cfg *drivers.TaskConfig) (*TaskConfig, error) {\n\tvar driverConfig TaskConfig\n\tif err := cfg.DecodeDriverConfig(&driverConfig); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar err error\n\tif driverConfig.startBlockForDuration, err = parseDuration(driverConfig.StartBlockFor); err != nil {\n\t\treturn nil, fmt.Errorf(\"start_block_for %v not a valid duration: %v\", driverConfig.StartBlockFor, err)","sourceCodeStart":398,"sourceCodeEnd":434,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/drivers/mock/driver.go#L398-L434","documentation":"parseDurations also converts StdoutRepeatDur into stdoutRepeatDuration using parseDuration. A value time.ParseDuration (or the mock helper) cannot interpret makes the driver return 'stdout_repeat_duration %v not a valid duration: %v'. Called from RecoverTask and parseDriverConfig, so it blocks both recovery and start of the mock task.","triggerScenarios":"Mock driver config sets stdout_repeat_duration to a malformed string (e.g. \"100msx\", \"\", \"every 5s\", \"0.5\") — RecoverTask or StartTask config parsing fails immediately.","commonSituations":"Copy-paste typos in job specs; forgetting the unit (\"500\" instead of \"500ms\"); interpolated env vars empty; locale-formatted numbers with commas.","solutions":["Set stdout_repeat_duration to a valid Go duration string, e.g. \"1s\", \"500ms\", \"0\".","Read the wrapped time.ParseDuration error to see the offending substring.","Validate interpolated values before submitting the job (nomad job inspect / local validation).","For recovery failures, resubmit the job with corrected config."],"exampleFix":"// before\nstdout_repeat_duration = \"500\"\n// after\nstdout_repeat_duration = \"500ms\"","handlingStrategy":"validation","validationCode":"if _, err := time.ParseDuration(c.StdoutRepeatDur); err != nil {\n    return fmt.Errorf(\"stdout_repeat_duration must be like 500ms, got %q\", c.StdoutRepeatDur)\n}","typeGuard":"func validDuration(s string) bool { _, err := time.ParseDuration(s); return err == nil }","tryCatchPattern":"if err := cmd.parseDurations(); err != nil {\n    if strings.Contains(err.Error(), \"stdout_repeat_duration\") {\n        return fmt.Errorf(\"fix stdout_repeat_duration in mock driver config: %w\", err)\n    }\n    return err\n}","preventionTips":["Use explicit units: \"500ms\", \"1s\", \"0\" to disable.","Trim whitespace from config values sourced from templates or env.","Validate all three repeat durations together in pre-submit checks."],"tags":["nomad","mock-driver","duration-parsing","config-validation"],"backgroundTag":"invalid-duration-format","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}