YARN-1219. FSDownload changes file suffix making FileUtil.unTar() throw exception. Contributed by Shanyu Zhao.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1529084 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
65cd7bf6b1
commit
6be30a7799
@ -156,6 +156,9 @@ Release 2.1.2 - UNRELEASED
|
|||||||
YARN-1131. $yarn logs command should return an appropriate error message if
|
YARN-1131. $yarn logs command should return an appropriate error message if
|
||||||
YARN application is still running. (Siddharth Seth via hitesh)
|
YARN application is still running. (Siddharth Seth via hitesh)
|
||||||
|
|
||||||
|
YARN-1219. FSDownload changes file suffix making FileUtil.unTar() throw
|
||||||
|
exception. (Shanyu Zhao via cnauroth)
|
||||||
|
|
||||||
Release 2.1.1-beta - 2013-09-23
|
Release 2.1.1-beta - 2013-09-23
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
@ -170,7 +170,7 @@ private static boolean checkPermissionOfOther(FileSystem fs, Path path,
|
|||||||
|
|
||||||
private Path copy(Path sCopy, Path dstdir) throws IOException {
|
private Path copy(Path sCopy, Path dstdir) throws IOException {
|
||||||
FileSystem sourceFs = sCopy.getFileSystem(conf);
|
FileSystem sourceFs = sCopy.getFileSystem(conf);
|
||||||
Path dCopy = new Path(dstdir, sCopy.getName() + ".tmp");
|
Path dCopy = new Path(dstdir, "tmp_"+sCopy.getName());
|
||||||
FileStatus sStat = sourceFs.getFileStatus(sCopy);
|
FileStatus sStat = sourceFs.getFileStatus(sCopy);
|
||||||
if (sStat.getModificationTime() != resource.getTimestamp()) {
|
if (sStat.getModificationTime() != resource.getTimestamp()) {
|
||||||
throw new IOException("Resource " + sCopy +
|
throw new IOException("Resource " + sCopy +
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
import java.util.jar.Manifest;
|
import java.util.jar.Manifest;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
import junit.framework.Assert;
|
import junit.framework.Assert;
|
||||||
|
|
||||||
@ -72,6 +73,9 @@ public class TestFSDownload {
|
|||||||
private static final Log LOG = LogFactory.getLog(TestFSDownload.class);
|
private static final Log LOG = LogFactory.getLog(TestFSDownload.class);
|
||||||
private static AtomicLong uniqueNumberGenerator =
|
private static AtomicLong uniqueNumberGenerator =
|
||||||
new AtomicLong(System.currentTimeMillis());
|
new AtomicLong(System.currentTimeMillis());
|
||||||
|
private enum TEST_FILE_TYPE {
|
||||||
|
TAR, JAR, ZIP, TGZ
|
||||||
|
};
|
||||||
|
|
||||||
@AfterClass
|
@AfterClass
|
||||||
public static void deleteTestDir() throws IOException {
|
public static void deleteTestDir() throws IOException {
|
||||||
@ -150,6 +154,34 @@ static LocalResource createTarFile(FileContext files, Path p, int len,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LocalResource createTgzFile(FileContext files, Path p, int len,
|
||||||
|
Random r, LocalResourceVisibility vis) throws IOException,
|
||||||
|
URISyntaxException {
|
||||||
|
byte[] bytes = new byte[len];
|
||||||
|
r.nextBytes(bytes);
|
||||||
|
|
||||||
|
File gzipFile = new File(p.toUri().getPath() + ".tar.gz");
|
||||||
|
gzipFile.createNewFile();
|
||||||
|
TarArchiveOutputStream out = new TarArchiveOutputStream(
|
||||||
|
new GZIPOutputStream(new FileOutputStream(gzipFile)));
|
||||||
|
TarArchiveEntry entry = new TarArchiveEntry(p.getName());
|
||||||
|
entry.setSize(bytes.length);
|
||||||
|
out.putArchiveEntry(entry);
|
||||||
|
out.write(bytes);
|
||||||
|
out.closeArchiveEntry();
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
LocalResource ret = recordFactory.newRecordInstance(LocalResource.class);
|
||||||
|
ret.setResource(ConverterUtils.getYarnUrlFromPath(new Path(p.toString()
|
||||||
|
+ ".tar.gz")));
|
||||||
|
ret.setSize(len);
|
||||||
|
ret.setType(LocalResourceType.ARCHIVE);
|
||||||
|
ret.setVisibility(vis);
|
||||||
|
ret.setTimestamp(files.getFileStatus(new Path(p.toString() + ".tar.gz"))
|
||||||
|
.getModificationTime());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static LocalResource createJarFile(FileContext files, Path p, int len,
|
static LocalResource createJarFile(FileContext files, Path p, int len,
|
||||||
Random r, LocalResourceVisibility vis) throws IOException,
|
Random r, LocalResourceVisibility vis) throws IOException,
|
||||||
URISyntaxException {
|
URISyntaxException {
|
||||||
@ -327,9 +359,8 @@ public void testDownload() throws IOException, URISyntaxException,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test (timeout=10000)
|
private void downloadWithFileType(TEST_FILE_TYPE fileType) throws IOException,
|
||||||
public void testDownloadArchive() throws IOException, URISyntaxException,
|
URISyntaxException, InterruptedException{
|
||||||
InterruptedException {
|
|
||||||
Configuration conf = new Configuration();
|
Configuration conf = new Configuration();
|
||||||
conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "077");
|
conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "077");
|
||||||
FileContext files = FileContext.getLocalFSFileContext(conf);
|
FileContext files = FileContext.getLocalFSFileContext(conf);
|
||||||
@ -352,7 +383,22 @@ public void testDownloadArchive() throws IOException, URISyntaxException,
|
|||||||
LocalResourceVisibility vis = LocalResourceVisibility.PRIVATE;
|
LocalResourceVisibility vis = LocalResourceVisibility.PRIVATE;
|
||||||
|
|
||||||
Path p = new Path(basedir, "" + 1);
|
Path p = new Path(basedir, "" + 1);
|
||||||
LocalResource rsrc = createTarFile(files, p, size, rand, vis);
|
LocalResource rsrc = null;
|
||||||
|
switch (fileType) {
|
||||||
|
case TAR:
|
||||||
|
rsrc = createTarFile(files, p, size, rand, vis);
|
||||||
|
break;
|
||||||
|
case JAR:
|
||||||
|
rsrc = createJarFile(files, p, size, rand, vis);
|
||||||
|
rsrc.setType(LocalResourceType.PATTERN);
|
||||||
|
break;
|
||||||
|
case ZIP:
|
||||||
|
rsrc = createZipFile(files, p, size, rand, vis);
|
||||||
|
break;
|
||||||
|
case TGZ:
|
||||||
|
rsrc = createTgzFile(files, p, size, rand, vis);
|
||||||
|
break;
|
||||||
|
}
|
||||||
Path destPath = dirs.getLocalPathForWrite(basedir.toString(), size, conf);
|
Path destPath = dirs.getLocalPathForWrite(basedir.toString(), size, conf);
|
||||||
destPath = new Path (destPath,
|
destPath = new Path (destPath,
|
||||||
Long.toString(uniqueNumberGenerator.incrementAndGet()));
|
Long.toString(uniqueNumberGenerator.incrementAndGet()));
|
||||||
@ -371,7 +417,7 @@ public void testDownloadArchive() throws IOException, URISyntaxException,
|
|||||||
FileStatus[] childFiles = files.getDefaultFileSystem().listStatus(
|
FileStatus[] childFiles = files.getDefaultFileSystem().listStatus(
|
||||||
filestatus.getPath());
|
filestatus.getPath());
|
||||||
for (FileStatus childfile : childFiles) {
|
for (FileStatus childfile : childFiles) {
|
||||||
if (childfile.getPath().getName().equalsIgnoreCase("1.tar.tmp")) {
|
if (childfile.getPath().getName().startsWith("tmp")) {
|
||||||
Assert.fail("Tmp File should not have been there "
|
Assert.fail("Tmp File should not have been there "
|
||||||
+ childfile.getPath());
|
+ childfile.getPath());
|
||||||
}
|
}
|
||||||
@ -383,117 +429,28 @@ public void testDownloadArchive() throws IOException, URISyntaxException,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test (timeout=10000)
|
||||||
|
public void testDownloadArchive() throws IOException, URISyntaxException,
|
||||||
|
InterruptedException {
|
||||||
|
downloadWithFileType(TEST_FILE_TYPE.TAR);
|
||||||
|
}
|
||||||
|
|
||||||
@Test (timeout=10000)
|
@Test (timeout=10000)
|
||||||
public void testDownloadPatternJar() throws IOException, URISyntaxException,
|
public void testDownloadPatternJar() throws IOException, URISyntaxException,
|
||||||
InterruptedException {
|
InterruptedException {
|
||||||
Configuration conf = new Configuration();
|
downloadWithFileType(TEST_FILE_TYPE.JAR);
|
||||||
conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "077");
|
|
||||||
FileContext files = FileContext.getLocalFSFileContext(conf);
|
|
||||||
final Path basedir = files.makeQualified(new Path("target",
|
|
||||||
TestFSDownload.class.getSimpleName()));
|
|
||||||
files.mkdir(basedir, null, true);
|
|
||||||
conf.setStrings(TestFSDownload.class.getName(), basedir.toString());
|
|
||||||
|
|
||||||
Random rand = new Random();
|
|
||||||
long sharedSeed = rand.nextLong();
|
|
||||||
rand.setSeed(sharedSeed);
|
|
||||||
System.out.println("SEED: " + sharedSeed);
|
|
||||||
|
|
||||||
Map<LocalResource, Future<Path>> pending = new HashMap<LocalResource, Future<Path>>();
|
|
||||||
ExecutorService exec = Executors.newSingleThreadExecutor();
|
|
||||||
LocalDirAllocator dirs = new LocalDirAllocator(
|
|
||||||
TestFSDownload.class.getName());
|
|
||||||
|
|
||||||
int size = rand.nextInt(512) + 512;
|
|
||||||
LocalResourceVisibility vis = LocalResourceVisibility.PRIVATE;
|
|
||||||
|
|
||||||
Path p = new Path(basedir, "" + 1);
|
|
||||||
LocalResource rsrcjar = createJarFile(files, p, size, rand, vis);
|
|
||||||
rsrcjar.setType(LocalResourceType.PATTERN);
|
|
||||||
Path destPathjar = dirs.getLocalPathForWrite(basedir.toString(), size, conf);
|
|
||||||
destPathjar = new Path (destPathjar,
|
|
||||||
Long.toString(uniqueNumberGenerator.incrementAndGet()));
|
|
||||||
FSDownload fsdjar = new FSDownload(files,
|
|
||||||
UserGroupInformation.getCurrentUser(), conf, destPathjar, rsrcjar);
|
|
||||||
pending.put(rsrcjar, exec.submit(fsdjar));
|
|
||||||
exec.shutdown();
|
|
||||||
while (!exec.awaitTermination(1000, TimeUnit.MILLISECONDS));
|
|
||||||
Assert.assertTrue(pending.get(rsrcjar).isDone());
|
|
||||||
|
|
||||||
try {
|
|
||||||
FileStatus[] filesstatus = files.getDefaultFileSystem().listStatus(
|
|
||||||
basedir);
|
|
||||||
for (FileStatus filestatus : filesstatus) {
|
|
||||||
if (filestatus.isDirectory()) {
|
|
||||||
FileStatus[] childFiles = files.getDefaultFileSystem().listStatus(
|
|
||||||
filestatus.getPath());
|
|
||||||
for (FileStatus childfile : childFiles) {
|
|
||||||
if (childfile.getPath().getName().equalsIgnoreCase("1.jar.tmp")) {
|
|
||||||
Assert.fail("Tmp File should not have been there "
|
|
||||||
+ childfile.getPath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}catch (Exception e) {
|
|
||||||
throw new IOException("Failed exec", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test (timeout=10000)
|
@Test (timeout=10000)
|
||||||
public void testDownloadArchiveZip() throws IOException, URISyntaxException,
|
public void testDownloadArchiveZip() throws IOException, URISyntaxException,
|
||||||
InterruptedException {
|
InterruptedException {
|
||||||
Configuration conf = new Configuration();
|
downloadWithFileType(TEST_FILE_TYPE.ZIP);
|
||||||
conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "077");
|
|
||||||
FileContext files = FileContext.getLocalFSFileContext(conf);
|
|
||||||
final Path basedir = files.makeQualified(new Path("target",
|
|
||||||
TestFSDownload.class.getSimpleName()));
|
|
||||||
files.mkdir(basedir, null, true);
|
|
||||||
conf.setStrings(TestFSDownload.class.getName(), basedir.toString());
|
|
||||||
|
|
||||||
Random rand = new Random();
|
|
||||||
long sharedSeed = rand.nextLong();
|
|
||||||
rand.setSeed(sharedSeed);
|
|
||||||
System.out.println("SEED: " + sharedSeed);
|
|
||||||
|
|
||||||
Map<LocalResource, Future<Path>> pending = new HashMap<LocalResource, Future<Path>>();
|
|
||||||
ExecutorService exec = Executors.newSingleThreadExecutor();
|
|
||||||
LocalDirAllocator dirs = new LocalDirAllocator(
|
|
||||||
TestFSDownload.class.getName());
|
|
||||||
|
|
||||||
int size = rand.nextInt(512) + 512;
|
|
||||||
LocalResourceVisibility vis = LocalResourceVisibility.PRIVATE;
|
|
||||||
|
|
||||||
Path p = new Path(basedir, "" + 1);
|
|
||||||
LocalResource rsrczip = createZipFile(files, p, size, rand, vis);
|
|
||||||
Path destPathjar = dirs.getLocalPathForWrite(basedir.toString(), size, conf);
|
|
||||||
destPathjar = new Path (destPathjar,
|
|
||||||
Long.toString(uniqueNumberGenerator.incrementAndGet()));
|
|
||||||
FSDownload fsdzip = new FSDownload(files,
|
|
||||||
UserGroupInformation.getCurrentUser(), conf, destPathjar, rsrczip);
|
|
||||||
pending.put(rsrczip, exec.submit(fsdzip));
|
|
||||||
exec.shutdown();
|
|
||||||
while (!exec.awaitTermination(1000, TimeUnit.MILLISECONDS));
|
|
||||||
Assert.assertTrue(pending.get(rsrczip).isDone());
|
|
||||||
|
|
||||||
try {
|
|
||||||
FileStatus[] filesstatus = files.getDefaultFileSystem().listStatus(
|
|
||||||
basedir);
|
|
||||||
for (FileStatus filestatus : filesstatus) {
|
|
||||||
if (filestatus.isDirectory()) {
|
|
||||||
FileStatus[] childFiles = files.getDefaultFileSystem().listStatus(
|
|
||||||
filestatus.getPath());
|
|
||||||
for (FileStatus childfile : childFiles) {
|
|
||||||
if (childfile.getPath().getName().equalsIgnoreCase("1.gz.tmp")) {
|
|
||||||
Assert.fail("Tmp File should not have been there "
|
|
||||||
+ childfile.getPath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}catch (Exception e) {
|
|
||||||
throw new IOException("Failed exec", e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test (timeout=10000)
|
||||||
|
public void testDownloadArchiveTgz() throws IOException, URISyntaxException,
|
||||||
|
InterruptedException {
|
||||||
|
downloadWithFileType(TEST_FILE_TYPE.TGZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void verifyPermsRecursively(FileSystem fs,
|
private void verifyPermsRecursively(FileSystem fs,
|
||||||
|
Loading…
Reference in New Issue
Block a user