microsoft/garnet · error · Exception

Revivification cannot specify RevivifiableFraction without s

Error message

Revivification cannot specify RevivifiableFraction without specifying bins.

What it means

Generic Exception thrown during Options.Initialize revivification validation when RevivifiableFraction is changed from its default (DefaultRevivifiableFraction) but no bin scheme is configured (RevivBinRecordSizes is empty AND EnableRevivification is false). RevivifiableFraction controls what fraction of deleted records are eligible for revivification, which only has meaning when revivification bins exist.

Source

Thrown at libs/host/Configuration/Options.cs:819

            if (hasRecordCounts)
            {
                if (useRevivBinsPowerOf2)
                    throw new Exception("Revivification cannot specify both record counts and powerof2 bins.");
                if (!hasRecordSizes)
                    throw new Exception("Revivification bin counts require bin sizes.");
                useRevivBinsPowerOf2 = false;
            }
            if (RevivBinBestFitScanLimit != 0)
            {
                if (!hasRecordSizes && !enableRevivification)
                    throw new Exception("Revivification cannot specify best fit scan limit without specifying bins.");
                if (RevivBinBestFitScanLimit < 0)
                    throw new Exception("RevivBinBestFitScanLimit must be >= 0.");
            }
            if (RevivifiableFraction != RevivificationSettings.DefaultRevivifiableFraction)
            {
                if (!hasRecordSizes && !enableRevivification)
                    throw new Exception("Revivification cannot specify RevivifiableFraction without specifying bins.");
            }

            // Warn users who explicitly opt into Scan compaction about the memory-spike cost.
            // Scan builds a temporary parallel KV index proportional to the keyspace; Lookup is the recommended alternative.
            if (CompactionType == LogCompactionType.Scan)
            {
                logger?.LogWarning("Compaction type Scan builds a temporary parallel KV index proportional to the keyspace, causing significant transient memory use. Use Lookup instead unless you have a specific reason for Scan.");
            }

            if (SlowLogThreshold > 0)
            {
                if (SlowLogThreshold < 100)
                    throw new Exception("SlowLogThreshold must be at least 100 microseconds.");
            }


            if (!EnableAOF.GetValueOrDefault())
            {

View on GitHub (pinned to 951b0fc683)

Solutions

  1. If revivification is off, reset RevivifiableFraction to RevivificationSettings.DefaultRevivifiableFraction.
  2. If you want a custom fraction, enable revivification (EnableRevivification=true) or provide explicit RevivBinRecordSizes.

Example fix

// before
options.EnableRevivification = false;
options.RevivifiableFraction = 0.5;

// after
options.EnableRevivification = false;
options.RevivifiableFraction = RevivificationSettings.DefaultRevivifiableFraction;
Defensive patterns

Strategy: validation

Validate before calling

void ValidateFractionHasBins(double fraction, int[] sizes, bool enableReviv)
{
    if (fraction != RevivificationSettings.DefaultRevivifiableFraction && (sizes == null || sizes.Length == 0) && !enableReviv)
        throw new InvalidOperationException("RevivifiableFraction requires a bin scheme (sizes or EnableRevivification).");
}

Try / catch

try
{
    options.Initialize(logger);
}
catch (Exception ex) when (ex.Message.Contains("RevivifiableFraction"))
{
    logger.LogError("Revivification: RevivifiableFraction set but no bins configured.");
    throw;
}

Prevention

When it happens

Trigger: Setting RevivifiableFraction to a non-default value while revivification is effectively off (no explicit sizes and EnableRevivification false). Happens when revivification was disabled but the fraction setting was left customized.

Common situations: Disabling revivification without resetting RevivifiableFraction to its default; config overlay that customizes the fraction but also turns revivification off.

Related errors


AI-assisted analysis of microsoft/garnet@951b0fc683 (2026-08-13). Data as JSON: /api/errors/452ac41294efbd05. Report an issue: GitHub.