[ https://issues.apache.org/jira/browse/TORQUE-115?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Thomas Fox closed TORQUE-115. ----------------------------- > TorqueInstance.init(Configuration) - wrong implementation > --------------------------------------------------------- > > Key: TORQUE-115 > URL: https://issues.apache.org/jira/browse/TORQUE-115 > Project: Torque > Issue Type: Bug > Components: Runtime > Affects Versions: 3.2, 3.3-RC1, 3.3-RC2, 3.3-RC3, 3.3 > Environment: Any > Reporter: Adrian Tarau > Assignee: Thomas Fox > Priority: Critical > Fix For: 4.0-beta1 > > > I was hunted by this bug for a long time, but I didn't had time to > investigate. Since it happens mostly(almost every time) on my workstation and > not in production I wasn't worry about it until now, when I have in > investigate some huge performance degradation and I cannot do it if the > AbstractBaseManager.setRegion doesn't work during development. It is actually > also a bug of Scarab(I will post a similar bug in their bug tracking) which > it is possible due wrong handling during Torque initialization. > I'm using Scarab (http://scarab.tigris.org/) and they use Turbine & Torque. > Everything works nice, except that Torque is initialized twice. > First, it is initialize by Turbine and the stack trace is this one : > main@1, priority=5, in group 'main', status: 'RUNNING' > at > org.tigris.scarab.components.TorqueComponent.initialize(TorqueComponent.java:105) > at > org.apache.fulcrum.yaafi.framework.container.ServiceComponentImpl.initialize(ServiceComponentImpl.java:280) > at > org.apache.fulcrum.yaafi.framework.container.ServiceContainerImpl.incarnate(ServiceContainerImpl.java:472) > at > org.apache.fulcrum.yaafi.framework.container.ServiceContainerImpl.incarnate(ServiceContainerImpl.java:522) > at > org.apache.fulcrum.yaafi.framework.container.ServiceContainerImpl.initialize(ServiceContainerImpl.java:201) > at > org.apache.fulcrum.yaafi.framework.factory.ServiceManagerFactory.create(ServiceManagerFactory.java:141) > at > org.apache.turbine.services.yaaficomponent.TurbineYaafiComponentService.init(TurbineYaafiComponentService.java:194) > at > org.apache.fulcrum.BaseServiceBroker.initService(BaseServiceBroker.java:398) > at > org.apache.fulcrum.BaseServiceBroker.doInitService(BaseServiceBroker.java:477) > at > org.apache.fulcrum.BaseServiceBroker.initServices(BaseServiceBroker.java:449) > at org.apache.fulcrum.BaseServiceBroker.init(BaseServiceBroker.java:262) > at org.apache.turbine.Turbine.configure(Turbine.java:707) > at org.apache.turbine.Turbine.init(Turbine.java:193) > at > org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1,105) > at > org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:932) > at > org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3,951) > at > org.apache.catalina.core.StandardContext.start(StandardContext.java:4,225) > at > org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759) > at > org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739) > at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524) > at > org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:608) > at > org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:535) > at > org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470) > at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1,122) > at > org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310) > at > org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) > at > org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1,021) > at org.apache.catalina.core.StandardHost.start(StandardHost.java:718) > at > org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1,013) > at > org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442) > at > org.apache.catalina.core.StandardService.start(StandardService.java:450) > at > org.apache.catalina.core.StandardServer.start(StandardServer.java:709) > at org.apache.catalina.startup.Catalina.start(Catalina.java:551) > at > sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:585) > at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294) > at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432) > Second time is initialize by a Search Service and the stack trace looks like > this : > Thread-2@854, priority=5, in group 'UpdateIndex', status: 'RUNNING' > at > org.tigris.scarab.components.TorqueComponent.initialize(TorqueComponent.java:104) > at > org.apache.fulcrum.yaafi.framework.container.ServiceComponentImpl.initialize(ServiceComponentImpl.java:280) > at > org.apache.fulcrum.yaafi.framework.container.ServiceContainerImpl.incarnate(ServiceContainerImpl.java:472) > at > org.apache.fulcrum.yaafi.framework.container.ServiceContainerImpl.incarnate(ServiceContainerImpl.java:522) > at > org.apache.fulcrum.yaafi.framework.container.ServiceContainerImpl.initialize(ServiceContainerImpl.java:201) > at > org.apache.fulcrum.yaafi.framework.factory.ServiceManagerFactory.create(ServiceManagerFactory.java:141) > at > org.apache.turbine.services.yaaficomponent.TurbineYaafiComponentService.init(TurbineYaafiComponentService.java:194) > at > org.apache.fulcrum.BaseServiceBroker.getService(BaseServiceBroker.java:572) > at > org.tigris.scarab.services.ServiceManager.getService(ServiceManager.java:91) > at > org.tigris.scarab.services.ServiceManager.lookup(ServiceManager.java:75) > at > org.tigris.scarab.util.word.SearchFactory.getInstance(SearchFactory.java:73) > at > org.tigris.scarab.util.word.LuceneSearchIndex$UpdateThread.run(LuceneSearchIndex.java:781) > at java.lang.Thread.run(Thread.java:595) > I'm not sure why Search Service tries to initialize Torque again(it should be > initialize by Turbine), anyway this is not related with Torque but this is > how I was able to find this bug. > Also they change TorqueComponent, which looks like this : > public class TorqueComponent > extends org.apache.torque.avalon.TorqueComponent > { > > static{ > ScarabUtil.initializeScarab(); > } > > public TorqueComponent() > { > super(); > } > /** > * Creates a new instance. > * > * @param torqueInstance The instance of the Torque core used by > * this component. > */ > protected TorqueComponent(TorqueInstance torqueInstance) > { > super(torqueInstance); > } > /** > * @see > org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration) > */ > public void configure(Configuration configuration) > throws ConfigurationException > { > // we retrieve the configuration from Turbine runtime @see > #initialize() > getLogger().debug("configure(" + configuration + ")"); > } > /** > * @see org.apache.avalon.framework.activity.Initializable#initialize() > */ > public void initialize() > throws Exception > { > getLogger().debug("initialize()"); > //return the configuration object with the torque values only. > Torque.init(Turbine.getConfiguration()); > } > } > You can see they initialize Torque with Turbine configuration(composite > configuration, it contains also Torque configuration file) and since > TorqueComponent.initialize() is called twice, > TorqueInstance.init(Configuration) is called twice. > The current implementation of TorqueInstance.init(Configuration) is wrong. > First it changes the configuration and than calls initialize() which should > change the current configuration with "conf.subset(Torque.TORQUE_KEY)" . > Because Torque was already intialized, TorqueInstance.initialize() returns > without changing the configuration with a subset configuration. Due this > improper initialization, when Search Services starts Torque gets a composite > configuration(Turbine's configuration) instead of a subset of Turbine > configuration(Torque's configuration). Every Configuration.getXX() fails > (returns default values), cache is not initialized and maybe some other > (lazy) things are not correct either. > private synchronized void initialize() throws TorqueException > { > log.debug("initialize()"); > if (isInit) > { > log.debug("Multiple initializations of Torque attempted"); > return; > } > if (conf == null || conf.isEmpty()) > { > throw new TorqueException("Torque cannot be initialized without " > + "a valid configuration. Please check the log files " > + "for further details."); > } > ..... > } > public void init(Configuration conf) > throws TorqueException > { > log.debug("init(" + conf + ")"); > setConfiguration(conf); > initialize(); > } > I will propose a fix for Scarab > if (!Torque.isInit()) { > Torque.init(Turbine.getConfiguration()); > } > but this should be fixed also in Torque to prevent users making mistakes like > this one. > Also " log.debug("Multiple initializations of Torque attempted");" was not > very inspired because usually you don't activate debug level on Torque, even > during development(except you suspect something is really wrong with Torque). > It should be logged with error level(better throw an exception) if calling > init() is wrong or in the worst case it should skip calls to init() after > first call. > I think Torque should throw an exception in initialize() but also should > avoid changing the configuration before calling initialize(). > Thanks. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: torque-dev-unsubscr...@db.apache.org For additional commands, e-mail: torque-dev-h...@db.apache.org