code: @Override
    public boolean rename(Path src, Path dst) throws IOException {
      // Even though the underlying GCSFS will also throw an IAE if src is root, since our filesystem
      // root happens to equal the global root, we want to explicitly check it here since derived
      // classes may not have filesystem roots equal to the global root.
      if (src.makeQualified(this).equals(getFileSystemRoot())) {
        logger.atFine().log("GHFS.rename: src is root: '%s'", src);
        return false;
      }
  
      long startTime = System.nanoTime();
      Preconditions.checkArgument(src != null, "src must not be null");
      Preconditions.checkArgument(dst != null, "dst must not be null");
  
      checkOpen();
  
      URI srcPath = getGcsPath(src);
      URI dstPath = getGcsPath(dst);
      logger.atFine().log("GHFS.rename: %s -> %s", src, dst);
  
      try {
        getGcsFs().rename(srcPath, dstPath);
      } catch (IOException e) {
        // Occasionally log exceptions that have a cause at info level,
        // because they could surface real issues and help with troubleshooting
        (logger.atFine().isEnabled() || e.getCause() == null
                ? logger.atFine()
                : logger.atInfo().atMostEvery(5, TimeUnit.MINUTES))
            .withCause(e)
            .log("Failed GHFS.rename: %s -> %s", src, dst);
        return false;
      }
  
      long duration = System.nanoTime() - startTime;
      increment(Counter.RENAME);
      increment(Counter.RENAME_TIME, duration);
      return true;
    }
docs: Renames src to dst. Src must not be equal to the filesystem root.
  
  @param src Source path.
  @param dst Destination path.
  @return true if rename succeeds.
  @throws FileNotFoundException if src does not exist.
  @throws IOException if an error occurs.