code: func (s *StateSyncer) retrySyncFullEventFn() event {
  	select {
  	// trigger a full sync immediately.
  	// this is usually called when a consul server was added to the cluster.
  	// stagger the delay to avoid a thundering herd.
  	case <-s.SyncFull.Notif():
  		select {
  		case <-time.After(s.stagger(s.serverUpInterval)):
  			return syncFullNotifEvent
  		case <-s.ShutdownCh:
  			return shutdownEvent
  		}
  
  	// retry full sync after some time
  	// todo(fs): why don't we use s.Interval here?
  	case <-time.After(s.retryFailInterval + s.stagger(s.retryFailInterval)):
  		return syncFullTimerEvent
  
  	case <-s.ShutdownCh:
  		return shutdownEvent
  	}
  }
docs: // retrySyncFullEventFn waits for an event which triggers a retry
  // of a full sync or a termination signal. This function should not be
  // called directly but through s.retryFullSyncState to allow mocking for
  // testing.