Browse Source

etcdserver/etcdhttp: apply in single goroutine to avoid race

Blake Mizerany 11 years ago
parent
commit
665af71888
1 changed files with 11 additions and 9 deletions
  1. 11 9
      etcdserver2/server.go

+ 11 - 9
etcdserver2/server.go

@@ -56,15 +56,17 @@ func (s *Server) Run(ctx context.Context) {
 		case rd := <-s.Node.Ready():
 			s.Save(rd.State, rd.Entries)
 			s.Send(rd.Messages)
-			go func() {
-				for _, e := range rd.CommittedEntries {
-					var resp Response
-					resp.Event, resp.err = s.apply(context.TODO(), e)
-					resp.Term = rd.Term
-					resp.Commit = rd.Commit
-					s.w.Trigger(e.Id, resp)
-				}
-			}()
+
+			// TODO(bmizerany): do this in the background, but take
+			// care to apply entries in a single goroutine, and not
+			// race them.
+			for _, e := range rd.CommittedEntries {
+				var resp Response
+				resp.Event, resp.err = s.apply(context.TODO(), e)
+				resp.Term = rd.Term
+				resp.Commit = rd.Commit
+				s.w.Trigger(e.Id, resp)
+			}
 		case <-ctx.Done():
 			return
 		}