{"record":{"id":"394985143b52d833","repo":"hashicorp/nomad","slug":"error-parsing-max-kill-timeout-s","errorCode":null,"errorMessage":"Error parsing max kill timeout: %s","messagePattern":"Error parsing max kill timeout: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"command/agent/agent.go","lineNumber":988,"sourceCode":"\tif agentConfig.Client.CpuDisableDmidecode {\n\t\tconf.CpuDisableDmidecode = agentConfig.Client.CpuDisableDmidecode\n\t}\n\tif agentConfig.Client.CpuCompute != 0 {\n\t\tconf.CpuCompute = agentConfig.Client.CpuCompute\n\t}\n\tif agentConfig.Client.MemoryMB != 0 {\n\t\tconf.MemoryMB = agentConfig.Client.MemoryMB\n\t}\n\tif agentConfig.Client.DiskTotalMB != 0 {\n\t\tconf.DiskTotalMB = agentConfig.Client.DiskTotalMB\n\t}\n\tif agentConfig.Client.DiskFreeMB != 0 {\n\t\tconf.DiskFreeMB = agentConfig.Client.DiskFreeMB\n\t}\n\tif agentConfig.Client.MaxKillTimeout != \"\" {\n\t\tdur, err := time.ParseDuration(agentConfig.Client.MaxKillTimeout)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Error parsing max kill timeout: %s\", err)\n\t\t}\n\t\tconf.MaxKillTimeout = dur\n\t}\n\tconf.ClientMaxPort = uint(agentConfig.Client.ClientMaxPort)\n\tconf.ClientMinPort = uint(agentConfig.Client.ClientMinPort)\n\tconf.MaxDynamicPort = agentConfig.Client.MaxDynamicPort\n\tconf.MinDynamicPort = agentConfig.Client.MinDynamicPort\n\tconf.DisableRemoteExec = agentConfig.Client.DisableRemoteExec\n\n\tif agentConfig.Client.TemplateConfig != nil {\n\t\tconf.TemplateConfig = conf.TemplateConfig.Merge(agentConfig.Client.TemplateConfig)\n\t}\n\n\thvMap := make(map[string]*structs.ClientHostVolumeConfig, len(agentConfig.Client.HostVolumes))\n\tfor _, v := range agentConfig.Client.HostVolumes {\n\t\thvMap[v.Name] = v\n\t}\n\tconf.HostVolumes = hvMap","sourceCodeStart":970,"sourceCodeEnd":1006,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/command/agent/agent.go#L970-L1006","documentation":"convertClientConfig parses client.max_kill_timeout with time.ParseDuration. If the string is not a valid Go duration literal, the parse error is formatted into 'Error parsing max kill timeout: %s' and client configuration fails. MaxKillTimeout caps how long Nomad waits before force-killing tasks, so it must be a valid duration.","triggerScenarios":"Setting client.max_kill_timeout to a malformed duration string (e.g. \"30\", \"thirty seconds\", \"5min\" instead of \"5m\") during agent startup or a reload via handleReload.","commonSituations":"Omitting the time unit (\"30\" instead of \"30s\"); using non-Go units like \"min\" or \"hrs\"; quotes stripped by templating leaving bare numbers; config copied from other tools with different duration syntax.","solutions":["Use a valid Go duration string with a unit, e.g. max_kill_timeout = \"30s\" or \"5m\".","Accepted units: ns, us, ms, s, m, h — fix the unit suffix.","Remove the key to use Nomad's default max kill timeout."],"exampleFix":"// before\nclient { max_kill_timeout = \"30\" }\n// after\nclient { max_kill_timeout = \"30s\" }","handlingStrategy":"validation","validationCode":"if v := cfg.Client.MaxKillTimeout; v != \"\" {\n  if _, err := time.ParseDuration(v); err != nil {\n    return fmt.Errorf(\"max_kill_timeout %q is not a valid Go duration (e.g. 30s)\", v)\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include unit suffixes: s, m, h (never bare numbers).","Add duration-lint to config CI using time.ParseDuration.","Copy duration syntax only from Go-based tools, not other ecosystems."],"tags":["config","nomad","duration-parsing"],"backgroundTag":"invalid-duration-config","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"}