@Override
  protected void startShippers() {
    for (String walGroupId : logQueue.getQueues().keySet()) {
      workerThreads.put(walGroupId, createNewShipper(walGroupId));
    }
    // start shippers after initializing the workerThreads, as in the below postFinish logic, if
    // workerThreads is empty, we will mark the RecoveredReplicationSource as finished. So if we
    // start the worker on the fly, it is possible that a shipper has already finished its work and
    // called postFinish, and find out the workerThreads is empty and then mark the
    // RecoveredReplicationSource as finish, while the next shipper has not been added to
    // workerThreads yet. See HBASE-28155 for more details.
    for (ReplicationSourceShipper shipper : workerThreads.values()) {
      startShipper(shipper);
    }
  }
Class that handles the recovered source of a replication stream, which is transfered from another
dead region server. This will be closed when all logs are pushed to peer cluster.
hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/RecoveredReplicationSource.java