blob: d611871294025c49c93bb476cfdad1a51c70d3c8 [file] [log] [blame]
/*
* 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();
}