Ok, so after some discussion with Thomas: * I agree that solution 2.3 is nice and we should probably go towards it in the future * I need a quick solution that can be committed for 6.2.1
As a conclusion I’ll implement the @DisposePriority annotation for now (it’s simple to do, I have it done actually). Then in the future we’ll be able to either keep it or deprecate it in favor of a better solution. Thanks -Vincent On 24 Sep 2014 at 09:46:38, Thomas Mortagne ([email protected](mailto:[email protected])) wrote: > On Wed, Sep 24, 2014 at 9:23 AM, [email protected] wrote: > > Hi Thomas, > > > > On 24 Sep 2014 at 08:58:56, Thomas Mortagne > > ([email protected](mailto:[email protected])) wrote: > > > >> On Tue, Sep 23, 2014 at 11:48 PM, [email protected] wrote: > >> > Hi devs, > >> > > >> > Right now there’s a problem when XWiki is shutdown. This is what > >> > currently happens: > >> > > >> > 2014-09-23 13:54:05,563 [Thread-1] DEBUG o.x.shutdown - Starting XWiki > >> > shutdown... > >> > 2014-09-23 13:54:05,563 [Thread-1] DEBUG o.x.shutdown - Stopping > >> > Database Connection Pool... > >> > 2014-09-23 13:54:05,735 [Thread-1] DEBUG o.x.shutdown - Database > >> > Connection Pool has been stopped > >> > 2014-09-23 13:54:10,513 [Thread-1] DEBUG o.x.shutdown - Stopping > >> > component > >> > [org.xwiki.localization.wiki.internal.DocumentTranslationBundleFactory]… > >> > 2014-09-23 13:54:10,513 [Thread-1] DEBUG o.x.shutdown - Component > >> > [org.xwiki.localization.wiki.internal.DocumentTranslationBundleFactory] > >> > has been stopped > >> > … > >> > 2014-09-23 13:54:10,514 [Thread-1] DEBUG o.x.shutdown - Stopping > >> > component [org.xwiki.search.solr.internal.DefaultSolrIndexer]... > >> > 2014-09-23 13:54:10,514 [Thread-1] DEBUG o.x.shutdown - Component > >> > [org.xwiki.search.solr.internal.DefaultSolrIndexer] has been stopped > >> > … > >> > 2014-09-23 13:54:10,539 [Thread-1] INFO o.x.shutdown - XWiki shutdown > >> > has been completed. > >> > > >> > As you can see the problem is that the DB is stopped first. So any code > >> > accessing the DB will get an error once the connection pool is stopped. > >> > This is why we get a lot stack traces when you ctrl-c XWiki quickly > >> > after it starts (i.e. when the init is not finished or when SOLR is > >> > still indexing). You can also get stack traces if a watchlist is being > >> > sent or some scheduler job is executing for example. > >> > > >> > There are 2 ways to fix this: > >> > - solution 1: all code that accesses the DB could check if an XWiki > >> > shutdown is in progress and don’t generate stack traces if this is the > >> > case > >> > - solution 2: stop the DB as the last thing, after everything else has > >> > stopped > >> > > >> > Obviously solution 2 is much better. > >> > > >> > I’ve started implementing it by doing this: > >> > - Remove the current HibernateShutdownEventListener since this is > >> > executed first during shutdown, before component disposal > >> > - Instead have XWikiHibernateStore implement Disposable and move the > >> > content of HibernateShutdownEventListener in that method > >> > > >> > This works already better but it’s not enough since ECM.dispose() works > >> > out the component dependencies but this works only for explicit > >> > dependencies and doesn’t work if a component uses the ComponentManager > >> > to dynamically find implementations (as this is the case for example for > >> > DefaultSolrIndexer). > >> > > >> > Thus in order to help the component disposal process, I propose to > >> > introduce a new annotation: @DisposePriority(int). > >> > > >> > Note that an alternative would be to introduce a new Disposable > >> > interface with a new getPriority() method in it (we cannot modify the > >> > current Disposable since that would break backward compat). > >> > >> It's always hard to know what priority to put exactly so this is last > >> resort solution for me. > > > > The idea is to use this only for special cases (like DB shutdown) since in > > the majority of cases the component dependency order would be enough. So in > > these few cases it’s quite easy and similar to Macro priority (which hasn’t > > proved to be a problem so far and is working well). > > > >> A few other alternatives: > >> 1) stop the DB after disposing components (I would not vote for it I > >> think but it should work for this use case) > > > > Yes I thought about this but I wanted something a bit more generic. See at > > the end of this email though. > > > >> 2) introduce something like a @ComponentDependency annotation to let > >> component declare indirect dependencies (ECM#dispose would simply add > >> @ComponentDependency annotations to its current dependencies based > >> ordering) and: > >> 2.1) even when a component does not directly use XWikiStoreInterface > >> (pretty much all of them are using XWiki methods and don't even know > >> about it officially) we could still ask them to declare something like > >> @ComponentDependency(XWikiStoreInterface.class) to indicate that they > >> want to be disposed after any component of this role. > > > > Yes I had also thought about this one but discarded because it means > > finding all components using indirectly XWikiStoreInterface and modifying > > them all. This means a lot of places (since a lot of places use the XWiki > > class for example) and a lot of work. > > > > I also find it a lot more complex to implement than a priority order which > > seems really the most simple solution. > > The dependencies based ordering is already what we have and 2) is just > about adding more depdencies. > > The first need is to add the annotation in the few places where we > have the issue (only SOLR right now AFAIK) so no it does not really > mean "finding all components using indirectly XWikiStoreInterface and > modifying them all" right away. > > > > >> 2.2) make XWiki instance a component instead of storing it in the > >> servlet context and inject it instead of accessing it through > >> XWikiContext (XWiki itself would inject the component it want). XWiki > >> itself would declare a > >> @ComponentDependency(XWikiStoreInterface.class). > >> 2.3) move all storage related methods from XWiki (saveDocument, > >> getDocument, etc) to another component (and remove XWikiContext > >> parameter to all these methods) which would be injected by components > >> directly instead of searching for the XWikiContext (that's how new > >> model will work but we can have another one before that still expose > >> olcore APIs like XWikiDocument). Then this component would take care > >> of declaring the @ComponentDependency(XWikiStoreInterface.class) (it's > >> not really possible to directly inject the right XWikiStoreInterface > >> since it's configuration based) > > > > These 2 alternatives are ok but they are a lot of work and could be done in > > the future. I was trying to find a solution that can be applied in 1/2 day > > right now. We need to fix our bug now and I fear we’ll just not do anything > > if we wait for 2.2 and 2.3 (which we can do on the longer run). > > 2.3 is mostly copy pasting and start using the new component in the > few places that have ordering issue (pretty much only SOLR right now). > Changing other places is not a priority, it's not like we were > refactoring the whole code each time we introduce a new API. > > > > > Since you don’t agree about priority and since I’d like to fix the shutdown > > “bug” for 6.2.x and on 6.3M1 now, I’m proposing the following alternative > > for now: > > > > * Introduce a new constructor in the ApplicationStoppedEvent class: > > ApplicationStoppedEvent(boolean afterDispose) > > * Modify XWikiServletContextListener.contextDestroyed() so that it sends > > the ApplicationStoppedEvent(false) before calling cm.dispose() and it sends > > the ApplicationStoppedEvent(true) after calling cm.dispose() > > * Keep HibernateShutdownEventListener but make it listen to > > ApplicationStoppedEvent(true) > > > > This will ensure it’s called after all components have been disposed. > > I doubt that would work. If the CM is disposed > HibernateShutdownEventListener won't exist anymore (and I'm not > talking about using the observation manager which is going to be > disposed officially, it's not doing anything special when disposed > right now but it might). > > > > > WDYT? Acceptable? > > > > Thanks > > -Vincent > > > >> > The idea is then to use this information in ECM.dispose() to first sort > >> > all components based on this and then only to order them with their > >> > dependencies. > >> > > >> > WDYT? > >> > > >> > Thanks > >> > -Vincent > > _______________________________________________ > > devs mailing list > > [email protected] > > http://lists.xwiki.org/mailman/listinfo/devs > > > > -- > Thomas Mortagne > _______________________________________________ > devs mailing list > [email protected] > http://lists.xwiki.org/mailman/listinfo/devs _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

