cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Marcus Crafter <craft...@fztig938.bank.dresdner.net>
Subject Re: [C2 patch] xsp generation & multiple threads
Date Thu, 30 Aug 2001 12:49:47 GMT
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 <crafterm@fztig938.bank.dresdner.net> 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 : Marcus.Crafter@osa.de
> >           &&&&.        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: cocoon-dev-unsubscribe@xml.apache.org
> > For additional commands, email: cocoon-dev-help@xml.apache.org
> 
> 
> =====
> 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: cocoon-dev-unsubscribe@xml.apache.org
> For additional commands, email: cocoon-dev-help@xml.apache.org
> 
> 

-- 
        .....
     ,,$$$$$$$$$,      Marcus Crafter
    ;$'      '$$$$:    Computer Systems Engineer
    $:         $$$$:   Open Software Associates GmbH
     $       o_)$$$:   82-84 Mainzer Landstrasse
     ;$,    _/\ &&:'   60327 Frankfurt Germany
       '     /( &&&
           \_&&&&'     Email : Marcus.Crafter@osa.de
          &&&&.        Business Hours : +49 69 9757 200
    &&&&&&&:


---------------------------------------------------------------------
To unsubscribe, e-mail: cocoon-dev-unsubscribe@xml.apache.org
For additional commands, email: cocoon-dev-help@xml.apache.org


Mime
View raw message