[ 
https://issues.apache.org/jira/browse/TRINIDAD-2468?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13970674#comment-13970674
 ] 

Andy Schwartz commented on TRINIDAD-2468:
-----------------------------------------

I have put together a patch file that can be applied to trinidad-trunk to help 
simulate the problem:

https://issues.apache.org/jira/secure/attachment/12640452/trinidad-2468-hack-delays.patch

This patch does the following:

- Introduces a delay after the first file of a two part style sheet is written.
- Introduces a second delay when a second request detects that a single file is 
present on the file system.
- Tweaks our logic for deciding when to split style sheet files to make it 
easier to hit the split style sheet file case.
-  Adds logging that includes the thread id.

We can now simulate the problem by:

1.  Applying the patch to trinidad-trunk.
2.  Fire up trinidad-demo
3.  Make sure that the trinidad-demo’s style sheet cache is empty.
4.  Hit the demo via curl, eg:

curl localhost:8080/trinidad-demo/faces/index.jspx

5.  Wait a few seconds, and then hit the demo a second time via curl.

Without the fix, we see the following sequence:

SEVERE: !! Entering _createEntry {thread:12}
SEVERE: !! Got output files: 0 {thread:12}
SEVERE: !! Creating output file: 
/scratch/anschwar/dev/trinidad/trinidad-trunk/trinidad-examples/trinidad-demo/target/work/adf/styles/cache/casablanca-desktop-mjyt4t--d-d-d-d-ltr-d--s-n-u.css
 {thread:12}
SEVERE: !! I have written one output file.  Going to sleep for a while. 
{thread:12}
SEVERE: !! Entering _createEntry {thread:16}
SEVERE: !! I found one output file.  Going to sleep for a while! {thread:16}
SEVERE: !! Done sleeping.  Ready write more output files. {thread:12}
SEVERE: !! Creating output file: 
/scratch/anschwar/dev/trinidad/trinidad-trunk/trinidad-examples/trinidad-demo/target/work/adf/styles/cache/casablanca-desktop-mjyt4t--d-d-d-d-ltr-d--s-n-u2.css
 {thread:12}
SEVERE: !! Exiting _createEntry.  Entry now has 2 file(s) {thread:12}
SEVERE: !! Just one output file here.  Waking up. {thread:16}
SEVERE: !! Got output files: 1 {thread:16}
SEVERE: !! Exiting _createEntry.  Entry now has 1 file(s) {thread:16}

At this point the entry cache contains an Entry instance with a single file 
reference, even though two files were written.  All requests from here on out 
result in a single style sheet link being rendered.

I have also uploaded a second patch that can be applied on top of my fix 
(required some tweaking):

https://issues.apache.org/jira/secure/attachment/12640453/trinidad-2468-hack-delays-on-top-of-fix.patch

When running the same steps against the fix, we now see output like this:

SEVERE: !! Entering _createEntry {thread:12}
SEVERE: !! Got output files: 0 {thread:12}
SEVERE: !! Creating output file: 
/scratch/anschwar/dev/trinidad/trinidad-2468-trunk/trinidad-examples/trinidad-demo/target/work/adf/styles/cache/casablanca-desktop-mjyt4t--d-d-d-d-ltr-d--s-n-u.css
 {thread:12}
SEVERE: !! I have written one output file.  Going to sleep for a while. 
{thread:12}
SEVERE: !! Getting entry from Future {thread:16}
SEVERE: !! Done sleeping.  Ready write more output files. {thread:12}
SEVERE: !! Creating output file: 
/scratch/anschwar/dev/trinidad/trinidad-2468-trunk/trinidad-examples/trinidad-demo/target/work/adf/styles/cache/casablanca-desktop-mjyt4t--d-d-d-d-ltr-d--s-n-u2.css
 {thread:12}
SEVERE: !! Exiting _createEntry.  Entry now has 2 file(s) {thread:12}
SEVERE: !! Got entry with 2 file(s) from Future {thread:16}
SEVERE: !! Got entry with 2 file(s) from Future {thread:12}

The second thread now waits on Future.get() until the first thread has 
completed generating both style sheets.  And now everyone has a consistent view 
of the world.

> 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
>         Attachments: trinidad-2468-hack-delays-on-top-of-fix.patch, 
> trinidad-2468-hack-delays.patch, trinidad-2468.patch
>
>
> 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)

Reply via email to