Details
-
Type: Bug
-
Status: Closed
-
Priority: Major
-
Resolution: Fixed
-
Affects Version/s: 1.7.1
-
Component/s: Framework
-
Labels:None
-
Environment:Any
-
ICEsoft Forum Reference:
Description
According to the forum entry, clients accessing an application from a slower site can impact the performance of clients accessing an application from a faster location. This looks to be due to blocking in the Parser code. It's related to sychronization that was added to fix another issue, ICE-2936
The Parser is not re-entrantly threadsafe as an application scoped instance, so the parse method has to be synchronized. It can't be made session-scoped because the parser is 140K/user. And it can't be request scoped because it takes 2+ seconds to load the tag rules each time the parser is initialized which is added to the render time.
That's the source of the inter-thread blocking.
We may have to load the tag rules statically in the constructor and then construct a per-request instance of the parser. This will require a little bit of breakage, because the parser is a member variable of the ViewHandler, which is an application scoped entity.
The Parser is not re-entrantly threadsafe as an application scoped instance, so the parse method has to be synchronized. It can't be made session-scoped because the parser is 140K/user. And it can't be request scoped because it takes 2+ seconds to load the tag rules each time the parser is initialized which is added to the render time.
That's the source of the inter-thread blocking.
We may have to load the tag rules statically in the constructor and then construct a per-request instance of the parser. This will require a little bit of breakage, because the parser is a member variable of the ViewHandler, which is an application scoped entity.
The parse() method of com.icesoft.faces.webapp.parser.Parser is currently synchronized at the method level to prevent the threading issues described in the previous case. One solution may be to make the synchronization more granular. Ted made a quick test and this seemed work without side effects.
synchronized(this)
{ digester.clear(); digester.push(rootTag); digester.push(rootWire); digester.parse(page); }