// writeInitialState bootstraps a new Raft group (i.e. it is called when we // bootstrap a Range, or when setting up the right hand side of a split). // Its main task is to persist a consistent Raft (and associated Replica) state // which does not start from zero but presupposes a few entries already having // applied. // The supplied MVCCStats are used for the Stats field after adjusting for // persisting the state itself, and the updated stats are returned. func writeInitialState( ctx context.Context, eng engine.ReadWriter, ms enginepb.MVCCStats, desc roachpb.RangeDescriptor, oldHS raftpb.HardState, lease *roachpb.Lease, ) (enginepb.MVCCStats, error) { var s storagebase.ReplicaState s.TruncatedState = &roachpb.RaftTruncatedState{ Term: raftInitialLogTerm, Index: raftInitialLogIndex, } s.RaftAppliedIndex = s.TruncatedState.Index s.Desc = &roachpb.RangeDescriptor{ RangeID: desc.RangeID, } s.Frozen = storagebase.ReplicaState_UNFROZEN s.Stats = ms s.Lease = lease if existingLease, err := loadLease(ctx, eng, desc.RangeID); err != nil { return enginepb.MVCCStats{}, errors.Wrap(err, "error reading lease") } else if (existingLease != roachpb.Lease{}) { log.Fatalf(ctx, "expected trivial lease, but found %+v", existingLease) } newMS, err := saveState(ctx, eng, s) if err != nil { return enginepb.MVCCStats{}, err } if err := synthesizeHardState(ctx, eng, s, oldHS); err != nil { return enginepb.MVCCStats{}, err } if err := setLastIndex(ctx, eng, desc.RangeID, s.TruncatedState.Index); err != nil { return enginepb.MVCCStats{}, err } return newMS, nil }