forked from Consensys/quorum
-
Notifications
You must be signed in to change notification settings - Fork 1
/
wal.go
60 lines (47 loc) · 1.34 KB
/
wal.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
}