{"record":{"id":"762db1e25b9e13ac","repo":"quickwit-oss/quickwit","slug":"max-num-bytes-cannot-be-0-if-max-num-splits-is-0","errorCode":null,"errorMessage":"max_num_bytes cannot be > 0 if max_num_splits is 0","messagePattern":"max_num_bytes cannot be > 0 if max_num_splits is 0","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-indexing/src/split_store/split_store_quota.rs","lineNumber":45,"sourceCode":"    /// Maximum size in bytes allowed in the cache. 0 if max_num_splits=0.\n    max_num_bytes: ByteSize,\n}\n\nimpl Default for SplitStoreQuota {\n    fn default() -> Self {\n        Self {\n            num_splits_in_cache: 0,\n            size_in_bytes_in_cache: ByteSize::default(),\n            max_num_bytes: IndexerConfig::default_split_store_max_num_bytes(),\n            max_num_splits: IndexerConfig::default_split_store_max_num_splits(),\n        }\n    }\n}\n\nimpl SplitStoreQuota {\n    pub fn try_new(max_num_splits: usize, max_num_bytes: ByteSize) -> anyhow::Result<Self> {\n        if max_num_splits == 0 && max_num_bytes.as_u64() > 0 {\n            anyhow::bail!(\"max_num_bytes cannot be > 0 if max_num_splits is 0\");\n        }\n        Ok(Self {\n            max_num_splits,\n            max_num_bytes,\n            ..Default::default()\n        })\n    }\n\n    /// Space quota that prevents any caching.\n    pub fn no_caching() -> Self {\n        Self::try_new(0, ByteSize::default()).unwrap()\n    }\n\n    pub fn can_fit_split(&self, split_size_in_bytes: ByteSize) -> bool {\n        if self.num_splits_in_cache >= self.max_num_splits {\n            return false;\n        }\n        if self.size_in_bytes_in_cache.as_u64() + split_size_in_bytes.as_u64()","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-indexing/src/split_store/split_store_quota.rs#L27-L63","documentation":"SplitStoreQuota::try_new validates quota configuration: allowing a nonzero byte limit while the split count limit is 0 is contradictory (a zero split quota would forbid every split, making the byte quota meaningless), so it bails. The configuration is rejected at construction time rather than silently misbehaving at runtime.","triggerScenarios":"Constructing SplitStoreQuota::try_new(max_num_splits=0, max_num_bytes > 0), typically via a split store config where max_num_splits was left at 0/unset but max_num_bytes was set.","commonSituations":"Index config mistakes: user sets only split_store_max_num_bytes expecting byte-only quota, but 0 splits means disabled/none, not unlimited; template defaults with split count 0.","solutions":["Set max_num_splits to a positive value alongside max_num_bytes.","If only a byte quota is wanted, choose a very large max_num_splits instead of 0 (after checking config semantics).","Remove the byte limit if the split store is meant to be disabled."],"exampleFix":"// before\nsplit_store_max_num_splits: 0\nsplit_store_max_num_bytes: 100 GB\n// after\nsplit_store_max_num_splits: 1000\nsplit_store_max_num_bytes: 100 GB","handlingStrategy":"validation","validationCode":"fn validate_split_store_quota(max_num_splits: usize, max_num_bytes: ByteSize) -> Result<(), String> {\n    if max_num_splits == 0 && max_num_bytes.as_u64() > 0 {\n        return Err(\"max_num_bytes set while max_num_splits is 0\".into());\n    }\n    Ok(())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never leave max_num_splits at 0 when setting a byte quota.","Validate split store config in config linting before applying index templates.","Understand that 0 means disabled, not unlimited, for the split quota."],"tags":["configuration","quota","validation","split-store"],"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-17T15:17:12.973Z"}