private static PipeRuntimeMeta deserializeVersion1(
      ByteBuffer byteBuffer, byte pipeRuntimeVersionByte, final boolean needPersist) {
    final PipeRuntimeMeta pipeRuntimeMeta = new PipeRuntimeMeta();

    pipeRuntimeMeta.status.set(PipeStatus.getPipeStatus(pipeRuntimeVersionByte));

    final int size = ReadWriteIOUtils.readInt(byteBuffer);
    for (int i = 0; i < size; ++i) {
      final int taskIndex = ReadWriteIOUtils.readInt(byteBuffer);
      pipeRuntimeMeta.consensusGroupId2TaskMetaMap.put(
          taskIndex,
          PipeTaskMeta.deserialize(
              PipeRuntimeMetaVersion.VERSION_1, byteBuffer, taskIndex, needPersist));
    }

    return pipeRuntimeMeta;
  }
We use negative regionId to identify the external pipe source, which is not a consensus group
id. Then we can reuse the regionId to schedule the external pipe source and store the progress
information.
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/agent/task/meta/PipeRuntimeMeta.java