code: public void renamePath(final Path src, final Path dst, final Optional<String> group) {
      this.futures.add(new NamedFuture(this.executor.submit(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
          Lock lock = ParallelRunner.this.locks.get(src.toString());
          lock.lock();
          try {
            if (ParallelRunner.this.fs.exists(src)) {
              HadoopUtils.renamePath(ParallelRunner.this.fs, src, dst);
              if (group.isPresent()) {
                HadoopUtils.setGroup(ParallelRunner.this.fs, dst, group.get());
              }
            }
            return null;
          } catch (FileAlreadyExistsException e) {
            LOGGER.warn(String.format("Failed to rename %s to %s: dst already exists", src, dst), e);
            return null;
          } finally {
            lock.unlock();
          }
        }
      }), "Rename " + src + " to " + dst));
    }
docs: Rename a {@link Path}.
  
  <p>
  This method submits a task to rename a {@link Path} and returns immediately
  after the task is submitted.
  </p>
  
  @param src path to be renamed
  @param dst new path after rename
  @param group an optional group name for the destination path