@Override
  public ReplicationSourceInterface startup() {
    if (this.sourceRunning) {
      return this;
    }
    this.sourceRunning = true;
    setSourceStartupStatus(true);
    initThread = new Thread(this::initialize);
    Threads.setDaemonThreadRunning(initThread,
      Thread.currentThread().getName() + ".replicationSource," + this.queueId, (t, e) -> {
        // if first initialization attempt failed, and abortOnError is false, we will
        // keep looping in this thread until initialize eventually succeeds,
        // while the server main startup one can go on with its work.
        sourceRunning = false;
        checkError(t, e);
        retryStartup.set(!this.abortOnError);
        do {
          if (retryStartup.get()) {
            this.sourceRunning = true;
            setSourceStartupStatus(true);
            retryStartup.set(false);
            try {
              initialize();
            } catch (Throwable error) {
              setSourceStartupStatus(false);
              checkError(t, error);
              retryStartup.set(!this.abortOnError);
            }
          }
        } while ((this.startupOngoing.get() || this.retryStartup.get()) && !this.abortOnError);
      });
    return this;
  }
Do the sleeping logic
@param msg             Why we sleep
@param sleepMultiplier by how many times the default sleeping time is augmented
@return True if <code>sleepMultiplier</code> is &lt; <code>maxRetriesMultiplier</code>
hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java