From: markt Date: Thu, 30 Jun 2011 12:16:37 +0000 (+0000) Subject: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51445 X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=ee0bd0fbed45f5a04dbabc335f156a8902a1d509;p=tomcat7.0 Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51445 Correctly initialise all instances of Servlets that implement SingleThreadModel. Based on a patch by Felix Schumacher. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1141502 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/core/StandardWrapper.java b/java/org/apache/catalina/core/StandardWrapper.java index e30149fd5..ba2b2feb2 100644 --- a/java/org/apache/catalina/core/StandardWrapper.java +++ b/java/org/apache/catalina/core/StandardWrapper.java @@ -1115,14 +1115,14 @@ public class StandardWrapper extends ContainerBase classLoadTime=(int) (System.currentTimeMillis() -t1); - initServlet(servlet); - - // Register our newly initialized instance singleThreadModel = servlet instanceof SingleThreadModel; if (singleThreadModel) { if (instancePool == null) instancePool = new Stack(); } + + initServlet(servlet); + fireContainerEvent("load", this); loadTime=System.currentTimeMillis() -t1; @@ -1186,7 +1186,7 @@ public class StandardWrapper extends ContainerBase private synchronized void initServlet(Servlet servlet) throws ServletException { - if (instanceInitialized) return; + if (instanceInitialized && !singleThreadModel) return; // Call the initialization method of this servlet try { diff --git a/test/org/apache/catalina/core/TestStandardWrapper.java b/test/org/apache/catalina/core/TestStandardWrapper.java index 795e63fea..397a77401 100644 --- a/test/org/apache/catalina/core/TestStandardWrapper.java +++ b/test/org/apache/catalina/core/TestStandardWrapper.java @@ -333,7 +333,7 @@ public class TestStandardWrapper extends TomcatBaseTest { public static final int BUG51445_THREAD_COUNT = 5; - public void testBug51445() throws Exception { + public void testBug51445AddServlet() throws Exception { Tomcat tomcat = getTomcatInstance(); // Must have a real docBase - just use temp @@ -370,6 +370,46 @@ public class TestStandardWrapper extends TomcatBaseTest { } + public void testBug51445AddChild() throws Exception { + Tomcat tomcat = getTomcatInstance(); + + // Must have a real docBase - just use temp + StandardContext ctx = (StandardContext) + tomcat.addContext("", System.getProperty("java.io.tmpdir")); + + StandardWrapper wrapper = new StandardWrapper(); + wrapper.setServletName("Bug51445"); + wrapper.setServletClass(Bug51445Servlet.class.getName()); + ctx.addChild(wrapper); + ctx.addServletMapping("/", "Bug51445"); + + tomcat.start(); + + // Start the threads + Bug51445Thread[] threads = new Bug51445Thread[5]; + for (int i = 0; i < BUG51445_THREAD_COUNT; i ++) { + threads[i] = new Bug51445Thread(getPort()); + threads[i].start(); + } + + // Wait for threads to finish + for (int i = 0; i < BUG51445_THREAD_COUNT; i ++) { + threads[i].join(); + } + + Set servlets = new HashSet(); + // Check the result + for (int i = 0; i < BUG51445_THREAD_COUNT; i ++) { + String[] results = threads[i].getResult().split(","); + assertEquals(2, results.length); + assertEquals("10", results[0]); + System.out.println(results[1]); + assertFalse(servlets.contains(results[1])); + servlets.add(results[1]); + } + + } + private static class Bug51445Thread extends Thread { private int port; diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index b5481e71d..0a18d55c9 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -176,6 +176,11 @@ Improve the handling for Servlets that implement the deprecated SingleThreadModel when embedding Tomcat. (markt) + + 51445: Correctly initialise all instances of Servlets that + implement SingleThreadModel. Based on a patch by Felix Schumacher. + (markt) +