microsoft/garnet · error · TsavoriteException
{nameof(rcs.PageCount)} or {nameof(rcs.MemorySize)} must be
Error message
{nameof(rcs.PageCount)} or {nameof(rcs.MemorySize)} must be specified What it means
Constructor validation for the optional read cache: when logSettings.ReadCacheSettings is non-null, you must size it by setting at least one of rcs.PageCount or rcs.MemorySize (both default to 0). The read cache needs a resident page budget just like the main log.
Source
Thrown at libs/storage/Tsavorite/cs/src/core/Allocator/AllocatorBase.cs:567
if (logSettings.PageSizeBits < LogSettings.kMinPageSizeBits || logSettings.PageSizeBits > LogSettings.kMaxPageSizeBits)
throw new TsavoriteException($"{nameof(logSettings.PageSizeBits)} must be between {LogSettings.kMinPageSizeBits} and {LogSettings.kMaxPageSizeBits}");
if (logSettings.PageSizeBits < PageHeader.SizeBits)
throw new TsavoriteException($"{nameof(logSettings.PageSizeBits)} must be >= PageHeader.SizeBits {PageHeader.SizeBits}");
if (logSettings.PageCount > MemoryUtils.ArrayMaxLength)
throw new TsavoriteException($"{nameof(logSettings.PageCount)} must be less than or equal to the maximum array length ({MemoryUtils.ArrayMaxLength})");
if (logSettings.SegmentSizeBits < LogSettings.kMinMainLogSegmentSizeBits || logSettings.SegmentSizeBits > LogSettings.kMaxSegmentSizeBits)
throw new TsavoriteException($"{nameof(logSettings.SegmentSizeBits)} must be between {LogSettings.kMinMainLogSegmentSizeBits} and {LogSettings.kMaxSegmentSizeBits}");
if (logSettings.MemorySize != 0 && (logSettings.MemorySize < 1L << LogSettings.kMinMemorySizeBits || logSettings.MemorySize > 1L << LogSettings.kMaxMemorySizeBits))
throw new TsavoriteException($"{nameof(logSettings.MemorySize)} must be between {1L << LogSettings.kMinMemorySizeBits} and {1L << LogSettings.kMaxMemorySizeBits}, or may be 0 for ReadOnly TsavoriteLog");
if ((logSettings.MemorySize != 0) && (logSettings.MemorySize < (1L << logSettings.PageSizeBits) * LogSettings.kMinPageCount))
throw new TsavoriteException($"{nameof(logSettings.MemorySize)} must be at least {LogSettings.kMinPageCount}x the page size ({1L << logSettings.PageSizeBits})");
if (logSettings.MutableFraction < 0.0 || logSettings.MutableFraction > 1.0)
throw new TsavoriteException($"{nameof(logSettings.MutableFraction)} must be >= 0.0 and <= 1.0");
if (logSettings.ReadCacheSettings is not null)
{
var rcs = logSettings.ReadCacheSettings;
if (rcs.PageCount == 0 && rcs.MemorySize == 0)
throw new TsavoriteException($"{nameof(rcs.PageCount)} or {nameof(rcs.MemorySize)} must be specified");
if (rcs.PageSizeBits < LogSettings.kMinPageSizeBits || rcs.PageSizeBits > LogSettings.kMaxPageSizeBits)
throw new TsavoriteException($"{nameof(rcs.PageSizeBits)} must be between {LogSettings.kMinPageSizeBits} and {LogSettings.kMaxPageSizeBits}");
if (rcs.PageCount > MemoryUtils.ArrayMaxLength)
throw new TsavoriteException($"{nameof(rcs.PageCount)} must be less than or equal to the maximum array length ({MemoryUtils.ArrayMaxLength})");
if (rcs.MemorySize != 0 && (rcs.MemorySize < 1L << LogSettings.kMinMemorySizeBits || rcs.MemorySize > 1L << LogSettings.kMaxMemorySizeBits))
throw new TsavoriteException($"{nameof(rcs.MemorySize)} must be between {1L << LogSettings.kMinMemorySizeBits} and {1L << LogSettings.kMaxMemorySizeBits}");
if ((rcs.MemorySize != 0) && (rcs.MemorySize < (1L << rcs.PageSizeBits) * 2))
throw new TsavoriteException($"{nameof(logSettings.MemorySize)} must be at least twice the page size ({1L << rcs.PageSizeBits})");
if (rcs.SecondChanceFraction < 0.0 || rcs.SecondChanceFraction > 1.0)
throw new TsavoriteException($"{rcs.SecondChanceFraction} must be >= 0.0 and <= 1.0");
}
if (logSettings.MaxInlineKeySize < LogSettings.MinMaxInlineSize || logSettings.MaxInlineKeySize > LogSettings.MaxInlineKeySizeLimit)
throw new TsavoriteException($"{nameof(logSettings.MaxInlineKeySize)} must be between {LogSettings.MinMaxInlineSize} and {LogSettings.MaxInlineKeySizeLimit}");
if (logSettings.MaxInlineValueSize < LogSettings.MinMaxInlineSize || logSettings.MaxInlineValueSize > LogSettings.MaxInlineValueSizeLimit)
throw new TsavoriteException($"{nameof(logSettings.MaxInlineValueSize)} must be between {LogSettings.MinMaxInlineSize} and {LogSettings.MaxInlineValueSizeLimit}");
this.logger = logger;View on GitHub (pinned to 951b0fc683)
Solutions
- Set rcs.MemorySize to a positive value (e.g. 64MiB), or
- Set rcs.PageCount to a positive number of pages.
- If you did not intend a read cache, leave ReadCacheSettings = null.
Example fix
// before
logSettings.ReadCacheSettings = new ReadCacheSettings(); // both size fields 0
// after
logSettings.ReadCacheSettings = new ReadCacheSettings { MemorySize = 1L << 26 }; // 64MiB Defensive patterns
Strategy: validation
Validate before calling
if (logSettings.ReadCacheSettings is { } rcs && rcs.PageCount == 0 && rcs.MemorySize == 0)
throw new ArgumentException("ReadCacheSettings enabled but PageCount and MemorySize are both 0; set one."); Try / catch
try { new TsavoriteKV<K,V>(logSettings, ...); }
catch (TsavoriteException ex) when (ex.Message.Contains("rcs.PageCount") && ex.Message.Contains("must be specified"))
{ /* size the read cache via MemorySize or PageCount, then recreate */ } Prevention
- When enabling ReadCacheSettings, always set MemorySize (e.g. 64MiB) or PageCount.
- Leave ReadCacheSettings=null if you do not need a read cache.
- Centralize read-cache config so sizing is never omitted.
When it happens
Trigger: Enabling the read cache via `logSettings.ReadCacheSettings = new ReadCacheSettings()` and leaving both PageCount and MemorySize at their defaults (0).
Common situations: Turning on ReadCacheSettings to improve read hit rate but forgetting to size it; copying an example that omitted sizing fields.
Related errors
- {nameof(rcs.PageSizeBits)} must be between {LogSettings.kMin
- {nameof(rcs.PageCount)} must be less than or equal to the ma
- {nameof(rcs.MemorySize)} must be between {1L << LogSettings.
- {nameof(logSettings.MemorySize)} must be at least twice the
- {rcs.SecondChanceFraction} must be >= 0.0 and <= 1.0
AI-assisted analysis of microsoft/garnet@951b0fc683 (2026-08-13).
Data as JSON: /api/errors/a0921d1f4ae33161.
Report an issue: GitHub.