HADOOP-8635. Cannot cancel paths registered deleteOnExit (daryn via bobby)
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1367296 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
48a2e2b4e2
commit
7226dead1e
|
@ -865,6 +865,8 @@ Release 0.23.3 - UNRELEASED
|
|||
HADOOP-8550. hadoop fs -touchz automatically created parent directories
|
||||
(John George via bobby)
|
||||
|
||||
HADOOP-8635. Cannot cancel paths registered deleteOnExit (daryn via bobby)
|
||||
|
||||
Release 0.23.2 - UNRELEASED
|
||||
|
||||
INCOMPATIBLE CHANGES
|
||||
|
|
|
@ -1214,6 +1214,16 @@ public abstract class FileSystem extends Configured implements Closeable {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel the deletion of the path when the FileSystem is closed
|
||||
* @param f the path to cancel deletion
|
||||
*/
|
||||
public boolean cancelDeleteOnExit(Path f) {
|
||||
synchronized (deleteOnExit) {
|
||||
return deleteOnExit.remove(f);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete all files that were marked as delete-on-exit. This recursively
|
||||
|
|
|
@ -269,26 +269,82 @@ public class TestFileSystemCaching {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteOnExitChecksExists() throws Exception {
|
||||
public void testDelete() throws IOException {
|
||||
FileSystem mockFs = mock(FileSystem.class);
|
||||
FileSystem fs = new FilterFileSystem(mockFs);
|
||||
Path path = new Path("/a");
|
||||
|
||||
fs.delete(path, false);
|
||||
verify(mockFs).delete(eq(path), eq(false));
|
||||
reset(mockFs);
|
||||
fs.delete(path, true);
|
||||
verify(mockFs).delete(eq(path), eq(true));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteOnExit() throws IOException {
|
||||
FileSystem mockFs = mock(FileSystem.class);
|
||||
FileSystem fs = new FilterFileSystem(mockFs);
|
||||
Path p = new Path("/a");
|
||||
|
||||
// path has to exist for deleteOnExit to register it
|
||||
when(mockFs.getFileStatus(p)).thenReturn(new FileStatus());
|
||||
fs.deleteOnExit(p);
|
||||
verify(mockFs).getFileStatus(eq(p));
|
||||
fs.close();
|
||||
verify(mockFs).delete(eq(p), anyBoolean());
|
||||
Path path = new Path("/a");
|
||||
|
||||
// delete on close if path does exist
|
||||
when(mockFs.getFileStatus(eq(path))).thenReturn(new FileStatus());
|
||||
assertTrue(fs.deleteOnExit(path));
|
||||
verify(mockFs).getFileStatus(eq(path));
|
||||
reset(mockFs);
|
||||
|
||||
// make sure it doesn't try to delete a file that doesn't exist
|
||||
when(mockFs.getFileStatus(p)).thenReturn(new FileStatus());
|
||||
fs.deleteOnExit(p);
|
||||
verify(mockFs).getFileStatus(eq(p));
|
||||
when(mockFs.getFileStatus(eq(path))).thenReturn(new FileStatus());
|
||||
fs.close();
|
||||
verify(mockFs).getFileStatus(eq(path));
|
||||
verify(mockFs).delete(eq(path), eq(true));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteOnExitFNF() throws IOException {
|
||||
FileSystem mockFs = mock(FileSystem.class);
|
||||
FileSystem fs = new FilterFileSystem(mockFs);
|
||||
Path path = new Path("/a");
|
||||
|
||||
// don't delete on close if path doesn't exist
|
||||
assertFalse(fs.deleteOnExit(path));
|
||||
verify(mockFs).getFileStatus(eq(path));
|
||||
reset(mockFs);
|
||||
fs.close();
|
||||
verify(mockFs).getFileStatus(eq(p));
|
||||
verify(mockFs, never()).getFileStatus(eq(path));
|
||||
verify(mockFs, never()).delete(any(Path.class), anyBoolean());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testDeleteOnExitRemoved() throws IOException {
|
||||
FileSystem mockFs = mock(FileSystem.class);
|
||||
FileSystem fs = new FilterFileSystem(mockFs);
|
||||
Path path = new Path("/a");
|
||||
|
||||
// don't delete on close if path existed, but later removed
|
||||
when(mockFs.getFileStatus(eq(path))).thenReturn(new FileStatus());
|
||||
assertTrue(fs.deleteOnExit(path));
|
||||
verify(mockFs).getFileStatus(eq(path));
|
||||
reset(mockFs);
|
||||
fs.close();
|
||||
verify(mockFs).getFileStatus(eq(path));
|
||||
verify(mockFs, never()).delete(any(Path.class), anyBoolean());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCancelDeleteOnExit() throws IOException {
|
||||
FileSystem mockFs = mock(FileSystem.class);
|
||||
FileSystem fs = new FilterFileSystem(mockFs);
|
||||
Path path = new Path("/a");
|
||||
|
||||
// don't delete on close if path existed, but later cancelled
|
||||
when(mockFs.getFileStatus(eq(path))).thenReturn(new FileStatus());
|
||||
assertTrue(fs.deleteOnExit(path));
|
||||
verify(mockFs).getFileStatus(eq(path));
|
||||
assertTrue(fs.cancelDeleteOnExit(path));
|
||||
assertFalse(fs.cancelDeleteOnExit(path)); // false because not registered
|
||||
reset(mockFs);
|
||||
fs.close();
|
||||
verify(mockFs, never()).getFileStatus(any(Path.class));
|
||||
verify(mockFs, never()).delete(any(Path.class), anyBoolean());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -182,6 +182,9 @@ public class TestFilterFileSystem {
|
|||
public boolean deleteOnExit(Path f) throws IOException {
|
||||
return false;
|
||||
}
|
||||
public boolean cancelDeleteOnExit(Path f) throws IOException {
|
||||
return false;
|
||||
}
|
||||
public String getScheme() {
|
||||
return "dontcheck";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue