Re: Deadlock issue
Jacopo Cappellato <[email protected]>
| Newsgroups | gmane.comp.web.freemarker.user |
|---|---|
| Message-ID | <[email protected]> |
Thank you Daniel, please see my comments inline: On Apr 18, 2012, at 9:27 PM, Daniel Dekany wrote: > Wednesday, April 18, 2012, 5:06:07 PM, Jacopo Cappellato wrote: > >> ... >> Here are the details of the deadlock: >> >> Thread 1: >> a) ClassBasedModelFactory.get is called: this method acquires a lock on the "cache" variable >> b) the method then calls BeansWrapper.introspectClass: this method >> attempts to acquire a lock on "classCache" variable >> >> Thread 2: >> x) BeansWrapper.introspectClass is called: this method acquires a lock on the "classCache" variable >> y) the method then calls BeansWrapper.introspectClassInternal that in turn >> calls ClassBasedModelFactory.clearCache: this method attempts to >> acquire a lock on "cache" variable > > Yeah, that's wrong. And I see 2.3.19 does this too. Please let me know if you want me to file a ticket in the issue tracker. > >> If the two threads are concurrent and perform the tasks in the following order: >> a >> x >> b >> y >> we get the deadlock. >> >> Now: we are sure this is the cause of the problem; what we do not >> know, and I am hoping on your help, is what could be cause that 2 >> threads perform the calls axby on the two objects >> ClassBasedModelFactory and BeansWrapper >> I suspect it may be something wrong we are doing with Freemarker >> templates, include directives etc... > > It's a bug in FreeMarker, so it's not because you do something wrong. > It has to be fixed in FreeMarker. However, I smell something fishy > here... This deadlock can occur only if FreeMarker detects a > class-reloading, and then you also must be rather unlucky with the > timings. So it looks like class-reloading is frequent on your > production server, or at FreeMarker believes that. Is it possible that > you load the same class with different ClassLoader-s (like, different > versions of the same class)? Having different versions of the same > class around is normal with OSGi and like, but as far as I see (only > from a quick look though), the author of BeansWrapper haven't > considered that. So if you have that situation, FreeMarker will drop > the introspection caches often, which is already a bad thing, as it > can slow down things. Thanks for the useful information. We are actually using Freemarker in OFBiz (http://ofbiz.apache.org) and we have several production instances running without experiencing this deadlock. So I suspect (and I am investigating) we have some custom template that is causing the issue in this instance only. Could it be possible that the following condition causes the deadlock under high traffic? We have 2 ftl templates: template1.ftl: it contains content ftl directives etc... template2.ftl: it contains the following code: <header id="header"> <#include "template1.ftl"/> </header> and we have several threads that may render template1.ftl directly or template2.ftl Could this contribute to cause the deadlock? I am asking because we did the attempt to remove the <#include> directive and copy the content of template1.ftl directly in template2.ftl and this *seems* to resolve the problem (but we are still testing it). Thanks Jacopo ------------------------------------------------------------------------------ For Developers, A Lot Can Happen In A Second. Boundary is the first to Know...and Tell You. Monitor Your Applications in Ultra-Fine Resolution. Try it FREE! http://p.sf.net/sfu/Boundary-d2dvs2