svn merge -c 1367114 FIXES: HADOOP-8627. FS deleteOnExit may delete the wrong path (daryn via bobby)
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1367115 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9d30ba3753
commit
79fc1b2fe8
|
@ -676,6 +676,8 @@ Release 0.23.3 - UNRELEASED
|
||||||
HADOOP-8613. AbstractDelegationTokenIdentifier#getUser() should set token
|
HADOOP-8613. AbstractDelegationTokenIdentifier#getUser() should set token
|
||||||
auth type. (daryn)
|
auth type. (daryn)
|
||||||
|
|
||||||
|
HADOOP-8627. FS deleteOnExit may delete the wrong path (daryn via bobby)
|
||||||
|
|
||||||
Release 0.23.2 - UNRELEASED
|
Release 0.23.2 - UNRELEASED
|
||||||
|
|
||||||
NEW FEATURES
|
NEW FEATURES
|
||||||
|
|
|
@ -191,23 +191,6 @@ public class FilterFileSystem extends FileSystem {
|
||||||
return fs.delete(f, recursive);
|
return fs.delete(f, recursive);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Mark a path to be deleted when FileSystem is closed.
|
|
||||||
* When the JVM shuts down,
|
|
||||||
* all FileSystem objects will be closed automatically.
|
|
||||||
* Then,
|
|
||||||
* the marked path will be deleted as a result of closing the FileSystem.
|
|
||||||
*
|
|
||||||
* The path has to exist in the file system.
|
|
||||||
*
|
|
||||||
* @param f the path to delete.
|
|
||||||
* @return true if deleteOnExit is successful, otherwise false.
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public boolean deleteOnExit(Path f) throws IOException {
|
|
||||||
return fs.deleteOnExit(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** List files in a directory. */
|
/** List files in a directory. */
|
||||||
public FileStatus[] listStatus(Path f) throws IOException {
|
public FileStatus[] listStatus(Path f) throws IOException {
|
||||||
return fs.listStatus(f);
|
return fs.listStatus(f);
|
||||||
|
|
|
@ -179,7 +179,9 @@ public class TestFilterFileSystem {
|
||||||
public Token<?> getDelegationToken(String renewer) throws IOException {
|
public Token<?> getDelegationToken(String renewer) throws IOException {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
public boolean deleteOnExit(Path f) throws IOException {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
public String getScheme() {
|
public String getScheme() {
|
||||||
return "dontcheck";
|
return "dontcheck";
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.apache.hadoop.fs.FileStatus;
|
||||||
import org.apache.hadoop.fs.ContentSummary;
|
import org.apache.hadoop.fs.ContentSummary;
|
||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.FileSystemTestHelper;
|
import org.apache.hadoop.fs.FileSystemTestHelper;
|
||||||
|
import org.apache.hadoop.fs.FilterFileSystem;
|
||||||
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.viewfs.ChRootedFileSystem;
|
import org.apache.hadoop.fs.viewfs.ChRootedFileSystem;
|
||||||
|
@ -33,6 +34,7 @@ import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
public class TestChRootedFileSystem {
|
public class TestChRootedFileSystem {
|
||||||
FileSystem fSys; // The ChRoootedFs
|
FileSystem fSys; // The ChRoootedFs
|
||||||
|
@ -314,4 +316,37 @@ public class TestChRootedFileSystem {
|
||||||
public void testResolvePathNonExisting() throws IOException {
|
public void testResolvePathNonExisting() throws IOException {
|
||||||
fSys.resolvePath(new Path("/nonExisting"));
|
fSys.resolvePath(new Path("/nonExisting"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeleteOnExitPathHandling() throws IOException {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
conf.setClass("fs.mockfs.impl", MockFileSystem.class, FileSystem.class);
|
||||||
|
|
||||||
|
URI chrootUri = URI.create("mockfs://foo/a/b");
|
||||||
|
ChRootedFileSystem chrootFs = new ChRootedFileSystem(chrootUri, conf);
|
||||||
|
FileSystem mockFs = ((FilterFileSystem)chrootFs.getRawFileSystem())
|
||||||
|
.getRawFileSystem();
|
||||||
|
|
||||||
|
// ensure delete propagates the correct path
|
||||||
|
Path chrootPath = new Path("/c");
|
||||||
|
Path rawPath = new Path("/a/b/c");
|
||||||
|
chrootFs.delete(chrootPath, false);
|
||||||
|
verify(mockFs).delete(eq(rawPath), eq(false));
|
||||||
|
reset(mockFs);
|
||||||
|
|
||||||
|
// fake that the path exists for deleteOnExit
|
||||||
|
FileStatus stat = mock(FileStatus.class);
|
||||||
|
when(mockFs.getFileStatus(eq(rawPath))).thenReturn(stat);
|
||||||
|
// ensure deleteOnExit propagates the correct path
|
||||||
|
chrootFs.deleteOnExit(chrootPath);
|
||||||
|
chrootFs.close();
|
||||||
|
verify(mockFs).delete(eq(rawPath), eq(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
static class MockFileSystem extends FilterFileSystem {
|
||||||
|
MockFileSystem() {
|
||||||
|
super(mock(FileSystem.class));
|
||||||
|
}
|
||||||
|
public void initialize(URI name, Configuration conf) throws IOException {}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue