products forums blog support careers about
  History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: ROR-246
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Critical Critical
Assignee: Chris Williams
Reporter: Michelle Petersen
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
Aptana RadRails

org.rubypeople.rdt.core.IRubyProject error causes startup lag

Created: 11/Dec/07 09:27 PM   Updated: 06/Mar/08 02:32 PM
Component/s: None
Affects Version/s: 0.9.1
Fix Version/s: 1.0.0

Issue Links:
Duplicate
 

Importance: Critical
Studio Install Type: Standalone
Operating System: Windows XP
Participants: Chris Williams and Michelle Petersen


 Description  « Hide
Aptana Studio is really slow to start up. I found the following entries in my log, which Ingo believes relates to the slow startup time:

ENTRY org.eclipse.osgi 4 0 2007-12-11 16:57:04.978
!MESSAGE While loading class "org.rubypeople.rdt.core.IRubyProject", thread "Worker-4" timed out waiting (5000ms) for thread "Worker-1" to finish starting bundle "org.rubypeople.rdt.core". To avoid deadlock, thread "Worker-4" is proceeding but "org.rubypeople.rdt.core.IRubyProject" may not be fully initialized.
!STACK 0
java.lang.Exception: Generated exception.
at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.preFindLocalClass(EclipseLazyStarter.java:77)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:412)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:334)
at org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass(SingleSourcePackage.java:37)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:383)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:347)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at org.rubypeople.rdt.internal.launching.LaunchingPlugin.start(LaunchingPlugin.java:145)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:991)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:985)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:966)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:317)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:256)
at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:342)
at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.preFindLocalClass(EclipseLazyStarter.java:88)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:412)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:334)
at org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass(SingleSourcePackage.java:37)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:383)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:347)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:161)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:501)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:471)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:430)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:413)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:334)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:386)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:347)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass(BundleLoader.java:278)
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:227)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1245)
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:147)
at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:759)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:51)
at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:242)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:49)
at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:238)
at org.eclipse.ui.internal.EarlyStartupRunnable.getExecutableExtension(EarlyStartupRunnable.java:117)
at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:66)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
at org.eclipse.ui.internal.Workbench$21.run(Workbench.java:1775)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:58)

!ENTRY org.eclipse.osgi 4 0 2007-12-11 16:57:10.797
!MESSAGE While loading class "org.rubypeople.rdt.internal.core.RubyModelManager$5$1", thread "Worker-7" timed out waiting (5000ms) for thread "Worker-1" to finish starting bundle "org.rubypeople.rdt.core". To avoid deadlock, thread "Worker-7" is proceeding but "org.rubypeople.rdt.internal.core.RubyModelManager$5$1" may not be fully initialized.
!STACK 0
java.lang.Exception: Generated exception.
at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.preFindLocalClass(EclipseLazyStarter.java:77)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:412)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:334)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:386)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:347)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at org.rubypeople.rdt.internal.core.RubyModelManager$5.run(RubyModelManager.java:975)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:58)

!ENTRY org.eclipse.osgi 4 0 2007-12-11 16:57:10.847
!MESSAGE While loading class "com.aptana.rdt.AptanaRDTPlugin", thread "Worker-4" timed out waiting (5000ms) for thread "Worker-1" to finish starting bundle "com.aptana.rdt". To avoid deadlock, thread "Worker-4" is proceeding but "com.aptana.rdt.AptanaRDTPlugin" may not be fully initialized.
!STACK 0
java.lang.Exception: Generated exception.
at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.preFindLocalClass(EclipseLazyStarter.java:77)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:412)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:334)
at org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass(SingleSourcePackage.java:37)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:383)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:347)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at com.aptana.rdt.ui.RubyGemsInitializer.earlyStartup(RubyGemsInitializer.java:14)
at org.eclipse.ui.internal.EarlyStartupRunnable.runEarlyStartup(EarlyStartupRunnable.java:87)
at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:66)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
at org.eclipse.ui.internal.Workbench$21.run(Workbench.java:1775)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:58)



 All   Comments   Change History      Sort Order:
Chris Williams - 12/Dec/07 02:13 PM
I've just done a lot of moving IStartups into Job and UIJobs that get scheduled during the various plugin's activator's start() methods.

I think that these changes combined should make a noticeable difference in startup time. One particularly bad plugin was the Ruby Mylyn connector (I saw messages like yours above for the Mylyn stuff on my machine).

I turned on tracing for plugin startup time and the various plugins load up fairly quickly now (quicker than they did, but I still never saw > 5000ms).

This also had the side effect of making it so that no ruby plugins get loaded until they're used. The IStartup job that forced open the RadRails perspective the first time was also causing all the plugins to get loaded even if they were never used. So I commented it out, but now we need another mechanism for Aptana features to be able to force their own perspective open without having to resort to an IStartup that causes the plugins to get started unnecessarily.


Chris Williams - 26/Dec/07 12:20 PM
Are you guys still seeing this with the latest nightlies?

Chris Williams - 04/Mar/08 10:31 AM
I just made a change that puts the work into a job that gets fired off async from startup of plugin. This should hopefully eliminate this issue once and for all.

Chris Williams - 05/Mar/08 07:30 PM
We need to keep a lot of the code in RubyModelManager.startup() running as part of plugin's start method, but see if we can move some portions out into a Job. Moving the whole thing out to a Job caused much bigger problems.

Chris Williams - 06/Mar/08 02:31 PM
I've checked in another try at fixing this. Now only portions of the startup method are separated into Jobs that fire off async. The preferences still get set up as a result of starting the plugin, but the loading of loadpath variables and containers and the starting of the indexer are fored off as jobs.