gnosygnu / xowa

xowa offline wiki application
Other
374 stars 41 forks source link

Thread: fetchLanguageNames needs synchronized (frwiki invoke failed gplx.Err: counts do not match) #549

Closed desb42 closed 5 years ago

desb42 commented 5 years ago

having made the changes for #531 I started a hdump build of frwiki 2019-06-01 and got many errors of the form

20190812_155910.161 invoke failed: Liévin {{#invoke:Biblio|ouvrage}}
 [err 0] <gplx> @g:/xowa/bin/any/xowa/xtns/Scribunto/engines/Luaj/MWServer.lua:59 vm error: gplx.Err: counts do not match; same key is either added twice, or delete failed: proc=Add_base key=null:mw hash=3 list=10
  stack traceback:
  g:/xowa/bin/any/xowa/xtns/Scribunto/engines/Luaj/MWServer.lua:53: in function <g:/xowa/bin/any/xowa/xtns/Scribunto/engines/Luaj/MWServer.lua:52>
  Module:Langue/Data:1: in main chunk
  package.lua:90: in function '__index'
  mw.lua:491: in function '__index'
  mw.lua:779: in function <mw.lua:778>
  Module:Langue:1: in main chunk
  package.lua:90: in function <package.lua:89>
  Module:Biblio/Ouvrage:1: in main chunk
  package.lua:90: in function '__index'
  Module:Biblio:10: in function <Module:Biblio:9>
  mw.lua:531: in function <mw.lua:530>
  [Java]: in function '__index'
  g:/xowa/bin/any/xowa/xtns/Scribunto/engines/Luaj/MWServer.lua:75: in function <g:/xowa/bin/any/xowa/xtns/Scribunto/engines/Luaj/MWServer.lua:74>
  [Java]: in ?: ttl=Liévin excerpt={{#invoke:Biblio|ouvrage}}
  [trace]:
    gplx.xowa.xtns.scribunto.Scrib_core.Handle_error(Scrib_core.java:226)
    gplx.xowa.xtns.scribunto.engines.luaj.Luaj_engine.Dispatch_as_kv_ary(Luaj_engine.java:84)
    gplx.xowa.xtns.scribunto.engines.luaj.Luaj_engine.CallFunction(Luaj_engine.java:59)
    gplx.xowa.xtns.scribunto.Scrib_core.Invoke(Scrib_core.java:192)
    gplx.xowa.xtns.scribunto.Scrib_invoke_func.Func_evaluate(Scrib_invoke_func.java:80)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn_.Eval_func(Xot_invk_tkn_.java:30)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Xot_invk_tkn.java:258)
    gplx.xowa.parsers.tmpls.Xot_defn_tmpl.Tmpl_evaluate(Xot_defn_tmpl.java:87)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Xot_invk_tkn.java:288)
    gplx.xowa.parsers.tmpls.Xot_tmpl_wtr.Write_tkn(Xot_tmpl_wtr.java:104)
    gplx.xowa.parsers.tmpls.Xot_tmpl_wtr.Write_tkn(Xot_tmpl_wtr.java:35)
    gplx.xowa.parsers.tmpls.Xot_tmpl_wtr.Write_all(Xot_tmpl_wtr.java:23)
    gplx.xowa.parsers.Xop_parser.Expand_tmpl(Xop_parser.java:50)
    gplx.xowa.parsers.Xop_parser.Expand_tmpl(Xop_parser.java:44)
    gplx.xowa.parsers.Xop_parser.Parse_text_to_wdom(Xop_parser.java:102)
    gplx.xowa.parsers.Xow_parser_mgr.Parse(Xow_parser_mgr.java:102)
    gplx.xowa.addons.bldrs.mass_parses.parses.wkrs.Xomp_parse_wkr.Exec(Xomp_parse_wkr.java:140)
    gplx.xowa.addons.bldrs.mass_parses.parses.wkrs.Xomp_parse_wkr.Invk(Xomp_parse_wkr.java:213)
    gplx.Gfo_invk_.Invk_by_msg(Gfo_invk_.java:34)
    gplx.core.threads.Thread_adp.run(Thread_adp.java:33)
    java.lang.Thread.run(Thread.java:748)

running this in a debugging environment showed (to me) that there was some thread interference (I use 8 workers)

I have found putting a synchronized (this) around fetchLanguageNames stops this from occurring

gnosygnu commented 5 years ago

Cool. Thanks for discovering the issue.

I added synchronized blocks to both fetchLanguageNames and fetchLanguageName

Thanks again!