{"record":{"id":"41a41471ee6017d8","repo":"microsoft/FASTER","slug":"memory-size-logtotalsizebytes-must-be-configured-to-be","errorCode":null,"errorMessage":"Memory size ({LogTotalSizeBytes}) must be configured to be either 1 (i.e., 0 bits) or at least page size ({PageSize})","messagePattern":"Memory size \\((.+?)\\) must be configured to be either 1 \\(i\\.e\\., 0 bits\\) or at least page size \\((.+?)\\)","errorType":"exception","errorClass":"FasterException","httpStatus":null,"severity":"error","filePath":"cs/src/core/Allocator/AllocatorBase.cs","lineNumber":1014,"sourceCode":"            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\n            AlignedPageSizeBytes = (PageSize + (sectorSize - 1)) & ~(sectorSize - 1);\n        }\n","sourceCodeStart":996,"sourceCodeEnd":1032,"githubUrl":"https://github.com/microsoft/FASTER/blob/321d872eabda6a0345c8bd76419f89723ed864ae/cs/src/core/Allocator/AllocatorBase.cs#L996-L1032","documentation":"The in-memory portion of the hybrid log (LogTotalSizeBytes = 1 << MemorySizeBits) must be either exactly 1 (MemorySizeBits = 0, meaning an unbounded/disk-only log) or at least one page size. Any other value below PageSize cannot hold even one page buffer, so the allocator rejects it. This guards against misconfigured memory limits.","triggerScenarios":"Setting LogSettings.MemorySizeBits to a small non-zero value such that 1 << MemorySizeBits < 1 << PageSizeBits, e.g. MemorySizeBits=20 with PageSizeBits=25.","commonSituations":"Trying to minimize memory footprint on small devices; container/CI environments with limited RAM where users shrink MemorySizeBits below the page size.","solutions":["Increase LogSettings.MemorySizeBits so it is >= LogSettings.PageSizeBits.","Set MemorySizeBits = 0 if you want an unbounded log backed entirely by the log device (use Epically-sized setups / on-disk only).","Reduce PageSizeBits first, then choose MemorySizeBits >= PageSizeBits."],"exampleFix":"// before\nvar settings = new LogSettings {\n  LogDevice = Devices.CreateLogDevice(\"./faster.log\"),\n  PageSizeBits = 24, // 16MB pages\n  MemorySizeBits = 20 // 1MB - below one page\n};\n\n// after\nvar settings = new LogSettings {\n  LogDevice = Devices.CreateLogDevice(\"./faster.log\"),\n  PageSizeBits = 24,\n  MemorySizeBits = 24 // at least one page (or 0 for unbounded)\n};","handlingStrategy":"validation","validationCode":"if (settings.MemorySizeBits != 0 && (1L << settings.MemorySizeBits) < (1L << settings.PageSizeBits))\n    throw new ArgumentException(\"MemorySizeBits must be 0 or >= PageSizeBits\");","typeGuard":"bool MemorySizeValid(LogSettings s) => s.MemorySizeBits == 0 || (1L << s.MemorySizeBits) >= (1L << s.PageSizeBits);","tryCatchPattern":"try { var fht = new FasterKV<K, V>(size, settings); }\ncatch (FasterException ex) when (ex.Message.Contains(\"Memory size\")) { /* raise MemorySizeBits or set to 0 */ }","preventionTips":["Set MemorySizeBits >= PageSizeBits, or 0 for unbounded/disk-only logs.","Account for container memory limits when sizing the in-memory log.","Validate PageSizeBits <= MemorySizeBits in your settings builder."],"tags":["csharp","configuration","faster","memory-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"}