| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.ignite; |
| |
| import java.util.Collection; |
| import java.util.Map; |
| import org.apache.ignite.configuration.FileSystemConfiguration; |
| import org.apache.ignite.igfs.IgfsBlockLocation; |
| import org.apache.ignite.igfs.IgfsFile; |
| import org.apache.ignite.igfs.IgfsInputStream; |
| import org.apache.ignite.igfs.IgfsMetrics; |
| import org.apache.ignite.igfs.IgfsMode; |
| import org.apache.ignite.igfs.IgfsOutputStream; |
| import org.apache.ignite.igfs.IgfsPath; |
| import org.apache.ignite.igfs.IgfsPathSummary; |
| import org.apache.ignite.igfs.mapreduce.IgfsRecordResolver; |
| import org.apache.ignite.igfs.mapreduce.IgfsTask; |
| import org.apache.ignite.lang.IgniteAsyncSupport; |
| import org.apache.ignite.lang.IgniteFuture; |
| import org.apache.ignite.lang.IgniteUuid; |
| import org.jetbrains.annotations.Nullable; |
| import org.apache.ignite.igfs.IgfsPathNotFoundException; |
| |
| /** |
| * <b>IG</b>nite <b>F</b>ile <b>S</b>ystem API. It provides a typical file system "view" on a particular cache: |
| * <ul> |
| * <li>list directories or get information for a single path</li> |
| * <li>create/move/delete files or directories</li> |
| * <li>write/read data streams into/from files</li> |
| * </ul> |
| * The data of each file is split on separate data blocks and stored in the cache. |
| * You can access file's data with a standard Java streaming API. Moreover, for each part |
| * of the file you can calculate an affinity and process file's content on corresponding |
| * nodes to escape unnecessary networking. |
| * <p/> |
| * This API is fully thread-safe and you can use it from several threads. |
| * <h1 class="header">IGFS Configuration</h1> |
| * The simplest way to run a Ignite node with configured file system is to pass |
| * special configuration file included in Ignite distribution to {@code ignite.sh} or |
| * {@code ignite.bat} scripts, like this: {@code ignite.sh config/hadoop/default-config.xml} |
| * <p> |
| * {@code IGFS} can be started as a data node or as a client node. Data node is responsible for |
| * caching data, while client node is responsible for basic file system operations and accessing |
| * data nodes remotely. When used as Hadoop file system, clients nodes usually started together |
| * with {@code job-submitter} or {@code job-scheduler} processes, while data nodes are usually |
| * started together with Hadoop {@code task-tracker} processes. |
| * <h1 class="header">Integration With Hadoop</h1> |
| * In addition to direct file system API, {@code IGFS} can be integrated with {@code Hadoop} by |
| * plugging in as {@code Hadoop FileSystem}. Refer to |
| * {@code org.apache.ignite.hadoop.fs.v1.IgniteHadoopFileSystem} or |
| * {@code org.apache.ignite.hadoop.fs.v2.IgniteHadoopFileSystem} for more information. |
| * <p> |
| * <b>NOTE:</b> integration with Hadoop is available only in {@code In-Memory Accelerator For Hadoop} edition. |
| */ |
| public interface IgniteFileSystem extends IgniteAsyncSupport { |
| /** IGFS scheme name. */ |
| public static final String IGFS_SCHEME = "igfs"; |
| |
| /** |
| * Gets IGFS name. |
| * |
| * @return IGFS name. |
| */ |
| public String name(); |
| |
| /** |
| * Gets IGFS configuration. |
| * |
| * @return IGFS configuration. |
| */ |
| public FileSystemConfiguration configuration(); |
| |
| /** |
| * Gets summary (total number of files, total number of directories and total length) |
| * for a given path. |
| * |
| * @param path Path to get information for. |
| * @return Summary object. |
| * @throws IgfsPathNotFoundException If path is not found. |
| * @throws IgniteException If failed. |
| */ |
| public IgfsPathSummary summary(IgfsPath path) throws IgniteException; |
| |
| /** |
| * Opens a file for reading. |
| * |
| * @param path File path to read. |
| * @return File input stream to read data from. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If path doesn't exist. |
| */ |
| public IgfsInputStream open(IgfsPath path) throws IgniteException; |
| |
| /** |
| * Opens a file for reading. |
| * |
| * @param path File path to read. |
| * @param bufSize Read buffer size (bytes) or {@code zero} to use default value. |
| * @return File input stream to read data from. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If path doesn't exist. |
| */ |
| public IgfsInputStream open(IgfsPath path, int bufSize) throws IgniteException; |
| |
| /** |
| * Opens a file for reading. |
| * |
| * @param path File path to read. |
| * @param bufSize Read buffer size (bytes) or {@code zero} to use default value. |
| * @param seqReadsBeforePrefetch Amount of sequential reads before prefetch is started. |
| * @return File input stream to read data from. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If path doesn't exist. |
| */ |
| public IgfsInputStream open(IgfsPath path, int bufSize, int seqReadsBeforePrefetch) throws IgniteException; |
| |
| /** |
| * Creates a file and opens it for writing. |
| * |
| * @param path File path to create. |
| * @param overwrite Overwrite file if it already exists. Note: you cannot overwrite an existent directory. |
| * @return File output stream to write data to. |
| * @throws IgniteException In case of error. |
| */ |
| public IgfsOutputStream create(IgfsPath path, boolean overwrite) throws IgniteException; |
| |
| /** |
| * Creates a file and opens it for writing. |
| * |
| * @param path File path to create. |
| * @param bufSize Write buffer size (bytes) or {@code zero} to use default value. |
| * @param overwrite Overwrite file if it already exists. Note: you cannot overwrite an existent directory. |
| * @param replication Replication factor. |
| * @param blockSize Block size. |
| * @param props File properties to set. |
| * @return File output stream to write data to. |
| * @throws IgniteException In case of error. |
| */ |
| public IgfsOutputStream create(IgfsPath path, int bufSize, boolean overwrite, int replication, |
| long blockSize, @Nullable Map<String, String> props) throws IgniteException; |
| |
| /** |
| * Creates a file and opens it for writing. |
| * |
| * @param path File path to create. |
| * @param bufSize Write buffer size (bytes) or {@code zero} to use default value. |
| * @param overwrite Overwrite file if it already exists. Note: you cannot overwrite an existent directory. |
| * @param affKey Affinity key used to store file blocks. If not {@code null}, the whole file will be |
| * stored on node where {@code affKey} resides. |
| * @param replication Replication factor. |
| * @param blockSize Block size. |
| * @param props File properties to set. |
| * @return File output stream to write data to. |
| * @throws IgniteException In case of error. |
| */ |
| public IgfsOutputStream create(IgfsPath path, int bufSize, boolean overwrite, |
| @Nullable IgniteUuid affKey, int replication, long blockSize, @Nullable Map<String, String> props) |
| throws IgniteException; |
| |
| /** |
| * Opens an output stream to an existing file for appending data. |
| * |
| * @param path File path to append. |
| * @param create Create file if it doesn't exist yet. |
| * @return File output stream to append data to. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If path doesn't exist and create flag is {@code false}. |
| */ |
| public IgfsOutputStream append(IgfsPath path, boolean create) throws IgniteException; |
| |
| /** |
| * Opens an output stream to an existing file for appending data. |
| * |
| * @param path File path to append. |
| * @param bufSize Write buffer size (bytes) or {@code zero} to use default value. |
| * @param create Create file if it doesn't exist yet. |
| * @param props File properties to set only in case it file was just created. |
| * @return File output stream to append data to. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If path doesn't exist and create flag is {@code false}. |
| */ |
| public IgfsOutputStream append(IgfsPath path, int bufSize, boolean create, @Nullable Map<String, String> props) |
| throws IgniteException; |
| |
| /** |
| * Sets last access time and last modification time for a given path. If argument is {@code null}, |
| * corresponding time will not be changed. |
| * |
| * @param path Path to update. |
| * @param modificationTime Optional last modification time to set. Value {@code -1} does not update |
| * modification time. |
| * @param accessTime Optional last access time to set. Value {@code -1} does not update access time. |
| * @throws IgfsPathNotFoundException If target was not found. |
| * @throws IgniteException If error occurred. |
| */ |
| public void setTimes(IgfsPath path, long modificationTime, long accessTime) throws IgniteException; |
| |
| /** |
| * Gets affinity block locations for data blocks of the file, i.e. the nodes, on which the blocks |
| * are stored. |
| * |
| * @param path File path to get affinity for. |
| * @param start Position in the file to start affinity resolution from. |
| * @param len Size of data in the file to resolve affinity for. |
| * @return Affinity block locations. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If path doesn't exist. |
| */ |
| public Collection<IgfsBlockLocation> affinity(IgfsPath path, long start, long len) throws IgniteException; |
| |
| /** |
| * Get affinity block locations for data blocks of the file. In case {@code maxLen} parameter is set and |
| * particular block location length is greater than this value, block locations will be split into smaller |
| * chunks. |
| * |
| * @param path File path to get affinity for. |
| * @param start Position in the file to start affinity resolution from. |
| * @param len Size of data in the file to resolve affinity for. |
| * @param maxLen Maximum length of a single returned block location length. |
| * @return Affinity block locations. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If path doesn't exist. |
| */ |
| public Collection<IgfsBlockLocation> affinity(IgfsPath path, long start, long len, long maxLen) |
| throws IgniteException; |
| |
| /** |
| * Gets metrics snapshot for this file system. |
| * |
| * @return Metrics. |
| * @throws IgniteException In case of error. |
| */ |
| public IgfsMetrics metrics() throws IgniteException; |
| |
| /** |
| * Resets metrics for this file system. |
| * |
| * @throws IgniteException In case of error. |
| */ |
| public void resetMetrics() throws IgniteException; |
| |
| /** |
| * Determines size of the file denoted by provided path. In case if path is a directory, then |
| * total size of all containing entries will be calculated recursively. |
| * |
| * @param path File system path. |
| * @return Total size. |
| * @throws IgniteException In case of error. |
| */ |
| public long size(IgfsPath path) throws IgniteException; |
| |
| /** |
| * Formats the file system removing all existing entries from it, but not removing anything in secondary |
| * file system (if any). |
| * |
| * @throws IgniteException In case clear failed. |
| */ |
| public void clear() throws IgniteException; |
| |
| /** |
| * Formats the file system removing all existing entries from it, but not removing anything in secondary |
| * file system (if any). |
| * |
| * @return Future representing pending completion of the clear operation. |
| */ |
| public IgniteFuture<Void> clearAsync() throws IgniteException; |
| |
| /** |
| * Executes IGFS task. |
| * |
| * @param task Task to execute. |
| * @param rslvr Optional resolver to control split boundaries. |
| * @param paths Collection of paths to be processed within this task. |
| * @param arg Optional task argument. |
| * @return Task result. |
| * @throws IgniteException If execution failed. |
| */ |
| public <T, R> R execute(IgfsTask<T, R> task, @Nullable IgfsRecordResolver rslvr, |
| Collection<IgfsPath> paths, @Nullable T arg) throws IgniteException; |
| |
| /** |
| * Executes IGFS task asynchronously. |
| * |
| * @param task Task to execute. |
| * @param rslvr Optional resolver to control split boundaries. |
| * @param paths Collection of paths to be processed within this task. |
| * @param arg Optional task argument. |
| * @return a Future representing pending completion of the task. |
| * @throws IgniteException If execution failed. |
| */ |
| public <T, R> IgniteFuture<R> executeAsync(IgfsTask<T, R> task, @Nullable IgfsRecordResolver rslvr, |
| Collection<IgfsPath> paths, @Nullable T arg) throws IgniteException; |
| |
| |
| /** |
| * Executes IGFS task with overridden maximum range length (see |
| * {@link org.apache.ignite.configuration.FileSystemConfiguration#getMaximumTaskRangeLength()} for more information). |
| * <p> |
| * Supports asynchronous execution (see {@link IgniteAsyncSupport}). |
| * |
| * @param task Task to execute. |
| * @param rslvr Optional resolver to control split boundaries. |
| * @param paths Collection of paths to be processed within this task. |
| * @param skipNonExistentFiles Whether to skip non existent files. If set to {@code true} non-existent files will |
| * be ignored. Otherwise an exception will be thrown. |
| * @param maxRangeLen Optional maximum range length. If {@code 0}, then by default all consecutive |
| * IGFS blocks will be included. |
| * @param arg Optional task argument. |
| * @return Task result. |
| * @throws IgniteException If execution failed. |
| */ |
| public <T, R> R execute(IgfsTask<T, R> task, @Nullable IgfsRecordResolver rslvr, |
| Collection<IgfsPath> paths, boolean skipNonExistentFiles, long maxRangeLen, @Nullable T arg) |
| throws IgniteException; |
| |
| /** |
| * Executes IGFS task asynchronously with overridden maximum range length (see |
| * {@link org.apache.ignite.configuration.FileSystemConfiguration#getMaximumTaskRangeLength()} for more information). |
| * |
| * @param task Task to execute. |
| * @param rslvr Optional resolver to control split boundaries. |
| * @param paths Collection of paths to be processed within this task. |
| * @param skipNonExistentFiles Whether to skip non existent files. If set to {@code true} non-existent files will |
| * be ignored. Otherwise an exception will be thrown. |
| * @param maxRangeLen Optional maximum range length. If {@code 0}, then by default all consecutive |
| * IGFS blocks will be included. |
| * @param arg Optional task argument. |
| * @return a Future representing pending completion of the task. |
| * @throws IgniteException If execution failed. |
| */ |
| public <T, R> IgniteFuture<R> executeAsync(IgfsTask<T, R> task, @Nullable IgfsRecordResolver rslvr, |
| Collection<IgfsPath> paths, boolean skipNonExistentFiles, long maxRangeLen, @Nullable T arg) |
| throws IgniteException; |
| |
| /** |
| * Executes IGFS task. |
| * <p> |
| * Supports asynchronous execution (see {@link IgniteAsyncSupport}). |
| * |
| * @param taskCls Task class to execute. |
| * @param rslvr Optional resolver to control split boundaries. |
| * @param paths Collection of paths to be processed within this task. |
| * @param arg Optional task argument. |
| * @return Task result. |
| * @throws IgniteException If execution failed. |
| */ |
| public <T, R> R execute(Class<? extends IgfsTask<T, R>> taskCls, |
| @Nullable IgfsRecordResolver rslvr, Collection<IgfsPath> paths, @Nullable T arg) throws IgniteException; |
| |
| /** |
| * Executes IGFS task asynchronously. |
| * |
| * @param taskCls Task class to execute. |
| * @param rslvr Optional resolver to control split boundaries. |
| * @param paths Collection of paths to be processed within this task. |
| * @param arg Optional task argument. |
| * @return a Future representing pending completion of the task. |
| * @throws IgniteException If execution failed. |
| */ |
| public <T, R> IgniteFuture<R> executeAsync(Class<? extends IgfsTask<T, R>> taskCls, |
| @Nullable IgfsRecordResolver rslvr, Collection<IgfsPath> paths, @Nullable T arg) throws IgniteException; |
| |
| |
| /** |
| * Executes IGFS task with overridden maximum range length (see |
| * {@link org.apache.ignite.configuration.FileSystemConfiguration#getMaximumTaskRangeLength()} for more information). |
| * <p> |
| * Supports asynchronous execution (see {@link IgniteAsyncSupport}). |
| * |
| * @param taskCls Task class to execute. |
| * @param rslvr Optional resolver to control split boundaries. |
| * @param paths Collection of paths to be processed within this task. |
| * @param skipNonExistentFiles Whether to skip non existent files. If set to {@code true} non-existent files will |
| * be ignored. Otherwise an exception will be thrown. |
| * @param maxRangeLen Maximum range length. |
| * @param arg Optional task argument. |
| * @return Task result. |
| * @throws IgniteException If execution failed. |
| */ |
| public <T, R> R execute(Class<? extends IgfsTask<T, R>> taskCls, |
| @Nullable IgfsRecordResolver rslvr, Collection<IgfsPath> paths, boolean skipNonExistentFiles, |
| long maxRangeLen, @Nullable T arg) throws IgniteException; |
| |
| /** |
| * Executes IGFS task asynchronously with overridden maximum range length (see |
| * {@link org.apache.ignite.configuration.FileSystemConfiguration#getMaximumTaskRangeLength()} for more information). |
| * |
| * @param taskCls Task class to execute. |
| * @param rslvr Optional resolver to control split boundaries. |
| * @param paths Collection of paths to be processed within this task. |
| * @param skipNonExistentFiles Whether to skip non existent files. If set to {@code true} non-existent files will |
| * be ignored. Otherwise an exception will be thrown. |
| * @param maxRangeLen Maximum range length. |
| * @param arg Optional task argument. |
| * @return a Future representing pending completion of the task. |
| * @throws IgniteException If execution failed. |
| */ |
| public <T, R> IgniteFuture<R> executeAsync(Class<? extends IgfsTask<T, R>> taskCls, |
| @Nullable IgfsRecordResolver rslvr, Collection<IgfsPath> paths, boolean skipNonExistentFiles, |
| long maxRangeLen, @Nullable T arg) throws IgniteException; |
| |
| /** |
| * Checks if the specified path exists in the file system. |
| * |
| * @param path Path to check for existence in the file system. |
| * @return {@code True} if such file exists, otherwise - {@code false}. |
| * @throws IgniteException In case of error. |
| */ |
| public boolean exists(IgfsPath path); |
| |
| /** |
| * Updates file information for the specified path. Existent properties, not listed in the passed collection, |
| * will not be affected. Other properties will be added or overwritten. Passed properties with {@code null} values |
| * will be removed from the stored properties or ignored if they don't exist in the file info. |
| * <p> |
| * When working in {@code DUAL_SYNC} or {@code DUAL_ASYNC} modes with Hadoop secondary file system only the following properties will be updated: |
| * <ul> |
| * <li>{@code usrName} - file owner name;</li> |
| * <li>{@code grpName} - file owner group;</li> |
| * <li>{@code permission} - Unix-style string representing file permissions.</li> |
| * </ul> |
| * |
| * @param path File path to set properties for. |
| * @param props Properties to update. |
| * @return File information for specified path or {@code null} if such path does not exist. |
| * @throws IgniteException In case of error. |
| */ |
| public IgfsFile update(IgfsPath path, Map<String, String> props) throws IgniteException; |
| |
| /** |
| * Renames/moves a file. |
| * <p> |
| * You are free to rename/move data files as you wish, but directories can be only renamed. |
| * You cannot move the directory between different parent directories. |
| * <p> |
| * Examples: |
| * <ul> |
| * <li>"/work/file.txt" => "/home/project/Presentation Scenario.txt"</li> |
| * <li>"/work" => "/work-2012.bkp"</li> |
| * <li>"/work" => "<strike>/backups/work</strike>" - such operation is restricted for directories.</li> |
| * </ul> |
| * |
| * @param src Source file path to rename. |
| * @param dest Destination file path. If destination path is a directory, then source file will be placed |
| * into destination directory with original name. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If source file doesn't exist. |
| */ |
| public void rename(IgfsPath src, IgfsPath dest) throws IgniteException; |
| |
| /** |
| * Deletes file. |
| * |
| * @param path File path to delete. |
| * @param recursive Delete non-empty directories recursively. |
| * @return {@code True} in case of success, {@code false} otherwise. |
| * @throws IgniteException In case of error. |
| */ |
| public boolean delete(IgfsPath path, boolean recursive) throws IgniteException; |
| |
| /** |
| * Creates directories under specified path. |
| * |
| * @param path Path of directories chain to create. |
| * @throws IgniteException In case of error. |
| */ |
| public void mkdirs(IgfsPath path) throws IgniteException; |
| |
| /** |
| * Creates directories under specified path with the specified properties. |
| * Note that the properties are applied only to created directories, but never |
| * updated for existing ones. |
| * |
| * @param path Path of directories chain to create. |
| * @param props Metadata properties to set on created directories. |
| * @throws IgniteException In case of error. |
| */ |
| public void mkdirs(IgfsPath path, @Nullable Map<String, String> props) throws IgniteException; |
| |
| /** |
| * Lists file paths under the specified path. |
| * |
| * @param path Path to list files under. |
| * @return List of paths under the specified path. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If path doesn't exist. |
| */ |
| public Collection<IgfsPath> listPaths(IgfsPath path) throws IgniteException; |
| |
| /** |
| * Lists files under the specified path. |
| * |
| * @param path Path to list files under. |
| * @return List of files under the specified path. |
| * @throws IgniteException In case of error. |
| * @throws IgfsPathNotFoundException If path doesn't exist. |
| */ |
| public Collection<IgfsFile> listFiles(IgfsPath path) throws IgniteException; |
| |
| /** |
| * Gets file information for the specified path. |
| * |
| * @param path Path to get information for. |
| * @return File information for specified path or {@code null} if such path does not exist. |
| * @throws IgniteException In case of error. |
| */ |
| @Nullable public IgfsFile info(IgfsPath path) throws IgniteException; |
| |
| /** |
| * Get mode for the given path. |
| * |
| * @param path Path. |
| * @return Mode used for this path. |
| */ |
| public IgfsMode mode(IgfsPath path); |
| |
| /** |
| * Gets used space in bytes. |
| * |
| * @return Used space in bytes. |
| * @throws IgniteException In case of error. |
| */ |
| public long usedSpaceSize() throws IgniteException; |
| |
| /** {@inheritDoc} */ |
| @Deprecated |
| @Override public IgniteFileSystem withAsync(); |
| } |