{"record":{"id":"4a2938111de78159","repo":"k3s-io/k3s","slug":"etcd-snapshot-reconcile-interval-must-be-greater-t","errorCode":null,"errorMessage":"etcd-snapshot-reconcile-interval must be greater than 0s","messagePattern":"etcd-snapshot-reconcile-interval must be greater than 0s","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/cli/server/server.go","lineNumber":206,"sourceCode":"\tserverConfig.ControlConfig.DisableKubeProxy = cfg.DisableKubeProxy\n\tserverConfig.ControlConfig.DisableETCD = cfg.DisableETCD\n\tserverConfig.ControlConfig.DisableAPIServer = cfg.DisableAPIServer\n\tserverConfig.ControlConfig.DisableScheduler = cfg.DisableScheduler\n\tserverConfig.ControlConfig.DisableControllerManager = cfg.DisableControllerManager\n\tserverConfig.ControlConfig.DisableAgent = cfg.DisableAgent\n\tserverConfig.ControlConfig.EmbeddedRegistry = cfg.EmbeddedRegistry\n\tserverConfig.ControlConfig.ClusterInit = cfg.ClusterInit\n\tserverConfig.ControlConfig.EncryptSecrets = cfg.EncryptSecrets\n\tserverConfig.ControlConfig.EncryptProvider = cfg.EncryptProvider\n\tserverConfig.ControlConfig.EtcdExposeMetrics = cfg.EtcdExposeMetrics\n\tserverConfig.ControlConfig.EtcdDisableSnapshots = cfg.EtcdDisableSnapshots\n\tserverConfig.ControlConfig.SupervisorMetrics = cfg.SupervisorMetrics\n\tserverConfig.ControlConfig.VLevel = cmds.LogConfig.VLevel\n\tserverConfig.ControlConfig.VModule = cmds.LogConfig.VModule\n\n\tif !cfg.EtcdDisableSnapshots || cfg.ClusterReset {\n\t\tif cfg.EtcdSnapshotReconcile <= 0 {\n\t\t\treturn errors.New(\"etcd-snapshot-reconcile-interval must be greater than 0s\")\n\t\t}\n\t\tserverConfig.ControlConfig.EtcdSnapshotCompress = cfg.EtcdSnapshotCompress\n\t\tserverConfig.ControlConfig.EtcdSnapshotName = cfg.EtcdSnapshotName\n\t\tserverConfig.ControlConfig.EtcdSnapshotCron = cfg.EtcdSnapshotCron\n\t\tserverConfig.ControlConfig.EtcdSnapshotDir = cfg.EtcdSnapshotDir\n\t\tserverConfig.ControlConfig.EtcdSnapshotReconcile = metav1.Duration{Duration: cfg.EtcdSnapshotReconcile}\n\t\tserverConfig.ControlConfig.EtcdSnapshotRetention = cfg.EtcdSnapshotRetention\n\t\tif cfg.EtcdS3 {\n\t\t\tif cfg.EtcdS3Timeout <= 0 {\n\t\t\t\treturn errors.New(\"etcd-s3-timeout must be greater than 0s\")\n\t\t\t}\n\t\t\t// set default s3 retention from local snapshot retention\n\t\t\t// preserves legacy behavior of local snapshot retention also affecting s3\n\t\t\tif !app.IsSet(\"etcd-s3-retention\") && app.IsSet(\"etcd-snapshot-retention\") {\n\t\t\t\tcfg.EtcdS3Retention = cfg.EtcdSnapshotRetention\n\t\t\t}\n\t\t\tserverConfig.ControlConfig.EtcdS3 = &config.EtcdS3{\n\t\t\t\tAccessKey:     cfg.EtcdS3AccessKey,","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/k3s-io/k3s/blob/6ba341e396edc16b8dcae978a7c5e3ac7ee5606e/pkg/cli/server/server.go#L188-L224","documentation":"Server startup validates the etcd snapshot reconciler cadence whenever snapshots are active (i.e. --etcd-disable-snapshots is false) or a cluster-reset is in progress. The reconcile interval drives how often snapshots are taken/pruned; a zero or negative duration would stall that loop, so EtcdSnapshotReconcile <= 0 is rejected. Note the companion check: --etcd-s3 with --etcd-s3-timeout <= 0 fails similarly.","triggerScenarios":"Setting --etcd-snapshot-reconcile-interval=0s (or a negative value) while leaving snapshots enabled; attempting to 'disable the reconciler' via the interval instead of --etcd-disable-snapshots; cluster-reset runs with a zeroed interval.","commonSituations":"Admins copying docs for disabling snapshots but zeroing the wrong flag; config.yaml merge setting reconcile-interval: 0s; tuning intervals down to 'off' during maintenance.","solutions":["If snapshots should be off, use --etcd-disable-snapshots instead of a zero interval","Otherwise set a positive interval: --etcd-snapshot-reconcile-interval=5m (or your desired cadence)","Also keep --etcd-s3-timeout > 0 whenever --etcd-s3 is enabled","Review /etc/rancher/k3s/config.yaml for reconcile-interval: 0s leftovers after maintenance"],"exampleFix":"# before\nk3s server --etcd-snapshot-reconcile-interval=0s  # -> must be greater than 0s\n\n# after\neither: k3s server --etcd-disable-snapshots\nor:     k3s server --etcd-snapshot-reconcile-interval=5m","handlingStrategy":"validation","validationCode":"if !cfg.EtcdDisableSnapshots || cfg.ClusterReset {\n    if cfg.EtcdSnapshotReconcile <= 0 {\n        return errors.New(\"set --etcd-snapshot-reconcile-interval > 0s, or disable snapshots with --etcd-disable-snapshots\")\n    }\n    if cfg.EtcdS3 && cfg.EtcdS3Timeout <= 0 {\n        return errors.New(\"--etcd-s3 requires --etcd-s3-timeout > 0s\")\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use --etcd-disable-snapshots to turn snapshots off; never zero the interval","Schema-validate config.yaml (interval must parse to a positive duration) in config management","Review flag pairs (s3 + timeout, disable-snapshots + interval) in pre-deploy linting"],"tags":["etcd","snapshot","server","config","validation"],"backgroundTag":null,"analyzedSha":"6ba341e396edc16b8dcae978a7c5e3ac7ee5606e","analyzedAt":"2026-08-15T16:27:54.286Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}