On Thu, 2019-09-12 at 19:53 +0000, Langer, Christoph wrote:
> Hi Severin,
> 
> that seems an interesting idea for an elegant solution. However,
> after trying this on a decently fast linux x86 box by leveraging one
> of these ProcessTools::startProcess methods that would wait for a
> certain output to appear in the child before returning, I figured
> that the elapsed runtime of the test increases from about 3 seconds
> to 3 minutes. It evidently takes a lot longer to bootstrap a JVM and
> get the results of a first println than just forking a process and
> immediately accessing its proc filesystem. So I think we don't want
> to do that.

Wow, that's unfortunate.

> I would like to go with this version (changed the comment to Thomas'
> suggestion): http://cr.openjdk.java.net/~clanger/webrevs/8230850.1/

Patch seems OK in this case.

Thanks,
Severin

> Chris, are you ok with it?
> 
> Thanks
> Christoph
> 
> > -----Original Message-----
> > From: Severin Gehwolf <sgehw...@redhat.com>
> > Sent: Donnerstag, 12. September 2019 11:01
> > To: Langer, Christoph <christoph.lan...@sap.com>; Thomas Stüfe
> > <thomas.stu...@gmail.com>
> > Cc: OpenJDK Serviceability <serviceability-dev@openjdk.java.net>
> > Subject: Re: RFR (S): 8230850: Test
> > sun/tools/jcmd/TestProcessHelper.java
> > fails intermittently
> > 
> > Hi Christoph,
> > 
> > Have you considered to wait for TestProcess - the spawned processes
> > - to
> > print this on stdout:
> > 
> > "The process started, pid: XXX"
> > 
> > Once that's ready on stdout, checking the main class should always
> > pass. I believe p.isAlive() check which is currrently done is
> > insufficient.
> > 
> > Thanks,
> > Severin
> > 
> > On Thu, 2019-09-12 at 08:12 +0000, Langer, Christoph wrote:
> > > Hi Thomas,
> > > 
> > > sounds reasonable, will do.
> > > 
> > > Thanks
> > > Christoph
> > > 
> > > From: Thomas Stüfe <thomas.stu...@gmail.com>
> > > Sent: Donnerstag, 12. September 2019 10:11
> > > To: Langer, Christoph <christoph.lan...@sap.com>
> > > Cc: Chris Plummer <chris.plum...@oracle.com>; OpenJDK
> > > Serviceability
> > <serviceability-dev@openjdk.java.net>
> > > Subject: Re: RFR (S): 8230850: Test
> > > sun/tools/jcmd/TestProcessHelper.java
> > fails intermittently
> > > I'm fine with the patch if you would reshape the platform
> > > dependent
> > comment. Proposal:
> > > ----
> > > -        // Depending on hw/os, process helper can return null
> > > here
> > > -        // because /proc/<pid>/cmdline is not ready yet. To
> > > cover that case,
> > >         // give it some retries.
> > > ->
> > > + getMainClass() may return NULL, e.g. due to timing issues.
> > > Attempt some
> > limited retries.
> > > ----
> > > I do not need another webrev.
> > > Cheers, Thomas
> > > 
> > > 
> > > 
> > > 
> > > On Wed, Sep 11, 2019 at 11:37 PM Langer, Christoph
> > <christoph.lan...@sap.com> wrote:
> > > > Hi Chris, Thomas,
> > > > 
> > > > thanks for looking at this. I was also wondering whether a fix
> > > > in
> > ProcessHelper would be appropriate. But I think introducing retries
> > and
> > delays in that code can do more harm than help.
> > > > For this special test case, aiming to test the ProcessHelper
> > > > functionality
> > (on Linux) only, the observed problem is that the
> > /proc/<pid>/cmdline file is
> > not ready yet when it gets evaluated because the test can be
> > quicker than
> > the spawned processes. But in real life usage of jcmd this seems
> > rather
> > unlikely. One will probably use jcmd quite some time after a java
> > process was
> > started and /proc/<pid>/cmdline should be ready. If then there are
> > problems reading it, there are likely other issues which won’t go
> > away by
> > waiting. And for these cases the fallback is to use the attach
> > framework, as
> > implemented in ProcessArgumentMatcher, which provides some chance
> > to
> > be working still. And this fallback should also cover the exotic
> > case when jcmd
> > is issued too early.
> > > > After all, ProcessHelper::getMainClass also documents that its
> > > > result can
> > be null.
> > > > @Thomas, as for your other points:
> > > >  PID reusage: Hm, maybe one can construct cases. However, I’d
> > > > think the
> > /proc/pid files should be gone after a process ends. Or at least be
> > reconstructed if there were orphans and a new process reusing an
> > old pid
> > gets started. But who knows what can happen – we’ll maybe see 😉
> > > >  Comment for Linux only issue: The test is in fact a Linux only
> > > > test. See line
> > 55: * @requires os.family == "linux". So, if we’ll eventually see
> > implementations for ProcessHelper::getMainClass on other platforms,
> > this
> > comment might have to be adopted. But for the time being I guess
> > it’s fine at
> > its current place.
> > > > Would you agree?
> > > > 
> > > > Best regards
> > > > Christoph
> > > > 
> > > > From: Chris Plummer <chris.plum...@oracle.com>
> > > > Sent: Mittwoch, 11. September 2019 19:21
> > > > To: Thomas Stüfe <thomas.stu...@gmail.com>; Langer, Christoph
> > <christoph.lan...@sap.com>
> > > > Cc: OpenJDK Serviceability <serviceability-dev@openjdk.java.net
> > > > >
> > > > Subject: Re: RFR (S): 8230850: Test
> > sun/tools/jcmd/TestProcessHelper.java fails intermittently
> > > > It does seem that the fix should be in ProcessHelper.java in
> > getMainClass(), or maybe even getCommandLine(). Fixing it in the
> > test
> > implies that every user of getMainClass() should be doing something
> > similar.
> > But then also note what ProcessArgumentMatch.check() is doing. It
> > also
> > deals with getMainClass() returing null.
> > > > thanks,
> > > > 
> > > > Chris
> > > > 
> > > > On 9/11/19 6:59 AM, Thomas Stüfe wrote:
> > > > > Hi Christoph,
> > > > > 
> > > > > in general I think this is fine. The increase-by-pow2 sleep
> > > > > time is odd
> > but okay :)
> > > > > The whole things seems rather fragile and has a lot of
> > > > > question marks
> > but I think your fix does not make it worse. One fun error now is
> > that with a
> > follow up java test reusing the PID we could get a wrong main class
> > but I think
> > the chances are astronomically low.
> > > > > Only remark, you fix this in the platform shared code, if
> > > > > this is a Linux
> > only issue maybe it should be fixed in
> > /shared/projects/openjdk/jdk-
> > jdk/source/src/jdk.jcmd/linux/classes/sun/tools/ProcessHelper.java
> > instead? If not, I would remove at least the /proc/<pid>/cmdline
> > comment
> > since this is quite platform specific.
> > > > > Cheers, Thomas
> > > > > 
> > > > > 
> > > > > On Wed, Sep 11, 2019 at 2:39 PM Langer, Christoph
> > <christoph.lan...@sap.com> wrote:
> > > > > > Hi,
> > > > > > 
> > > > > > please review this change for test
> > sun/tools/jcmd/TestProcessHelper.java to make it more robust.
> > > > > > Bug: https://bugs.openjdk.java.net/browse/JDK-8230850
> > > > > > Webrev: 
> > > > > > http://cr.openjdk.java.net/~clanger/webrevs/8230850.0/
> > > > > > 
> > > > > > This Linux only test is starting several Java processes and
> > > > > > then tries to
> > figure out the main class by invoking jdk.jcmd's linux specific
> > ProcessHelper
> > implementation  which parses the contents of /proc/<pid>/cmdline.
> > > > > > Under some circumstances, the test already attempts to read
> > /proc/<pid>/cmdline before it actually exists or is filled with
> > data. This can be
> > fixed with some sleeps/retries to wait for that data to be ready.
> > > > > > In the actual jcmd tool, such behavior of ProcessHelper.
> > > > > > getMainClass
> > should not be an issue because it is handled in
> > ProcessArgumentMatcher [0].
> > > > > > Thanks
> > > > > > Christoph
> > > > > > 
> > > > > > [0]
> > http://hg.openjdk.java.net/jdk/jdk/file/8b08eaf9a0eb/src/jdk.jcmd/share/cl
> > asses/sun/tools/common/ProcessArgumentMatcher.java#l86

Reply via email to