{"record":{"id":"b8f3bc15ee4da60d","repo":"cloudflare/cloudflared","slug":"s-must-be-equal-or-less-than-v","errorCode":null,"errorMessage":"%s must be equal or less than %v","messagePattern":"(.+?) must be equal or less than (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/cloudflared/tunnel/configuration.go","lineNumber":287,"sourceCode":"\treturn tunnelConfig, orchestratorConfig, nil\n}\n\nfunc parseConfigFlags(c *cli.Context) map[string]string {\n\tresult := make(map[string]string)\n\n\tfor _, flag := range configFlags {\n\t\tif v := c.String(flag); c.IsSet(flag) && v != \"\" {\n\t\t\tresult[flag] = v\n\t\t}\n\t}\n\n\treturn result\n}\n\nfunc gracePeriod(c *cli.Context) (time.Duration, error) {\n\tperiod := c.Duration(flags.GracePeriod)\n\tif period > connection.MaxGracePeriod {\n\t\treturn time.Duration(0), fmt.Errorf(\"%s must be equal or less than %v\", flags.GracePeriod, connection.MaxGracePeriod)\n\t}\n\treturn period, nil\n}\n\nfunc isRunningFromTerminal() bool {\n\treturn term.IsTerminal(int(os.Stdout.Fd())) // nolint:gosec\n}\n\n// ParseConfigIPVersion returns the IP version from possible expected values from config\nfunc parseConfigIPVersion(version string) (v allregions.ConfigIPVersion, err error) {\n\tswitch version {\n\tcase \"4\":\n\t\tv = allregions.IPv4Only\n\tcase \"6\":\n\t\tv = allregions.IPv6Only\n\tcase \"auto\":\n\t\tv = allregions.Auto\n\tdefault: // unspecified or invalid","sourceCodeStart":269,"sourceCodeEnd":305,"githubUrl":"https://github.com/cloudflare/cloudflared/blob/2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f/cmd/cloudflared/tunnel/configuration.go#L269-L305","documentation":"gracePeriod validates the `--grace-period` duration against connection.MaxGracePeriod (3 minutes by default); a longer value is rejected so shutdown waits stay bounded. The flag and its value come straight from the CLI/config.","triggerScenarios":"Running `cloudflared tunnel run --grace-period 10m` or setting `grace-period: 10m` in the config file with a value above MaxGracePeriod.","commonSituations":"Operators wanting longer drain time during deploys set large grace periods; copied Kubernetes preStop tuning exceeds the built-in cap.","solutions":["Reduce `--grace-period` to at most the max shown in the message (e.g. 3m0s).","If longer drain is genuinely needed, manage connection draining at the orchestrator level (e.g. Kubernetes terminationGracePeriodSeconds) instead.","Remove the flag to use the default grace period."],"exampleFix":"// before\ngrace-period: 10m\n// after\ngrace-period: 3m","handlingStrategy":"validation","validationCode":"// shell: clamp grace-period to the 3m cap\np=\"${GRACE_PERIOD:-2m}\"\n[[ \"$(echo \"$p\" | sed 's/[a-z]//g')\" =~ ^[0-9]+$ ]] || p=\"2m\"\ncloudflared tunnel run --grace-period \"$p\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep grace-period <= 3m (connection.MaxGracePeriod).","Handle longer drains at the orchestrator (terminationGracePeriodSeconds), not cloudflared.","Include grace-period in config linting rules."],"tags":["cli","configuration","duration"],"backgroundTag":"value-out-of-range","analyzedSha":"2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f","analyzedAt":"2026-09-06T04:14:33.757Z","contentChangedAt":"2026-09-06T04:14:33.757Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}