{"record":{"id":"081328e1906a709e","repo":"microsoft/FASTER","slug":"segment-segmentsize-must-be-at-least-of-page-size-pagesize","errorCode":null,"errorMessage":"Segment ({SegmentSize}) must be at least of page size ({PageSize})","messagePattern":"Segment \\((.+?)\\) must be at least of page size \\((.+?)\\)","errorType":"exception","errorClass":"FasterException","httpStatus":null,"severity":"error","filePath":"cs/src/core/Allocator/AllocatorBase.cs","lineNumber":1011,"sourceCode":"            PageSizeMask = PageSize - 1;\n\n            // Total HLOG size\n            LogTotalSizeBits = settings.MemorySizeBits;\n            LogTotalSizeBytes = 1L << LogTotalSizeBits;\n            BufferSize = (int)(LogTotalSizeBytes / (1L << LogPageSizeBits));\n            BufferSizeMask = BufferSize - 1;\n\n            LogMutableFraction = settings.MutableFraction;\n\n            EmptyPageCount = 0;\n\n            // Segment size\n            LogSegmentSizeBits = settings.SegmentSizeBits;\n            SegmentSize = 1L << LogSegmentSizeBits;\n            SegmentBufferSize = 1 + (LogTotalSizeBytes / SegmentSize < 1 ? 1 : (int)(LogTotalSizeBytes / SegmentSize));\n\n            if (SegmentSize < PageSize)\n                throw new FasterException($\"Segment ({SegmentSize}) must be at least of page size ({PageSize})\");\n\n            if ((LogTotalSizeBits != 0) && (LogTotalSizeBytes < PageSize))\n                throw new FasterException($\"Memory size ({LogTotalSizeBytes}) must be configured to be either 1 (i.e., 0 bits) or at least page size ({PageSize})\");\n\n            PageStatusIndicator = new FullPageStatus[BufferSize];\n\n            if (!IsNullDevice)\n            {\n                PendingFlush = new PendingFlushList[BufferSize];\n                for (int i = 0; i < BufferSize; i++)\n                    PendingFlush[i] = new PendingFlushList();\n            }\n            device = settings.LogDevice;\n            sectorSize = (int)device.SectorSize;\n\n            if (PageSize < sectorSize)\n                throw new FasterException($\"Page size must be at least of device sector size ({sectorSize} bytes). Set PageSizeBits accordingly.\");\n","sourceCodeStart":993,"sourceCodeEnd":1029,"githubUrl":"https://github.com/microsoft/FASTER/blob/321d872eabda6a0345c8bd76419f89723ed864ae/cs/src/core/Allocator/AllocatorBase.cs#L993-L1029","documentation":"FASTER's hybrid log is divided into segments that must each hold at least one full page (SegmentSize >= PageSize). If SegmentSizeBits yields a segment smaller than the page size (1 << PageSizeBits), the allocator cannot be initialized and throws. This preserves the invariant that every segment can contain whole pages.","triggerScenarios":"Configuring LogSettings.SegmentSizeBits < LogSettings.PageSizeBits, e.g. SegmentSizeBits=16 (64KB) with PageSizeBits=20 (1MB).","commonSituations":"Users tuning down SegmentSizeBits to limit memory or disk granularity without realizing it must stay >= PageSizeBits; copying example configs and scaling values independently.","solutions":["Increase LogSettings.SegmentSizeBits so it is >= LogSettings.PageSizeBits.","Alternatively decrease PageSizeBits so it is <= SegmentSizeBits.","Use the default SegmentSizeBits (e.g. 27 on Linux, 30 on Windows) unless you have a specific reason to change it."],"exampleFix":"// before\nvar settings = new LogSettings {\n  LogDevice = Devices.CreateLogDevice(\"./faster.log\"),\n  PageSizeBits = 22, // 4MB\n  SegmentSizeBits = 20 // 1MB - smaller than a page!\n};\n\n// after\nvar settings = new LogSettings {\n  LogDevice = Devices.CreateLogDevice(\"./faster.log\"),\n  PageSizeBits = 22, // 4MB\n  SegmentSizeBits = 23 // 8MB >= page size\n};","handlingStrategy":"validation","validationCode":"if ((1L << settings.SegmentSizeBits) < (1L << settings.PageSizeBits))\n    throw new ArgumentException(\"SegmentSizeBits must be >= PageSizeBits\");","typeGuard":"bool SegmentAtLeastPage(LogSettings s) => (1L << s.SegmentSizeBits) >= (1L << s.PageSizeBits);","tryCatchPattern":"try { var fht = new FasterKV<K, V>(size, settings); }\ncatch (FasterException ex) when (ex.Message.Contains(\"must be at least of page size\")) { /* adjust SegmentSizeBits */ }","preventionTips":["Derive SegmentSizeBits from PageSizeBits (e.g. SegmentSizeBits = PageSizeBits + 3).","Centralize log settings creation in one validated factory.","Keep defaults unless profiling demands otherwise."],"tags":["csharp","configuration","faster","page-size"],"backgroundTag":"invalid-config-value","analyzedSha":"321d872eabda6a0345c8bd76419f89723ed864ae","analyzedAt":"2026-09-15T22:18:00.693Z","contentChangedAt":"2026-09-15T22:18:00.693Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}