You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ke...@apache.org on 2005/12/13 00:00:38 UTC
svn commit: r356407 - in
/geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment:
Deployer.java util/DeploymentUtil.java
Author: kevan
Date: Mon Dec 12 15:00:35 2005
New Revision: 356407
URL: http://svn.apache.org/viewcvs?rev=356407&view=rev
Log:
Does a better job of cleaning up temporary deployment files. Doesn't get all files. Also, implementation could be better, but want to get this in. I'll improve as time permits...
Modified:
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/Deployer.java
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/util/DeploymentUtil.java
Modified: geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/Deployer.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/Deployer.java?rev=356407&r1=356406&r2=356407&view=diff
==============================================================================
--- geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/Deployer.java (original)
+++ geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/Deployer.java Mon Dec 12 15:00:35 2005
@@ -40,11 +40,13 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
import java.util.Set;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
@@ -57,6 +59,9 @@
*/
public class Deployer {
private static final Log log = LogFactory.getLog(Deployer.class);
+ private final int REAPER_INTERVAL = 60 * 1000;
+ private final Properties pendingDeletionIndex = new Properties();
+ private DeployerReaper reaper;
private final Collection builders;
private final ConfigurationStore store;
private final Kernel kernel;
@@ -65,6 +70,12 @@
this.builders = builders;
this.store = store;
this.kernel = kernel;
+
+ // Create and start the reaper...
+ this.reaper = new DeployerReaper(REAPER_INTERVAL);
+ Thread t = new Thread(reaper, "Geronimo Config Store Reaper");
+ t.setDaemon(true);
+ t.start();
}
public List deploy(File moduleFile, File planFile) throws DeploymentException {
@@ -73,10 +84,10 @@
if (moduleFile != null && !moduleFile.isDirectory()) {
// todo jar url handling with Sun's VM on Windows leaves a lock on the module file preventing rebuilds
// to address this we use a gross hack and copy the file to a temporary directory
- // unfortunately the lock on the file will prevent that being deleted properly
- // we need to rewrite deployment so that it does not use jar: urls
+ // the lock on the file will prevent that being deleted properly until the URLJarFile has
+ // been GC'ed.
try {
- tmpDir = File.createTempFile("deployer", ".tmpdir");
+ tmpDir = File.createTempFile("geronimo-deployer", ".tmpdir");
tmpDir.delete();
tmpDir.mkdir();
File tmpFile = new File(tmpDir, moduleFile.getName());
@@ -94,7 +105,9 @@
throw e.cleanse();
} finally {
if (tmpDir != null) {
- DeploymentUtil.recursiveDelete(tmpDir);
+ if (!DeploymentUtil.recursiveDelete(tmpDir)) {
+ pendingDeletionIndex.setProperty(tmpDir.getName(), new String("delete"));
+ }
}
}
}
@@ -270,7 +283,10 @@
}
return deployedURIs;
} else {
- DeploymentUtil.recursiveDelete(configurationDir);
+ if (!DeploymentUtil.recursiveDelete(configurationDir)) {
+ pendingDeletionIndex.setProperty(configurationDir.getName(), new String("delete"));
+ log.debug("Queued deployment directory to be reaped " + configurationDir);
+ }
return Collections.EMPTY_LIST;
}
} catch (InvalidConfigException e) {
@@ -278,7 +294,10 @@
throw new DeploymentException(e);
}
} catch(Throwable e) {
- DeploymentUtil.recursiveDelete(configurationDir);
+ if (!DeploymentUtil.recursiveDelete(configurationDir)) {
+ pendingDeletionIndex.setProperty(configurationDir.getName(), new String("delete"));
+ log.debug("Queued deployment directory to be reaped " + configurationDir);
+ }
if (targetFile != null) {
targetFile.delete();
}
@@ -298,6 +317,57 @@
}
}
+ /**
+ * Thread to cleanup unused temporary Deployer directories (and files).
+ * On Windows, open files can't be deleted. Until MultiParentClassLoaders
+ * are GC'ed, we won't be able to delete Config Store directories/files.
+ */
+ class DeployerReaper implements Runnable {
+ private final int reaperInterval;
+ private volatile boolean done = false;
+
+ public DeployerReaper(int reaperInterval) {
+ this.reaperInterval = reaperInterval;
+ }
+
+ public void close() {
+ this.done = true;
+ }
+
+ public void run() {
+ log.debug("ConfigStoreReaper started");
+ while(!done) {
+ try {
+ Thread.sleep(reaperInterval);
+ } catch (InterruptedException e) {
+ continue;
+ }
+ reap();
+ }
+ }
+
+ /**
+ * For every directory in the pendingDeletionIndex, attempt to delete all
+ * sub-directories and files.
+ */
+ public void reap() {
+ // return, if there's nothing to do
+ if (pendingDeletionIndex.size() == 0)
+ return;
+ // Otherwise, attempt to delete all of the directories
+ Enumeration list = pendingDeletionIndex.propertyNames();
+ while (list.hasMoreElements()) {
+ String dirName = (String)list.nextElement();
+ File deleteDir = new File(dirName);
+
+ if (!DeploymentUtil.recursiveDelete(deleteDir)) {
+ pendingDeletionIndex.remove(deleteDir);
+ log.debug("Reaped deployment directory " + deleteDir);
+ }
+ }
+ }
+ }
+
public static final GBeanInfo GBEAN_INFO;
private static final String DEPLOYER = "Deployer";
Modified: geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/util/DeploymentUtil.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/util/DeploymentUtil.java?rev=356407&r1=356406&r2=356407&view=diff
==============================================================================
--- geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/util/DeploymentUtil.java (original)
+++ geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/util/DeploymentUtil.java Mon Dec 12 15:00:35 2005
@@ -55,7 +55,7 @@
// be careful to clean up the temp directory
public static File createTempDir() throws IOException {
- File tempDir = File.createTempFile("geronimo-deployment-", ".tmp");
+ File tempDir = File.createTempFile("geronimo-deploymentUtil", ".tmpdir");
tempDir.delete();
tempDir.mkdirs();
return tempDir;
@@ -64,7 +64,7 @@
// be careful to clean up the temp file... we tell the vm to delete this on exit
// but VMs can't be trusted to acutally delete the file
public static File createTempFile() throws IOException {
- File tempFile = File.createTempFile("geronimo-deployment-", "tmp");
+ File tempFile = File.createTempFile("geronimo-deploymentUtil", ".tmpdir");
tempFile.deleteOnExit();
return tempFile;
}
@@ -220,9 +220,9 @@
}
}
- public static void recursiveDelete(File root) {
+ public static boolean recursiveDelete(File root) {
if (root == null) {
- return;
+ return true;
}
if (root.isDirectory()) {
@@ -238,7 +238,7 @@
}
}
}
- root.delete();
+ return root.delete();
}
public static Collection listRecursiveFiles(File file) {