diff --git a/core/pom.xml b/core/pom.xml
index 277d662ff1a37ff850965f99cb87948d9b0d5a8c..dd5ae4f8844e9cf2e654dd70e57336163635ed26 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -766,6 +766,7 @@ THE SOFTWARE.
0.5C
true
-XX:MaxPermSize=128m -noverify
+ false
diff --git a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java
index 444040d5894cdc5a9f0db1122994d13fc1910f8e..b7bb2b5f022df4b4d4caabc53349f85991e2bbc1 100644
--- a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java
+++ b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java
@@ -28,6 +28,7 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
+import org.apache.commons.io.FileUtils;
/**
* {@link OutputStream} that writes to a file.
@@ -48,6 +49,7 @@ public class RewindableFileOutputStream extends OutputStream {
private synchronized OutputStream current() throws IOException {
if (current == null) {
if (!closed) {
+ FileUtils.forceMkdir(out.getParentFile());
try {
current = new FileOutputStream(out,false);
} catch (FileNotFoundException e) {
diff --git a/core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java b/core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java
similarity index 53%
rename from core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java
rename to core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java
index 94fc5cf9ed61ef793dbc0d3705f68cccd3c04608..867ac546a689950296b532562c8f0087ea7da653 100644
--- a/core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java
+++ b/core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java
@@ -9,16 +9,20 @@ import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
+import org.apache.commons.io.FileUtils;
+import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
+import org.jvnet.hudson.test.Issue;
-/**
- * @author Kohsuke Kawaguchi
- */
-public class ReopenableRotatingFileOutputStreamTest {
+public class RewindableRotatingFileOutputStreamTest {
+
+ @Rule
+ public TemporaryFolder tmp = new TemporaryFolder();
@Test
public void rotation() throws IOException, InterruptedException {
- File base = File.createTempFile("test", "log");
- ReopenableRotatingFileOutputStream os = new ReopenableRotatingFileOutputStream(base,3);
+ File base = tmp.newFile("test.log");
+ RewindableRotatingFileOutputStream os = new RewindableRotatingFileOutputStream(base,3);
PrintWriter w = new PrintWriter(os,true);
for (int i=0; i<=4; i++) {
w.println("Content"+i);
@@ -35,4 +39,21 @@ public class ReopenableRotatingFileOutputStreamTest {
os.deleteAll();
}
+
+ @Issue("JENKINS-16634")
+ @Test
+ public void deletedFolder() throws Exception {
+ File dir = tmp.newFolder("dir");
+ File base = new File(dir, "x.log");
+ RewindableRotatingFileOutputStream os = new RewindableRotatingFileOutputStream(base, 3);
+ for (int i = 0; i < 2; i++) {
+ FileUtils.deleteDirectory(dir);
+ os.write('.');
+ FileUtils.deleteDirectory(dir);
+ os.write('.');
+ FileUtils.deleteDirectory(dir);
+ os.rewind();
+ }
+ }
+
}