Hi Bart,

I've attached the patch to SiteMenuLinkRewriterImpl. We still have to do a
extensive test (hopefully next weekend) to determine how well this patch
works. I'll let you know about the results.

Regards,

Wouter Zelle


On Fri, Mar 12, 2010 at 11:09, Bart van der Schans <
b.vandersch...@onehippo.com> wrote:

> Hi Wouter,
>
> Thanks for your analysis. I'm not that familiar with the
> SitemenuLinkRewriterTranformer and it has been a long time since I had
> a look at the code. It sounds like there is something going wrong in
> there. I agree with your analysis and proposed (line of) change. Could
> you create an initial patch?
>
> Regards,
> Bart
>
> On Thu, Mar 11, 2010 at 12:40 PM, Wouter Zelle <wouter.ze...@gmail.com>
> wrote:
> > Hi,
> >
> > Occasionally we see incorrect translations of documents in the repository
> to
> > external urls. The same SitemenuLinkRewriterTranformer should never be
> used
> > by seperate threads, so the cause is probably in the
> > SiteMenuLinkRewriterImpl. One of the incorrect translations is for a
> > 'perfect match' (location is the same as the datasource), so the error
> > should be between lines 164-200 of the SiteMenuLinkRewriterImpl. In that
> > code range I noticed a fairly classic multi-threading bug (roughly
> speaking,
> > it is 'double-checked locking') on line 168:
> >
> > if (!(cache.containsKey(cacheKeyList) && cache.containsKey(cacheKeyMap)))
> {
> >     initialize(host);
> > }
> >
> > The initialize method is synchronized, but since the check isn't, a later
> > thread can use a semi-initialized cache, while an earlier thread is still
> in
> > the initialize method. A partial solution to this problem might be to
> place
> > a synchronize-block (locking the cache) around the code above (removing
> the
> > synchronization from the initialize method), which should prevent this
> > problem, would prevent duplicate initializations and would block other
> > threads (who are already translating) from seeing an partially
> initialized
> > cache (since the cache has synchronized methods, so cache.get will block
> > during the initialize). Of course, threads still might have to deal with
> a
> > cache that empties and/or get filled half-way through a translate, but
> > solving this requires a lot more synchronization.
> >
> > I expect that the performance penalty of this change will be minimal. Do
> you
> > agree that this might be a good change?
> >
> > Regards,
> >
> > Wouter Zelle
> > ********************************************
> > Hippocms-dev: Hippo CMS 6 development public mailinglist
> >
> > Searchable archives can be found at:
> > MarkMail: http://hippocms-dev.markmail.org
> > Nabble: http://www.nabble.com/Hippo-CMS-f26633.html
> >
> >
>
>
>
> --
> Hippo B.V.  -  Amsterdam
> Oosteinde 11, 1017 WT, Amsterdam, +31(0)20-5224466
>
> Hippo USA Inc.  -  San Francisco
> 101 H Street, Suite Q, Petaluma CA, 94952-3329, +1 (707) 773-4646
> -----------------------------------------------------------------
> http://www.onehippo.com   -  i...@onehippo.com
> -----------------------------------------------------------------
> ********************************************
> Hippocms-dev: Hippo CMS 6 development public mailinglist
>
> Searchable archives can be found at:
> MarkMail: http://hippocms-dev.markmail.org
> Nabble: http://www.nabble.com/Hippo-CMS-f26633.html
>
>

Attachment: threadsafety.patch
Description: Binary data

********************************************
Hippocms-dev: Hippo CMS 6 development public mailinglist

Searchable archives can be found at:
MarkMail: http://hippocms-dev.markmail.org
Nabble: http://www.nabble.com/Hippo-CMS-f26633.html

Reply via email to