{"record":{"id":"4bfd2abbc88ae9e2","repo":"quickwit-oss/quickwit","slug":"index-config-merge-policy-max-merge-factor-must","errorCode":null,"errorMessage":"index config merge policy `max_merge_factor` must be superior or equal to `merge_factor`","messagePattern":"index config merge policy `max_merge_factor` must be superior or equal to `merge_factor`","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-config/src/merge_policy_config.rs","lineNumber":242,"sourceCode":"}\n\nimpl MergePolicyConfig {\n    pub fn noop() -> Self {\n        MergePolicyConfig::Nop\n    }\n\n    pub fn validate(&self) -> anyhow::Result<()> {\n        let (merge_factor, max_merge_factor) = match self {\n            MergePolicyConfig::Nop => {\n                return Ok(());\n            }\n            MergePolicyConfig::ConstWriteAmplification(config) => {\n                (config.merge_factor, config.max_merge_factor)\n            }\n            MergePolicyConfig::StableLog(config) => (config.merge_factor, config.max_merge_factor),\n        };\n        if max_merge_factor < merge_factor {\n            anyhow::bail!(\n                \"index config merge policy `max_merge_factor` must be superior or equal to \\\n                 `merge_factor`\"\n            );\n        }\n        Ok(())\n    }\n}\n","sourceCodeStart":224,"sourceCodeEnd":250,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-config/src/merge_policy_config.rs#L224-L250","documentation":"The merge policy config in quickwit-config must satisfy the invariant `max_merge_factor >= merge_factor`: the merge factor is how many segments are merged per merge operation, and the max merge factor caps merge sizes. `MergePolicyConfig::validate` compares the two values for the configured policy (ConstWriteAmplification, StableLog, or default) and bails if the cap is below the factor, since such a configuration is contradictory.","triggerScenarios":"Setting `merge_policy.max_merge_factor` lower than `merge_factor` in the index config (e.g. `merge_factor: 10, max_merge_factor: 8`) and running config validation at startup or index creation.","commonSituations":"Hand-tuning merge settings to reduce write amplification and lowering `max_merge_factor` without noticing `merge_factor`; copying configs between indexes with mismatched values; documentation examples edited piecemeal.","solutions":["Raise `max_merge_factor` to at least `merge_factor` (typical: merge_factor 10, max_merge_factor 12).","If you intended smaller merges, lower `merge_factor` instead so it does not exceed `max_merge_factor`.","Validate the index config locally (`quickwit index create` or config validation) before deploying."],"exampleFix":"// before\nmerge_policy:\n  merge_factor: 10\n  max_merge_factor: 8\n// after\nmerge_policy:\n  merge_factor: 10\n  max_merge_factor: 12","handlingStrategy":"validation","validationCode":"fn merge_policy_is_consistent(merge_factor: usize, max_merge_factor: usize) -> bool {\n    max_merge_factor >= merge_factor\n}","typeGuard":null,"tryCatchPattern":"// Rust\nif let Err(e) = merge_policy_config.validate() {\n    eprintln!(\"invalid merge policy: {e:#}\");\n    return Err(e);\n}","preventionTips":["Treat max_merge_factor as merge_factor + headroom (e.g. 10/12), never below it.","When tuning for write amplification, lower merge_factor first, then max_merge_factor.","Validate index configs in CI before rollout."],"tags":["config","validation","merge-policy","quickwit"],"backgroundTag":"invalid-config-value","analyzedSha":"a39730c5cdcd1a4fe798403737ae293999ea21f8","analyzedAt":"2026-09-08T13:19:37.784Z","contentChangedAt":"2026-09-08T13:19:37.784Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}