提交 c57af869 编写于 作者: S Stephen Connolly 提交者: Oliver Gondža

[FIXED JENKINS-33681] Plugin filters were failing to be removed and blocking restart

(cherry picked from commit a5febd76)
上级 d72076c4
......@@ -25,6 +25,7 @@ package hudson.util;
import hudson.ExtensionPoint;
import hudson.security.SecurityRealm;
import java.util.ArrayList;
import jenkins.model.Jenkins;
import javax.annotation.CheckForNull;
......@@ -148,18 +149,26 @@ public class PluginServletFilter implements Filter, ExtensionPoint {
public static void cleanUp() {
PluginServletFilter instance = getInstance(Jenkins.getInstance().servletContext);
if (instance != null) {
for (Iterator<Filter> iterator = instance.list.iterator(); iterator.hasNext(); ) {
Filter f = iterator.next();
// While we could rely on the current implementation of list being a CopyOnWriteArrayList
// safer to just take an explicit copy of the list and operate on the copy
for (Filter f: new ArrayList<>(instance.list)) {
instance.list.remove(f);
// remove from the list even if destroy() fails as a failed destroy is still a destroy
try {
f.destroy();
} catch (RuntimeException e) {
LOGGER.log(Level.WARNING, "Filter " + f + " propagated an exception from its destroy method", e);
LOGGER.log(Level.WARNING, "Filter " + f + " propagated an exception from its destroy method",
e);
} catch (Error e) {
throw e; // we are not supposed to catch errors, don't log as could be an OOM
} catch (Throwable e) {
LOGGER.log(Level.SEVERE, "Filter " + f + " propagated an exception from its destroy method", e);
}
iterator.remove();
}
// if some fool adds a filter while we are terminating, we should just log the fact
if (!instance.list.isEmpty()) {
LOGGER.log(Level.SEVERE, "The following filters appear to have been added during clean up: {0}",
instance.list);
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册