db-torque-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Adrian Tarau (JIRA)" <j...@apache.org>
Subject [jira] Created: (TORQUE-115) TorqueInstance.init(Configuration) - wrong implementation
Date Thu, 22 May 2008 16:25:55 GMT
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
            Priority: Critical


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.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org


Mime
View raw message