[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>&lt;?&gt; 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>&lt;?&gt; 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