mirror of https://github.com/poanetwork/quorum.git
61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package raft
|
|
|
|
import (
|
|
"os"
|
|
|
|
"github.com/coreos/etcd/raft/raftpb"
|
|
"github.com/coreos/etcd/wal"
|
|
"github.com/coreos/etcd/wal/walpb"
|
|
"github.com/ethereum/go-ethereum/logger"
|
|
"github.com/ethereum/go-ethereum/logger/glog"
|
|
)
|
|
|
|
func (pm *ProtocolManager) openWAL(maybeSnapshot *raftpb.Snapshot) *wal.WAL {
|
|
if !wal.Exist(pm.waldir) {
|
|
if err := os.Mkdir(pm.waldir, 0750); err != nil {
|
|
glog.Fatalf("cannot create waldir (%v)", err)
|
|
}
|
|
|
|
wal, err := wal.Create(pm.waldir, nil)
|
|
if err != nil {
|
|
glog.Fatalf("failed to create waldir (%v)", err)
|
|
}
|
|
wal.Close()
|
|
}
|
|
|
|
walsnap := walpb.Snapshot{}
|
|
if maybeSnapshot != nil {
|
|
walsnap.Index = maybeSnapshot.Metadata.Index
|
|
walsnap.Term = maybeSnapshot.Metadata.Term
|
|
}
|
|
|
|
glog.V(logger.Info).Infof("loading WAL at term %d and index %d", walsnap.Term, walsnap.Index)
|
|
|
|
wal, err := wal.Open(pm.waldir, walsnap)
|
|
if err != nil {
|
|
glog.Fatalf("error loading WAL (%v)", err)
|
|
}
|
|
|
|
return wal
|
|
}
|
|
|
|
func (pm *ProtocolManager) replayWAL() *wal.WAL {
|
|
glog.V(logger.Info).Infoln("replaying WAL")
|
|
maybeSnapshot := pm.loadSnapshot()
|
|
wal := pm.openWAL(maybeSnapshot)
|
|
|
|
_, hardState, entries, err := wal.ReadAll()
|
|
if err != nil {
|
|
glog.Fatalf("failed to read WAL (%v)", err)
|
|
}
|
|
|
|
if maybeSnapshot != nil {
|
|
pm.applySnapshot(*maybeSnapshot)
|
|
}
|
|
|
|
pm.raftStorage.SetHardState(hardState)
|
|
pm.raftStorage.Append(entries)
|
|
|
|
return wal
|
|
}
|