code: func (m *Memberlist) pushPullTrigger(stop <-chan struct{}) {
  	interval := m.config.PushPullInterval
  
  	// Use a random stagger to avoid syncronizing
  	randStagger := time.Duration(uint64(rand.Int63()) % uint64(interval))
  	select {
  	case <-time.After(randStagger):
  	case <-stop:
  		return
  	}
  
  	// Tick using a dynamic timer
  	for {
  		tickTime := pushPullScale(interval, m.estNumNodes())
  		select {
  		case <-time.After(tickTime):
  			m.pushPull()
  		case <-stop:
  			return
  		}
  	}
  }
docs: // pushPullTrigger is used to periodically trigger a push/pull until
  // a stop tick arrives. We don't use triggerFunc since the push/pull
  // timer is dynamically scaled based on cluster size to avoid network
  // saturation