@Override
  protected void releaseLock(ConfigNodeProcedureEnv configNodeProcedureEnv) {
    super.releaseLock(configNodeProcedureEnv);

    if (pipeTaskInfo == null) {
      LOGGER.warn("ProcedureId {} release lock. No need to release pipe lock.", getProcId());
    } else {
      LOGGER.info("ProcedureId {} release lock. Pipe lock will be released.", getProcId());
      if (this instanceof PipeMetaSyncProcedure) {
        configNodeProcedureEnv
            .getConfigManager()
            .getPipeManager()
            .getPipeTaskCoordinator()
            .updateLastSyncedVersion();
      }
      PipeProcedureMetrics.getInstance()
          .updateTimer(this.getOperation().getName(), this.elapsedTime());
      configNodeProcedureEnv.getConfigManager().getPipeManager().getPipeTaskCoordinator().unlock();
      pipeTaskInfo = null;
    }
  }
This procedure manages 2 kinds of PIPE operations:

<ul>
  <li>PIPE user task operations:
      <ul>
        <li>{@link PipeTaskOperation#CREATE_PIPE}
        <li>{@link PipeTaskOperation#START_PIPE}
        <li>{@link PipeTaskOperation#STOP_PIPE}
        <li>{@link PipeTaskOperation#DROP_PIPE}
        <li>{@link PipeTaskOperation#ALTER_PIPE}
      </ul>
  <li>PIPE runtime task operations:
      <ul>
        <li>{@link PipeTaskOperation#HANDLE_LEADER_CHANGE}
        <li>{@link PipeTaskOperation#SYNC_PIPE_META}
        <li>{@link PipeTaskOperation#HANDLE_PIPE_META_CHANGE}
      </ul>
</ul>

<p>This class extends {@link AbstractNodeProcedure} to make sure that pipe task procedures can be
executed in sequence and node procedures can be locked when a pipe task procedure is running.
iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/pipe/AbstractOperatePipeProcedureV2.java