private void waitUntilReceiverGetInitiated(
      AtomicReference<PipeConsensusReceiver> receiverReference) {
    try {
      while (receiverReference.get() == null) {
        Thread.sleep(WAIT_INITIALIZE_RECEIVER_INTERVAL_IN_MS);
      }
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
      LOGGER.warn(
          "PipeConsensusReceiver thread is interrupted when waiting for receiver get initiated, may because system exit.",
          e);
    }
  }
For each consensus Pipe task, there is an independent receiver. So for every replica, it has
(n-1) receivers, n is the num of replicas. 1 DataNode --has--> 1 PipeConsensusReceiverAgent & n
replicas 1 PipeConsensusReceiverAgent --manages--> n replicas' receivers 1 replica --has-->
(n-1) receivers
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/pipeconsensus/PipeConsensusReceiverAgent.java