github.com/bigzoro/my_simplechain@v0.0.0-20240315012955-8ad0a2a29bb9/consensus/raft/backend/wal.go (about) 1 package backend 2 3 import ( 4 "os" 5 6 "github.com/bigzoro/my_simplechain/consensus/raft" 7 "github.com/bigzoro/my_simplechain/log" 8 9 "github.com/coreos/etcd/raft/raftpb" 10 "github.com/coreos/etcd/wal" 11 "github.com/coreos/etcd/wal/walpb" 12 ) 13 14 func (pm *ProtocolManager) openWAL(maybeRaftSnapshot *raftpb.Snapshot) *wal.WAL { 15 if !wal.Exist(pm.waldir) { 16 if err := os.Mkdir(pm.waldir, 0750); err != nil { 17 raft.Fatalf("cannot create waldir: %s", err) 18 } 19 20 wal, err := wal.Create(pm.waldir, nil) 21 if err != nil { 22 raft.Fatalf("failed to create waldir: %s", err) 23 } 24 wal.Close() 25 } 26 27 walsnap := walpb.Snapshot{} 28 29 log.Info("loading WAL", "term", walsnap.Term, "index", walsnap.Index) 30 31 if maybeRaftSnapshot != nil { 32 walsnap.Index, walsnap.Term = maybeRaftSnapshot.Metadata.Index, maybeRaftSnapshot.Metadata.Term 33 } 34 35 wal, err := wal.Open(pm.waldir, walsnap) 36 if err != nil { 37 raft.Fatalf("error loading WAL: %s", err) 38 } 39 40 return wal 41 } 42 43 func (pm *ProtocolManager) replayWAL(maybeRaftSnapshot *raftpb.Snapshot) *wal.WAL { 44 log.Info("replaying WAL") 45 wal := pm.openWAL(maybeRaftSnapshot) 46 47 _, hardState, entries, err := wal.ReadAll() 48 if err != nil { 49 raft.Fatalf("failed to read WAL: %s", err) 50 } 51 52 pm.raftStorage.SetHardState(hardState) 53 pm.raftStorage.Append(entries) 54 55 return wal 56 }