double getRemainingTime() {
    final PipeRateAverage pipeRemainingTimeCommitRateAverageTime =
        PipeConfig.getInstance().getPipeRemainingTimeCommitRateAverageTime();

    // Do not calculate heartbeat event
    final long totalConfigRegionWriteEventCount =
        configRegionExtractors.stream()
            .map(IoTDBConfigRegionExtractor::getUnTransferredEventCount)
            .reduce(Long::sum)
            .orElse(0L);

    configRegionCommitMeter.updateAndGet(
        meter -> {
          if (Objects.nonNull(meter)) {
            lastConfigRegionCommitSmoothingValue =
                pipeRemainingTimeCommitRateAverageTime.getMeterRate(meter);
          }
          return meter;
        });

    final double configRegionRemainingTime;
    if (totalConfigRegionWriteEventCount <= 0) {
      notifyEmpty();
      configRegionRemainingTime = 0;
    } else {
      notifyNonEmpty();
      configRegionRemainingTime =
          lastConfigRegionCommitSmoothingValue <= 0
              ? Double.MAX_VALUE
              : totalConfigRegionWriteEventCount / lastConfigRegionCommitSmoothingValue;
    }

    return configRegionRemainingTime >= REMAINING_MAX_SECONDS
        ? REMAINING_MAX_SECONDS
        : configRegionRemainingTime;
  }
This will calculate the estimated remaining time of the given pipe's {@link
PipeConfigNodeSubtask}.

@return The estimated remaining time
iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/metric/overview/PipeConfigNodeRemainingTimeOperator.java