logging fixes for last pre-ZBB JDK7-TL snapshot (6977677, 7016208, 7041595)
Daniel D. Daugherty
daniel.daugherty at oracle.com
Mon May 16 20:31:43 PDT 2011
First, no apology is needed. I very much appreciate
the catch on your part.
Second, it seems that the pendulum that is the Logging API
continues to swing back and forth: We fix a deadlock... we
introduce a race... we fix the race... we introduce a deadlock...
lather, rinse, repeat...
I'll file a bug tomorrow and have a test ready sometime
tomorrow also. Sigh...
My gut says that this race is not that critical because
in a properly functioning system one of the threads would
get an IllegalArgumentException. Please let me know if
I'm misunderstanding what you're saying here...
Dan
On 5/16/2011 8:00 PM, David Holmes wrote:
> Dan,
>
> I'm sorry this didn't come through in time ...
>
> Mandy Chung said the following on 05/17/11 05:22:
>> Logger.java
>> Looks good. The removal of the synchronization required by
>> Logger.getLogger fixes the deadlock issue.
>
> But this method now has a race condition:
>
> 372 // Synchronization is not required here. All synchronization for
> 373 // adding a new Logger object is handled by
> LogManager.addLogger().
> 374 public static Logger getLogger(String name, String
> resourceBundleName) {
> 375 LogManager manager = LogManager.getLogManager();
> 376 Logger result = manager.demandLogger(name);
> 377 if (result.resourceBundleName == null) {
> 378 // Note: we may get a MissingResourceException here.
> 379 result.setupResourceInfo(resourceBundleName);
> 380 } else if
> (!result.resourceBundleName.equals(resourceBundleName)) {
> 381 throw new
> IllegalArgumentException(result.resourceBundleName +
> 382 " != " + resourceBundleName);
> 383 }
> 384 return result;
> 385 }
>
> Two threads calling this method with the same name but different
> resource bundle names can both see null at line 377 and install their
> different resource bundles. That section needs to be atomic.
>
> David
> -----
>
>>
>> LogManager.java
>> Retrying in a while loop is one way to fix weak ref / gc timing
>> issue.
>> What about if you refactor the addLogger method to add a new private
>> private method equivalent to addLogger (say add(Logger)) that
>> will return
>> logger if added successfully or null if not.
>>
>> The addLogger method will return add(logger) != logger. The
>> synchronization
>> will be done in the new add method.
>>
>> Would this fix 7016208? It seems to me that addLogger
>> returning boolean
>> is the cause for this bug.
>>
>> Mandy
>>
>> On 05/15/11 11:40, Daniel D. Daugherty wrote:
>>> Greetings,
>>>
>>> The final pre-ZBB JDK7-TL snapshot is happening @ 1700 PT on
>>> Monday, May 14, 2011. This snapshot is targeted for JDK7-B143
>>> or JDK7-B144 (I'm not sure which). Yes, we're still trying to
>>> figure out how to merge our JDK & HotSpot Express processes
>>> with Oracle processes. Please be patient while we iron out the
>>> wrinkles...
>>>
>>> I have three bug fixes for the java.util.logging area:
>>>
>>> 6977677 3/2 Deadlock on logging subsystem initialization
>>> 7016208 4/3 null sometimes returned by java.util.logging.Logger.
>>> getLogger(String name) in -server -Xcomp
>>> 7041595 4/4 add lost test for 6487638
>>>
>>> 6977677 is a deadlock between java.util.logging.Logger.getLogger()
>>> and LogManager.<clinit> via a PlatformLogger. This fix involves:
>>>
>>> src/share/classes/java/util/logging/Logger.java
>>> test/java/util/logging/LoggingDeadlock4.java
>>>
>>> Mandy, I would like your review of the above bug fix.
>>>
>>> 7016208 is an unexpected null return from Logger.getLogger() due to
>>> the lack of a strong reference. This fix involves:
>>>
>>> src/share/classes/java/util/logging/LogManager.java
>>>
>>> Tom R., I would like your review of the above bug fix.
>>>
>>> 7041595 is just pushing a Logging deadlock test that got lost a
>>> long time ago. This fix involves:
>>>
>>> test/java/util/logging/LoggingDeadlock3.java
>>> test/java/util/logging/LoggingDeadlock3.props
>>>
>>> Because I'm fixing a deadlock in 6977677, I wanted to make sure
>>> that this Logging deadlock test was back in the mix.
>>>
>>> Here is the webrev URL:
>>>
>>> http://cr.openjdk.java.net/~dcubed/logging-batch-20110515-webrev/0/
>>>
>>> The comments that I added to the code changes should make the
>>> reason(s) for the code changes pretty self explanatory.
>>>
>>> These changes have been run through JPRT and pass the "jdk_util"
>>> tests on all platforms. I have also run SDK/JDK logging tests
>>> and the VM/NSK logging tests on the following configs:
>>>
>>> Solaris X86 * {Client VM, Server VM} product * {-Xmixed, -Xcomp}
>>> WinXP * {Client VM, Server VM} product * {-Xmixed, -Xcomp}
>>>
>>> Here is the summary from Solaris X86:
>>>
>>> Summary of Test Results (8 result dirs)
>>> =========================================
>>> all executed: 2264 all passed: 2264 all ignored: 0 all failed: 0
>>> time: 0 hour(s) 17 minute(s)
>>>
>>> Here is the partial summary (6 of 8) from WinXP:
>>>
>>> Summary of Test Results (6 result dirs)
>>> =========================================
>>> all executed: 1160 all passed: 1160 all ignored: 0 all failed: 0
>>> time: 1 hour(s) 0 minute(s)
>>>
>>> The last two VM/NSK test runs are still going; yes, WinXP is slower
>>> than
>>> Solaris X86...
>>>
>>> Thanks, in advance, for any reviews.
>>>
>>> Dan
>>>
>>
More information about the serviceability-dev
mailing list