Browse Source

Merge pull request #4888 from xiang90/fix_raft

rafthttp: do not block on proposal
Xiang Li 9 years ago
parent
commit
75babb82b6
1 changed files with 14 additions and 2 deletions
  1. 14 2
      rafthttp/peer.go

+ 14 - 2
rafthttp/peer.go

@@ -140,11 +140,23 @@ func startPeer(transport *Transport, urls types.URLs, local, to, cid types.ID, r
 	go func() {
 	go func() {
 		for {
 		for {
 			select {
 			select {
-			case mm := <-p.propc:
+			case mm := <-p.recvc:
 				if err := r.Process(ctx, mm); err != nil {
 				if err := r.Process(ctx, mm); err != nil {
 					plog.Warningf("failed to process raft message (%v)", err)
 					plog.Warningf("failed to process raft message (%v)", err)
 				}
 				}
-			case mm := <-p.recvc:
+			case <-p.stopc:
+				return
+			}
+		}
+	}()
+
+	// r.Process might block for processing proposal when there is no leader.
+	// Thus propc must be put into a separate routine with recvc to avoid blocking
+	// processing other raft messages.
+	go func() {
+		for {
+			select {
+			case mm := <-p.propc:
 				if err := r.Process(ctx, mm); err != nil {
 				if err := r.Process(ctx, mm); err != nil {
 					plog.Warningf("failed to process raft message (%v)", err)
 					plog.Warningf("failed to process raft message (%v)", err)
 				}
 				}