code: func (s *Serf) handleNodeUpdate(n *memberlist.Node) {
  	s.memberLock.Lock()
  	defer s.memberLock.Unlock()
  
  	member, ok := s.members[n.Name]
  	if !ok {
  		// We've never even heard of this node that is updating.
  		// Just ignore it completely.
  		return
  	}
  
  	// Update the member attributes
  	member.Addr = net.IP(n.Addr)
  	member.Port = n.Port
  	member.Tags = s.decodeTags(n.Meta)
  
  	// Snag the latest versions. NOTE - the current memberlist code will NOT
  	// fire an update event if the metadata (for Serf, tags) stays the same
  	// and only the protocol versions change. If we wake any Serf-level
  	// protocol changes where we want to get this event under those
  	// circumstances, we will need to update memberlist to do a check of
  	// versions as well as the metadata.
  	member.ProtocolMin = n.PMin
  	member.ProtocolMax = n.PMax
  	member.ProtocolCur = n.PCur
  	member.DelegateMin = n.DMin
  	member.DelegateMax = n.DMax
  	member.DelegateCur = n.DCur
  
  	// Update some metrics
  	metrics.IncrCounter([]string{"serf", "member", "update"}, 1)
  
  	// Send an event along
  	s.logger.Printf("[INFO] serf: EventMemberUpdate: %s", member.Member.Name)
  	if s.config.EventCh != nil {
  		s.config.EventCh <- MemberEvent{
  			Type:    EventMemberUpdate,
  			Members: []Member{member.Member},
  		}
  	}
  }
docs: // handleNodeUpdate is called when a node meta data update
  // has taken place