{"record":{"id":"63465abd882eef35","repo":"microsoft/garnet","slug":"nameof-settings-logsettings-objectlogsegmentsizeb","errorCode":null,"errorMessage":"{nameof(settings.LogSettings.ObjectLogSegmentSizeBits)} must be between {LogSettings.kMinObjectLogSegmentSizeBits} and {LogSettings.kMaxSegmentSizeBits}","messagePattern":"(.+?) must be between (.+?) and (.+?)","errorType":"validation","errorClass":"TsavoriteException","httpStatus":null,"severity":"error","filePath":"libs/storage/Tsavorite/cs/src/core/Allocator/ObjectAllocatorImpl.cs","lineNumber":97,"sourceCode":"\n            maxInlineKeySize = settings.LogSettings.MaxInlineKeySize;\n            maxInlineValueSize = settings.LogSettings.MaxInlineValueSize;\n\n            ObjectLogSegmentSize = 1L << settings.LogSettings.ObjectLogSegmentSizeBits;\n\n            freePagePool = new OverflowPool<PageUnit<ObjectPage>>(4, static p => { });\n            pageHeaderSize = PageHeader.Size;\n\n            if (settings.LogSettings.NumberOfFlushBuffers < LogSettings.kMinFlushBuffers || settings.LogSettings.NumberOfFlushBuffers > LogSettings.kMaxFlushBuffers || !IsPowerOfTwo(settings.LogSettings.NumberOfFlushBuffers))\n                throw new TsavoriteException($\"{nameof(settings.LogSettings.NumberOfFlushBuffers)} must be between {LogSettings.kMinFlushBuffers} and {LogSettings.kMaxFlushBuffers - 1} and a power of 2\");\n            numberOfFlushBuffers = settings.LogSettings.NumberOfFlushBuffers;\n\n            if (settings.LogSettings.NumberOfDeserializationBuffers < LogSettings.kMinDeserializationBuffers || settings.LogSettings.NumberOfDeserializationBuffers > LogSettings.kMaxDeserializationBuffers || !IsPowerOfTwo(settings.LogSettings.NumberOfDeserializationBuffers))\n                throw new TsavoriteException($\"{nameof(settings.LogSettings.NumberOfDeserializationBuffers)} must be between {LogSettings.kMinDeserializationBuffers} and {LogSettings.kMaxDeserializationBuffers - 1} and a power of 2\");\n            numberOfDeserializationBuffers = settings.LogSettings.NumberOfDeserializationBuffers;\n\n            if (settings.LogSettings.ObjectLogSegmentSizeBits is < LogSettings.kMinObjectLogSegmentSizeBits or > LogSettings.kMaxSegmentSizeBits)\n                throw new TsavoriteException($\"{nameof(settings.LogSettings.ObjectLogSegmentSizeBits)} must be between {LogSettings.kMinObjectLogSegmentSizeBits} and {LogSettings.kMaxSegmentSizeBits}\");\n            objectLogTail = new(0, settings.LogSettings.ObjectLogSegmentSizeBits);\n\n            objectPages = new ObjectPage[BufferSize];\n            for (var ii = 0; ii < BufferSize; ii++)\n                objectPages[ii] = new();\n        }\n\n        /// <summary>Initialize allocator</summary>\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        protected internal override void Initialize()\n        {\n            base.Initialize();\n            LastIssuedFlushedUntilAddress = FlushedUntilAddress;\n            OngoingFlushedUntilAddress = 0;\n            NoFlushUntilAddress = 0;\n        }\n\n        internal int OverflowPageCount => freePagePool.Count;","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/microsoft/garnet/blob/951b0fc6838721f89d102c2bbe1b914e8d39d700/libs/storage/Tsavorite/cs/src/core/Allocator/ObjectAllocatorImpl.cs#L79-L115","documentation":"Thrown by ObjectAllocatorImpl when LogSettings.ObjectLogSegmentSizeBits is less than kMinObjectLogSegmentSizeBits (22, i.e. 4MB) or greater than kMaxSegmentSizeBits (62). The object-log segment size also sizes the read/write buffers for object serialization, so it must be large enough to buffer a segment and bounded by the 62-bit address space.","triggerScenarios":"Setting LogSettings.ObjectLogSegmentSizeBits outside [22, 62], e.g. matching it to a small PageSizeBits or an arbitrary value, when constructing an object store. Default is 33 (8GB).","commonSituations":"Reducing ObjectLogSegmentSizeBits to cut buffer memory without knowing the 4MB floor; setting it equal to PageSizeBits for uniformity (PageSizeBits is often 25 < 22? no, but e.g. 20 would fail); bumping it very high to avoid segment crossings and exceeding 62.","solutions":["Keep ObjectLogSegmentSizeBits within [22, 62] (default 33).","Do not set it below 22 even if page size is smaller; the object log needs its own minimum segment/buffer size.","If lowering memory, reduce PageSizeBits/MemorySize instead of ObjectLogSegmentSizeBits."],"exampleFix":"// before\nlogSettings.ObjectLogSegmentSizeBits = 20; // < kMinObjectLogSegmentSizeBits (22)\n// after\nlogSettings.ObjectLogSegmentSizeBits = 22; // 4MB minimum","handlingStrategy":"validation","validationCode":"if (logSettings.ObjectLogSegmentSizeBits is < LogSettings.kMinObjectLogSegmentSizeBits or > LogSettings.kMaxSegmentSizeBits)\n    throw new ArgumentException($\"ObjectLogSegmentSizeBits must be in [22,62]\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not tie ObjectLogSegmentSizeBits to PageSizeBits; they have different minimums (22 vs 12).","Prefer the default (33) and only deviate with a clear capacity/memory reason."],"tags":["configuration","object-log","segment","validation"],"backgroundTag":null,"analyzedSha":"951b0fc6838721f89d102c2bbe1b914e8d39d700","analyzedAt":"2026-08-13T19:01:32.939Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}