ARTEMIS-958 Improve web server tmp dir cleanup

When server is shutdown by user the shutdown hook will check
if the tmpdir of the web server is cleaned up. However the cleanup
is also performed in a shutdown hook (using File.deleteOnExit).
Because the order of execution of hooks is not guaranteed,
if the tmp dir is not cleaned up by the time of check,
we should add a 'force' delete to make sure the tmp dir
is removed after server stop.
This commit is contained in:
Howard Gao 2017-02-14 09:34:06 +08:00 committed by Clebert Suconic
parent 8938c26cc0
commit f6670c9aaf
1 changed files with 13 additions and 2 deletions

View File

@ -29,6 +29,7 @@ import org.apache.activemq.artemis.components.ExternalComponent;
import org.apache.activemq.artemis.dto.AppDTO;
import org.apache.activemq.artemis.dto.ComponentDTO;
import org.apache.activemq.artemis.dto.WebServerDTO;
import org.apache.activemq.artemis.utils.FileUtil;
import org.apache.activemq.artemis.utils.TimeUtils;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
@ -43,9 +44,12 @@ import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.webapp.WebAppContext;
import org.jboss.logging.Logger;
public class WebServerComponent implements ExternalComponent {
private static final Logger logger = Logger.getLogger(WebServerComponent.class);
private Server server;
private HandlerList handlers;
private WebServerDTO webServerConfig;
@ -145,9 +149,16 @@ public class WebServerComponent implements ExternalComponent {
//tmpdir will be removed by deleteOnExit()
//somehow when broker is stopped and restarted quickly
//this tmpdir won't get deleted sometimes
boolean fileDeleted = TimeUtils.waitOnBoolean(false, 10000, tmpdir::exists);
boolean fileDeleted = TimeUtils.waitOnBoolean(false, 5000, tmpdir::exists);
if (!fileDeleted) {
ActiveMQWebLogger.LOGGER.tmpFileNotDeleted(tmpdir);
//because the execution order of shutdown hooks are
//not determined, so it's possible that the deleteOnExit
//is executed after this hook, in that case we force a delete.
FileUtil.deleteDirectory(tmpdir);
logger.debug("Force to delete temporary file on shutdown: " + tmpdir.getAbsolutePath());
if (tmpdir.exists()) {
ActiveMQWebLogger.LOGGER.tmpFileNotDeleted(tmpdir);
}
}
}
}