Package com.google.cloud.hadoop.fs.gcs
Class GoogleHadoopFileSystem
- java.lang.Object
-
- org.apache.hadoop.conf.Configured
-
- org.apache.hadoop.fs.FileSystem
-
- com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem
-
- All Implemented Interfaces:
Closeable,AutoCloseable,org.apache.hadoop.conf.Configurable,org.apache.hadoop.fs.PathCapabilities,org.apache.hadoop.fs.statistics.IOStatisticsSource,org.apache.hadoop.security.token.DelegationTokenIssuer
public class GoogleHadoopFileSystem extends org.apache.hadoop.fs.FileSystem implements org.apache.hadoop.fs.statistics.IOStatisticsSourceGoogleHadoopFileSystem is rooted in a single bucket at initialization time; in this case, Hadoop paths no longer correspond directly to general GCS paths, and all Hadoop operations going through this FileSystem will never touch any GCS bucket other than the bucket on which this FileSystem is rooted.This implementation sacrifices a small amount of cross-bucket interoperability in favor of more straightforward FileSystem semantics and compatibility with existing Hadoop applications. In particular, it is not subject to bucket-naming constraints, and files are allowed to be placed in root.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classGoogleHadoopFileSystem.GcsFileChecksumTypeAvailable GCS checksum types for use withGoogleHadoopFileSystemConfiguration.GCS_FILE_CHECKSUM_TYPE.static classGoogleHadoopFileSystem.GlobAlgorithmAvailable GCS glob algorithms for use withGoogleHadoopFileSystemConfiguration.GCS_GLOB_ALGORITHM.
-
Constructor Summary
Constructors Constructor Description GoogleHadoopFileSystem()Constructs an instance of GoogleHadoopFileSystem; the internal GoogleCloudStorageFileSystem will be set up with config settings when initialize() is called.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description org.apache.hadoop.fs.FSDataOutputStreamappend(org.apache.hadoop.fs.Path hadoopPath, int bufferSize, org.apache.hadoop.util.Progressable progress)Appends to an existing file (optional operation).protected voidcheckPath(org.apache.hadoop.fs.Path path)voidclose()voidcompleteLocalOutput(org.apache.hadoop.fs.Path fsOutputFile, org.apache.hadoop.fs.Path tmpLocalFile)voidconcat(org.apache.hadoop.fs.Path tgt, org.apache.hadoop.fs.Path[] srcs)Concat existing files into one file.voidcopyFromLocalFile(boolean delSrc, boolean overwrite, org.apache.hadoop.fs.Path[] srcs, org.apache.hadoop.fs.Path dst)voidcopyFromLocalFile(boolean delSrc, boolean overwrite, org.apache.hadoop.fs.Path src, org.apache.hadoop.fs.Path dst)voidcopyToLocalFile(boolean delSrc, org.apache.hadoop.fs.Path src, org.apache.hadoop.fs.Path dst)org.apache.hadoop.fs.FSDataOutputStreamcreate(org.apache.hadoop.fs.Path hadoopPath, org.apache.hadoop.fs.permission.FsPermission permission, boolean overwrite, int bufferSize, short replication, long blockSize, org.apache.hadoop.util.Progressable progress)org.apache.hadoop.fs.FSDataOutputStreamcreateNonRecursive(org.apache.hadoop.fs.Path hadoopPath, org.apache.hadoop.fs.permission.FsPermission permission, EnumSet<org.apache.hadoop.fs.CreateFlag> flags, int bufferSize, short replication, long blockSize, org.apache.hadoop.util.Progressable progress)booleandelete(org.apache.hadoop.fs.Path hadoopPath, boolean recursive)booleandeleteOnExit(org.apache.hadoop.fs.Path f)booleanexists(org.apache.hadoop.fs.Path f)StringgetCanonicalServiceName()org.apache.hadoop.fs.ContentSummarygetContentSummary(org.apache.hadoop.fs.Path f)longgetDefaultBlockSize()protected intgetDefaultPort()The default port is listed as -1 as an indication that ports are not used.shortgetDefaultReplication()Gets the default replication factor.org.apache.hadoop.security.token.Token<?>getDelegationToken(String renewer)org.apache.hadoop.fs.FileChecksumgetFileChecksum(org.apache.hadoop.fs.Path hadoopPath)org.apache.hadoop.fs.FileStatusgetFileStatus(org.apache.hadoop.fs.Path hadoopPath)GoogleCloudStorageFileSystemgetGcsFs()Gets GCS FS instance.GhfsGlobalStorageStatisticsgetGlobalGcsStorageStatistics()Get the storage statistics of this filesystem.org.apache.hadoop.fs.PathgetHomeDirectory()Returns home directory of the current user.GhfsInstrumentationgetInstrumentation()org.apache.hadoop.fs.statistics.IOStatisticsgetIOStatistics()Get the instrumentation's IOStatistics.StringgetScheme()GhfsStorageStatisticsgetStorageStatistics()Get the storage statistics of this filesystem.URIgetUri()Returns a URI of the root of this FileSystem.longgetUsed()Supplier<VectoredIOImpl>getVectoredIOSupplier()org.apache.hadoop.fs.PathgetWorkingDirectory()Gets the current working directory.byte[]getXAttr(org.apache.hadoop.fs.Path path, String name)Map<String,byte[]>getXAttrs(org.apache.hadoop.fs.Path path)Map<String,byte[]>getXAttrs(org.apache.hadoop.fs.Path path, List<String> names)org.apache.hadoop.fs.FileStatus[]globStatus(org.apache.hadoop.fs.Path pathPattern)Returns an array of FileStatus objects whose path names match pathPattern.org.apache.hadoop.fs.FileStatus[]globStatus(org.apache.hadoop.fs.Path pathPattern, org.apache.hadoop.fs.PathFilter filter)booleanhasPathCapability(org.apache.hadoop.fs.Path path, String capability)voidinitialize(URI path, org.apache.hadoop.conf.Configuration config)org.apache.hadoop.fs.RemoteIterator<org.apache.hadoop.fs.LocatedFileStatus>listLocatedStatus(org.apache.hadoop.fs.Path f)org.apache.hadoop.fs.FileStatus[]listStatus(org.apache.hadoop.fs.Path hadoopPath)List<String>listXAttrs(org.apache.hadoop.fs.Path path)org.apache.hadoop.fs.PathmakeQualified(org.apache.hadoop.fs.Path path)Overridden to make root its own parent.booleanmkdirs(org.apache.hadoop.fs.Path hadoopPath, org.apache.hadoop.fs.permission.FsPermission permission)org.apache.hadoop.fs.FSDataInputStreamopen(org.apache.hadoop.fs.Path hadoopPath, int bufferSize)CompletableFuture<org.apache.hadoop.fs.FSDataInputStream>openFileWithOptions(org.apache.hadoop.fs.Path hadoopPath, org.apache.hadoop.fs.impl.OpenFileParameters parameters)Initiate the open operation.protected voidprocessDeleteOnExit()voidremoveXAttr(org.apache.hadoop.fs.Path path, String name)booleanrename(org.apache.hadoop.fs.Path src, org.apache.hadoop.fs.Path dst)voidsetOwner(org.apache.hadoop.fs.Path p, String username, String groupname)voidsetPermission(org.apache.hadoop.fs.Path p, org.apache.hadoop.fs.permission.FsPermission permission)voidsetTimes(org.apache.hadoop.fs.Path p, long mtime, long atime)voidsetVerifyChecksum(boolean verifyChecksum)voidsetWorkingDirectory(org.apache.hadoop.fs.Path hadoopPath)voidsetXAttr(org.apache.hadoop.fs.Path path, String name, byte[] value, EnumSet<org.apache.hadoop.fs.XAttrSetFlag> flags)org.apache.hadoop.fs.PathstartLocalOutput(org.apache.hadoop.fs.Path fsOutputFile, org.apache.hadoop.fs.Path tmpLocalFile)-
Methods inherited from class org.apache.hadoop.fs.FileSystem
access, append, append, append, append, appendFile, areSymlinksEnabled, cancelDeleteOnExit, canonicalizeUri, clearStatistics, closeAll, closeAllForUGI, copyFromLocalFile, copyFromLocalFile, copyToLocalFile, copyToLocalFile, create, create, create, create, create, create, create, create, create, create, create, create, createDataInputStreamBuilder, createDataInputStreamBuilder, createDataOutputStreamBuilder, createFile, createMultipartUploader, createNewFile, createNonRecursive, createNonRecursive, createPathHandle, createSnapshot, createSnapshot, createSymlink, delete, deleteSnapshot, enableSymlinks, fixRelativePart, get, get, get, getAclStatus, getAdditionalTokenIssuers, getAllStatistics, getAllStoragePolicies, getBlockSize, getCanonicalUri, getChildFileSystems, getDefaultBlockSize, getDefaultReplication, getDefaultUri, getFileBlockLocations, getFileBlockLocations, getFileChecksum, getFileLinkStatus, getFileSystemClass, getFSofPath, getGlobalStorageStatistics, getInitialWorkingDirectory, getLength, getLinkTarget, getLocal, getName, getNamed, getPathHandle, getQuotaUsage, getReplication, getServerDefaults, getServerDefaults, getStatistics, getStatistics, getStatus, getStatus, getStoragePolicy, getTrashRoot, getTrashRoots, getUsed, isDirectory, isFile, listCorruptFileBlocks, listFiles, listLocatedStatus, listStatus, listStatus, listStatus, listStatusBatch, listStatusIterator, mkdirs, mkdirs, modifyAclEntries, moveFromLocalFile, moveFromLocalFile, moveToLocalFile, msync, newInstance, newInstance, newInstance, newInstanceLocal, open, open, open, openFile, openFile, openFileWithOptions, primitiveCreate, primitiveMkdir, primitiveMkdir, printStatistics, removeAcl, removeAclEntries, removeDefaultAcl, rename, renameSnapshot, resolveLink, resolvePath, satisfyStoragePolicy, setAcl, setDefaultUri, setDefaultUri, setQuota, setQuotaByStorageType, setReplication, setStoragePolicy, setWriteChecksum, setXAttr, supportsSymlinks, truncate, unsetStoragePolicy
-
-
-
-
Field Detail
-
SCHEME
public static final String SCHEME
URI scheme for GoogleHadoopFileSystem- See Also:
- Constant Field Values
-
-
Method Detail
-
initialize
public void initialize(URI path, org.apache.hadoop.conf.Configuration config) throws IOException
- Overrides:
initializein classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
checkPath
protected void checkPath(org.apache.hadoop.fs.Path path)
- Overrides:
checkPathin classorg.apache.hadoop.fs.FileSystem
-
getScheme
public String getScheme()
- Overrides:
getSchemein classorg.apache.hadoop.fs.FileSystem
-
open
public org.apache.hadoop.fs.FSDataInputStream open(org.apache.hadoop.fs.Path hadoopPath, int bufferSize) throws IOException- Specified by:
openin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
create
public org.apache.hadoop.fs.FSDataOutputStream create(org.apache.hadoop.fs.Path hadoopPath, org.apache.hadoop.fs.permission.FsPermission permission, boolean overwrite, int bufferSize, short replication, long blockSize, org.apache.hadoop.util.Progressable progress) throws IOException- Specified by:
createin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
createNonRecursive
public org.apache.hadoop.fs.FSDataOutputStream createNonRecursive(org.apache.hadoop.fs.Path hadoopPath, org.apache.hadoop.fs.permission.FsPermission permission, EnumSet<org.apache.hadoop.fs.CreateFlag> flags, int bufferSize, short replication, long blockSize, org.apache.hadoop.util.Progressable progress) throws IOException- Overrides:
createNonRecursivein classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
rename
public boolean rename(org.apache.hadoop.fs.Path src, org.apache.hadoop.fs.Path dst) throws IOException- Specified by:
renamein classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
delete
public boolean delete(org.apache.hadoop.fs.Path hadoopPath, boolean recursive) throws IOException- Specified by:
deletein classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
listStatus
public org.apache.hadoop.fs.FileStatus[] listStatus(org.apache.hadoop.fs.Path hadoopPath) throws IOException- Specified by:
listStatusin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
mkdirs
public boolean mkdirs(org.apache.hadoop.fs.Path hadoopPath, org.apache.hadoop.fs.permission.FsPermission permission) throws IOException- Specified by:
mkdirsin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
getFileStatus
public org.apache.hadoop.fs.FileStatus getFileStatus(org.apache.hadoop.fs.Path hadoopPath) throws IOException- Specified by:
getFileStatusin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
globStatus
public org.apache.hadoop.fs.FileStatus[] globStatus(org.apache.hadoop.fs.Path pathPattern, org.apache.hadoop.fs.PathFilter filter) throws IOException- Overrides:
globStatusin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
getDelegationToken
public org.apache.hadoop.security.token.Token<?> getDelegationToken(String renewer) throws IOException
- Specified by:
getDelegationTokenin interfaceorg.apache.hadoop.security.token.DelegationTokenIssuer- Overrides:
getDelegationTokenin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
copyFromLocalFile
public void copyFromLocalFile(boolean delSrc, boolean overwrite, org.apache.hadoop.fs.Path[] srcs, org.apache.hadoop.fs.Path dst) throws IOException- Overrides:
copyFromLocalFilein classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
copyFromLocalFile
public void copyFromLocalFile(boolean delSrc, boolean overwrite, org.apache.hadoop.fs.Path src, org.apache.hadoop.fs.Path dst) throws IOException- Overrides:
copyFromLocalFilein classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
getFileChecksum
public org.apache.hadoop.fs.FileChecksum getFileChecksum(org.apache.hadoop.fs.Path hadoopPath) throws IOException- Overrides:
getFileChecksumin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
exists
public boolean exists(org.apache.hadoop.fs.Path f) throws IOException- Overrides:
existsin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
listLocatedStatus
public org.apache.hadoop.fs.RemoteIterator<org.apache.hadoop.fs.LocatedFileStatus> listLocatedStatus(org.apache.hadoop.fs.Path f) throws IOException- Overrides:
listLocatedStatusin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
getXAttr
public byte[] getXAttr(org.apache.hadoop.fs.Path path, String name) throws IOException- Overrides:
getXAttrin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
getXAttrs
public Map<String,byte[]> getXAttrs(org.apache.hadoop.fs.Path path) throws IOException
- Overrides:
getXAttrsin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
getXAttrs
public Map<String,byte[]> getXAttrs(org.apache.hadoop.fs.Path path, List<String> names) throws IOException
- Overrides:
getXAttrsin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
listXAttrs
public List<String> listXAttrs(org.apache.hadoop.fs.Path path) throws IOException
- Overrides:
listXAttrsin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
getGlobalGcsStorageStatistics
public GhfsGlobalStorageStatistics getGlobalGcsStorageStatistics()
Get the storage statistics of this filesystem.- Returns:
- the storage statistics
-
getStorageStatistics
public GhfsStorageStatistics getStorageStatistics()
Get the storage statistics of this filesystem.- Overrides:
getStorageStatisticsin classorg.apache.hadoop.fs.FileSystem- Returns:
- the storage statistics
-
getIOStatistics
public org.apache.hadoop.fs.statistics.IOStatistics getIOStatistics()
Get the instrumentation's IOStatistics.- Specified by:
getIOStatisticsin interfaceorg.apache.hadoop.fs.statistics.IOStatisticsSource
-
getInstrumentation
public GhfsInstrumentation getInstrumentation()
-
makeQualified
public org.apache.hadoop.fs.Path makeQualified(org.apache.hadoop.fs.Path path)
Overridden to make root its own parent. This is POSIX compliant, but more importantly guards against poor directory accounting in the PathData class of Hadoop 2's FsShell.- Overrides:
makeQualifiedin classorg.apache.hadoop.fs.FileSystem
-
getUri
public URI getUri()
Returns a URI of the root of this FileSystem.- Specified by:
getUriin classorg.apache.hadoop.fs.FileSystem
-
getDefaultPort
protected int getDefaultPort()
The default port is listed as -1 as an indication that ports are not used.- Overrides:
getDefaultPortin classorg.apache.hadoop.fs.FileSystem
-
hasPathCapability
public boolean hasPathCapability(org.apache.hadoop.fs.Path path, String capability)- Specified by:
hasPathCapabilityin interfaceorg.apache.hadoop.fs.PathCapabilities- Overrides:
hasPathCapabilityin classorg.apache.hadoop.fs.FileSystem
-
openFileWithOptions
public CompletableFuture<org.apache.hadoop.fs.FSDataInputStream> openFileWithOptions(org.apache.hadoop.fs.Path hadoopPath, org.apache.hadoop.fs.impl.OpenFileParameters parameters) throws IOException
Initiate the open operation. This is invoked from both the FileSystem and FileContext APIs- Overrides:
openFileWithOptionsin classorg.apache.hadoop.fs.FileSystem- Parameters:
hadoopPath- path to the fileparameters- open file parameters from the builder.- Returns:
- a future which will evaluate to the opened file.
- Throws:
IOException- failure to resolve the link.IllegalArgumentException- unknown mandatory key
-
append
public org.apache.hadoop.fs.FSDataOutputStream append(org.apache.hadoop.fs.Path hadoopPath, int bufferSize, org.apache.hadoop.util.Progressable progress) throws IOExceptionAppends to an existing file (optional operation). Not supported.- Specified by:
appendin classorg.apache.hadoop.fs.FileSystem- Parameters:
hadoopPath- The existing file to be appended.bufferSize- The size of the buffer to be used.progress- For reporting progress if it is not null.- Returns:
- A writable stream.
- Throws:
IOException- if an error occurs.
-
concat
public void concat(org.apache.hadoop.fs.Path tgt, org.apache.hadoop.fs.Path[] srcs) throws IOExceptionConcat existing files into one file.- Overrides:
concatin classorg.apache.hadoop.fs.FileSystem- Parameters:
tgt- the path to the target destination.srcs- the paths to the sources to use for the concatenation.- Throws:
IOException- IO failure
-
getWorkingDirectory
public org.apache.hadoop.fs.Path getWorkingDirectory()
Gets the current working directory.- Specified by:
getWorkingDirectoryin classorg.apache.hadoop.fs.FileSystem- Returns:
- The current working directory.
-
getDefaultReplication
public short getDefaultReplication()
Gets the default replication factor.- Overrides:
getDefaultReplicationin classorg.apache.hadoop.fs.FileSystem
-
globStatus
public org.apache.hadoop.fs.FileStatus[] globStatus(org.apache.hadoop.fs.Path pathPattern) throws IOExceptionReturns an array of FileStatus objects whose path names match pathPattern.Return null if pathPattern has no glob and the path does not exist. Return an empty array if pathPattern has a glob and no path matches it.
- Overrides:
globStatusin classorg.apache.hadoop.fs.FileSystem- Parameters:
pathPattern- A regular expression specifying the path pattern.- Returns:
- An array of FileStatus objects.
- Throws:
IOException- if an error occurs.
-
getHomeDirectory
public org.apache.hadoop.fs.Path getHomeDirectory()
Returns home directory of the current user.Note: This directory is only used for Hadoop purposes. It is not the same as a user's OS home directory.
- Overrides:
getHomeDirectoryin classorg.apache.hadoop.fs.FileSystem
-
getCanonicalServiceName
public String getCanonicalServiceName()
Returns the service if delegation tokens are configured, otherwise, null.
- Specified by:
getCanonicalServiceNamein interfaceorg.apache.hadoop.security.token.DelegationTokenIssuer- Overrides:
getCanonicalServiceNamein classorg.apache.hadoop.fs.FileSystem
-
getGcsFs
public GoogleCloudStorageFileSystem getGcsFs()
Gets GCS FS instance.
-
getVectoredIOSupplier
public Supplier<VectoredIOImpl> getVectoredIOSupplier()
-
deleteOnExit
public boolean deleteOnExit(org.apache.hadoop.fs.Path f) throws IOException- Overrides:
deleteOnExitin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
processDeleteOnExit
protected void processDeleteOnExit()
- Overrides:
processDeleteOnExitin classorg.apache.hadoop.fs.FileSystem
-
getContentSummary
public org.apache.hadoop.fs.ContentSummary getContentSummary(org.apache.hadoop.fs.Path f) throws IOException- Overrides:
getContentSummaryin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
copyToLocalFile
public void copyToLocalFile(boolean delSrc, org.apache.hadoop.fs.Path src, org.apache.hadoop.fs.Path dst) throws IOException- Overrides:
copyToLocalFilein classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
startLocalOutput
public org.apache.hadoop.fs.Path startLocalOutput(org.apache.hadoop.fs.Path fsOutputFile, org.apache.hadoop.fs.Path tmpLocalFile) throws IOException- Overrides:
startLocalOutputin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
completeLocalOutput
public void completeLocalOutput(org.apache.hadoop.fs.Path fsOutputFile, org.apache.hadoop.fs.Path tmpLocalFile) throws IOException- Overrides:
completeLocalOutputin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
close
public void close() throws IOException- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Overrides:
closein classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
getUsed
public long getUsed() throws IOException- Overrides:
getUsedin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
getDefaultBlockSize
public long getDefaultBlockSize()
- Overrides:
getDefaultBlockSizein classorg.apache.hadoop.fs.FileSystem
-
setWorkingDirectory
public void setWorkingDirectory(org.apache.hadoop.fs.Path hadoopPath)
- Specified by:
setWorkingDirectoryin classorg.apache.hadoop.fs.FileSystem
-
setVerifyChecksum
public void setVerifyChecksum(boolean verifyChecksum)
- Overrides:
setVerifyChecksumin classorg.apache.hadoop.fs.FileSystem
-
setPermission
public void setPermission(org.apache.hadoop.fs.Path p, org.apache.hadoop.fs.permission.FsPermission permission) throws IOException- Overrides:
setPermissionin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
setOwner
public void setOwner(org.apache.hadoop.fs.Path p, String username, String groupname) throws IOException- Overrides:
setOwnerin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
setTimes
public void setTimes(org.apache.hadoop.fs.Path p, long mtime, long atime) throws IOException- Overrides:
setTimesin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
setXAttr
public void setXAttr(org.apache.hadoop.fs.Path path, String name, byte[] value, EnumSet<org.apache.hadoop.fs.XAttrSetFlag> flags) throws IOException- Overrides:
setXAttrin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
removeXAttr
public void removeXAttr(org.apache.hadoop.fs.Path path, String name) throws IOException- Overrides:
removeXAttrin classorg.apache.hadoop.fs.FileSystem- Throws:
IOException
-
-