code: func (nt *NodeTree) Next() string {
  	nt.mu.Lock()
  	defer nt.mu.Unlock()
  	if len(nt.zones) == 0 {
  		return ""
  	}
  	numExhaustedZones := 0
  	for {
  		if nt.zoneIndex >= len(nt.zones) {
  			nt.zoneIndex = 0
  		}
  		zone := nt.zones[nt.zoneIndex]
  		nt.zoneIndex++
  		// We do not check the exhausted zones before calling next() on the zone. This ensures
  		// that if more nodes are added to a zone after it is exhausted, we iterate over the new nodes.
  		nodeName, exhausted := nt.tree[zone].next()
  		if exhausted {
  			numExhaustedZones++
  			if numExhaustedZones >= len(nt.zones) { // all zones are exhausted. we should reset.
  				nt.resetExhausted()
  			}
  		} else {
  			return nodeName
  		}
  	}
  }
docs: // Next returns the name of the next node. NodeTree iterates over zones and in each zone iterates
  // over nodes in a round robin fashion.