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) }