code: func (m *Memberlist) probe() {
  	// Track the number of indexes we've considered probing
  	numCheck := 0
  START:
  	m.nodeLock.RLock()
  
  	// Make sure we don't wrap around infinitely
  	if numCheck >= len(m.nodes) {
  		m.nodeLock.RUnlock()
  		return
  	}
  
  	// Handle the wrap around case
  	if m.probeIndex >= len(m.nodes) {
  		m.nodeLock.RUnlock()
  		m.resetNodes()
  		m.probeIndex = 0
  		numCheck++
  		goto START
  	}
  
  	// Determine if we should probe this node
  	skip := false
  	var node nodeState
  
  	node = *m.nodes[m.probeIndex]
  	if node.Name == m.config.Name {
  		skip = true
  	} else if node.State == stateDead {
  		skip = true
  	}
  
  	// Potentially skip
  	m.nodeLock.RUnlock()
  	m.probeIndex++
  	if skip {
  		numCheck++
  		goto START
  	}
  
  	// Probe the specific node
  	m.probeNode(&node)
  }
docs: // Tick is used to perform a single round of failure detection and gossip