for {
select {
...
case rd := <-rc.node.Ready():
rc.wal.Save(rd.HardState, rd.Entries) # 1
if !raft.IsEmptySnap(rd.Snapshot) {
// loop where we're trying to get a snapshot
for {
if err := rc.downloadSnapshotFromSideChannel(rd.Snapshot); err == nil { # 2
break
}
}
rc.saveSnap(rd.Snapshot) # 3
rc.raftStorage.ApplySnapshot(rd.Snapshot)
rc.publishSnapshot(rd.Snapshot)
}
rc.raftStorage.Append(rd.Entries)
rc.transport.Send(rd.Messages)
if ok := rc.publishEntries(rc.entriesToApply(rd.CommittedEntries)); !ok {
rc.stop()
return
}
rc.maybeTriggerSnapshot()
rc.node.Advance()
}
}