{"record":{"id":"29f7fc9cab911768","repo":"microsoft/garnet","slug":"nameof-logsettings-segmentsizebits-must-be-betw","errorCode":null,"errorMessage":"{nameof(logSettings.SegmentSizeBits)} must be between {LogSettings.kMinMainLogSegmentSizeBits} and {LogSettings.kMaxSegmentSizeBits}","messagePattern":"(.+?) must be between (.+?) and (.+?)","errorType":"exception","errorClass":"TsavoriteException","httpStatus":null,"severity":"error","filePath":"libs/storage/Tsavorite/cs/src/core/Allocator/AllocatorBase.cs","lineNumber":556,"sourceCode":"            _wrapper = wrapperCreator(this);\n\n            // Pre-bind the instance-method delegate once so the pending-IO hot path does\n            // not allocate a fresh DeviceIOCompletionCallback per AsyncGetFromDisk call.\n            asyncGetFromDiskCallbackDelegate = AsyncGetFromDiskCallback;\n\n            this.transientObjectIdMap = transientObjectIdMap;\n\n            // Validation\n            if (logSettings.PageCount == 0 && logSettings.MemorySize == 0)\n                throw new TsavoriteException($\"{nameof(logSettings.PageCount)} or {nameof(logSettings.MemorySize)} must be specified\");\n            if (logSettings.PageSizeBits < LogSettings.kMinPageSizeBits || logSettings.PageSizeBits > LogSettings.kMaxPageSizeBits)\n                throw new TsavoriteException($\"{nameof(logSettings.PageSizeBits)} must be between {LogSettings.kMinPageSizeBits} and {LogSettings.kMaxPageSizeBits}\");\n            if (logSettings.PageSizeBits < PageHeader.SizeBits)\n                throw new TsavoriteException($\"{nameof(logSettings.PageSizeBits)} must be >= PageHeader.SizeBits {PageHeader.SizeBits}\");\n            if (logSettings.PageCount > MemoryUtils.ArrayMaxLength)\n                throw new TsavoriteException($\"{nameof(logSettings.PageCount)} must be less than or equal to the maximum array length ({MemoryUtils.ArrayMaxLength})\");\n            if (logSettings.SegmentSizeBits < LogSettings.kMinMainLogSegmentSizeBits || logSettings.SegmentSizeBits > LogSettings.kMaxSegmentSizeBits)\n                throw new TsavoriteException($\"{nameof(logSettings.SegmentSizeBits)} must be between {LogSettings.kMinMainLogSegmentSizeBits} and {LogSettings.kMaxSegmentSizeBits}\");\n            if (logSettings.MemorySize != 0 && (logSettings.MemorySize < 1L << LogSettings.kMinMemorySizeBits || logSettings.MemorySize > 1L << LogSettings.kMaxMemorySizeBits))\n                throw new TsavoriteException($\"{nameof(logSettings.MemorySize)} must be between {1L << LogSettings.kMinMemorySizeBits} and {1L << LogSettings.kMaxMemorySizeBits}, or may be 0 for ReadOnly TsavoriteLog\");\n            if ((logSettings.MemorySize != 0) && (logSettings.MemorySize < (1L << logSettings.PageSizeBits) * LogSettings.kMinPageCount))\n                throw new TsavoriteException($\"{nameof(logSettings.MemorySize)} must be at least {LogSettings.kMinPageCount}x the page size ({1L << logSettings.PageSizeBits})\");\n            if (logSettings.MutableFraction < 0.0 || logSettings.MutableFraction > 1.0)\n                throw new TsavoriteException($\"{nameof(logSettings.MutableFraction)} must be >= 0.0 and <= 1.0\");\n            if (logSettings.ReadCacheSettings is not null)\n            {\n                var rcs = logSettings.ReadCacheSettings;\n                if (rcs.PageCount == 0 && rcs.MemorySize == 0)\n                    throw new TsavoriteException($\"{nameof(rcs.PageCount)} or {nameof(rcs.MemorySize)} must be specified\");\n                if (rcs.PageSizeBits < LogSettings.kMinPageSizeBits || rcs.PageSizeBits > LogSettings.kMaxPageSizeBits)\n                    throw new TsavoriteException($\"{nameof(rcs.PageSizeBits)} must be between {LogSettings.kMinPageSizeBits} and {LogSettings.kMaxPageSizeBits}\");\n                if (rcs.PageCount > MemoryUtils.ArrayMaxLength)\n                    throw new TsavoriteException($\"{nameof(rcs.PageCount)} must be less than or equal to the maximum array length ({MemoryUtils.ArrayMaxLength})\");\n                if (rcs.MemorySize != 0 && (rcs.MemorySize < 1L << LogSettings.kMinMemorySizeBits || rcs.MemorySize > 1L << LogSettings.kMaxMemorySizeBits))\n                    throw new TsavoriteException($\"{nameof(rcs.MemorySize)} must be between {1L << LogSettings.kMinMemorySizeBits} and {1L << LogSettings.kMaxMemorySizeBits}\");\n                if ((rcs.MemorySize != 0) && (rcs.MemorySize < (1L << rcs.PageSizeBits) * 2))","sourceCodeStart":538,"sourceCodeEnd":574,"githubUrl":"https://github.com/microsoft/garnet/blob/951b0fc6838721f89d102c2bbe1b914e8d39d700/libs/storage/Tsavorite/cs/src/core/Allocator/AllocatorBase.cs#L538-L574","documentation":"Constructor validation: logSettings.SegmentSizeBits must be in [LogSettings.kMinMainLogSegmentSizeBits, LogSettings.kMaxSegmentSizeBits] = [12, 62]. Segments are the on-disk grouping of pages and the unit of the DiskWriteBuffer; the bit width feeds segment-offset math. Default is 30 (1GiB).","triggerScenarios":"Setting SegmentSizeBits below 12 or above 62 when constructing the store, e.g. `SegmentSizeBits = 10` or `= 64`.","commonSituations":"Tuning segment size for very large disks and overshooting 62 bits; confusing bits/bytes; copying guidance from a system with different limits.","solutions":["Set SegmentSizeBits within [12, 62]; default 30 (1GiB) is a safe choice.","Ensure SegmentSizeBits >= PageSizeBits to also avoid error 239 downstream.","Remember it is a bit exponent (30 => 1GiB segment)."],"exampleFix":"// before\nlogSettings.SegmentSizeBits = 64;  // above 62-bit ceiling\n// after\nlogSettings.SegmentSizeBits = 30;   // 1GiB, the default","handlingStrategy":"validation","validationCode":"const int MinSegBits = 12, MaxSegBits = 62; // LogSettings constants\nif (logSettings.SegmentSizeBits < MinSegBits || logSettings.SegmentSizeBits > MaxSegBits)\n    throw new ArgumentOutOfRangeException(nameof(logSettings.SegmentSizeBits),\n        $\"SegmentSizeBits must be in [{MinSegBits},{MaxSegBits}]\");\n// also keep segment >= page to avoid error 239:\nif (logSettings.SegmentSizeBits < logSettings.PageSizeBits)\n    logSettings.SegmentSizeBits = logSettings.PageSizeBits;","typeGuard":null,"tryCatchPattern":"try { new TsavoriteKV<K,V>(logSettings, ...); }\ncatch (TsavoriteException ex) when (ex.Message.Contains(\"SegmentSizeBits\") && ex.Message.Contains(\"between\"))\n{ /* set SegmentSizeBits to a value in [12,62] and >= PageSizeBits */ }","preventionTips":["Keep the default SegmentSizeBits=30 unless you have measured reason to change it.","Always keep SegmentSizeBits >= PageSizeBits.","Treat the value as a bit exponent (30 => 1GiB)."],"tags":["storage","configuration","log-settings","segment-size"],"backgroundTag":null,"analyzedSha":"951b0fc6838721f89d102c2bbe1b914e8d39d700","analyzedAt":"2026-08-13T19:01:32.939Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}