From d9c3671fe91429d98ca228fee528eb5f49b1f518 Mon Sep 17 00:00:00 2001 From: Manish R Jain <manish@dgraph.io> Date: Thu, 19 Jul 2018 13:28:43 -0700 Subject: [PATCH] Run raft.Step in serial order, without using goroutines. --- conn/raft_server.go | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/conn/raft_server.go b/conn/raft_server.go index fdea1ce5..53ba97b8 100644 --- a/conn/raft_server.go +++ b/conn/raft_server.go @@ -167,24 +167,6 @@ func (w *RaftServer) JoinCluster(ctx context.Context, return &api.Payload{}, err } -var () - -func (w *RaftServer) applyMessage(ctx context.Context, msg raftpb.Message) error { - node := w.GetNode() - if node == nil || node.Raft() == nil { - return ErrNoNode - } - - c := make(chan error, 1) - go func() { c <- node.Raft().Step(ctx, msg) }() - - select { - case <-ctx.Done(): - return ctx.Err() - case err := <-c: - return err - } -} func (w *RaftServer) RaftMessage(ctx context.Context, batch *intern.RaftBatch) (*api.Payload, error) { if ctx.Err() != nil { @@ -194,7 +176,7 @@ func (w *RaftServer) RaftMessage(ctx context.Context, rc := batch.GetContext() if rc != nil { n := w.GetNode() - if n == nil { + if n == nil || n.Raft() == nil { return &api.Payload{}, ErrNoNode } n.Connect(rc.Id, rc.Addr) @@ -203,6 +185,7 @@ func (w *RaftServer) RaftMessage(ctx context.Context, return &api.Payload{}, nil } data := batch.Payload.Data + raft := w.GetNode().Raft() for idx := 0; idx < len(data); { x.AssertTruef(len(data[idx:]) >= 4, @@ -219,7 +202,8 @@ func (w *RaftServer) RaftMessage(ctx context.Context, if err := msg.Unmarshal(data[idx : idx+sz]); err != nil { x.Check(err) } - if err := w.applyMessage(ctx, msg); err != nil { + // This should be done in order, and not via a goroutine. + if err := raft.Step(ctx, msg); err != nil { return &api.Payload{}, err } idx += sz -- GitLab