[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-serviceability-dev
Subject: Re: RFR: JDK-8140556: Add force rotation option to VM.log jcmd
From: Yasumasa Suenaga <yasuenag () gmail ! com>
Date: 2015-10-31 15:10:52
Message-ID: 5634D9FC.6080502 () gmail ! com
[Download RAW message or body]
> This in turn means that we are logging before the thread local storage has been \
> initialized, and the JVM will crash/hit the assert because we are trying to take \
> the rotation lock.
I guess that you are saying about class member (not TLS - e.g. \
pthread_setspecific()).
Most of fields (include _rotation_lock) in LogFileOutput are initialized at c'tor.
Other field (_stream) is initialized at LogFileOutput::initialize().
We can avoid problem if we can move initialize() to c'tor because LogFileOutput
will be instantiated at LogConfiguration::new_output().
Currently, LogFileOutput will be added to LogConfiguration::_outputs and
to LogTagSet after calling LogFileOutput::initialize().
I wonder why we cannot avoid crash/assert with current implementation...
I will keep current implementation about _rotation_lock if the above is incorrect.
Thanks,
Yasumasa
On 2015/10/31 0:31, Marcus Larsson wrote:
> Hey,
>
> On 2015-10-30 15:39, Yasumasa Suenaga wrote:
> > Hi Marcus,
> >
> > Thank you for your comment.
> >
> >
> > > Still missing the renaming of rotate_all_logfile to rotate_all_outputs.
> >
> > Sorry, I will fix.
> >
>
> Thanks!
>
> >
> > > This rotate function works I guess, but it will probably need some rework once \
> > > there are other types of log outputs (rotate doesn't make sense on all types of \
> > > log outputs).
> >
> > I will add is_rotetable() to LogOutput as virtual function.
> > This function return false (can not rotate) by default, return true if \
> > _file_count is greater than 0 in LogFileOutput.
> >
> > LogConfiguration::rotate_all_outputs() will rotate if this function returns true.
> >
>
> Small typo, please make that is_rotatable().
>
> >
> > > If we configure a rotated file output and then log something on that output \
> > > before thread local storage initialization is complete, we will crash/hit an \
> > > assert. The previous implementation avoided this as long as no rotation was \
> > > needed before this initialization was complete. (This can be triggered using \
> > > the following arguments "-Xlog:all=trace:file.txt::filesize=10,filecount=2 \
> > > -Xlog:invalid", for example.)
> >
> > I do not think so.
> > Each -Xlog option creates unique instance of LogOutput (and subclass).
> > So they are isolated.
>
> My example includes a second (and intentionally incorrect) -Xlog option only to \
> trigger logging on the newly configured rotating LogFileOutput. This will cause \
> some logging about the invalid -Xlog argument, and this logging happens during the \
> argument parsing. This in turn means that we are logging before the thread local \
> storage has been initialized, and the JVM will crash/hit the assert because we are \
> trying to take the rotation lock. This has nothing to do with concurrent fprintfs \
> or freopens, even if that is a problem.
> >
> > However, we might have to rotate at safepoint.
>
> Doing stuff at a safepoint will not give us much in this case. There are threads \
> that continue execution through a safepoint, which means we will see log calls \
> being made even during this time.
> > Currently, LogOutput might be used by multiple threads concurrently.
> > If we rotate log when another thread is writing string to output, we encounter \
> > unexpected behavior.
> > LogFileOutput::rotate() uses freopen().
> > LogFileStreamOutput::write() uses vfprintf() through jio_fprintf().
> > freopen() and vfprintf() are not atomic.
>
> You're right. There seems to be an overlooked concurrency issue with vfprintfs \
> during freopen. I don't think we should resolve this as part of this particular \
> fix, so instead I'll create a separate issue for it.
> >
> > I think that cause of crash/assertion which you say is it.
> > (GC log will be rotated at safepoint.)
> >
>
> See my comment above for what crash/assert I'm talking about.
>
> Thanks,
> Marcus
>
> >
> > Thanks,
> >
> > Yasumasa
> >
> >
> > On 2015/10/29 23:58, Marcus Larsson wrote:
> > > Hi,
> > >
> > > On 2015-10-29 15:01, Yasumasa Suenaga wrote:
> > > > Hi Marcus,
> > > >
> > > > Thank you for your comment.
> > > >
> > > > > I'll sponsor it.
> > > >
> > > > Thank you so much!
> > > > I've uploaded new webrev:
> > > >
> > > > http://cr.openjdk.java.net/~ysuenaga/JDK-8140556/webrev.01/
> > > >
> > > >
> > >
> > > Still missing the renaming of rotate_all_logfile to rotate_all_outputs.
> > >
> > > > > logConfiguration.cpp/hpp:
> > > > >
> > > > > * I don't think we should rely on the archive_name or the output's name to \
> > > > > decide whether or not an output should be rotated. It would be better to \
> > > > > introduce an is_rotated() test function in LogOutput that could be used \
> > > > > here.
> > > > > * rotate_all_logfile() should be renamed to rotate_all_outputs(). Currently \
> > > > > there are only LogFileOutputs (other than stdout/stderr), but in the future \
> > > > > there might be other types of outputs so I prefer having a more general \
> > > > > name. Also, please use static_cast<LogFileOutput*> instead of the C-style \
> > > > > cast. (Additional logic will be required here once more types of log \
> > > > > outputs are added, but I don't think we need to worry about this right \
> > > > > now.)
> > > > > * Don't print an error if an output is not rotatable, since it's not an \
> > > > > error to have some log outputs rotated while others are not. If you really \
> > > > > want some traceability here I suggest adding log messages on trace level, \
> > > > > tagged with 'logging'.
> > > >
> > > > I added LogOutput::rotate(bool) as virtual function.
> > > > This function works nothing by default, but will rotate all logs at \
> > > > LogFileOutput.
> > >
> > > This rotate function works I guess, but it will probably need some rework once \
> > > there are other types of log outputs (rotate doesn't make sense on all types of \
> > > log outputs).
> > > >
> > > > If true is passed to this function, all files will be rotated.
> > > >
> > > >
> > > > > logDiagnosticCommand.cpp/hpp:
> > > > >
> > > > > * I think the description could be improved to something like "Lists \
> > > > > current log configuration, enables/disables/configures a log output, or \
> > > > > disables/rotates all logs."
> > > > > * The rotate option description should clarify that all logs will be \
> > > > > rotated ("current log" is too ambiguous).
> > > >
> > > > I've fixed.
> > >
> > > Great, thanks!
> > >
> > > >
> > > >
> > > > > logFileOutput.cpp/hpp:
> > > > >
> > > > > * Moving the MutexLocker like this introduces a race condition where a log \
> > > > > might be rotated multiple times by different threads, instead of just once. \
> > > > > Instead of making the rotate() function public and moving the mutexlocker, \
> > > > > I suggest adding something like a public force_rotation() function that \
> > > > > grabs the lock and calls the private rotate().
> > > > > * Given the addition of is_rotated() in LogOutput, then get_archive_name() \
> > > > > should be removed.
> > > >
> > > > I moved MutexLocker and should_rotate() to rotate().
> > > > I think this change can avoid race condition.
> > > >
> > >
> > > There is a subtle problem with taking the lock to check if we should rotate. If \
> > > we configure a rotated file output and then log something on that output before \
> > > thread local storage initialization is complete, we will crash/hit an assert. \
> > > The previous implementation avoided this as long as no rotation was needed \
> > > before this initialization was complete. (This can be triggered using the \
> > > following arguments "-Xlog:all=trace:file.txt::filesize=10,filecount=2 \
> > > -Xlog:invalid", for example.)
> > > Thanks,
> > > Marcus
> > >
> > > >
> > > > Thanks,
> > > >
> > > > Yasumasa
> > > >
> > > >
> > > > On 2015/10/27 21:17, Marcus Larsson wrote:
> > > > > Hi,
> > > > >
> > > > > On 2015-10-27 01:03, Yasumasa Suenaga wrote:
> > > > > > Hi Marcus,
> > > > > >
> > > > > > Thank you for replying.
> > > > > >
> > > > > > I filed this feature to JBS and change subject of this email.
> > > > > > Could you be a sponsor and review it?
> > > > >
> > > > > I'll sponsor it.
> > > > >
> > > > > >
> > > > > > http://cr.openjdk.java.net/~ysuenaga/JDK-8140556/webrev.00/
> > > > >
> > > > > logConfiguration.cpp/hpp:
> > > > >
> > > > > * I don't think we should rely on the archive_name or the output's name to \
> > > > > decide whether or not an output should be rotated. It would be better to \
> > > > > introduce an is_rotated() test function in LogOutput that could be used \
> > > > > here.
> > > > > * rotate_all_logfile() should be renamed to rotate_all_outputs(). Currently \
> > > > > there are only LogFileOutputs (other than stdout/stderr), but in the future \
> > > > > there might be other types of outputs so I prefer having a more general \
> > > > > name. Also, please use static_cast<LogFileOutput*> instead of the C-style \
> > > > > cast. (Additional logic will be required here once more types of log \
> > > > > outputs are added, but I don't think we need to worry about this right \
> > > > > now.)
> > > > > * Don't print an error if an output is not rotatable, since it's not an \
> > > > > error to have some log outputs rotated while others are not. If you really \
> > > > > want some traceability here I suggest adding log messages on trace level, \
> > > > > tagged with 'logging'.
> > > > >
> > > > > logDiagnosticCommand.cpp/hpp:
> > > > >
> > > > > * I think the description could be improved to something like "Lists \
> > > > > current log configuration, enables/disables/configures a log output, or \
> > > > > disables/rotates all logs."
> > > > > * The rotate option description should clarify that all logs will be \
> > > > > rotated ("current log" is too ambiguous).
> > > > >
> > > > > logFileOutput.cpp/hpp:
> > > > >
> > > > > * Moving the MutexLocker like this introduces a race condition where a log \
> > > > > might be rotated multiple times by different threads, instead of just once. \
> > > > > Instead of making the rotate() function public and moving the mutexlocker, \
> > > > > I suggest adding something like a public force_rotation() function that \
> > > > > grabs the lock and calls the private rotate().
> > > > > * Given the addition of is_rotated() in LogOutput, then get_archive_name() \
> > > > > should be removed.
> > > > > Thanks,
> > > > > Marcus
> > > > >
> > > > > >
> > > > > >
> > > > > > Thanks,
> > > > > >
> > > > > > Yasumasa
> > > > > >
> > > > > >
> > > > > > On 2015/10/26 18:56, Marcus Larsson wrote:
> > > > > > > Hi,
> > > > > > >
> > > > > > > Sorry for my late reply.
> > > > > > >
> > > > > > > I think being able to force rotation via jcmd seems like a good \
> > > > > > > feature. Files are currently opened in append mode so it should already \
> > > > > > > be possible to use external log rotation tools by copying and \
> > > > > > > truncating the files. Still I think it would be nice to provide the \
> > > > > > > jcmd for rotation as well.
> > > > > > > I can see some small issues with the implementation, but we can deal \
> > > > > > > with that during the review.
> > > > > > > Thanks,
> > > > > > > Marcus
> > > > > > >
> > > > > > >
> > > > > > > On 2015-10-26 00:26, Yasumasa Suenaga wrote:
> > > > > > > > Hi all,
> > > > > > > >
> > > > > > > > Have you ever seen my change?
> > > > > > > > I (and my customers) need log rotation function via external tool.
> > > > > > > >
> > > > > > > > I want to merge it by Feature Complete.
> > > > > > > >
> > > > > > > > Thanks,
> > > > > > > >
> > > > > > > > Yasumasa
> > > > > > > > 2015/10/16 22:55 "Yasumasa Suenaga" <yasuenag@gmail.com>:
> > > > > > > >
> > > > > > > > > Hi all,
> > > > > > > > >
> > > > > > > > > I contributed JDK-7090324: gclog rotation via external tool to be
> > > > > > > > > synchronized with
> > > > > > > > > logrotated tool on Linux.
> > > > > > > > >
> > > > > > > > > I think JEP 158 is in progress.
> > > > > > > > > However, this JEP does not contain log rotation via external tool \
> > > > > > > > > in the spec.
> > > > > > > > > I want to rotate logs via jcmd in this JEP.
> > > > > > > > >
> > > > > > > > > I've updated a patch for it:
> > > > > > > > >
> > > > > > > > > http://cr.openjdk.java.net/~ysuenaga/jvmlogging-logrotate/
> > > > > > > > >
> > > > > > > > > This patch provides new option "rotate" in VM.log command.
> > > > > > > > > If this change can be accepted, I will file it to JBS and send RFR.
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > Thanks,
> > > > > > > > >
> > > > > > > > > Yasumasa
> > > > > > > > >
> > > > > > >
> > > > >
> > >
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic