On Fri, 14 Feb 2025 15:07:58 GMT, David Beaumont <d...@openjdk.org> wrote:

>> Well spotted :) Yes, it's a theoretical risk, but not at the same level as 
>> that of log record formatting.
>> 
>> My original draft push of this PR had comments about lock expectations here, 
>> but I was asked to not change the JavaDoc on Formatter.
>> 
>> The getHead() and getTail() methods *could* cause deadlock, but only because 
>> of code directly associated with their implementation. They don't have any 
>> access to a log record (and no reason to have access to log records), so 
>> they aren't going to be calling into completely arbitrary user code.
>> 
>> It's also unlikely that a formatter implementation will do a lot of complex 
>> work in these methods since, semantically, they are called an arbitrary 
>> number of times (according to configuration) and at arbitrary times, so they 
>> really cannot meaningfully rely on user runtime data or much beyond things 
>> like timestamps and counters.
>> 
>> So while, in theory, it could be an issue, it's an issue that can almost 
>> certainly be fixed by the author of the Formatter class itself. This is 
>> contrasted with the issue at hand, which is inherent in the handler code and 
>> cannot be fixed in any other reasonable way by the user of the logging 
>> library.
>> 
>> I'd be happy to move the head/tail acquisition out of the locked regions if 
>> it were deemed a risk, but that's never something I've observed as an issue 
>> (I spent 10 years doing Java logging stuff and saw the publish() deadlock, 
>> but never issues with head/tail stuff). It's also hard to move it out, 
>> because tail writing happens in close(), called from flush(), both of which 
>> are much more expected to be synchronized, so you'd probably want to get and 
>> cache the tail() string when the file was opened.
>
> As for the example you gave there, that is interesting. Keeping an 
> unformatted log record around for any time after the log statement that 
> created it has exited would be quite problematic (it prevents GC of arbitrary 
> things).
> 
> If I were doing some kind of summary tail entry, I'd pull, format (user args) 
> and cache anything I needed out of the log record when I had it, but not keep 
> it around. Then when the tail is written I'd just have what I need ready to 
> go.
> 
> But yes, right now, with or without this PR, that code looks like it's got a 
> deadlock risk.

Need to update to have single call to getFormatter().

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/23491#discussion_r1968667060

Reply via email to