Search in sources :

Example 1 with NativeIOException

use of org.apache.hadoop.io.nativeio.NativeIOException in project hadoop by apache.

the class AtomicFileOutputStream method close.

@Override
public void close() throws IOException {
    boolean triedToClose = false, success = false;
    try {
        flush();
        ((FileOutputStream) out).getChannel().force(true);
        triedToClose = true;
        super.close();
        success = true;
    } finally {
        if (success) {
            boolean renamed = tmpFile.renameTo(origFile);
            if (!renamed) {
                // On windows, renameTo does not replace.
                if (origFile.exists() && !origFile.delete()) {
                    throw new IOException("Could not delete original file " + origFile);
                }
                try {
                    NativeIO.renameTo(tmpFile, origFile);
                } catch (NativeIOException e) {
                    throw new IOException("Could not rename temporary file " + tmpFile + " to " + origFile + " due to failure in native rename. " + e.toString());
                }
            }
        } else {
            if (!triedToClose) {
                // If we failed when flushing, try to close it to not leak an FD
                IOUtils.closeStream(out);
            }
            // close wasn't successful, try to delete the tmp file
            if (!tmpFile.delete()) {
                LOG.warn("Unable to delete tmp file " + tmpFile);
            }
        }
    }
}
Also used : NativeIOException(org.apache.hadoop.io.nativeio.NativeIOException) NativeIOException(org.apache.hadoop.io.nativeio.NativeIOException) IOException(java.io.IOException)

Aggregations

IOException (java.io.IOException)1 NativeIOException (org.apache.hadoop.io.nativeio.NativeIOException)1