This is an automated email from the ASF dual-hosted git repository.
markt-asf pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push:
new 9bcb96a3b5 Fix potential concurrency issue in the Manager web app
9bcb96a3b5 is described below
commit 9bcb96a3b5cadb24bb1a5aaf4d8029a1e08610bc
Author: Mark Thomas <[email protected]>
AuthorDate: Fri May 29 16:08:35 2026 +0100
Fix potential concurrency issue in the Manager web app
Ensure automatic deployment does not trigger an undeployment during a
Manager triggered web application reload.
Hopefully addresses a gump failure
---
.../apache/catalina/manager/ManagerServlet.java | 34 +++++++++++++---------
webapps/docs/changelog.xml | 4 +++
2 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/java/org/apache/catalina/manager/ManagerServlet.java
b/java/org/apache/catalina/manager/ManagerServlet.java
index 6a735b2769..a87d6b0b0d 100644
--- a/java/org/apache/catalina/manager/ManagerServlet.java
+++ b/java/org/apache/catalina/manager/ManagerServlet.java
@@ -1084,26 +1084,34 @@ public class ManagerServlet extends HttpServlet
implements ContainerServlet {
return;
}
+ String name = cn.getName();
try {
- Context context = (Context) host.findChild(cn.getName());
- if (context == null) {
- writer.println(
- smClient.getString("managerServlet.noContext",
Escape.htmlElementContent(cn.getDisplayName())));
- return;
- }
- // It isn't possible for the manager to reload itself
- if (context.getName().equals(this.context.getName())) {
- writer.println(smClient.getString("managerServlet.noSelf"));
- return;
+ if (tryAddServiced(name)) {
+ try {
+ Context context = (Context) host.findChild(name);
+ if (context == null) {
+ writer.println(
+ smClient.getString("managerServlet.noContext",
Escape.htmlElementContent(cn.getDisplayName())));
+ return;
+ }
+ // It isn't possible for the manager to reload itself
+ if (context.getName().equals(this.context.getName())) {
+
writer.println(smClient.getString("managerServlet.noSelf"));
+ return;
+ }
+ context.reload();
+
writer.println(smClient.getString("managerServlet.reloaded",
cn.getDisplayName()));
+ } finally {
+ removeServiced(name);
+ }
+ } else {
+ writer.println(smClient.getString("managerServlet.inService",
cn.getDisplayName()));
}
- context.reload();
- writer.println(smClient.getString("managerServlet.reloaded",
cn.getDisplayName()));
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
log(sm.getString("managerServlet.error.reload",
cn.getDisplayName()), t);
writer.println(smClient.getString("managerServlet.exception",
t.toString()));
}
-
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index b78eaf7515..695421b2b2 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -523,6 +523,10 @@
Fix double escaping in the context names for the JSON mode of the
manager servlet. (remm)
</fix>
+ <fix>
+ Manager. Ensure automatic deployment does not trigger an undeployment
+ during a Manager triggered web application reload. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="jdbc-pool">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]