[jetty-dev] [jira] (JETTY-1555) Log.getLogger() could return null due to a thread issue
"Daniel Wu (JIRA)" <[email protected]> Thu, 24 Jan 2013 22:01:13 -0600 (CST)
| Newsgroups | gmane.comp.java.jetty.general |
|---|---|
| Message-ID | <1878125004.36357.1359086473688.JavaMail.j2ee-jira@codehaus01.managed.contegix.com> |
<style>
/* Changing the layout to use less space for mobiles */
@media screen and (max-device-width: 480px), screen and (-webkit-min-device-pixel-ratio: 2) {
#email-body { min-width: 30em !important; }
#email-page { padding: 8px !important; }
#email-banner { padding: 8px 8px 0 8px !important; }
#email-avatar { margin: 1px 8px 8px 0 !important; padding: 0 !important; }
#email-fields { padding: 0 8px 8px 8px !important; }
#email-gutter { width: 0 !important; }
}
</style>
<div id="email-body">
<table id="email-wrap" align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#f0f0f0;color:#000000;width:100%;">
<tr valign="top">
<td id="email-page" style="padding:16px !important;">
<table align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#ffffff;border:1px solid #bbbbbb;color:#000000;width:100%;">
<tr valign="top">
<td bgcolor="#ffffff" style="background-color:#ffffff;color:#00AA00;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;line-height:1;"><img src="http://www.codehaus.org/codehaus-small.gif" alt="" style="vertical-align:top;" /></td>
</tr><tr valign="top">
<td id="email-banner" style="padding:32px 32px 0 32px;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="width:100%;">
<tr valign="top">
<td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;padding:0;">
<img id="email-avatar" src="https://jira.codehaus.org/secure/useravatar?avatarId=10232" alt="" height="48" width="48" border="0" align="left" style="padding:0;margin: 0 16px 16px 0;" />
<div id="email-action" style="padding: 0 0 8px 0;font-size:12px;line-height:18px;">
<a class="user-hover" rel="danielywoo" id="email_danielywoo" href="https://jira.codehaus.org/secure/ViewProfile.jspa?name=danielywoo" style="color:#005500;">Daniel Wu</a>
created <img src="https://jira.codehaus.org/images/icons/bug.gif" height="16" width="16" border="0" align="absmiddle" alt="Bug"> <a style='color:#005500;text-decoration:none;' href='https://jira.codehaus.org/browse/JETTY-1555'>JETTY-1555</a>
</div>
<div id="email-summary" style="font-size:16px;line-height:20px;padding:2px 0 16px 0;">
<a style='color:#005500;text-decoration:none;' href='https://jira.codehaus.org/browse/JETTY-1555'><strong>Log.getLogger() could return null due to a thread issue</strong></a>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr valign="top">
<td id="email-fields" style="padding:0 32px 32px 32px;">
<table border="0" cellpadding="0" cellspacing="0" style="padding:0;text-align:left;width:100%;" width="100%">
<tr valign="top">
<td id="email-gutter" style="width:64px;white-space:nowrap;"></td>
<td>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Issue Type:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<img src="https://jira.codehaus.org/images/icons/bug.gif" height="16" width="16" border="0" align="absmiddle" alt="Bug"> Bug
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Affects Versions:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
8.1.2 </td>
</tr>
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Assignee:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
Unassigned </td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Attachments:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
fix.txt </td>
</tr>
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Created:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
24/Jan/13 9:59 PM
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Description:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<p style='margin-top:0;margin-bottom:10px;'>When Log.getLogger() is called in two threads simultaneously, one of </p>
<div class="code panel" style="border-style: solid;border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;border-bottom-style: solid;"><b>org/eclipse/jetty/util/log/Log.java</b></div><div class="codeContent panelContent">
<pre class="code-java">132 <span class="code-keyword">private</span> <span class="code-keyword">static</span> Logger LOG;
133 <span class="code-keyword">private</span> <span class="code-keyword">static</span> <span class="code-object">boolean</span> __initialized;
134
135 <span class="code-keyword">public</span> <span class="code-keyword">static</span> <span class="code-object">boolean</span> initialized()
136 {
137 <span class="code-keyword">if</span> (LOG != <span class="code-keyword">null</span>)
138 {
139 <span class="code-keyword">return</span> <span class="code-keyword">true</span>;
140 }
141
142 <span class="code-keyword">synchronized</span> (Log.class)
143 {
144 <span class="code-keyword">if</span> (__initialized)
145 {
146 <span class="code-keyword">return</span> LOG != <span class="code-keyword">null</span>;
147 }
148 __initialized = <span class="code-keyword">true</span>;
149 }
150
151 <span class="code-keyword">try</span>
152 {
153 <span class="code-object">Class</span><?> log_class = Loader.loadClass(Log.class, __logClass);
154 <span class="code-keyword">if</span> (LOG == <span class="code-keyword">null</span> || !LOG.getClass().equals(log_class))
155 {
156 LOG = (Logger)log_class.newInstance();
157 LOG.debug(<span class="code-quote">"Logging to {} via {}"</span>, LOG, log_class.getName());
158 }
159 }
160 <span class="code-keyword">catch</span>(Throwable e)
161 {
162 <span class="code-comment">// Unable to load specified Logger implementation, <span class="code-keyword">default</span> to standard logging.
</span>163 initStandardLogging(e);
164 }
165
166 <span class="code-keyword">return</span> LOG != <span class="code-keyword">null</span>;
167 }</pre>
</div></div>
<p style='margin-top:0;margin-bottom:10px;'>If T1 runs to line 148 and update the __initialized flag to true, then T2 runs to line 144, T2 probably will hit line 146 and return false (if the master memory copy is flushed to T2). Then getLogger will return null. See line 430-431 below:</p>
<div class="code panel" style="border-style: solid;border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;border-bottom-style: solid;"><b>org/eclipse/jetty/util/log/Log.java</b></div><div class="codeContent panelContent">
<pre class="code-java">428 <span class="code-keyword">public</span> <span class="code-keyword">static</span> Logger getLogger(<span class="code-object">String</span> name)
429 {
430 <span class="code-keyword">if</span> (!initialized())
431 <span class="code-keyword">return</span> <span class="code-keyword">null</span>;</pre>
</div></div>
<p style='margin-top:0;margin-bottom:10px;'>Most developers won't expect Log.getLogger() return null. In my application, I embedded jetty 8.1.2 and occasionally I see NPE when the jetty server starts up, around 5~10% probability.</p>
<p style='margin-top:0;margin-bottom:10px;'>Can we simplify and fix it this way?</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java"><span class="code-keyword">private</span> <span class="code-keyword">static</span> <span class="code-keyword">volatile</span> Logger LOG;
<span class="code-keyword">public</span> <span class="code-keyword">static</span> void initialize()
{
<span class="code-keyword">if</span> (LOG != <span class="code-keyword">null</span>)
{
<span class="code-keyword">return</span>;
}
<span class="code-keyword">synchronized</span> (Log.class)
{
<span class="code-keyword">if</span> (LOG == <span class="code-keyword">null</span>) {
<span class="code-keyword">try</span>
{
<span class="code-object">Class</span><?> log_class = Loader.loadClass(Log.class, __logClass);
<span class="code-keyword">if</span> (LOG == <span class="code-keyword">null</span> || !LOG.getClass().equals(log_class))
{
LOG = (Logger)log_class.newInstance();
LOG.debug(<span class="code-quote">"Logging to {} via {}"</span>, LOG, log_class.getName());
}
}
<span class="code-keyword">catch</span>(Throwable e)
{
<span class="code-comment">// Unable to load specified Logger implementation, <span class="code-keyword">default</span> to standard logging.
</span> initStandardLogging(e);
}
}
}
}</pre>
</div></div>
</td>
</tr>
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Project:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<a style="color:#005500;" href="https://jira.codehaus.org/browse/JETTY">Jetty</a>
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Priority:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<img src="https://jira.codehaus.org/images/icons/priority_major.gif" height="16" width="16" border="0" align="absmiddle" alt="Major"> Major
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Reporter:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<a class="user-hover" rel="danielywoo" id="email_danielywoo" href="https://jira.codehaus.org/secure/ViewProfile.jspa?name=danielywoo" style="color:#005500;">Daniel Wu</a>
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Original Estimate:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
12 hours
</td>
</tr>
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Remaining Estimate:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
12 hours
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td><!-- End #email-page -->
</tr>
<tr valign="top">
<td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:10px;line-height:14px;padding: 0 16px 16px 16px;text-align:center;">
This message is automatically generated by JIRA.<br />
If you think it was sent incorrectly, please contact your <a style='color:#005500;' href='https://jira.codehaus.org/secure/ContactAdministrators!default.jspa'>JIRA administrators</a>.<br />
For more information on JIRA, see: <a style='color:#005500;' href='http://www.atlassian.com/software/jira'>http://www.atlassian.com/software/jira</a>
</td>
</tr>
</table><!-- End #email-wrap -->
</div><!-- End #email-body -->
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email