code: func (n *Node) configure(ctx context.Context, cc raftpb.ConfChange) error {
  	cc.ID = n.reqIDGen.Next()
  
  	ctx, cancel := context.WithCancel(ctx)
  	ch := n.wait.register(cc.ID, nil, cancel)
  
  	if err := n.raftNode.ProposeConfChange(ctx, cc); err != nil {
  		n.wait.cancel(cc.ID)
  		return err
  	}
  
  	select {
  	case x := <-ch:
  		if err, ok := x.(error); ok {
  			return err
  		}
  		if x != nil {
  			log.G(ctx).Panic("raft: configuration change error, return type should always be error")
  		}
  		return nil
  	case <-ctx.Done():
  		n.wait.cancel(cc.ID)
  		return ctx.Err()
  	}
  }
docs: // configure sends a configuration change through consensus and
  // then waits for it to be applied to the server. It will block
  // until the change is performed or there is an error.