You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ni...@apache.org on 2010/10/08 06:02:57 UTC
svn commit: r1005707 - in /commons/proper/io/trunk/src:
main/java/org/apache/commons/io/FileCleaningTracker.java
test/java/org/apache/commons/io/FileCleaningTrackerTestCase.java
Author: niallp
Date: Fri Oct 8 04:02:57 2010
New Revision: 1005707
URL: http://svn.apache.org/viewvc?rev=1005707&view=rev
Log:
Fix to resolve OutOfMemoryError has now caused another issue. Try adding a *pause* to see if additional times allows the file delete to complete. If not provide a facility to show that the delete failed.
Modified:
commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileCleaningTracker.java
commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileCleaningTrackerTestCase.java
Modified: commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileCleaningTracker.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileCleaningTracker.java?rev=1005707&r1=1005706&r2=1005707&view=diff
==============================================================================
--- commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileCleaningTracker.java (original)
+++ commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileCleaningTracker.java Fri Oct 8 04:02:57 2010
@@ -19,9 +19,11 @@ package org.apache.commons.io;
import java.io.File;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.List;
/**
* Keeps track of files awaiting deletion, and deletes them when an associated
@@ -51,6 +53,10 @@ public class FileCleaningTracker {
*/
final Collection<Tracker> trackers = Collections.synchronizedSet(new HashSet<Tracker>()); // synchronized
/**
+ * Collection of File paths that failed to delete.
+ */
+ final List<String> deleteFailures = Collections.synchronizedList(new ArrayList<String>());
+ /**
* Whether to terminate the thread when the tracking is complete.
*/
volatile boolean exitWhenFinished = false;
@@ -151,6 +157,16 @@ public class FileCleaningTracker {
}
/**
+ * Return the file paths that failed to delete.
+ *
+ * @return the file paths that failed to delete
+ * @since Commons IO 2.0
+ */
+ public List<String> getDeleteFailures() {
+ return deleteFailures;
+ }
+
+ /**
* Call this method to cause the file cleaner thread to terminate when
* there are no more objects being tracked for deletion.
* <p>
@@ -205,7 +221,9 @@ public class FileCleaningTracker {
// Wait for a tracker to remove.
Tracker tracker = (Tracker) q.remove(); // cannot return null
trackers.remove(tracker);
- tracker.delete();
+ if (!tracker.delete()) {
+ deleteFailures.add(tracker.getPath());
+ }
tracker.clear();
} catch (InterruptedException e) {
continue;
@@ -244,6 +262,15 @@ public class FileCleaningTracker {
}
/**
+ * Return the path.
+ *
+ * @return the path
+ */
+ public String getPath() {
+ return path;
+ }
+
+ /**
* Deletes the file associated with this tracker instance.
*
* @return <code>true</code> if the file was deleted successfully;
Modified: commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileCleaningTrackerTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileCleaningTrackerTestCase.java?rev=1005707&r1=1005706&r2=1005707&view=diff
==============================================================================
--- commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileCleaningTrackerTestCase.java (original)
+++ commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileCleaningTrackerTestCase.java Fri Oct 8 04:02:57 2010
@@ -70,6 +70,7 @@ public class FileCleaningTrackerTestCase
{
theInstance.q = new ReferenceQueue<Object>();
theInstance.trackers.clear();
+ theInstance.deleteFailures.clear();
theInstance.exitWhenFinished = false;
theInstance.reaper = null;
}
@@ -94,9 +95,10 @@ public class FileCleaningTrackerTestCase
r = null;
waitUntilTrackCount();
+ pauseForDeleteToComplete(new File(path));
assertEquals(0, theInstance.getTrackCount());
- assertEquals(false, new File(path).exists());
+ assertEquals(showFailures(), false, new File(path).exists());
}
public void testFileCleanerDirectory() throws Exception {
@@ -150,10 +152,11 @@ public class FileCleaningTrackerTestCase
obj = null;
waitUntilTrackCount();
+ pauseForDeleteToComplete(testFile.getParentFile());
assertEquals(0, theInstance.getTrackCount());
- assertEquals(false, testFile.exists());
- assertEquals(false, testFile.getParentFile().exists());
+ assertEquals(showFailures(), false, testFile.exists());
+ assertEquals(showFailures(), false, testFile.getParentFile().exists());
}
public void testFileCleanerNull() throws Exception {
@@ -237,9 +240,10 @@ public class FileCleaningTrackerTestCase
r = null;
waitUntilTrackCount();
+ pauseForDeleteToComplete(new File(path));
assertEquals("10-Track Count", 0, theInstance.getTrackCount());
- assertEquals("11-testFile exists", false, new File(path).exists());
+ assertEquals("11-testFile exists " + showFailures(), false, new File(path).exists());
assertEquals("12-exitWhenFinished", true, theInstance.exitWhenFinished);
assertEquals("13-reaper.isAlive", false, theInstance.reaper.isAlive());
}
@@ -262,9 +266,10 @@ public class FileCleaningTrackerTestCase
r = null;
waitUntilTrackCount();
+ pauseForDeleteToComplete(new File(path));
assertEquals(0, theInstance.getTrackCount());
- assertEquals(false, new File(path).exists());
+ assertEquals(showFailures(), false, new File(path).exists());
assertEquals(false, theInstance.exitWhenFinished);
assertEquals(true, theInstance.reaper.isAlive());
@@ -278,6 +283,16 @@ public class FileCleaningTrackerTestCase
}
//-----------------------------------------------------------------------
+ private void pauseForDeleteToComplete(File file) throws Exception {
+ int count = 0;
+ while(file.exists() && count++ < 20) {
+ Thread.sleep(500L);
+ }
+ }
+ private String showFailures() throws Exception {
+ return "Failed to delete " + theInstance.deleteFailures.size() + " files";
+ }
+
private void waitUntilTrackCount() throws Exception {
int count = 0;
while(theInstance.getTrackCount() != 0 && count++ < 5) {