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]

Reply via email to