Andy Schwartz created TRINIDAD-2468:
---------------------------------------
Summary: FileSystemStyleCache: split style sheet concurrency issue
Key: TRINIDAD-2468
URL: https://issues.apache.org/jira/browse/TRINIDAD-2468
Project: MyFaces Trinidad
Issue Type: Bug
Components: Skinning
Reporter: Andy Schwartz
Assignee: Andy Schwartz
Due to IE’s per-file style rule limit, documented here:
http://support.microsoft.com/kb/262161
In particular:
“All style rules after the first 4,095 rules are not applied.”
Trinidad’s skinning framework breaks up large style sheets into multiple files,
each with a maximum of 4,095 rules. That is, a generated style sheet of the
form:
- foo-desktop-gecko.css
Might be result in the generation of two style sheets on IE:
- foo-desktop-ie.css
- foo-desktop-ie2.css
We are running into thread safety problems with the current implementation of
this multi-file solution.
Under certain circumstances, we see the style sheet (correctly) being split
across two files, but only a single style sheet link is rendered in the HTML
contents. As a result, the styles from the second file are missing, which
typically has fatal results.
This only happens under a somewhat unusual case: the client who is reporting
this behavior is running a test which upon start up immediately hits the server
with two concurrent requests from IE.
This triggers the following sequence:
- Request 1 enters FileSystemStyleCache._createEntry().
- Request 1 generates the first of two files that make up the IE-specific style
sheet.
- Request 2 arrives and, finding FileSystemStyleCache’s entry cache empty, also
enters _createEntry().
- Upon entry to _createEntry(), Request 2 checks to see whether any files have
already been generated for the requested style sheet.
- Request 2 finds the first of two files and assumes that the style sheet is
composed of a single file.
- Request 1 finishes generating the second style sheet.
- Request 1 populates the FileSystemStyleCache’s entry cache with an Entry
instance that correctly references both generated files.
- Request 2 blows away the previously installed Entry and replaces it with a
bogus Entry that only references the first of two style sheet files.
On all subsequent requests, StyleSheetRenderer retrieves data from the bogus
(single file) Entry, and thus only renders a single link.
The fix is to control access to _createEntry() for individual style sheets.
That is, we want to allow concurrent access to _createEntry() for style sheets
with different variants (ie. it should be possible to generate the IE style
sheets and Gecko style sheets concurrently). However, if a request is in the
middle of generating files for a particular style sheet, other requests that
want access to the same style sheet must wait until the first request completes
its work (instead of possibly trampling over the work of the first request).
--
This message was sent by Atlassian JIRA
(v6.2#6252)