I've attached to FELIX-500 a patch to do this.

On Tue, Feb 26, 2008 at 8:55 PM, Richard S. Hall <[EMAIL PROTECTED]> wrote:
> The "diagnoseClassLoadError()" method was always intended to be purely
>  for debugging purposes. It seems like it would be easier to just disable
>  it if the framework log level is not at least at DEBUG.
>
>  -> richard
>
>
>
>  Guillaume Nodet wrote:
>  > I've raised a JIRA with a patch that should accomodate this problem.
>  > I must admit this is not the cleanest thing, but given a 95%
>  > performance boost in my case
>  > I'd be happy it it is included :-)
>  > See https://issues.apache.org/jira/browse/FELIX-500
>  >
>  > On Mon, Feb 25, 2008 at 5:05 PM, Guillaume Nodet <[EMAIL PROTECTED]> wrote:
>  >
>  >> I suppose we could make the ClassNotFoundException class a static class, 
> give it
>  >>  a transient reference to the IModule and make sure the message is 
> extracted when
>  >>  the Exception is serialized.
>  >>  Thoughts ?
>  >>
>  >>
>  >>
>  >>  On Mon, Feb 25, 2008 at 4:47 PM, Dale Peakall <[EMAIL PROTECTED]> wrote:
>  >>  > These patches do have the problem that exceptions are supposed to be
>  >>  >  Serializable - and IModule is not Serializable.  I don't know if the
>  >>  >  information necessary to construct the message is Serializable and can
>  >>  >  be quickly extracted from the module definition - given the apparent
>  >>  >  run-time cost of the method I suspect not.
>  >>  >
>  >>  >
>  >>  >
>  >>  >  Stuart McCulloch wrote:
>  >>  >  > On 25/02/2008, Guillaume Nodet <[EMAIL PROTECTED]> wrote:
>  >>  >  >
>  >>  >  >> Thanks Stuart.  The exception was catched and the getMessage method
>  >>  >  >> called, so I've
>  >>  >  >> hacked a bit more, but the following patch seems to work great for 
> me.
>  >>  >  >>
>  >>  >  >
>  >>  >  >
>  >>  >  > cool, could you raise a JIRA issue and attach the combined patch - 
> thanks
>  >>  >  >
>  >>  >  > Index: src/main/java/org/apache/felix/moduleloader/ModuleImpl.java
>  >>  >  >
>  >>  >  >> ===================================================================
>  >>  >  >> --- src/main/java/org/apache/felix/moduleloader/ModuleImpl.java
>  >>  >  >> (revision 630863)
>  >>  >  >> +++ src/main/java/org/apache/felix/moduleloader/ModuleImpl.java 
> (working
>  >>  >  >> copy)
>  >>  >  >> @@ -147,10 +147,17 @@
>  >>  >  >>          }
>  >>  >  >>          catch (ClassNotFoundException ex)
>  >>  >  >>          {
>  >>  >  >> -            m_logger.log(
>  >>  >  >> -                Logger.LOG_WARNING,
>  >>  >  >> -                ex.getMessage(),
>  >>  >  >> -                ex);
>  >>  >  >> +            // Diagnosing the class loader error is very costly, 
> so only
>  >>  >  >> +            // perform this call (indirectly through 
> ex.getMessage())
>  >>  >  >> +            // if necessary.
>  >>  >  >> +            // See R4SearchPolicyCore#findClass
>  >>  >  >> +            if (m_logger.getLogLevel() >= Logger.LOG_WARNING)
>  >>  >  >> +            {
>  >>  >  >> +                m_logger.log(
>  >>  >  >> +                    Logger.LOG_WARNING,
>  >>  >  >> +                    ex.getMessage(),
>  >>  >  >> +                    ex);
>  >>  >  >> +            }
>  >>  >  >>          }
>  >>  >  >>          return null;
>  >>  >  >>
>  >>  >  >>      }
>  >>  >  >> Index:
>  >>  >  >> 
> src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java
>  >>  >  >> ===================================================================
>  >>  >  >> ---
>  >>  >  >> 
> src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java
>  >>  >  >>
>  >>  >  >>       (revision 630863)
>  >>  >  >>
>  >>  >  >> +++
>  >>  >  >> 
> src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java
>  >>  >  >>       (working copy)
>  >>  >  >> @@ -178,7 +178,7 @@
>  >>  >  >>          return null;
>  >>  >  >>      }
>  >>  >  >>
>  >>  >  >> -    public Class findClass(IModule module, String name)
>  >>  >  >> +    public Class findClass(final IModule module, final String 
> name)
>  >>  >  >>          throws ClassNotFoundException
>  >>  >  >>      {
>  >>  >  >>          try
>  >>  >  >>
>  >>  >  >> @@ -191,8 +191,13 @@
>  >>  >  >>
>  >>  >  >>          }
>  >>  >  >>          catch (ClassNotFoundException ex)
>  >>  >  >>          {
>  >>  >  >> -            String msg = diagnoseClassLoadError(module, name);
>  >>  >  >> -            throw new ClassNotFoundException(msg, ex);
>  >>  >  >>
>  >>  >  >> +            throw new ClassNotFoundException("", ex)
>  >>  >  >>
>  >>  >  >> +            {
>  >>  >  >> +                public String getMessage()
>  >>  >  >> +                {
>  >>  >  >> +                    return diagnoseClassLoadError(module, name);
>  >>  >  >> +                }
>  >>  >  >> +            };
>  >>  >  >>          }
>  >>  >  >>
>  >>  >  >>          // We should never reach this point.
>  >>  >  >>
>  >>  >  >>
>  >>  >  >>
>  >>  >  >> On Mon, Feb 25, 2008 at 3:37 PM, Stuart McCulloch
>  >>  >  >> <[EMAIL PROTECTED]> wrote:
>  >>  >  >>
>  >>  >  >>> On 25/02/2008, Guillaume Nodet <[EMAIL PROTECTED]> wrote:
>  >>  >  >>>  >
>  >>  >  >>>  > I'm currently working on ServiceMix 4 which uses Felix.\
>  >>  >  >>>  >
>  >>  >  >>>  > I have some really important performance problems in 
> classloading.
>  >>  >  >>>  > When loading JBI applications (they have some very specific
>  >>  >  >>>  > classloading architecture
>  >>  >  >>>  > that must be implemented to be JBI compliant), 95% of the time 
>  is
>  >>  >  >>>  > spent in the following method:
>  >>  >  >>>  >    R4SearchPolicyCore.diagnoseClassLoadError()
>  >>  >  >>>  > which is not really acceptable.
>  >>  >  >>>  >
>  >>  >  >>>  > The problem is that the classloader is built dynamically and 
> does not
>  >>  >  >>>  > completely rely on
>  >>  >  >>>  > OSGi.  For this reason, the classloader of JBI artifacts 
> delegates to
>  >>  >  >>>  > the parent classloader,
>  >>  >  >>>  > then looks inside its own jar.  This means there will be lots 
> of
>  >>  >  >>>  > ClassNotFoundException thrown
>  >>  >  >>>  > by the parents classloader (ultimately by Felix).
>  >>  >  >>>  >
>  >>  >  >>>  > Is there any way to maybe speed / disable the 
> diagnoseClassLoadError
>  >>  >  >>>  > method call which
>  >>  >  >>>  > is purely informative ?
>  >>  >  >>>
>  >>  >  >>>
>  >>  >  >>>  we could try a lazy-load approach (ie. only construct the string 
> in the
>  >>  >  >>>  getMessage method)
>  >>  >  >>>  for example, you might want to see if the following patch helps, 
> based
>  >>  >  >>>
>  >>  >  >> on
>  >>  >  >>
>  >>  >  >>>  the current trunk:
>  >>  >  >>>
>  >>  >  >>>  Index:
>  >>  >  >>>
>  >>  >  >>>  
> src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java
>  >>  >  >>>  
> ===================================================================
>  >>  >  >>>  ---
>  >>  >  >>>
>  >>  >  >>>  
> src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java
>  >>  >  >>>  (revision 630859)
>  >>  >  >>>  +++
>  >>  >  >>>
>  >>  >  >>>  
> src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java
>  >>  >  >>>  (working copy)
>  >>  >  >>>  @@ -178,7 +178,7 @@
>  >>  >  >>>          return null;
>  >>  >  >>>      }
>  >>  >  >>>
>  >>  >  >>>  -    public Class findClass(IModule module, String name)
>  >>  >  >>>  +    public Class findClass(final IModule module, final String 
> name)
>  >>  >  >>>          throws ClassNotFoundException
>  >>  >  >>>      {
>  >>  >  >>>          try
>  >>  >  >>>  @@ -191,8 +191,14 @@
>  >>  >  >>>          }
>  >>  >  >>>          catch (ClassNotFoundException ex)
>  >>  >  >>>          {
>  >>  >  >>>  -            String msg = diagnoseClassLoadError(module, name);
>  >>  >  >>>  -            throw new ClassNotFoundException(msg, ex);
>  >>  >  >>>  +            // lazy construction of exception message
>  >>  >  >>>  +            throw new ClassNotFoundException("", ex)
>  >>  >  >>>  +            {
>  >>  >  >>>  +                public String getMessage()
>  >>  >  >>>  +                {
>  >>  >  >>>  +                    return diagnoseClassLoadError(module, name);
>  >>  >  >>>  +                }
>  >>  >  >>>  +            };
>  >>  >  >>>          }
>  >>  >  >>>
>  >>  >  >>>          // We should never reach this point.
>  >>  >  >>>  @@ -3272,4 +3278,4 @@
>  >>  >  >>>
>  >>  >  >>>          return sb.toString();
>  >>  >  >>>      }
>  >>  >  >>>  -}
>  >>  >  >>>  \ No newline at end of file
>  >>  >  >>>  +}
>  >>  >  >>>
>  >>  >  >>>  although lazy construction might cause problems if people hold 
> onto
>  >>  >  >>>  the exception for a long time, but I don't think this is usually 
> the
>  >>  >  >>>
>  >>  >  >> case
>  >>  >  >>
>  >>  >  >>>
>  >>  >  >>>  I know the design of the JBI classloaders is not really a good 
> fit in
>  >>  >  >>>  > OSGi, so I will investigate
>  >>  >  >>>  > a better solution (leveraging more of OSGi classloaders) 
> anyway, but
>  >>  >  >>>
>  >>  >  >> I
>  >>  >  >>
>  >>  >  >>>  > still wanted to report
>  >>  >  >>>  > the problem.
>  >>  >  >>>  >
>  >>  >  >>>  >
>  >>  >  >>>  > --
>  >>  >  >>>  > Cheers,
>  >>  >  >>>  > Guillaume Nodet
>  >>  >  >>>  > ------------------------
>  >>  >  >>>  > Blog: http://gnodet.blogspot.com/
>  >>  >  >>>  >
>  >>  >  >>>
>  >>  >  >>>
>  >>  >  >>>
>  >>  >  >>>  --
>  >>  >  >>>  Cheers, Stuart
>  >>  >  >>>
>  >>  >  >>>
>  >>  >  >>
>  >>  >  >>
>  >>  >  >> --
>  >>  >  >>
>  >>  >  >> Cheers,
>  >>  >  >> Guillaume Nodet
>  >>  >  >> ------------------------
>  >>  >  >> Blog: http://gnodet.blogspot.com/
>  >>  >  >>
>  >>  >  >>
>  >>  >  >
>  >>  >  >
>  >>  >  >
>  >>  >  >
>  >>  >
>  >>  >
>  >>
>  >>
>  >>
>  >>  --
>  >>
>  >>
>  >> Cheers,
>  >>  Guillaume Nodet
>  >>  ------------------------
>  >>  Blog: http://gnodet.blogspot.com/
>  >>
>  >>
>  >
>  >
>  >
>  >
>



-- 
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/

Reply via email to