[ 
https://issues.apache.org/jira/browse/DERBY-5328?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Rick Hillegas updated DERBY-5328:
---------------------------------

    Attachment: derby-5328-01-aa-simpleFields.diff

Attaching derby-5328-01-aa-simpleFields.diff. This patch makes a number of 
changes to improve the re-entrancy of the NetServlet:

1) Makes the following fields volatile: tracingDirectory, logStatus, 
traceStatus.

2) Makes knownLang a constant.

3) Moves the following fields inside the doGet() method: locale, out.

This patch does not tackle the issue of what to do with the server field.

I have run the resulting NetServlet inside tomcat and accessed it from multiple 
browser tabs. The browser pages continue to operate as expected: changes to a 
field in one tab become visible in the other tab after you refresh the second 
tab. However, I have not stressed NetServlet by forcing close races between the 
two tabs.

Touches one file:

M      java/drda/org/apache/derby/drda/NetServlet.java


> The private fields of the NetServlet can be changed by multiple threads, 
> giving rise to race conditions and corruptions.
> ------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-5328
>                 URL: https://issues.apache.org/jira/browse/DERBY-5328
>             Project: Derby
>          Issue Type: Bug
>          Components: Network Server
>    Affects Versions: 10.9.0.0
>            Reporter: Rick Hillegas
>         Attachments: derby-5328-01-aa-simpleFields.diff
>
>
> At the beginning of the NetServlet class, there are a number of private 
> fields. These fields can be inspected and changed by any thread running 
> inside NetServlet.doGet(). Due to the way that app servers dispatch servlet 
> requests, this means that multiple threads can be operating inside doGet() at 
> the same time, clobbering one another's work. The weirdest instance of this 
> is the shared PrintWriter (called "out") which is used to produce the 
> response web page sent back by the servlet. Multiple threads all writing to 
> the same PrintWriter will create a very bizarre response page. The following 
> improvements should be made:
> 1) The "server" field should be set by a synchronized method.
> 2) Every run through doGet() should create its own PrintWriter which is 
> passed to other methods. The instance-wide "out" field should be removed.
> 3) Various other fields should be re-coded using the Atomic classes 
> introduced by Java 5. These fields include "logStatus" and "traceStatus". 
> This solution can be implemented if the community votes to approve the 
> sunsetting of JVM 1.4 (currently at the polls).

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to