raft/node.go
func (n *node) stepWithWaitOption(ctx context.Context, m pb.Message, wait bool) error {
	if m.Type != pb.MsgProp {
		select {
		case n.recvc <- m:
			return nil
		case <-ctx.Done():
			return ctx.Err()
		case <-n.done:
			return ErrStopped
		}
	}
	ch := n.propc
	pm := msgWithResult{m: m}
	if wait {
		pm.result = make(chan error, 1)
	}
	select {
	case ch <- pm:
		if !wait {
			return nil
		}
	case <-ctx.Done():
		return ctx.Err()
	case <-n.done:
		return ErrStopped
	}
	select {
	case err := <-pm.result:
		if err != nil {
			return err
		}
	case <-ctx.Done():
		return ctx.Err()
	case <-n.done:
		return ErrStopped
	}
	return nil
}
func (n *node) stepWithWaitOption(ctx context.Context, m pb.Message, wait bool) error {
	if m.Type != pb.MsgProp {
		select {
		case n.recvc <- m:
			return nil
		case <-ctx.Done():
			return ctx.Err()
		case <-n.done:
			return ErrStopped
		}
	}
	ch := n.propc
	pm := msgWithResult{m: m}
	if wait {
		pm.result = make(chan error, 1)
	}
	select {
	case ch <- pm:
		if !wait {
			return nil
		}
	case <-ctx.Done():
		return ctx.Err()
	case <-n.done:
		return ErrStopped
	}
	select {
	case err := <-pm.result:
		if err != nil {
			return err
		}
	case <-ctx.Done():
		return ctx.Err()
	case <-n.done:
		return ErrStopped
	}
	return nil
}
func ( n * node ) stepWithWaitOption ( ctx context . Context , m pb . Message , wait bool ) error { if m . Type != pb . MsgProp { select { case n . recvc <- m : return nil case <- ctx . Done ( ) : return ctx . Err ( ) case <- n . done : return ErrStopped } } ch := n . propc pm := msgWithResult { m : m } if wait { pm . result = make ( chan error , 1 ) } select { case ch <- pm : if ! wait { return nil } case <- ctx . Done ( ) : return ctx . Err ( ) case <- n . done : return ErrStopped } select { case err := <- pm . result : if err != nil { return err } case <- ctx . Done ( ) : return ctx . Err ( ) case <- n . done : return ErrStopped } return nil }
// Step advances the state machine using msgs. The ctx.Err() will be returned,
// if any.
Step advances the state machine using msgs . The ctx . Err () will be returned if any .