public ProgressIndex updateProgressIndex(final ProgressIndex updateIndex) {
    // only pipeTaskMeta that need to updateProgressIndex will persist progress index
    // isRegisterPersistTask is used to avoid multiple threads registering persist task concurrently
    if (Objects.nonNull(progressIndexPersistFile)
        && !isRegisterPersistTask.getAndSet(true)
        && this.persistProgressIndexFuture == null
        && PipeConfig.getInstance().isPipeProgressIndexPersistEnabled()) {
      this.persistProgressIndexFuture =
          PipePeriodicalJobExecutor.submitBackgroundJob(
              () -> {
                if (PipeConfig.getInstance().isPipeProgressIndexPersistEnabled()) {
                  persistProgressIndex();
                }
              },
              0,
              PipeConfig.getInstance().getPipeProgressIndexFlushIntervalMs());
    }

    progressIndex.updateAndGet(
        index -> index.updateToMinimumEqualOrIsAfterProgressIndex(updateIndex));
    if (Objects.nonNull(progressIndexPersistFile)
        && updateCount.incrementAndGet() - lastPersistCount.get() > checkPointGap
        && PipeConfig.getInstance().isPipeProgressIndexPersistEnabled()) {
      persistProgressIndex();
    }
    return progressIndex.get();
  }
Stores the exceptions encountered during run time of each pipe task.

<p>The exceptions are instances of {@link PipeRuntimeCriticalException}, {@link
PipeRuntimeConnectorCriticalException} and {@link PipeRuntimeNonCriticalException}.

<p>The failure of them, respectively, will lead to the stop of the pipe, the stop of the pipes
sharing the same connector, and nothing.
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/agent/task/meta/PipeTaskMeta.java