microsoft/FASTER · error

Unexpected checkpoint status

Error message

Unexpected checkpoint status [%s] for COLD store [expected: %s]

What it means

At the start of the cold-store checkpoint step, cold_store_status must be REQUESTED (set when the checkpoint was initiated). Any other value means the checkpoint state machine is inconsistent — e.g., this checkpoint context was already consumed or was never properly requested.

Solutions

  1. Only invoke the cold-store checkpoint step once per Checkpoint() round, after hot-store finishes
  2. Do not call internal per-store checkpoint methods directly; use the top-level Checkpoint() API
  3. Verify phase is COLD_STORE_CHECKPOINT before the call (the assert fires otherwise)
  4. Reset instance state after a FAILED checkpoint before retrying

Example fix

// before
f2->CheckpointColdStore(ctx); // called twice per round
f2->CheckpointColdStore(ctx); // second call: status no longer REQUESTED
// after
f2->CheckpointColdStore(ctx); // once, per Checkpoint() invocation only
Defensive patterns

Strategy: validation

Validate before calling

if (!inside_checkpoint_round || cold_step_already_ran) { return Status::Aborted; }

Prevention

When it happens

Trigger: The cold-store checkpoint entry point (CheckpointColdStore-like API) invoked when cold_store_status is IDLE/ACTIVE/FINISHED — e.g., double invocation of the cold checkpoint, or invocation outside a COLD_STORE_CHECKPOINT phase (also asserted).

Common situations: Manually driving checkpoint stages out of order; calling the cold-store checkpoint step twice within one checkpoint round; a previous FAILED checkpoint leaving stale status.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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

Appendix: source

Thrown at cc/src/core/f2.h:759

                                                bool shift_begin_address, int n_threads, bool checkpoint) {
  const bool is_hot_store = (store_type == StoreType::HOT);

  uint64_t tail_address = store.hlog.GetTailAddress().control();
  log_debug("Compact %s: {%.2lf GB} {Goal %.2lf GB} [%lu %lu] -> [%lu %lu]",
            is_hot_store ? "HOT" : "COLD",
            static_cast<double>(store.Size()) / (1 << 30),
            static_cast<double>(tail_address - until_address) / (1 << 30),
            store.hlog.begin_address.control(), tail_address,
            until_address, tail_address);
  if (until_address > store.hlog.safe_read_only_address.control()) {
    throw std::invalid_argument{ "Can only compact until safe read-only region" };
  }

  StoreCheckpointStatus status;
  if (checkpoint) {
    assert(checkpoint_.phase.load() == CheckpointPhase::COLD_STORE_CHECKPOINT);
    if ((status = checkpoint_.cold_store_status.load()) != StoreCheckpointStatus::REQUESTED) {
      log_error("Unexpected checkpoint status [%s] for COLD store [expected: %s]",
                STORE_CHECKPOINT_STATUS_STR[static_cast<int>(status)],
                STORE_CHECKPOINT_STATUS_STR[static_cast<int>(StoreCheckpointStatus::REQUESTED)]);
      assert(false);
    }
    checkpoint_.cold_store_status.store(StoreCheckpointStatus::ACTIVE);
  }
  Guid token = checkpoint ? checkpoint_.token : Guid::Create();
  bool success = store.InternalCompactWithLookup(until_address, shift_begin_address,
                                                n_threads, is_hot_store, checkpoint, token);
  log_debug("Compact %s [success=%d]: {Goal %.2lf} {Actual %.2lf GB} Done!",
            is_hot_store ? "HOT": "COLD", success,
            static_cast<double>(tail_address - until_address) / (1 << 30),
            static_cast<double>(store.Size()) / (1 << 30));

  if (checkpoint) {
    assert(checkpoint_.phase.load() == CheckpointPhase::COLD_STORE_CHECKPOINT);
    if ((status = checkpoint_.cold_store_status.load()) != StoreCheckpointStatus::ACTIVE) {
      log_error("Unexpected checkpoint status [%s] for COLD store [expected: %s]",

View on GitHub (pinned to 321d872eab)