Hi Dims,

On Wed, 29 Aug 2001, Davanum Srinivas wrote:

> Marcus,
> Checked in. Please cross-check.

        Looks good mate. Thanks.

        Cheers,
        
        Marcus
> 
> Thanks,
> dims
> 
> --- Marcus Crafter <[EMAIL PROTECTED]> wrote:
> > Hi All,
> > 
> >     Hope all is well.
> > 
> >     During our recent load tests I've come across a thread-related bug in
> >     the ProgramGenerator implementation. The symptoms are similar to the
> >     sitemap recompilation issue we faced last week.
> > 
> >     If 2 simultaneous requests ask for the same xsp resource, which is not
> >     compiled, or has changed, etc, then the that resource is created and
> >     loaded twice. If the loading of the class occurs while the second
> >     request is (re)compiling it, then very strange things happen.. :-)
> > 
> >     I've been able to reproduce this easily in our test environment, and
> >     have attached a patch (using the Carsten method (TM) :-) ) which fixes
> >     the problem. Hope it's all ok.
> > 
> >     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: 
>src/org/apache/cocoon/components/language/generator/ProgramGeneratorImpl.java
> > ===================================================================
> > RCS file:
> >
> 
>/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/components/language/generator/ProgramGeneratorImpl.java,v
> > retrieving revision 1.5.2.14
> > diff -u -r1.5.2.14 ProgramGeneratorImpl.java
> > --- src/org/apache/cocoon/components/language/generator/ProgramGeneratorImpl.java  
> 2001/08/22
> > 03:57:58    1.5.2.14
> > +++ src/org/apache/cocoon/components/language/generator/ProgramGeneratorImpl.java  
> 2001/08/29
> > 15:47:06
> > @@ -101,8 +101,9 @@
> >      }
> >  
> >      /**
> > -     * Set the global component manager. This metod also sets the
> > -     * <code>ComponentSelector</code> used as language factory for both markup 
>and programming
> > languages.
> > +     * Set the global component manager. This method also sets the
> > +     * <code>ComponentSelector</code> used as language factory for both markup
> > +     * and programming languages.
> >       * @param manager The global component manager
> >       */
> >      public void compose(ComponentManager manager) throws ComponentException {
> > @@ -171,7 +172,7 @@
> >              try {
> >                  programInstance = (CompiledComponent) select(normalizedName);
> >              } catch (Exception e) {
> > -                getLogger().debug("The instance was not accessible, creating it 
>now.");
> > +                getLogger().debug("The instance was not accessible from the 
>internal cache.
> > Proceeding.");
> >              }
> >      
> >              if ((programInstance == null) && this.preload) {
> > @@ -187,32 +188,11 @@
> >              }
> >      
> >              if (programInstance == null) {
> > -                MarkupLanguage markupLanguage = null;
> > -                ProgrammingLanguage programmingLanguage = null;
> > -                try {
> > -                    // Get markup and programming languages
> > -                    markupLanguage =
> > (MarkupLanguage)this.markupSelector.select(markupLanguageName);
> > -                    programmingLanguage =
> > (ProgrammingLanguage)this.languageSelector.select(programmingLanguageName);
> > -                    programmingLanguage.setLanguageName(programmingLanguageName);
> > -                    program = this.generateResource(newManager, fileName, 
>normalizedName,
> > markupLanguage, programmingLanguage, resolver);
> > -                } catch (LanguageException le) {
> > -                    getLogger().debug("Language Exception", le);
> > -                    throw new ProcessingException("Language Exception", le);
> > -                } finally {
> > -                    if (this.markupSelector != null) {
> > -                        this.markupSelector.release(markupLanguage);
> > -                    }
> > -    
> > -                    if (this.languageSelector != null) {
> > -                        this.languageSelector.release(programmingLanguage);
> > -                    }
> > -                }
> > -    
> > -                try {
> > -                    programInstance = (CompiledComponent) select(normalizedName);
> > -                } catch (Exception cme) {
> > -                    getLogger().debug("Can't load ServerPage", cme);
> > -                }
> > +           programInstance =
> > +                    this.createResource(
> > +                        newManager, fileName, normalizedName,
> > +                        markupLanguageName, programmingLanguageName, resolver
> > +                    );
> >              }
> >      
> >              if (this.autoReload == false) {
> > @@ -241,30 +221,80 @@
> >      
> >              if (programInstance == null) {
> >                  if (program == null) {
> > -                    MarkupLanguage markupLanguage = null;
> > -                    ProgrammingLanguage programmingLanguage = null;
> > -                    try {
> > -                        // Get markup and programming languages
> > -                        markupLanguage =
> > (MarkupLanguage)this.markupSelector.select(markupLanguageName);
> > -                        programmingLanguage =
> > (ProgrammingLanguage)this.languageSelector.select(programmingLanguageName);
> > -                        
>programmingLanguage.setLanguageName(programmingLanguageName);
> > -                        program = this.generateResource(newManager, fileName, 
>normalizedName,
> > markupLanguage, programmingLanguage, resolver);
> > -                    } catch (LanguageException le) {
> > -                        getLogger().debug("Language Exception", le);
> > -                        throw new ProcessingException("Language Exception", le);
> > -                    } finally {
> > -                        this.markupSelector.release(markupLanguage);
> > -                        this.languageSelector.release(programmingLanguage);
> > -                    }
> > -                }
> > -                // Instantiate
> > -                programInstance = (CompiledComponent) select(normalizedName);
> > +                    programInstance =
> > +                        this.createResource(
> > +                            newManager, fileName, normalizedName, 
> > +                            markupLanguageName, programmingLanguageName,
> > +                            resolver
> > +                        );
> > +                } else
> > +                    programInstance = (CompiledComponent) select(normalizedName);
> >              }
> >  
> >              return programInstance;
> >          } finally {
> >              source.recycle();
> >          }
> > +    }
> > +
> > +    /**
> > +     * Helper method to create resources in a threadsafe manner.
> > +     */
> > +    private CompiledComponent createResource(
> > +        ComponentManager newManager,
> > +        String fileName,
> > +        String normalizedName,
> > +        String markupLanguageName,
> > +        String programmingLanguageName,
> > +        SourceResolver resolver
> > +    )
> > +    throws Exception {
> > +
> > +        CompiledComponent programInstance = null;
> > +        MarkupLanguage markupLanguage = null;
> > +        ProgrammingLanguage programmingLanguage = null;
> > +        Class program = null;
> > +
> > +        // prevent 2 requests from generating this resource simultaneously
> > +        synchronized (this) {
> > +            try {
> > +                programInstance = (CompiledComponent) select(normalizedName);
> > +            } catch (Exception e) {
> > +
> > +                getLogger().debug(
> > +                     "Creating resource " +
> > +                     normalizedName.replace(File.separatorChar, '.') +
> > +                     ", using generator " + this
> > +                );
> > +
> > +                try {
> > +                    // Get markup and programming languages
> > +                    markupLanguage =
> > (MarkupLanguage)this.markupSelector.select(markupLanguageName);
> > +                    programmingLanguage =
> > (ProgrammingLanguage)this.languageSelector.select(programmingLanguageName);
> > +                    programmingLanguage.setLanguageName(programmingLanguageName);
> > +                    program = this.generateResource(newManager, fileName, 
>normalizedName,
> > markupLanguage, programmingLanguage, resolver);
> > +                } catch (LanguageException le) {
> > +                    getLogger().debug("Language Exception", le);
> > +                    throw new ProcessingException("Language Exception", le);
> > +                } finally {
> > +                    if (this.markupSelector != null) {
> > +                        this.markupSelector.release(markupLanguage);
> > +                    }
> > +
> > +                    if (this.languageSelector != null) {
> > +                        this.languageSelector.release(programmingLanguage);
> > +                    }
> > +                }
> > +
> > +                try {
> > +                    programInstance = (CompiledComponent) select(normalizedName);
> > +                } catch (Exception cme) {
> > +                    getLogger().debug("Can't load ServerPage", cme);
> > +                }
> > +            }
> > +        }
> > +
> > +   return programInstance;
> >      }
> >  
> >      private Class generateResource(ComponentManager newManager,
> > Index: src/org/apache/cocoon/components/language/programming/java/JavaLanguage.java
> > ===================================================================
> > RCS file:
> >
> 
>/home/cvspublic/xml-cocoon2/src/org/apache/cocoon/components/language/programming/java/JavaLanguage.java,v
> > retrieving revision 1.2.2.4
> > diff -u -r1.2.2.4 JavaLanguage.java
> > --- src/org/apache/cocoon/components/language/programming/java/JavaLanguage.java   
> 2001/08/21
> > 18:00:01    1.2.2.4
> > +++ src/org/apache/cocoon/components/language/programming/java/JavaLanguage.java   
> 2001/08/29
> > 15:47:06
> > @@ -149,11 +149,10 @@
> >        String pathname =
> >          baseDirectory.getCanonicalPath() + File.separator +
> >          name.substring(0, pos).replace(File.separatorChar, '/');
> > +      String filename_abs =
> > +        pathname + File.separator + filename + "." + this.getSourceExtension();
> >  
> > -      compiler.setFile(
> > -        pathname + File.separator +
> > -        filename + "." + this.getSourceExtension()
> > -      );
> > +      compiler.setFile(filename_abs);
> > 
> === message truncated ===> 
>---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, email: [EMAIL PROTECTED]
> 
> 
> =====
> Davanum Srinivas, JNI-FAQ Manager
> http://www.jGuru.com/faq/JNI
> 
> __________________________________________________
> Do You Yahoo!?
> Make international calls for as low as $.04/minute with Yahoo! Messenger
> http://phonecard.yahoo.com/
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, email: [EMAIL PROTECTED]
> 
> 

-- 
        .....
     ,,$$$$$$$$$,      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
    &&&&&&&:


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to