code: func (m *Memberlist) UpdateNode(timeout time.Duration) error {
  	// Get the node meta data
  	var meta []byte
  	if m.config.Delegate != nil {
  		meta = m.config.Delegate.NodeMeta(MetaMaxSize)
  		if len(meta) > MetaMaxSize {
  			panic("Node meta data provided is longer than the limit")
  		}
  	}
  
  	// Get the existing node
  	m.nodeLock.RLock()
  	state := m.nodeMap[m.config.Name]
  	m.nodeLock.RUnlock()
  
  	// Format a new alive message
  	a := alive{
  		Incarnation: m.nextIncarnation(),
  		Node:        m.config.Name,
  		Addr:        state.Addr,
  		Port:        state.Port,
  		Meta:        meta,
  		Vsn:         m.config.BuildVsnArray(),
  	}
  	notifyCh := make(chan struct{})
  	m.aliveNode(&a, notifyCh, true)
  
  	// Wait for the broadcast or a timeout
  	if m.anyAlive() {
  		var timeoutCh <-chan time.Time
  		if timeout > 0 {
  			timeoutCh = time.After(timeout)
  		}
  		select {
  		case <-notifyCh:
  		case <-timeoutCh:
  			return fmt.Errorf("timeout waiting for update broadcast")
  		}
  	}
  	return nil
  }
docs: // UpdateNode is used to trigger re-advertising the local node. This is
  // primarily used with a Delegate to support dynamic updates to the local
  // meta data.  This will block until the update message is successfully
  // broadcasted to a member of the cluster, if any exist or until a specified
  // timeout is reached.