code: @VisibleForTesting
    public void mkdir(URI path)
        throws IOException {
  
      logger.atFine().log("mkdir(%s)", path);
      Preconditions.checkNotNull(path);
      checkArgument(!path.equals(GCS_ROOT), "Cannot create root directory.");
  
      StorageResourceId resourceId = pathCodec.validatePathAndGetId(path, true);
  
      // If this is a top level directory, create the corresponding bucket.
      if (resourceId.isBucket()) {
        gcs.create(resourceId.getBucketName());
        return;
      }
  
      // Ensure that the path looks like a directory path.
      resourceId = FileInfo.convertToDirectoryPath(resourceId);
  
      // Not a top-level directory, create 0 sized object.
      gcs.createEmptyObject(resourceId);
  
      tryUpdateTimestampsForParentDirectories(ImmutableList.of(path), ImmutableList.<URI>of());
    }
docs: Creates a directory at the specified path.
  
  There are two conventions for using objects as directories in GCS.
  1. An object of zero size with name ending in /
  2. An object of zero size with name ending in _$folder$
  
  #1 is the recommended convention by the GCS team. We use it when
  creating a directory.
  
  However, some old tools still use #2. We will decide based on customer
  use cases whether to support #2 as well. For now, we only support #1.
  
  Note that a bucket is always considered a directory.
  Doesn't create parent directories; normal use cases should only call mkdirs().