microsoft/FASTER · error · FasterException

Memory size ( ) must be configured to be either 1 (i.e., 0…

Error message

Memory size ({LogTotalSizeBytes}) must be configured to be either 1 (i.e., 0 bits) or at least page size ({PageSize})

What it means

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.

Solutions

  1. Increase LogSettings.MemorySizeBits so it is >= LogSettings.PageSizeBits.
  2. Set MemorySizeBits = 0 if you want an unbounded log backed entirely by the log device (use Epically-sized setups / on-disk only).
  3. Reduce PageSizeBits first, then choose MemorySizeBits >= PageSizeBits.

Example fix

// before
var settings = new LogSettings {
  LogDevice = Devices.CreateLogDevice("./faster.log"),
  PageSizeBits = 24, // 16MB pages
  MemorySizeBits = 20 // 1MB - below one page
};

// after
var settings = new LogSettings {
  LogDevice = Devices.CreateLogDevice("./faster.log"),
  PageSizeBits = 24,
  MemorySizeBits = 24 // at least one page (or 0 for unbounded)
};
Defensive patterns

Strategy: validation

Validate before calling

if (settings.MemorySizeBits != 0 && (1L << settings.MemorySizeBits) < (1L << settings.PageSizeBits))
    throw new ArgumentException("MemorySizeBits must be 0 or >= PageSizeBits");

Type guard

bool MemorySizeValid(LogSettings s) => s.MemorySizeBits == 0 || (1L << s.MemorySizeBits) >= (1L << s.PageSizeBits);

Try / catch

try { var fht = new FasterKV<K, V>(size, settings); }
catch (FasterException ex) when (ex.Message.Contains("Memory size")) { /* raise MemorySizeBits or set to 0 */ }

Prevention

When it happens

Trigger: Setting LogSettings.MemorySizeBits to a small non-zero value such that 1 << MemorySizeBits < 1 << PageSizeBits, e.g. MemorySizeBits=20 with PageSizeBits=25.

Common situations: Trying to minimize memory footprint on small devices; container/CI environments with limited RAM where users shrink MemorySizeBits below the page size.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of microsoft/FASTER@321d872eab (2026-09-15). Data as JSON: /api/errors/41a41471ee6017d8. Report an issue: GitHub.

Appendix: source

Thrown at cs/src/core/Allocator/AllocatorBase.cs:1014

            LogTotalSizeBits = settings.MemorySizeBits;
            LogTotalSizeBytes = 1L << LogTotalSizeBits;
            BufferSize = (int)(LogTotalSizeBytes / (1L << LogPageSizeBits));
            BufferSizeMask = BufferSize - 1;

            LogMutableFraction = settings.MutableFraction;

            EmptyPageCount = 0;

            // Segment size
            LogSegmentSizeBits = settings.SegmentSizeBits;
            SegmentSize = 1L << LogSegmentSizeBits;
            SegmentBufferSize = 1 + (LogTotalSizeBytes / SegmentSize < 1 ? 1 : (int)(LogTotalSizeBytes / SegmentSize));

            if (SegmentSize < PageSize)
                throw new FasterException($"Segment ({SegmentSize}) must be at least of page size ({PageSize})");

            if ((LogTotalSizeBits != 0) && (LogTotalSizeBytes < PageSize))
                throw new FasterException($"Memory size ({LogTotalSizeBytes}) must be configured to be either 1 (i.e., 0 bits) or at least page size ({PageSize})");

            PageStatusIndicator = new FullPageStatus[BufferSize];

            if (!IsNullDevice)
            {
                PendingFlush = new PendingFlushList[BufferSize];
                for (int i = 0; i < BufferSize; i++)
                    PendingFlush[i] = new PendingFlushList();
            }
            device = settings.LogDevice;
            sectorSize = (int)device.SectorSize;

            if (PageSize < sectorSize)
                throw new FasterException($"Page size must be at least of device sector size ({sectorSize} bytes). Set PageSizeBits accordingly.");

            AlignedPageSizeBytes = (PageSize + (sectorSize - 1)) & ~(sectorSize - 1);
        }

View on GitHub (pinned to 321d872eab)