Browse Source

Remove raft.loadEnts and the ents parameter to raft.RestartNode.

The initial entries are now provided via the Storage interface.
Ben Darnell 11 years ago
parent
commit
54b07d7974
7 changed files with 21 additions and 32 deletions
  1. 2 1
      etcdserver/force_cluster.go
  2. 2 1
      etcdserver/server.go
  3. 0 11
      raft/log.go
  4. 1 4
      raft/node.go
  5. 1 1
      raft/node_test.go
  6. 0 4
      raft/raft.go
  7. 15 10
      raft/raft_paper_test.go

+ 2 - 1
etcdserver/force_cluster.go

@@ -54,7 +54,8 @@ func restartAsStandaloneNode(cfg *ServerConfig, index uint64, snapshot *raftpb.S
 
 	log.Printf("etcdserver: forcing restart of member %s in cluster %s at commit index %d", id, cfg.Cluster.ID(), st.Commit)
 	s := raft.NewMemoryStorage()
-	n := raft.RestartNode(uint64(id), 10, 1, snapshot, st, ents, s)
+	s.Append(ents)
+	n := raft.RestartNode(uint64(id), 10, 1, snapshot, st, s)
 	return id, n, s, w
 }
 

+ 2 - 1
etcdserver/server.go

@@ -773,7 +773,8 @@ func restartNode(cfg *ServerConfig, index uint64, snapshot *raftpb.Snapshot) (ty
 
 	log.Printf("etcdserver: restart member %s in cluster %s at commit index %d", id, cfg.Cluster.ID(), st.Commit)
 	s := raft.NewMemoryStorage()
-	n := raft.RestartNode(uint64(id), 10, 1, snapshot, st, ents, s)
+	s.Append(ents)
+	n := raft.RestartNode(uint64(id), 10, 1, snapshot, st, s)
 	return id, n, s, w
 }
 

+ 0 - 11
raft/log.go

@@ -64,17 +64,6 @@ func newLog(storage Storage) *raftLog {
 	return log
 }
 
-func (l *raftLog) load(ents []pb.Entry) {
-	// TODO(bdarnell): does this method need to support other Storage impls or does it go away?
-	ms := l.storage.(*MemoryStorage)
-	if ms.offset != ents[0].Index {
-		panic("entries loaded don't match offset index")
-	}
-	ms.ents = ents
-	l.unstable = ms.offset + uint64(len(ents))
-	l.unstableEnts = nil
-}
-
 func (l *raftLog) String() string {
 	return fmt.Sprintf("unstable=%d committed=%d applied=%d", l.unstable, l.committed, l.applied)
 

+ 1 - 4
raft/node.go

@@ -168,7 +168,7 @@ func StartNode(id uint64, peers []Peer, election, heartbeat int, storage Storage
 // log.
 // TODO(bdarnell): remove args that are unnecessary with storage.
 // Maybe this function goes away and is replaced by StartNode with a non-empty Storage.
-func RestartNode(id uint64, election, heartbeat int, snapshot *pb.Snapshot, st pb.HardState, ents []pb.Entry, storage Storage) Node {
+func RestartNode(id uint64, election, heartbeat int, snapshot *pb.Snapshot, st pb.HardState, storage Storage) Node {
 	n := newNode()
 	r := newRaft(id, nil, election, heartbeat, storage)
 	if snapshot != nil {
@@ -177,9 +177,6 @@ func RestartNode(id uint64, election, heartbeat int, snapshot *pb.Snapshot, st p
 	if !isHardStateEqual(st, emptyState) {
 		r.loadState(st)
 	}
-	if len(ents) != 0 {
-		r.loadEnts(ents)
-	}
 	go n.run(r)
 	return &n
 }

+ 1 - 1
raft/node_test.go

@@ -233,7 +233,7 @@ func TestNodeRestart(t *testing.T) {
 
 	storage := NewMemoryStorage()
 	storage.Append(entries)
-	n := RestartNode(1, 10, 1, nil, st, nil, storage)
+	n := RestartNode(1, 10, 1, nil, st, storage)
 	if g := <-n.Ready(); !reflect.DeepEqual(g, want) {
 		t.Errorf("g = %+v,\n             w   %+v", g, want)
 	} else {

+ 0 - 4
raft/raft.go

@@ -549,10 +549,6 @@ func (r *raft) promotable() bool {
 	return ok
 }
 
-func (r *raft) loadEnts(ents []pb.Entry) {
-	r.raftLog.load(ents)
-}
-
 func (r *raft) loadState(state pb.HardState) {
 	r.raftLog.committed = state.Commit
 	r.Term = state.Term

+ 15 - 10
raft/raft_paper_test.go

@@ -605,8 +605,9 @@ func TestFollowerCheckMsgApp(t *testing.T) {
 		{3, 3, true},
 	}
 	for i, tt := range tests {
-		r := newRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage())
-		r.loadEnts(ents)
+		storage := NewMemoryStorage()
+		storage.Append(ents)
+		r := newRaft(1, []uint64{1, 2, 3}, 10, 1, storage)
 		r.loadState(pb.HardState{Commit: 2})
 		r.becomeFollower(2, 2)
 
@@ -729,11 +730,13 @@ func TestLeaderSyncFollowerLog(t *testing.T) {
 		},
 	}
 	for i, tt := range tests {
-		lead := newRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage())
-		lead.loadEnts(ents)
+		leadStorage := NewMemoryStorage()
+		leadStorage.Append(ents)
+		lead := newRaft(1, []uint64{1, 2, 3}, 10, 1, leadStorage)
 		lead.loadState(pb.HardState{Commit: lead.raftLog.lastIndex(), Term: term})
-		follower := newRaft(2, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage())
-		follower.loadEnts(tt)
+		followerStorage := NewMemoryStorage()
+		followerStorage.Append(tt)
+		follower := newRaft(2, []uint64{1, 2, 3}, 10, 1, followerStorage)
 		follower.loadState(pb.HardState{Term: term - 1})
 		// It is necessary to have a three-node cluster.
 		// The second may have more up-to-date log than the first one, so the
@@ -823,8 +826,9 @@ func TestVoter(t *testing.T) {
 		{[]pb.Entry{{}, {Term: 2, Index: 1}, {Term: 1, Index: 2}}, 1, 1, true},
 	}
 	for i, tt := range tests {
-		r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
-		r.loadEnts(tt.ents)
+		storage := NewMemoryStorage()
+		storage.Append(tt.ents)
+		r := newRaft(1, []uint64{1, 2}, 10, 1, storage)
 
 		r.Step(pb.Message{From: 2, To: 1, Type: pb.MsgVote, Term: 3, LogTerm: tt.logterm, Index: tt.index})
 
@@ -858,8 +862,9 @@ func TestLeaderOnlyCommitsLogFromCurrentTerm(t *testing.T) {
 		{3, 3},
 	}
 	for i, tt := range tests {
-		r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
-		r.loadEnts(ents)
+		storage := NewMemoryStorage()
+		storage.Append(ents)
+		r := newRaft(1, []uint64{1, 2}, 10, 1, storage)
 		r.loadState(pb.HardState{Term: 2})
 		// become leader at term 3
 		r.becomeCandidate()