Author: markt Date: Fri Feb 12 17:51:06 2010 New Revision: 909528 URL: http://svn.apache.org/viewvc?rev=909528&view=rev Log: Add a find leaks option - with a suitable warning to the manager app (html & text)
Modified: tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java tomcat/trunk/java/org/apache/catalina/manager/LocalStrings.properties tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java Modified: tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java?rev=909528&r1=909527&r2=909528&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java (original) +++ tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java Fri Feb 12 17:51:06 2010 @@ -218,6 +218,8 @@ message = start(path); } else if (command.equals("/stop")) { message = stop(path); + } else if (command.equals("/findleaks")) { + message = findleaks(); } else { // Try GET doGet(request,response); @@ -616,6 +618,17 @@ args[4] = newNonce; writer.print(MessageFormat.format(UPLOAD_SECTION, args)); + // Diagnostics section + args = new Object[6]; + args[0] = sm.getString("htmlManagerServlet.diagnosticsTitle"); + args[1] = sm.getString("htmlManagerServlet.diagnosticsLeak"); + args[2] = response.encodeURL( + request.getContextPath() + "/html/findleaks"); + args[3] = newNonce; + args[4] = sm.getString("htmlManagerServlet.diagnosticsLeakWarning"); + args[5] = sm.getString("htmlManagerServlet.diagnosticsLeakButton"); + writer.print(MessageFormat.format(DIAGNOSTICS_SECTION, args)); + // Server Header Section args = new Object[7]; args[0] = sm.getString("htmlManagerServlet.serverTitle"); @@ -751,6 +764,33 @@ } /** + * Find potential memory leaks caused by web application reload. + * + * @see ManagerServlet#findleaks(PrintWriter) + * + * @return message String + */ + protected String findleaks() { + + StringBuilder msg = new StringBuilder(); + + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + + super.findleaks(printWriter); + + if (stringWriter.getBuffer().length() > 0) { + msg.append(sm.getString("htmlManagerServlet.findleaksList")); + msg.append(stringWriter.toString()); + } else { + msg.append(sm.getString("htmlManagerServlet.findleaksNone")); + } + + return msg.toString(); + } + + + /** * @see javax.servlet.Servlet#getServletInfo() */ @Override @@ -1126,7 +1166,7 @@ " <td class=\"row-left\" bgcolor=\"{13}\">\n" + " <form method=\"POST\" action=\"{8}\">\n" + " <small>\n" + - " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\"" + + " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\">" + " <input type=\"submit\" value=\"{9}\"> {10} <input type=\"text\" name=\"idle\" size=\"5\" value=\"{11}\"> {12} \n" + " </small>\n" + " </form>\n" + @@ -1137,11 +1177,11 @@ " <td class=\"row-left\" bgcolor=\"{13}\">\n" + " <small>{1}</small> \n" + " <form class=\"inline\" method=\"POST\" action=\"{2}\">" + - " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\"" + + " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\">" + " <small><input type=\"submit\" value=\"{3}\"></small>" + " </form>\n" + " <form class=\"inline\" method=\"POST\" action=\"{4}\">" + - " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\"" + + " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\">" + " <small><input type=\"submit\" value=\"{5}\"></small>" + " </form>\n" + " <form class=\"inline\" method=\"POST\" action=\"{6}\">" + @@ -1153,7 +1193,7 @@ " <td class=\"row-left\" bgcolor=\"{13}\">\n" + " <form method=\"POST\" action=\"{8}\">\n" + " <small>\n" + - " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\"" + + " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\">" + " <input type=\"submit\" value=\"{9}\"> {10} <input type=\"text\" name=\"idle\" size=\"5\" value=\"{11}\"> {12} \n" + " </small>\n" + " </form>\n" + @@ -1163,13 +1203,13 @@ private static final String STOPPED_DEPLOYED_APPS_ROW_BUTTON_SECTION = " <td class=\"row-left\" bgcolor=\"{13}\" rowspan=\"2\">\n" + " <form class=\"inline\" method=\"POST\" action=\"{0}\">" + - " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\"" + + " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\">" + " <small><input type=\"submit\" value=\"{1}\"></small>" + " </form>\n" + " <small>{3}</small> \n" + " <small>{5}</small> \n" + " <form class=\"inline\" method=\"POST\" action=\"{6}\">" + - " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\"" + + " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\">" + " <small><input type=\"submit\" value=\"{7}\"></small>" + " </form>\n" + " </td>\n" + @@ -1179,11 +1219,11 @@ " <td class=\"row-left\" bgcolor=\"{13}\" rowspan=\"2\">\n" + " <small>{1}</small> \n" + " <form class=\"inline\" method=\"POST\" action=\"{2}\">" + - " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\"" + + " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\">" + " <small><input type=\"submit\" value=\"{3}\"></small>" + " </form>\n" + " <form class=\"inline\" method=\"POST\" action=\"{4}\">" + - " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\"" + + " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\">" + " <small><input type=\"submit\" value=\"{5}\"></small>" + " </form>\n" + " <small>{7}</small> \n" + @@ -1193,7 +1233,7 @@ private static final String STOPPED_NONDEPLOYED_APPS_ROW_BUTTON_SECTION = " <td class=\"row-left\" bgcolor=\"{13}\" rowspan=\"2\">\n" + " <form class=\"inline\" method=\"POST\" action=\"{0}\">" + - " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\"" + + " <input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{14}\">" + " <small><input type=\"submit\" value=\"{1}\"></small>" + " </form>\n" + " <small>{3}</small> \n" + @@ -1215,7 +1255,7 @@ "<tr>\n" + " <td colspan=\"2\">\n" + "<form method=\"post\" action=\"{2}\">\n" + - "<input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{7}\"" + + "<input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{7}\" >" + "<table cellspacing=\"0\" cellpadding=\"3\">\n" + "<tr>\n" + " <td class=\"row-right\">\n" + @@ -1285,4 +1325,31 @@ "<br>\n" + "\n"; + private static final String DIAGNOSTICS_SECTION = + "<table border=\"1\" cellspacing=\"0\" cellpadding=\"3\">\n" + + "<tr>\n" + + " <td colspan=\"2\" class=\"title\">{0}</td>\n" + + "</tr>\n" + + "<tr>\n" + + " <td colspan=\"2\" class=\"header-left\"><small>{1}</small></td>\n" + + "</tr>\n" + + "<tr>\n" + + " <td colspan=\"2\">\n" + + "<form method=\"post\" action=\"{2}\">\n" + + "<input type=\"hidden\" name=\"" + NONCE_REQUEST + "\" value=\"{3}\" >" + + "<table cellspacing=\"0\" cellpadding=\"3\">\n" + + "<tr>\n" + + " <td class=\"row-left\">\n" + + " <input type=\"submit\" value=\"{5}\">\n" + + " </td>\n" + + " <td class=\"row-left\">\n" + + " <small>{4}</small>\n" + + " </td>\n" + + "</tr>\n" + + "</table>\n" + + "</form>\n" + + "</td>\n" + + "</tr>\n" + + "</table>\n" + + "<br>"; } Modified: tomcat/trunk/java/org/apache/catalina/manager/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/LocalStrings.properties?rev=909528&r1=909527&r2=909528&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/manager/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/manager/LocalStrings.properties Fri Feb 12 17:51:06 2010 @@ -43,6 +43,12 @@ htmlManagerServlet.deployUploadNoFile=FAIL - File upload failed, no file htmlManagerServlet.deployUploadWarExists=FAIL - War file \"{0}\" already exists on server htmlManagerServlet.deployWar=WAR or Directory URL: +htmlManagerServlet.diagnosticsLeak=Check to see if a web application has caused a memory leak on reload +htmlManagerServlet.diagnosticsLeakButton=Find leaks +htmlManagerServlet.diagnosticsLeakWarning=This diagnostic check will trigger a full garbage collection. Use it with extreme caution on production systems. +htmlManagerServlet.diagnosticsTitle=Diagnostics +htmlManagerServlet.findleaksList=The following web applications appear to have triggered a memory leak on reload (use a profiler to confirm):\n +htmlManagerServlet.findleaksNone=No web applications appear to have triggered a memory leak on reload. htmlManagerServlet.list=List Applications htmlManagerServlet.manager=Manager htmlManagerServlet.messageLabel=Message: @@ -64,6 +70,7 @@ managerServlet.deployFailed=FAIL - Failed to deploy application at context path {0} managerServlet.deployedButNotStarted=FAIL - Deployed application at context path {0} but context failed to start managerServlet.exception=FAIL - Encountered exception {0} +managerServlet.findleaksFail=FAIL - Find leaks failed: Host not instance of StandardHost managerServlet.invalidPath=FAIL - Invalid context path {0} was specified managerServlet.invalidWar=FAIL - Invalid application URL {0} was specified managerServlet.listed=OK - Listed applications for virtual host {0} Modified: tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java?rev=909528&r1=909527&r2=909528&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java (original) +++ tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java Fri Feb 12 17:51:06 2010 @@ -53,6 +53,7 @@ import org.apache.catalina.Session; import org.apache.catalina.UserDatabase; import org.apache.catalina.Wrapper; +import org.apache.catalina.core.StandardHost; import org.apache.catalina.core.StandardServer; import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.ServerInfo; @@ -364,6 +365,8 @@ stop(writer, path); } else if (command.equals("/undeploy")) { undeploy(writer, path); + } else if (command.equals("/findleaks")) { + findleaks(writer); } else { writer.println(sm.getString("managerServlet.unknownCommand", command)); @@ -497,6 +500,25 @@ /** + * Find potential memory leaks caused by web application reload. + */ + protected void findleaks(PrintWriter writer) { + + if (!(host instanceof StandardHost)) { + writer.println(sm.getString("managerServlet.findleaksFail")); + return; + } + + String[] results = + ((StandardHost) host).findReloadedContextMemoryLeaks(); + + for (String result : results) { + writer.println(result); + } + } + + + /** * Store server configuration. * * @param path Optional context path to save --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org