{"record":{"id":"976efe60189cfc2d","repo":"thanos-io/thanos","slug":"max-query-split-interval-should-be-greater-than-0","errorCode":null,"errorMessage":"max query split interval should be greater than 0 when query split threshold is enabled","messagePattern":"max query split interval should be greater than 0 when query split threshold is enabled","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/queryfrontend/config.go","lineNumber":313,"sourceCode":"\n\tif cfg.DefaultTimeRange == 0 {\n\t\treturn errors.New(\"labels.default-time-range cannot be set to 0\")\n\t}\n\n\tif cfg.DownstreamURL == \"\" {\n\t\treturn errors.New(\"downstream URL should be configured\")\n\t}\n\n\treturn nil\n}\n\nfunc (cfg *Config) validateDynamicSplitParams() error {\n\tif cfg.HorizontalShards <= 0 {\n\t\treturn errors.New(\"min horizontal shards should be greater than 0 when query split threshold is enabled\")\n\t}\n\n\tif cfg.MaxQuerySplitInterval <= 0 {\n\t\treturn errors.New(\"max query split interval should be greater than 0 when query split threshold is enabled\")\n\t}\n\n\tif cfg.MinQuerySplitInterval <= 0 {\n\t\treturn errors.New(\"min query split interval should be greater than 0 when query split threshold is enabled\")\n\t}\n\treturn nil\n}\n\nfunc (cfg *Config) isStaticSplitSet() bool {\n\treturn cfg.QueryRangeConfig.SplitQueriesByInterval != 0\n}\n\nfunc (cfg *Config) isDynamicSplitSet() bool {\n\treturn cfg.MinQuerySplitInterval > 0 ||\n\t\tcfg.HorizontalShards > 0 ||\n\t\tcfg.MaxQuerySplitInterval > 0\n}\n","sourceCodeStart":295,"sourceCodeEnd":331,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/queryfrontend/config.go#L295-L331","documentation":"validateDynamicSplitParams requires MaxQuerySplitInterval > 0 when the dynamic query-split threshold feature is enabled. This bounds the maximum width of generated query splits; a zero/negative value makes the interval computation invalid, so Validate fails at startup.","triggerScenarios":"Validate -> validateDynamicSplitParams is called with cfg.MaxQuerySplitInterval <= 0 — query_split_threshold is enabled but max_query_split_interval is unset or set to 0/negative.","commonSituations":"Configs enabling dynamic splitting but only setting min_query_split_interval; zero-valued defaults on new fields after upgrading Cortex; copy-pasted config blocks that dropped the max interval line.","solutions":["Set query_frontend.max_query_split_interval to a positive duration (e.g. 24h)","Ensure max > min_query_split_interval for a meaningful range","Disable query_split_threshold if dynamic splitting is not needed"],"exampleFix":"// before\nquery_frontend:\n  query_split_threshold: 100000\n  min_query_split_interval: 1h\n// after\nquery_frontend:\n  query_split_threshold: 100000\n  min_query_split_interval: 1h\n  max_query_split_interval: 24h","handlingStrategy":"validation","validationCode":"if cfg.MaxQuerySplitInterval <= 0 {\n    return errors.New(\"max_query_split_interval must be > 0 when query_split_threshold is enabled\")\n}","typeGuard":"func maxSplitIntervalSet(d time.Duration) bool { return d > 0 }","tryCatchPattern":"if err := cfg.Validate(); err != nil {\n    if strings.Contains(err.Error(), \"max query split interval\") {\n        log.Fatalf(\"set max_query_split_interval > 0: %v\", err)\n    }\n}","preventionTips":["Set max_query_split_interval and min_query_split_interval as a pair with min <= max","Keep these fields in the shared config template for all environments","Verify durations after env expansion render valid values"],"tags":["config","validation","query-frontend","splitting"],"backgroundTag":"invalid-config-value","analyzedSha":"35b8b991177def87ed52dcf10f9b6d87f07282c8","analyzedAt":"2026-09-07T01:49:59.689Z","contentChangedAt":"2026-09-07T01:49:59.689Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}