HADOOP-9631. ViewFs should use underlying FileSystem's server side defaults. Contributed by Lohit Vijayarenu and Erik Krogen.
This commit is contained in:
parent
ed2d03f2a5
commit
59d69257a8
@ -450,9 +450,21 @@ public Path getHomeDirectory() {
|
|||||||
* @return server default configuration values
|
* @return server default configuration values
|
||||||
*
|
*
|
||||||
* @throws IOException an I/O error occurred
|
* @throws IOException an I/O error occurred
|
||||||
|
* @deprecated use {@link #getServerDefaults(Path)} instead
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public abstract FsServerDefaults getServerDefaults() throws IOException;
|
public abstract FsServerDefaults getServerDefaults() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a set of server default configuration values based on path.
|
||||||
|
* @param f path to fetch server defaults
|
||||||
|
* @return server default configuration values for path
|
||||||
|
* @throws IOException an I/O error occurred
|
||||||
|
*/
|
||||||
|
public FsServerDefaults getServerDefaults(final Path f) throws IOException {
|
||||||
|
return getServerDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the fully-qualified path of path f resolving the path
|
* Return the fully-qualified path of path f resolving the path
|
||||||
* through any internal symlinks or mount point
|
* through any internal symlinks or mount point
|
||||||
@ -548,7 +560,7 @@ public final FSDataOutputStream create(final Path f,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FsServerDefaults ssDef = getServerDefaults();
|
FsServerDefaults ssDef = getServerDefaults(f);
|
||||||
if (ssDef.getBlockSize() % ssDef.getBytesPerChecksum() != 0) {
|
if (ssDef.getBlockSize() % ssDef.getBytesPerChecksum() != 0) {
|
||||||
throw new IOException("Internal error: default blockSize is" +
|
throw new IOException("Internal error: default blockSize is" +
|
||||||
" not a multiple of default bytesPerChecksum ");
|
" not a multiple of default bytesPerChecksum ");
|
||||||
@ -626,7 +638,7 @@ public abstract boolean delete(final Path f, final boolean recursive)
|
|||||||
*/
|
*/
|
||||||
public FSDataInputStream open(final Path f) throws AccessControlException,
|
public FSDataInputStream open(final Path f) throws AccessControlException,
|
||||||
FileNotFoundException, UnresolvedLinkException, IOException {
|
FileNotFoundException, UnresolvedLinkException, IOException {
|
||||||
return open(f, getServerDefaults().getFileBufferSize());
|
return open(f, getServerDefaults(f).getFileBufferSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -57,7 +57,7 @@ public ChecksumFs(AbstractFileSystem theFs)
|
|||||||
throws IOException, URISyntaxException {
|
throws IOException, URISyntaxException {
|
||||||
super(theFs);
|
super(theFs);
|
||||||
defaultBytesPerChecksum =
|
defaultBytesPerChecksum =
|
||||||
getMyFs().getServerDefaults().getBytesPerChecksum();
|
getMyFs().getServerDefaults(new Path("/")).getBytesPerChecksum();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -96,9 +96,10 @@ public int getBytesPerSum() {
|
|||||||
return defaultBytesPerChecksum;
|
return defaultBytesPerChecksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getSumBufferSize(int bytesPerSum, int bufferSize)
|
private int getSumBufferSize(int bytesPerSum, int bufferSize, Path file)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
int defaultBufferSize = getMyFs().getServerDefaults().getFileBufferSize();
|
int defaultBufferSize = getMyFs().getServerDefaults(file)
|
||||||
|
.getFileBufferSize();
|
||||||
int proportionalBufferSize = bufferSize / bytesPerSum;
|
int proportionalBufferSize = bufferSize / bytesPerSum;
|
||||||
return Math.max(bytesPerSum,
|
return Math.max(bytesPerSum,
|
||||||
Math.max(proportionalBufferSize, defaultBufferSize));
|
Math.max(proportionalBufferSize, defaultBufferSize));
|
||||||
@ -121,7 +122,7 @@ private static class ChecksumFSInputChecker extends FSInputChecker {
|
|||||||
|
|
||||||
public ChecksumFSInputChecker(ChecksumFs fs, Path file)
|
public ChecksumFSInputChecker(ChecksumFs fs, Path file)
|
||||||
throws IOException, UnresolvedLinkException {
|
throws IOException, UnresolvedLinkException {
|
||||||
this(fs, file, fs.getServerDefaults().getFileBufferSize());
|
this(fs, file, fs.getServerDefaults(file).getFileBufferSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ChecksumFSInputChecker(ChecksumFs fs, Path file, int bufferSize)
|
public ChecksumFSInputChecker(ChecksumFs fs, Path file, int bufferSize)
|
||||||
@ -132,7 +133,7 @@ public ChecksumFSInputChecker(ChecksumFs fs, Path file, int bufferSize)
|
|||||||
Path sumFile = fs.getChecksumFile(file);
|
Path sumFile = fs.getChecksumFile(file);
|
||||||
try {
|
try {
|
||||||
int sumBufferSize = fs.getSumBufferSize(fs.getBytesPerSum(),
|
int sumBufferSize = fs.getSumBufferSize(fs.getBytesPerSum(),
|
||||||
bufferSize);
|
bufferSize, file);
|
||||||
sums = fs.getRawFs().open(sumFile, sumBufferSize);
|
sums = fs.getRawFs().open(sumFile, sumBufferSize);
|
||||||
|
|
||||||
byte[] version = new byte[CHECKSUM_VERSION.length];
|
byte[] version = new byte[CHECKSUM_VERSION.length];
|
||||||
@ -353,7 +354,7 @@ public ChecksumFSOutputSummer(final ChecksumFs fs, final Path file,
|
|||||||
|
|
||||||
// Now create the chekcsumfile; adjust the buffsize
|
// Now create the chekcsumfile; adjust the buffsize
|
||||||
int bytesPerSum = fs.getBytesPerSum();
|
int bytesPerSum = fs.getBytesPerSum();
|
||||||
int sumBufferSize = fs.getSumBufferSize(bytesPerSum, bufferSize);
|
int sumBufferSize = fs.getSumBufferSize(bytesPerSum, bufferSize, file);
|
||||||
this.sums = fs.getRawFs().createInternal(fs.getChecksumFile(file),
|
this.sums = fs.getRawFs().createInternal(fs.getChecksumFile(file),
|
||||||
EnumSet.of(CreateFlag.CREATE, CreateFlag.OVERWRITE),
|
EnumSet.of(CreateFlag.CREATE, CreateFlag.OVERWRITE),
|
||||||
absolutePermission, sumBufferSize, replication, blockSize, progress,
|
absolutePermission, sumBufferSize, replication, blockSize, progress,
|
||||||
|
@ -149,10 +149,16 @@ public FsStatus getFsStatus(final Path f) throws IOException {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public FsServerDefaults getServerDefaults() throws IOException {
|
public FsServerDefaults getServerDefaults() throws IOException {
|
||||||
return fsImpl.getServerDefaults();
|
return fsImpl.getServerDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FsServerDefaults getServerDefaults(final Path f) throws IOException {
|
||||||
|
return fsImpl.getServerDefaults(f);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Path getHomeDirectory() {
|
public Path getHomeDirectory() {
|
||||||
return fsImpl.getHomeDirectory();
|
return fsImpl.getHomeDirectory();
|
||||||
|
@ -147,10 +147,15 @@ public FsStatus getFsStatus() throws IOException {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public FsServerDefaults getServerDefaults() throws IOException {
|
public FsServerDefaults getServerDefaults() throws IOException {
|
||||||
return myFs.getServerDefaults();
|
return myFs.getServerDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FsServerDefaults getServerDefaults(final Path f) throws IOException {
|
||||||
|
return myFs.getServerDefaults(f);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Path resolvePath(final Path p) throws FileNotFoundException,
|
public Path resolvePath(final Path p) throws FileNotFoundException,
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
import org.apache.hadoop.fs.DelegateToFileSystem;
|
import org.apache.hadoop.fs.DelegateToFileSystem;
|
||||||
import org.apache.hadoop.fs.FsConstants;
|
import org.apache.hadoop.fs.FsConstants;
|
||||||
import org.apache.hadoop.fs.FsServerDefaults;
|
import org.apache.hadoop.fs.FsServerDefaults;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The FtpFs implementation of AbstractFileSystem.
|
* The FtpFs implementation of AbstractFileSystem.
|
||||||
@ -57,7 +58,13 @@ public int getUriDefaultPort() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public FsServerDefaults getServerDefaults() throws IOException {
|
public FsServerDefaults getServerDefaults() throws IOException {
|
||||||
return FtpConfigKeys.getServerDefaults();
|
return FtpConfigKeys.getServerDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FsServerDefaults getServerDefaults(final Path f) throws IOException {
|
||||||
|
return FtpConfigKeys.getServerDefaults();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
import org.apache.hadoop.fs.DelegateToFileSystem;
|
import org.apache.hadoop.fs.DelegateToFileSystem;
|
||||||
import org.apache.hadoop.fs.FsConstants;
|
import org.apache.hadoop.fs.FsConstants;
|
||||||
import org.apache.hadoop.fs.FsServerDefaults;
|
import org.apache.hadoop.fs.FsServerDefaults;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.fs.RawLocalFileSystem;
|
import org.apache.hadoop.fs.RawLocalFileSystem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -63,6 +64,13 @@ public int getUriDefaultPort() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
public FsServerDefaults getServerDefaults(final Path f)
|
||||||
|
throws IOException {
|
||||||
|
return LocalConfigKeys.getServerDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
public FsServerDefaults getServerDefaults() throws IOException {
|
public FsServerDefaults getServerDefaults() throws IOException {
|
||||||
return LocalConfigKeys.getServerDefaults();
|
return LocalConfigKeys.getServerDefaults();
|
||||||
}
|
}
|
||||||
|
@ -223,10 +223,16 @@ public FsStatus getFsStatus() throws IOException {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public FsServerDefaults getServerDefaults() throws IOException {
|
public FsServerDefaults getServerDefaults() throws IOException {
|
||||||
return myFs.getServerDefaults();
|
return myFs.getServerDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FsServerDefaults getServerDefaults(final Path f) throws IOException {
|
||||||
|
return myFs.getServerDefaults(fullPath(f));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getUriDefaultPort() {
|
public int getUriDefaultPort() {
|
||||||
return myFs.getUriDefaultPort();
|
return myFs.getUriDefaultPort();
|
||||||
|
@ -240,10 +240,22 @@ AbstractFileSystem getTargetFileSystem(URI[] mergeFsURIList)
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public FsServerDefaults getServerDefaults() throws IOException {
|
public FsServerDefaults getServerDefaults() throws IOException {
|
||||||
return LocalConfigKeys.getServerDefaults();
|
return LocalConfigKeys.getServerDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FsServerDefaults getServerDefaults(final Path f) throws IOException {
|
||||||
|
InodeTree.ResolveResult<AbstractFileSystem> res;
|
||||||
|
try {
|
||||||
|
res = fsState.resolve(getUriPath(f), true);
|
||||||
|
} catch (FileNotFoundException fnfe) {
|
||||||
|
return LocalConfigKeys.getServerDefaults();
|
||||||
|
}
|
||||||
|
return res.targetFileSystem.getServerDefaults(res.remainingPath);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getUriDefaultPort() {
|
public int getUriDefaultPort() {
|
||||||
return -1;
|
return -1;
|
||||||
@ -927,8 +939,14 @@ public FsStatus getFsStatus() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public FsServerDefaults getServerDefaults() throws IOException {
|
public FsServerDefaults getServerDefaults() throws IOException {
|
||||||
throw new IOException("FsServerDefaults not implemented yet");
|
return LocalConfigKeys.getServerDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FsServerDefaults getServerDefaults(final Path f) throws IOException {
|
||||||
|
return LocalConfigKeys.getServerDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -117,6 +117,7 @@ public FsStatus getFsStatus() throws IOException {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public FsServerDefaults getServerDefaults() throws IOException {
|
public FsServerDefaults getServerDefaults() throws IOException {
|
||||||
// deliberately empty
|
// deliberately empty
|
||||||
return null;
|
return null;
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.security.PrivilegedExceptionAction;
|
import java.security.PrivilegedExceptionAction;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -46,8 +47,10 @@
|
|||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.AbstractFileSystem;
|
import org.apache.hadoop.fs.AbstractFileSystem;
|
||||||
import org.apache.hadoop.fs.BlockLocation;
|
import org.apache.hadoop.fs.BlockLocation;
|
||||||
|
import org.apache.hadoop.fs.CreateFlag;
|
||||||
import org.apache.hadoop.fs.FileContext;
|
import org.apache.hadoop.fs.FileContext;
|
||||||
import org.apache.hadoop.fs.FileContextTestHelper;
|
import org.apache.hadoop.fs.FileContextTestHelper;
|
||||||
|
import org.apache.hadoop.fs.FsServerDefaults;
|
||||||
import org.apache.hadoop.fs.LocatedFileStatus;
|
import org.apache.hadoop.fs.LocatedFileStatus;
|
||||||
import org.apache.hadoop.fs.RemoteIterator;
|
import org.apache.hadoop.fs.RemoteIterator;
|
||||||
import org.apache.hadoop.fs.FileContextTestHelper.fileType;
|
import org.apache.hadoop.fs.FileContextTestHelper.fileType;
|
||||||
@ -55,6 +58,7 @@
|
|||||||
import org.apache.hadoop.fs.FsConstants;
|
import org.apache.hadoop.fs.FsConstants;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.fs.UnresolvedLinkException;
|
import org.apache.hadoop.fs.UnresolvedLinkException;
|
||||||
|
import org.apache.hadoop.fs.local.LocalConfigKeys;
|
||||||
import org.apache.hadoop.fs.permission.AclEntry;
|
import org.apache.hadoop.fs.permission.AclEntry;
|
||||||
import org.apache.hadoop.fs.permission.AclStatus;
|
import org.apache.hadoop.fs.permission.AclStatus;
|
||||||
import org.apache.hadoop.fs.permission.AclUtil;
|
import org.apache.hadoop.fs.permission.AclUtil;
|
||||||
@ -839,6 +843,51 @@ public Object run() throws IOException, URISyntaxException {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRespectsServerDefaults() throws Exception {
|
||||||
|
FsServerDefaults targetDefs =
|
||||||
|
fcTarget.getDefaultFileSystem().getServerDefaults(new Path("/"));
|
||||||
|
FsServerDefaults viewDefs =
|
||||||
|
fcView.getDefaultFileSystem().getServerDefaults(new Path("/data"));
|
||||||
|
assertEquals(targetDefs.getReplication(), viewDefs.getReplication());
|
||||||
|
assertEquals(targetDefs.getBlockSize(), viewDefs.getBlockSize());
|
||||||
|
assertEquals(targetDefs.getBytesPerChecksum(),
|
||||||
|
viewDefs.getBytesPerChecksum());
|
||||||
|
assertEquals(targetDefs.getFileBufferSize(),
|
||||||
|
viewDefs.getFileBufferSize());
|
||||||
|
assertEquals(targetDefs.getWritePacketSize(),
|
||||||
|
viewDefs.getWritePacketSize());
|
||||||
|
assertEquals(targetDefs.getEncryptDataTransfer(),
|
||||||
|
viewDefs.getEncryptDataTransfer());
|
||||||
|
assertEquals(targetDefs.getTrashInterval(), viewDefs.getTrashInterval());
|
||||||
|
assertEquals(targetDefs.getChecksumType(), viewDefs.getChecksumType());
|
||||||
|
|
||||||
|
fcView.create(new Path("/data/file"), EnumSet.of(CreateFlag.CREATE))
|
||||||
|
.close();
|
||||||
|
FileStatus stat =
|
||||||
|
fcTarget.getFileStatus(new Path(targetTestRoot, "data/file"));
|
||||||
|
assertEquals(targetDefs.getReplication(), stat.getReplication());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testServerDefaultsInternalDir() throws Exception {
|
||||||
|
FsServerDefaults localDefs = LocalConfigKeys.getServerDefaults();
|
||||||
|
FsServerDefaults viewDefs = fcView
|
||||||
|
.getDefaultFileSystem().getServerDefaults(new Path("/internalDir"));
|
||||||
|
assertEquals(localDefs.getReplication(), viewDefs.getReplication());
|
||||||
|
assertEquals(localDefs.getBlockSize(), viewDefs.getBlockSize());
|
||||||
|
assertEquals(localDefs.getBytesPerChecksum(),
|
||||||
|
viewDefs.getBytesPerChecksum());
|
||||||
|
assertEquals(localDefs.getFileBufferSize(),
|
||||||
|
viewDefs.getFileBufferSize());
|
||||||
|
assertEquals(localDefs.getWritePacketSize(),
|
||||||
|
viewDefs.getWritePacketSize());
|
||||||
|
assertEquals(localDefs.getEncryptDataTransfer(),
|
||||||
|
viewDefs.getEncryptDataTransfer());
|
||||||
|
assertEquals(localDefs.getTrashInterval(), viewDefs.getTrashInterval());
|
||||||
|
assertEquals(localDefs.getChecksumType(), viewDefs.getChecksumType());
|
||||||
|
}
|
||||||
|
|
||||||
// Confirm that listLocatedStatus is delegated properly to the underlying
|
// Confirm that listLocatedStatus is delegated properly to the underlying
|
||||||
// AbstractFileSystem to allow for optimizations
|
// AbstractFileSystem to allow for optimizations
|
||||||
@Test
|
@Test
|
||||||
|
@ -155,10 +155,16 @@ public FsStatus getFsStatus() throws IOException {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public FsServerDefaults getServerDefaults() throws IOException {
|
public FsServerDefaults getServerDefaults() throws IOException {
|
||||||
return dfs.getServerDefaults();
|
return dfs.getServerDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FsServerDefaults getServerDefaults(final Path f) throws IOException {
|
||||||
|
return dfs.getServerDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RemoteIterator<LocatedFileStatus> listLocatedStatus(
|
public RemoteIterator<LocatedFileStatus> listLocatedStatus(
|
||||||
final Path p)
|
final Path p)
|
||||||
|
Loading…
Reference in New Issue
Block a user