microsoft/FASTER · error · FasterException
Invalid checkpoint version
Error message
Invalid checkpoint version {cversion} encountered, current version is {CheckpointVersion}, cannot recover with this checkpoint What it means
While recovering object-store checkpoint info from a token-completed checkpoint file, the reader parses a checkpoint version and compares it to the code's CheckpointVersion. Only a direct match, or the special v4->v5 translation path, is accepted; anything else throws FasterException with the offending and expected versions. The checkpoint was written by an incompatible version of the library.
Solutions
- Use the same library version that wrote the checkpoint to perform recovery, then re-checkpoint and migrate.
- If migrating v4 checkpoints, use a version supporting the v4->v5 translation (CheckpointVersion 5).
- Checkpoints cannot be downgraded: export data via TakeFullCheckpoint + application-level export from the newer version instead.
- Inspect the checkpoint file's version line to confirm what wrote it before attempting recovery.
Example fix
// before: recovering a v4 checkpoint with a v6 binary faster.Recover(token); // FasterException: Invalid checkpoint version 4 ... current is 6 // after: recover with a v5-capable binary (supports 4->5 translation) or matching version faster.Recover(token); // succeeds when CheckpointVersion == 5 with translateV4toV5
Defensive patterns
Strategy: validation
Validate before calling
// read the checkpoint version line and compare before recovering
var firstLine = File.ReadLines(infoFilePath).First();
int cversion = int.Parse(firstLine);
if (cversion != CheckpointVersion && !(cversion == 4 && CheckpointVersion == 5))
throw new InvalidOperationException($"Checkpoint version {cversion} incompatible with runtime version {CheckpointVersion}"); Try / catch
try { faster.Recover(token); } catch (FasterException ex) when (ex.Message.StartsWith("Invalid checkpoint version")) { // recover with a binary of the writing version or migrate checkpoints separately } Prevention
- Pin the library version across all services sharing checkpoints.
- Re-checkpoint after upgrading so new checkpoints use the current version.
- Test version-skew recovery in staging before upgrades.
When it happens
Trigger: Calling Recover (object checkpoint) on a checkpoint whose first line version cversion != CheckpointVersion and where translateV4toV5 (cversion==4, current==5) does not apply.
Common situations: Upgrading or downgrading the FasterLog/FASTER library and then recovering an old checkpoint; restoring checkpoints produced by a fork or different build; opening checkpoints from a newer library with an older binary.
Understand the failure class
Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.
Related errors
- Invalid version
- Unable to set first valid segment to
- Unable to set last valid segment to
- Invalid version found during commit recovery
- Invalid checksum for checkpoint
AI-assisted analysis of microsoft/FASTER@321d872eab (2026-09-15).
Data as JSON: /api/errors/5b8c7c499999d14e.
Report an issue: GitHub.
Appendix: source
Thrown at cs/src/core/Index/Common/Contexts.cs:449
objectLogSegmentOffsets = null;
}
/// <summary>
/// Initialize from stream
/// </summary>
/// <param name="reader"></param>
public void Initialize(StreamReader reader)
{
continueTokens = new();
string value = reader.ReadLine();
var cversion = int.Parse(value);
bool translateV4toV5 = (cversion == 4 && CheckpointVersion == 5);
if (cversion != CheckpointVersion && !translateV4toV5)
throw new FasterException($"Invalid checkpoint version {cversion} encountered, current version is {CheckpointVersion}, cannot recover with this checkpoint");
value = reader.ReadLine();
var checksum = long.Parse(value);
value = reader.ReadLine();
guid = Guid.Parse(value);
value = reader.ReadLine();
useSnapshotFile = int.Parse(value);
value = reader.ReadLine();
version = long.Parse(value);
value = reader.ReadLine();
nextVersion = long.Parse(value);
value = reader.ReadLine();
flushedLogicalAddress = long.Parse(value);View on GitHub (pinned to 321d872eab)