Hi *,

        Hope all is well.

        Michael and I have spent the day testing our C2 application with
        LoadRunner and have potentially uncovered a threading problem during
        sitemap creation.

        We're not experts with the code but from our understanding the
        following is happening, please let us know if we are right/wrong:

        There seems to be a problem with the getHandler() method, located in
        the sitemap Manager class (line 154). getHandler() attempts to access a
        sitemap handler object for each request for processing. If the handler
        object is not available it creates one, causing the sitemap to be
        generated.

        We've noticed under load, that many handler objects are created for
        the same sitemap. This is because getHandler() does not protect the
        following lines:

                Handler sitemapHandler = (Handler)sitemaps.get(source);

        and

                sitemaps.put(source, sitemapHandler);

        as a critical area.

        If multiple concurrent threads pass through getHandler() which are
        requests for resources from the same sitemap, the first line
        above will return null multiple times causing the same sitemap to be
        compiled several times, each by individual Handler objects.
        
        This happens because sitemaps.put() executes after each sitemap handler
        object is created (which can take time for large sitemaps), and cannot
        prevent other incoming threads from waiting until it adds the newly
        created handler object into the 'sitemaps' hashmap.

        When we synchronized the getHandler method to protect the
        getting/setting of the sitemaps hashmap, we saw that the sitemap
        handler object was created only once, and that the application
        performed much better under load. Previously the same sitemap handler
        object was created as many times as we had simultaneous threads
        make requests.

        Attached is a diff of the change we made. There might be a better
        solution as the Handler class seems to be built to handle this, it's
        just that the allocation of a new Handler objects per sitemap, defeats
        it's internal multi-thread logic.

        Any comments/thoughts/suggestions ?

        Cheers,

        Marcus

-- 
        .....
     ,,$$$$$$$$$,      Marcus Crafter
    ;$'      '$$$$:    Computer Systems Engineer
    $:         $$$$:   Open Software Associates GmbH
     $       o_)$$$:   82-84 Mainzer Landstrasse
     ;$,    _/\ &&:'   60327 Frankfurt Germany
       '     /( &&&
           \_&&&&'     Email : [EMAIL PROTECTED]
          &&&&.        Business Hours : +49 69 9757 200
    &&&&&&&:
Index: Manager.java
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/src/org/apache/cocoon/sitemap/Manager.java,v
retrieving revision 1.7
diff -u -r1.7 Manager.java
--- Manager.java        2001/07/12 12:28:19     1.7
+++ Manager.java        2001/08/18 20:13:12
@@ -151,7 +151,7 @@
     }
     */
 
-    private Handler getHandler(final ComponentManager newManager, final Environment 
environment, final String source, final boolean check_reload,
+    private synchronized Handler getHandler(final ComponentManager newManager, final 
+Environment environment, final String source, final boolean check_reload,
         final boolean reload_asynchron) throws Exception {
             Handler sitemapHandler = (Handler)sitemaps.get(source);
             if (sitemapHandler != null) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to