W dniu 2014-02-16 22:05, Dominique Pellé pisze:
> Daniel Naber <daniel.na...@languagetool.org
> <mailto:daniel.na...@languagetool.org>> wrote:
>
>  > On 2014-02-01 17:08, Xavi Ivars wrote
>  >
>  >>> wget -q -T 1 localhost:8081/Languages
>  >>
>  >> If it works, then I do nothing, but if it doesn't succeed, then I kill
>  >> the process (if it's still there) and I restart it again.
>  >
>  > That wasn't enough for me, as sometimes the server had a high load but
>  > still replied to some requests or so, so I'm using a script that checks
>  > the load the process causes. It's a bad hack, we shouldn't stop fixing
>  > the actual reason for these problems (I sent you the script anyway via
>  > email)...
>
> Hi
>
> Regarding the server hanging problem (which I believe is still
> happening, but I'd love to be wrong), it's likely the be a
> race condition. One thing I noticed in the source code, is the
> frequent use of "double-checked locking" pattern (or anti-pattern).
>
> Here is an example taken from
> languagetool/languagetool-language-modules/de/src/main/java/org/languagetool/language/German.java:
>
>   99   @Override
> 100   public Tagger getTagger() {
> 101     if (tagger == null) {
> 102       synchronized (this) {
> 103         if (tagger == null) {
> 104           tagger = new GermanTagger();
> 105         }
> 106       }
> 107     }
> 108     return tagger;
> 109   }
>
> This optimization is not safe as far as I know.  In fact,
> I just looked it up and wikipedia confirms it. See:
>
> http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java
>
> == BEGIN QUOTE from wikipedia ==
> [...] this technique has many subtle problems and should
> usually be avoided.
>
> [...]
>
> One of the dangers of using double-checked locking in J2SE 1.4
> (and earlier versions) is that it will often appear to work: it is not
> easy to distinguish between a correct implementation of the
> technique and one that has subtle problems. Depending on
> the compiler, the interleaving of threads by the scheduler and
> the nature of other concurrent system activity, failures resulting
> from an incorrect implementation of double-checked locking
> may only occur intermittently. Reproducing the failures can
> be difficult.
> == END QUOTE ==
>
> Besides the example in...
> languagetool/languagetool-language-modules/de/src/main/java/org/languagetool/language/German.java
>
> ... I see the double-checked lock anti-pattern being used
> at least here:
>
> languagetool-language-modules/ca/src/main/java/org/languagetool/tagging/ca/CatalanTagger.java
>
> languagetool-language-modules/pl/src/main/java/org/languagetool/synthesis/pl/PolishSynthesizer.java
>
> languagetool-language-modules/de/src/main/java/org/languagetool/tagging/de/GermanTagger.java
> (this is looks worse, as the check involves multiple variables)
>
> languagetool-core/src/main/java/org/languagetool/synthesis/BaseSynthesizer.java
>
> languagetool-core/src/main/java/org/languagetool/tagging/BaseTagger.java
>
> The wikipedia page proposes Java alternatives. See:
> http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java
>
> Of course, it may not be the root cause of server instabilities,
> but it looks worth fixing it.

I fixed some of those but I also ran a stress test using JMeter. It 
turns out that we had a major problem in BaseSynthesiser.lookup -- 
IStemmer.lookup() is not thread-safe, so we need to acquire a look 
before calling it. After adding a lock, lots of exceptions are gone. 
This may explain a lot of crashes.

I'll look into other cases as well.

Regards,
Marcin

------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
_______________________________________________
Languagetool-devel mailing list
Languagetool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/languagetool-devel

Reply via email to