Merge pull request #1478 from unihorn/190

etcdserver: panic on storage error
release-2.0
Yicheng Qin 2014-11-03 11:07:55 -08:00
commit 5da481213e
4 changed files with 29 additions and 18 deletions

View File

@ -88,9 +88,9 @@ type Response struct {
type Storage interface {
// Save function saves ents and state to the underlying stable storage.
// Save MUST block until st and ents are on stable storage.
Save(st raftpb.HardState, ents []raftpb.Entry)
Save(st raftpb.HardState, ents []raftpb.Entry) error
// SaveSnap function saves snapshot to the underlying stable storage.
SaveSnap(snap raftpb.Snapshot)
SaveSnap(snap raftpb.Snapshot) error
// TODO: WAL should be able to control cut itself. After implement self-controled cut,
// remove it in this interface.
@ -314,8 +314,12 @@ func (s *EtcdServer) run() {
}
}
s.storage.Save(rd.HardState, rd.Entries)
s.storage.SaveSnap(rd.Snapshot)
if err := s.storage.Save(rd.HardState, rd.Entries); err != nil {
log.Panicf("etcdserver: save state and entries error: %v", err)
}
if err := s.storage.SaveSnap(rd.Snapshot); err != nil {
log.Panicf("etcdserver: create snapshot error: %v", err)
}
s.send(rd.Messages)
// TODO(bmizerany): do this in the background, but take
@ -671,7 +675,9 @@ func (s *EtcdServer) snapshot(snapi uint64, snapnodes []uint64) {
panic("TODO: this is bad, what do we do about it?")
}
s.node.Compact(snapi, snapnodes, d)
s.storage.Cut()
if err := s.storage.Cut(); err != nil {
log.Panicf("etcdserver: rotate wal file error: %v", err)
}
}
func GetClusterFromPeers(urls []string) (*Cluster, error) {

View File

@ -1222,18 +1222,19 @@ type storageRecorder struct {
recorder
}
func (p *storageRecorder) Save(st raftpb.HardState, ents []raftpb.Entry) {
func (p *storageRecorder) Save(st raftpb.HardState, ents []raftpb.Entry) error {
p.record(action{name: "Save"})
return nil
}
func (p *storageRecorder) Cut() error {
p.record(action{name: "Cut"})
return nil
}
func (p *storageRecorder) SaveSnap(st raftpb.Snapshot) {
if raft.IsEmptySnap(st) {
return
func (p *storageRecorder) SaveSnap(st raftpb.Snapshot) error {
if !raft.IsEmptySnap(st) {
p.record(action{name: "SaveSnap"})
}
p.record(action{name: "SaveSnap"})
return nil
}
type readyNode struct {

View File

@ -52,11 +52,11 @@ func New(dir string) *Snapshotter {
}
}
func (s *Snapshotter) SaveSnap(snapshot raftpb.Snapshot) {
func (s *Snapshotter) SaveSnap(snapshot raftpb.Snapshot) error {
if raft.IsEmptySnap(snapshot) {
return
return nil
}
s.save(&snapshot)
return s.save(&snapshot)
}
func (s *Snapshotter) save(snapshot *raftpb.Snapshot) error {

View File

@ -273,13 +273,17 @@ func (w *WAL) SaveState(s *raftpb.HardState) error {
return w.encoder.encode(rec)
}
func (w *WAL) Save(st raftpb.HardState, ents []raftpb.Entry) {
func (w *WAL) Save(st raftpb.HardState, ents []raftpb.Entry) error {
// TODO(xiangli): no more reference operator
w.SaveState(&st)
for i := range ents {
w.SaveEntry(&ents[i])
if err := w.SaveState(&st); err != nil {
return err
}
w.Sync()
for i := range ents {
if err := w.SaveEntry(&ents[i]); err != nil {
return err
}
}
return w.Sync()
}
func (w *WAL) saveCrc(prevCrc uint32) error {