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]