shut down a Raft server but save its persistent state.
(i int)
| 103 | |
| 104 | // shut down a Raft server but save its persistent state. |
| 105 | func (cfg *config) crash1(i int) { |
| 106 | cfg.disconnect(i) |
| 107 | cfg.net.DeleteServer(i) // disable client connections to the server. |
| 108 | |
| 109 | cfg.mu.Lock() |
| 110 | defer cfg.mu.Unlock() |
| 111 | |
| 112 | // a fresh persister, in case old instance |
| 113 | // continues to update the Persister. |
| 114 | // but copy old persister's content so that we always |
| 115 | // pass Make() the last persisted state. |
| 116 | if cfg.saved[i] != nil { |
| 117 | cfg.saved[i] = cfg.saved[i].Copy() |
| 118 | } |
| 119 | |
| 120 | rf := cfg.rafts[i] |
| 121 | if rf != nil { |
| 122 | cfg.mu.Unlock() |
| 123 | rf.Kill() |
| 124 | cfg.mu.Lock() |
| 125 | cfg.rafts[i] = nil |
| 126 | } |
| 127 | |
| 128 | if cfg.saved[i] != nil { |
| 129 | raftlog := cfg.saved[i].ReadRaftState() |
| 130 | snapshot := cfg.saved[i].ReadSnapshot() |
| 131 | cfg.saved[i] = &Persister{} |
| 132 | cfg.saved[i].SaveStateAndSnapshot(raftlog, snapshot) |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | func (cfg *config) checkLogs(i int, m ApplyMsg) (string, bool) { |
| 137 | err_msg := "" |