71 lines
1.4 KiB
Go
71 lines
1.4 KiB
Go
package raft
|
|
|
|
//
|
|
// support for Raft and kvraft to save persistent
|
|
// Raft state (log &c) and k/v server snapshots.
|
|
//
|
|
// we will use the original persister.go to test your code for grading.
|
|
// so, while you can modify this code to help you debug, please
|
|
// test with the original before submitting.
|
|
//
|
|
|
|
import "sync"
|
|
|
|
type Persister struct {
|
|
mu sync.Mutex
|
|
raftstate []byte
|
|
snapshot []byte
|
|
}
|
|
|
|
func MakePersister() *Persister {
|
|
return &Persister{}
|
|
}
|
|
|
|
func clone(orig []byte) []byte {
|
|
x := make([]byte, len(orig))
|
|
copy(x, orig)
|
|
return x
|
|
}
|
|
|
|
func (ps *Persister) Copy() *Persister {
|
|
ps.mu.Lock()
|
|
defer ps.mu.Unlock()
|
|
np := MakePersister()
|
|
np.raftstate = ps.raftstate
|
|
np.snapshot = ps.snapshot
|
|
return np
|
|
}
|
|
|
|
func (ps *Persister) ReadRaftState() []byte {
|
|
ps.mu.Lock()
|
|
defer ps.mu.Unlock()
|
|
return clone(ps.raftstate)
|
|
}
|
|
|
|
func (ps *Persister) RaftStateSize() int {
|
|
ps.mu.Lock()
|
|
defer ps.mu.Unlock()
|
|
return len(ps.raftstate)
|
|
}
|
|
|
|
// Save both Raft state and K/V snapshot as a single atomic action,
|
|
// to help avoid them getting out of sync.
|
|
func (ps *Persister) Save(raftstate []byte, snapshot []byte) {
|
|
ps.mu.Lock()
|
|
defer ps.mu.Unlock()
|
|
ps.raftstate = clone(raftstate)
|
|
ps.snapshot = clone(snapshot)
|
|
}
|
|
|
|
func (ps *Persister) ReadSnapshot() []byte {
|
|
ps.mu.Lock()
|
|
defer ps.mu.Unlock()
|
|
return clone(ps.snapshot)
|
|
}
|
|
|
|
func (ps *Persister) SnapshotSize() int {
|
|
ps.mu.Lock()
|
|
defer ps.mu.Unlock()
|
|
return len(ps.snapshot)
|
|
}
|