/** * Copy constructor. * @param from the source replica */ LocalReplica(LocalReplica from) { this(from, from.getVolume(), from.getDir()); }
private boolean renameFile(File srcfile, File destfile) throws IOException { try { getFileIoProvider().rename(getVolume(), srcfile, destfile); return true; } catch (IOException e) { throw new IOException("Failed to move block file for " + this + " from " + srcfile + " to " + destfile.getAbsolutePath(), e); } }
@Override public void copyBlockdata(URI destination) throws IOException { //for local replicas, we assume the destination URI is file getFileIoProvider().nativeCopyFileUnbuffered( getVolume(), getBlockFile(), new File(destination), true); }
@Override public void copyMetadata(URI destination) throws IOException { //for local replicas, we assume the destination URI is file getFileIoProvider().nativeCopyFileUnbuffered( getVolume(), getMetaFile(), new File(destination), true); }
final FileIoProvider fileIoProvider = getFileIoProvider(); final File tmpFile = DatanodeUtil.createFileWithExistsCheck( getVolume(), b, DatanodeUtil.getUnlinkTmpFile(file), fileIoProvider); try { try (FileInputStream in = fileIoProvider.getFileInputStream( getVolume(), file)) { try (FileOutputStream out = fileIoProvider.getFileOutputStream( getVolume(), tmpFile)) { IOUtils.copyBytes(in, out, 16 * 1024); + tmpFile.length()); fileIoProvider.replaceFile(getVolume(), tmpFile, file); } catch (IOException e) { if (!fileIoProvider.delete(getVolume(), tmpFile)) { DataNode.LOG.info("detachFile failed to delete temporary file " + tmpFile);
/** * Get input stream for a local file and optionally seek to the offset. * @param f path to the file * @param seekOffset offset to seek * @return input stream for read * @throws IOException */ private FileInputStream getDataInputStream(File f, long seekOffset) throws IOException { FileInputStream fis; final FileIoProvider fileIoProvider = getFileIoProvider(); if (NativeIO.isAvailable()) { fis = fileIoProvider.getShareDeleteFileInputStream( getVolume(), f, seekOffset); } else { try { fis = fileIoProvider.openAndSeek(getVolume(), f, seekOffset); } catch (FileNotFoundException fnfe) { throw new IOException("Expected block file at " + f + " does not exist."); } } return fis; }
@Override public OutputStream getDataOutputStream(boolean append) throws IOException { return getFileIoProvider().getFileOutputStream( getVolume(), getBlockFile(), append); }
@Override public LengthInputStream getMetadataInputStream(long offset) throws IOException { final File meta = getMetaFile(); return new LengthInputStream( getFileIoProvider().openAndSeek(getVolume(), meta, offset), meta.length()); }
/** * Sync the parent directory changes to durable device. * @throws IOException */ public void fsyncDirectory() throws IOException { File dir = getDir(); try { getFileIoProvider().dirSync(getVolume(), getDir()); } catch (IOException e) { throw new IOException("Failed to sync " + dir, e); } } }
@Override public boolean deleteMetadata() { return getFileIoProvider().fullyDelete(getVolume(), getMetaFile()); }
@Override public boolean blockDataExists() { return getFileIoProvider().exists(getVolume(), getBlockFile()); }
@Override public boolean deleteBlockData() { return getFileIoProvider().fullyDelete(getVolume(), getBlockFile()); }
@Override public boolean metadataExists() { return getFileIoProvider().exists(getVolume(), getMetaFile()); }
final File file = getBlockFile(); final FileIoProvider fileIoProvider = getFileIoProvider(); if (file == null || getVolume() == null) { throw new IOException("detachBlock:Block not found. " + this); int linkCount = fileIoProvider.getHardLinkCount(getVolume(), file); if (linkCount > 1) { DataNode.LOG.info("Breaking hardlink for " + linkCount + "x-linked " + breakHardlinks(file, this); if (fileIoProvider.getHardLinkCount(getVolume(), meta) > 1) { breakHardlinks(meta, this);
@Override public void bumpReplicaGS(long newGS) throws IOException { long oldGS = getGenerationStamp(); final File oldmeta = getMetaFile(); setGenerationStamp(newGS); final File newmeta = getMetaFile(); // rename meta file to new GS if (LOG.isDebugEnabled()) { LOG.debug("Renaming " + oldmeta + " to " + newmeta); } try { // calling renameMeta on the ReplicaInfo doesn't work here getFileIoProvider().rename(getVolume(), oldmeta, newmeta); } catch (IOException e) { setGenerationStamp(oldGS); // restore old GS throw new IOException("Block " + this + " reopen failed. " + " Unable to move meta file " + oldmeta + " to " + newmeta, e); } }
@Override public void truncateBlock(long newLength) throws IOException { truncateBlock(getVolume(), getBlockFile(), getMetaFile(), getNumBytes(), newLength, getFileIoProvider()); }