HADOOP-17105. S3AFS - Do not attempt to resolve symlinks in globStatus (#2113)
Contributed by Jimmy Zuber.
This commit is contained in:
parent
b9fa5e0182
commit
806d84b79c
|
@ -3980,6 +3980,8 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Increments the statistic {@link Statistic#INVOCATION_GLOB_STATUS}.
|
* Increments the statistic {@link Statistic#INVOCATION_GLOB_STATUS}.
|
||||||
|
* Override superclass so as to disable symlink resolution as symlinks
|
||||||
|
* are not supported by S3A.
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@ -3988,9 +3990,9 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override superclass so as to disable symlink resolution and so avoid
|
* Increments the statistic {@link Statistic#INVOCATION_GLOB_STATUS}.
|
||||||
* some calls to the FS which may have problems when the store is being
|
* Override superclass so as to disable symlink resolution as symlinks
|
||||||
* inconsistent.
|
* are not supported by S3A.
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@ -4002,7 +4004,7 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities,
|
||||||
return Globber.createGlobber(this)
|
return Globber.createGlobber(this)
|
||||||
.withPathPattern(pathPattern)
|
.withPathPattern(pathPattern)
|
||||||
.withPathFiltern(filter)
|
.withPathFiltern(filter)
|
||||||
.withResolveSymlinks(true)
|
.withResolveSymlinks(false)
|
||||||
.build()
|
.build()
|
||||||
.glob();
|
.glob();
|
||||||
}
|
}
|
||||||
|
|
|
@ -574,4 +574,48 @@ public class ITestS3AFileOperationCost extends AbstractS3ATestBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCostOfGlobStatus() throws Throwable {
|
||||||
|
describe("Test globStatus has expected cost");
|
||||||
|
S3AFileSystem fs = getFileSystem();
|
||||||
|
assume("Unguarded FS only", !fs.hasMetadataStore());
|
||||||
|
|
||||||
|
Path basePath = path("testCostOfGlobStatus/nextFolder/");
|
||||||
|
|
||||||
|
// create a bunch of files
|
||||||
|
int filesToCreate = 10;
|
||||||
|
for (int i = 0; i < filesToCreate; i++) {
|
||||||
|
try (FSDataOutputStream out = fs.create(basePath.suffix("/" + i))) {
|
||||||
|
verifyOperationCount(1, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.globStatus(basePath.suffix("/*"));
|
||||||
|
// 2 head + 1 list from getFileStatus on path,
|
||||||
|
// plus 1 list to match the glob pattern
|
||||||
|
verifyOperationCount(2, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCostOfGlobStatusNoSymlinkResolution() throws Throwable {
|
||||||
|
describe("Test globStatus does not attempt to resolve symlinks");
|
||||||
|
S3AFileSystem fs = getFileSystem();
|
||||||
|
assume("Unguarded FS only", !fs.hasMetadataStore());
|
||||||
|
|
||||||
|
Path basePath = path("testCostOfGlobStatusNoSymlinkResolution/f/");
|
||||||
|
|
||||||
|
// create a single file, globStatus returning a single file on a pattern
|
||||||
|
// triggers attempts at symlinks resolution if configured
|
||||||
|
String fileName = "/notASymlinkDOntResolveMeLikeOne";
|
||||||
|
try (FSDataOutputStream out = fs.create(basePath.suffix(fileName))) {
|
||||||
|
verifyOperationCount(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.globStatus(basePath.suffix("/*"));
|
||||||
|
// unguarded: 2 head + 1 list from getFileStatus on path,
|
||||||
|
// plus 1 list to match the glob pattern
|
||||||
|
// no additional operations from symlink resolution
|
||||||
|
verifyOperationCount(2, 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue