[mayaa-user:479] Re: mayaa 1.1.5 でデッドロック

Takashi Someda takashi.someda @ gmail.com
2007年 3月 1日 (木) 12:53:49 JST


染田です。

度々すみません。
以下の件ですが、SpecificationCache 内で、repeaseCache という LinkedHashMap
に対する同期化処理について質問させてください。

該当の Specification がタイムアップしているかどうかの判別用の Map に見受けられるのですが、同期化ブロック内で
Specification#kill までを行う必要があるでしょうか ?
以下の diff を参照頂きたいのですが、Specification#kill 呼び出しを repeaseMap
の同期化ブロックの外にしても問題ないでしょうか。

各 Specification クラスの kill メソッド内でも同期化処理がとられているので、大丈夫かと思っている次第なのですが。。。

Index: src-impl/org/seasar/mayaa/impl/engine/SpecificationCache.java
===================================================================
--- src-impl/org/seasar/mayaa/impl/engine/SpecificationCache.java
 (revision 2901)
+++ src-impl/org/seasar/mayaa/impl/engine/SpecificationCache.java
 (working copy)
@@ -176,6 +176,8 @@
             while (_cleanUpSpecification != null) {
                 try {
                     Thread.sleep(1000);
+
+                    List killedspec = new ArrayList();
                     synchronized(_repeaseSpecs) {
                         for (Iterator it = _repeaseSpecs.entrySet().iterator()
                                 ; it.hasNext(); ) {
@@ -183,11 +185,18 @@
                             long timeup = ((Long)entry.getValue()).longValue();
                             if (System.currentTimeMillis() > timeup) {
                                 Specification spec = (Specification)
entry.getKey();
-                                spec.kill();
+                                killedspec.add(spec);
                                 it.remove();
                             }
                         }
                     }
+
+                    for(Iterator it = killedspec.iterator();it.hasNext();){
+                       Specification spec = (Specification) it.next();
+                       if(!spec.isDeprecated()){
+                               spec.kill();
+                       }
+                    }
                 } catch (InterruptedException e) {
                     // no operation
                 }

07/03/01 に Takashi Someda<takashi.someda @ gmail.com> さんは書きました:
> 染田です。
>
> 先のスレッド[mayaa-user:477] にも関連するの
> かもしれませんが、以下の環境でデッドロックが
> 発生しています。スレッドダンプを添付します。
>
> - mayaa-1.1.5
> - JDK 1.5.0_b10
>
> TimerSweepThread から定期的に呼び出される spec.kill
> のチェインでロックのループが出来ているようにも思うのですが、
> まだ詳細追いきれていません。。。
>
> こうすれば発生頻度を下げられる、等の
> 対応方法案ありましたらご教示頂けると助かります。
>
> よろしくお願いします。
>
> --
> SOMEDA Takashi (takashi.someda @ gmail.com)
> http://tuigwaa.sandbox.seasar.org/
>
> Found one Java-level deadlock:
> =============================
> "TP-Processor91":
>   waiting to lock monitor 0x0000000040136080 (object 0x0000002aaf44e6f8, a org.seasar.mayaa.impl.engine.SpecificationCache),
>   which is held by "ReferenceCache Sweep Monitor"
> "ReferenceCache Sweep Monitor":
>   waiting to lock monitor 0x0000000040136170 (object 0x0000002aaf74b770, a java.util.LinkedHashMap),
>   which is held by "TimeredSweepThread"
> "TimeredSweepThread":
>   waiting to lock monitor 0x0000000040137520 (object 0x0000002ab8158490, a org.seasar.mayaa.impl.engine.processor.InsertProcessor),
>   which is held by "TP-Processor61"
> "TP-Processor61":
>   waiting to lock monitor 0x00000000401372c8 (object 0x0000002aae85ed30, a org.seasar.mayaa.impl.engine.EngineImpl),
>   which is held by "TP-Processor91"
>
> Java stack information for the threads listed above:
> ===================================================
> "TP-Processor91":
>       at org.seasar.mayaa.impl.engine.SpecificationCache.get(SpecificationCache.java:70)
>       - waiting to lock <0x0000002aaf44e6f8> (a org.seasar.mayaa.impl.engine.SpecificationCache)
>       at org.seasar.mayaa.impl.engine.EngineImpl.findSpecificationFromCache(EngineImpl.java:105)
>       at org.seasar.mayaa.impl.engine.EngineImpl.findPageFromCache(EngineImpl.java:109)
>       at org.seasar.mayaa.impl.engine.EngineImpl.getPage(EngineImpl.java:114)
>       - locked <0x0000002aae85ed30> (a org.seasar.mayaa.impl.engine.EngineImpl)
>       at org.seasar.mayaa.impl.engine.TemplateImpl.getPage(TemplateImpl.java:77)
>       at org.seasar.mayaa.impl.engine.EngineUtil.getParentSpecification(EngineUtil.java:112)
>       at org.seasar.mayaa.impl.engine.specification.xpath.XPathUtil$CascadeSelectNodesIterator.hasNext(XPathUtil.java:137)
>       at org.seasar.mayaa.impl.builder.injection.XPathMatchesInjectionResolver.getNode(XPathMatchesInjectionResolver.java:58)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl$InjectionChainImpl.getNode(TemplateBuilderImpl.java:554)
>       at org.seasar.mayaa.impl.builder.injection.EqualsIDInjectionResolver.getNode(EqualsIDInjectionResolver.java:139)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl$InjectionChainImpl.getNode(TemplateBuilderImpl.java:554)
>       at org.seasar.mayaa.impl.builder.injection.InjectAttributeInjectionResolver.getNode(InjectAttributeInjectionResolver.java:63)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl$InjectionChainImpl.getNode(TemplateBuilderImpl.java:554)
>       at org.seasar.mayaa.impl.builder.injection.InsertSetter.getNode(InsertSetter.java:48)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl$InjectionChainImpl.getNode(TemplateBuilderImpl.java:554)
>       at org.seasar.mayaa.impl.builder.injection.RenderedSetter.getNode(RenderedSetter.java:55)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl$InjectionChainImpl.getNode(TemplateBuilderImpl.java:554)
>       at org.seasar.mayaa.impl.builder.injection.ReplaceSetter.getNode(ReplaceSetter.java:56)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl$InjectionChainImpl.getNode(TemplateBuilderImpl.java:554)
>       at org.seasar.mayaa.impl.builder.injection.MetaValuesSetter.getNode(MetaValuesSetter.java:99)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl$InjectionChainImpl.getNode(TemplateBuilderImpl.java:554)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.resolveOriginalNode(TemplateBuilderImpl.java:415)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:440)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.resolveInjectedNode(TemplateBuilderImpl.java:332)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:445)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.walkParsedTree(TemplateBuilderImpl.java:449)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.doInjection(TemplateBuilderImpl.java:493)
>       at org.seasar.mayaa.impl.builder.TemplateBuilderImpl.afterBuild(TemplateBuilderImpl.java:130)
>       at org.seasar.mayaa.impl.builder.SpecificationBuilderImpl.build(SpecificationBuilderImpl.java:79)
>       at org.seasar.mayaa.impl.engine.specification.SpecificationImpl.build(SpecificationImpl.java:145)
>       at org.seasar.mayaa.impl.engine.TemplateImpl.build(TemplateImpl.java:181)
>       at org.seasar.mayaa.impl.engine.EngineImpl.createSpecificationInstance(EngineImpl.java:534)
>       at org.seasar.mayaa.impl.engine.EngineImpl.createTemplateInstance(EngineImpl.java:575)
>       at org.seasar.mayaa.impl.engine.PageImpl.getTemplateFromFixedSuffix(PageImpl.java:151)
>       - locked <0x0000002aae85ed30> (a org.seasar.mayaa.impl.engine.EngineImpl)
>       at org.seasar.mayaa.impl.engine.PageImpl.getTemplate(PageImpl.java:165)
>       at org.seasar.mayaa.impl.engine.RenderUtil.getTemplate(RenderUtil.java:266)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:290)
>       at org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:219)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:152)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:152)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderProcessorTree(RenderUtil.java:232)
>       at org.seasar.mayaa.impl.engine.TemplateImpl.doTemplateRender(TemplateImpl.java:152)
>       at org.seasar.mayaa.impl.engine.PageImpl.renderTemplate(PageImpl.java:249)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:305)
>       at org.seasar.mayaa.impl.engine.PageImpl.doPageRender(PageImpl.java:192)
>       at org.seasar.mayaa.impl.engine.EngineImpl.doPageService(EngineImpl.java:354)
>       at org.seasar.mayaa.impl.engine.EngineImpl.doService(EngineImpl.java:470)
>       at org.seasar.mayaa.impl.MayaaServlet.doService(MayaaServlet.java:94)
>       at org.seasar.mayaa.impl.MayaaServlet.doGet(MayaaServlet.java:77)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
>       : (snip)
> "ReferenceCache Sweep Monitor":
>       at org.seasar.mayaa.impl.engine.SpecificationCache$TimeredSweepThread.add(SpecificationCache.java:171)
>       - waiting to lock <0x0000002aaf74b770> (a java.util.LinkedHashMap)
>       at org.seasar.mayaa.impl.engine.SpecificationCache$GCReceiver.sweepFinish(SpecificationCache.java:237)
>       - locked <0x0000002aaf44e6f8> (a org.seasar.mayaa.impl.engine.SpecificationCache)
>       at org.seasar.mayaa.impl.util.ReferenceCache$1.run(ReferenceCache.java:155)
> "TimeredSweepThread":
>       at org.seasar.mayaa.impl.engine.processor.TemplateProcessorSupport.kill(TemplateProcessorSupport.java:233)
>       - waiting to lock <0x0000002ab8158490> (a org.seasar.mayaa.impl.engine.processor.InsertProcessor)
>       at org.seasar.mayaa.impl.engine.processor.InsertProcessor.kill(InsertProcessor.java:327)
>       at org.seasar.mayaa.impl.engine.processor.TemplateProcessorSupport.kill(TemplateProcessorSupport.java:241)
>       - locked <0x0000002ab815fc08> (a java.util.ArrayList)
>       - locked <0x0000002ab814ce20> (a org.seasar.mayaa.impl.engine.processor.JspProcessor)
>       at org.seasar.mayaa.impl.engine.processor.JspProcessor.kill(JspProcessor.java:517)
>       at org.seasar.mayaa.impl.engine.TemplateImpl.kill(TemplateImpl.java:160)
>       - locked <0x0000002ab812fe10> (a xxx.TemplateImpl)
>       at org.seasar.mayaa.impl.engine.SpecificationCache$TimeredSweepThread.run(SpecificationCache.java:186)
>       - locked <0x0000002aaf74b770> (a java.util.LinkedHashMap)
> "TP-Processor61":
>       at org.seasar.mayaa.impl.engine.EngineImpl.getPage(EngineImpl.java:113)
>       - waiting to lock <0x0000002aae85ed30> (a org.seasar.mayaa.impl.engine.EngineImpl)
>       at org.seasar.mayaa.impl.engine.processor.InsertProcessor.getPage(InsertProcessor.java:128)
>       - locked <0x0000002ab8158490> (a org.seasar.mayaa.impl.engine.processor.InsertProcessor)
>       at org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:183)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:152)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderProcessorTree(RenderUtil.java:232)
>       at org.seasar.mayaa.impl.engine.TemplateImpl.doTemplateRender(TemplateImpl.java:152)
>       at org.seasar.mayaa.impl.engine.PageImpl.renderTemplate(PageImpl.java:249)
>       at org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:305)
>       at org.seasar.mayaa.impl.engine.PageImpl.doPageRender(PageImpl.java:192)
>       at org.seasar.mayaa.impl.engine.EngineImpl.doPageService(EngineImpl.java:354)
>       at org.seasar.mayaa.impl.engine.EngineImpl.doService(EngineImpl.java:470)
>       at org.seasar.mayaa.impl.MayaaServlet.doService(MayaaServlet.java:94)
>       at org.seasar.mayaa.impl.MayaaServlet.doGet(MayaaServlet.java:77)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
>       : (snip)
>
> Found 1 deadlock.
>
>
>


-- 
SOMEDA Takashi
takashi.someda @ gmail.com
http://tuigwaa.sandbox.seasar.org


mayaa-user メーリングリストの案内