db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rick Hillegas (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (DERBY-5328) The private fields of the NetServlet can be changed by multiple threads, giving rise to race conditions and corruptions.
Date Mon, 08 Aug 2011 19:18:28 GMT

     [ 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:
>            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


View raw message