RFR(S): 8186293: [aix] Fix thread creation with huge stack sizes
Thomas Stüfe
thomas.stuefe at gmail.com
Thu Aug 17 10:56:07 UTC 2017
Hi Goetz,
as I said before I think the patch is basically fine. So, this is just
discussion for discussions sake, which can be fun too :) See my answer
inline.
On Thu, Aug 17, 2017 at 10:41 AM, Lindenmaier, Goetz <
goetz.lindenmaier at sap.com> wrote:
> Hi Thomas,
>
> the purpose of my fix is to make the behavior more similar.
>
> For -XX:ThreadStackSize=40000000000 you get in both dbg and opt:
>
> on aix:
> [0.226s][warning][os,thread] The thread stack size specified is invalid:
> 40000000000k
> [0.226s][warning][os,thread] Failed to start thread - pthread_create
> failed (22=EINVAL) for attributes: stacksize: 192k, guardsize: 4k, detached.
> Error occurred during initialization of VM
> java.lang.OutOfMemoryError...
>
> on linux:
> [0.225s][warning][os,thread] Failed to start thread - pthread_create
> failed (EAGAIN) for attributes: stacksize: 400000000k, guardsize: 0k,
> detached.
> Error occurred during initialization of VM
> java.lang.OutOfMemoryError...
>
> Note the stack sizes reported.
> I think the assertion on linux is only theoretical, as the function
> succeeds setting even impossible values. What else should
> go wrong? attr != NULL is obvious.
>
For one, the value may be too small. Does glibc pthread_attr_setstacksize()
also silently accepts a too small value?
And then, this relies on the libc implementation we use. We may link
against another libc (musl, eglibc, ...). So, error behaviour may change,
so we should only rely on posix behaviour.
But all this is theoretical and consolidating all platforms may be
addressed by a follow up fix.
>
> You must remove the upper range limit from ThreadStackSize to reproduce
> this easily.
> In jdk9, this upper range limit is missing.
>
>
Or write a java program with a user-set stack size?
..Thomas
> Best regards,
> Goetz.
>
>
> > -----Original Message-----
> > From: David Holmes [mailto:david.holmes at oracle.com]
> > Sent: Thursday, August 17, 2017 9:23 AM
> > To: Thomas Stüfe <thomas.stuefe at gmail.com>; Lindenmaier, Goetz
> > <goetz.lindenmaier at sap.com>
> > Cc: hotspot-runtime-dev at openjdk.java.net
> > Subject: Re: RFR(S): 8186293: [aix] Fix thread creation with huge stack
> sizes
> >
> > Hi Thomas,
> >
> > On 17/08/2017 5:07 PM, Thomas Stüfe wrote:
> > >
> > > On Thu, Aug 17, 2017 at 8:52 AM, Lindenmaier, Goetz
> > > <goetz.lindenmaier at sap.com <mailto:goetz.lindenmaier at sap.com>>
> > wrote:
> > >
> > > Hi David,
> > >
> > > > I wonder whether a fatal error "Error occurred during
> initialization of
> > > > VM" would not be better than just logging a warning?
> > > I skip thread creation if the error code is != 0 and return false
> as it
> > > happens on linux. So you see the exact same behavior. Only I
> > > print the additional message about the stack size because that
> > > is missing from the pthread attr which is reported (as setting it
> > > failed).
> > >
> > >
> > > Platforms seem to have different behaviour now:
> > >
> > > AIX debug (with your patch): if either one of
> > > pthread_attr_setstacksize(), pthread_attr_setguardsize or
> pthread_create
> > > fails, we log a warning and return an error.
> > > AIX release: ditto.
> > >
> > > Linux debug: if pthread_attr_setstacksize fails, we assert. We ignore
> > > errors from pthread_attr_setguardsize. If pthread_create fails, we log
> a
> > > warning and return an error.
> > > Linux release: We ignore errors from both pthread_attr_setstacksize and
> > > pthread_attr_setguardsize. If pthread_create fails, we log a warning
> and
> > > return an error.
> >
> > To me the asserts are there to catch basic usage errors that indicate a
> > general programming bug (eg something uninitialized). They will also
> > catch an "illegal argument" if the API detects that, but that is
> secondary.
> >
> > If pthread_create fails we do as you say, but if this is a system
> > problem (like bad -Xss) then it will fail the first JavaThread creation
> > and we will get the "Error occurred during initialization".
> >
> > > I think it would be nice to have consistent behavior for all platforms.
> >
> > Yes consistency would be nice but if one platform has more error
> > checking then another then we'd have to drop assertions, even if we
> > don't ever expect a failure on that platform.
> >
> > > Not sure if this needs to be done with this patch here. As for an
> "Error
> > > occurred during initialization" (debug only or release too?) - can we
> be
> > > sure this only happens at initialization? Could it not be possible for
> > > java threads with different stack sizes to be started later, and
> > > triggering the same error?
> >
> > I would expect a large stacksize passed to j.l.Thread constructor to
> > also be able to trigger this. But bad -Xss/-XX:ThreadStackSize will
> > cause initialization to fail.
> >
> > > I think I prefer to always have a runtime error (both in debug and
> > > release builds), as Goetz did in his current AIX patch. And maybe have
> a
> > > sensible Exception text.
> >
> > If pthread_create fails we have no detail as to exactly why. If
> > pthread_attr_setstacksize does then we have a reasonable idea. So not
> > sure what you would suggest.
> >
> > But in any case, as you suggest, this would all be a separate
> > enhancement request.
> >
> > Cheers,
> > David
> >
> > > Kind Regards, Thomas
> > >
> > >
> > > I removed the reference to linux, although I find it useful to
> > > point out such unexpected differences.
> > > http://cr.openjdk.java.net/~goetz/wr17/8186293-
> > aixHugeStack/webrev.02/
> > > <http://cr.openjdk.java.net/~goetz/wr17/8186293-
> > aixHugeStack/webrev.02/>
> > >
> > > Best regards,
> > > Goetz.
> > >
> > >
> > >
> > >
> > > > -----Original Message-----
> > > > From: David Holmes [mailto:david.holmes at oracle.com
> > > <mailto:david.holmes at oracle.com>]
> > > > Sent: Wednesday, August 16, 2017 10:54 PM
> > > > To: Lindenmaier, Goetz <goetz.lindenmaier at sap.com
> > > <mailto:goetz.lindenmaier at sap.com>>; hotspot-runtime-
> > > > dev at openjdk.java.net <mailto:dev at openjdk.java.net>
> > > > Subject: Re: RFR(S): 8186293: [aix] Fix thread creation with
> huge
> > > stack sizes
> > > >
> > > > On 17/08/2017 12:24 AM, Lindenmaier, Goetz wrote:
> > > > > Hi,
> > > > >
> > > > > TestOptionWithRanges causes the vm on aix to crash on some
> > > machines.
> > > > > This is because huge stack sizes are not treated properly.
> > > > >
> > > > > On linux, pthread_attr_setstacksize succeeds if called with
> > > huge values, but
> > > > > pthread_create() then fails. On Aix, pthread_attr_setstacksize
> > > fails if
> > > > > passed a value exceeding the limits and leaves the minimal
> system
> > > >
> > > > The AIX behaviour is more in spirit with POSIX.
> > > >
> > > > > thread stack size in attr. Thus thread creation succeeds and
> > > leads to
> > > > > crashes after thread creation when the guard pages shall be
> > > protected
> > > > > but don't fit on the tiny stack created.
> > > > >
> > > > > Please review this small, aix-only change.
> > > > > http://cr.openjdk.java.net/~goetz/wr17/8186293-
> > > <http://cr.openjdk.java.net/~goetz/wr17/8186293->
> > > > aixHugeStack/webrev.01/
> > > >
> > > > I wonder whether a fatal error "Error occurred during
> > > initialization of
> > > > VM" would not be better than just logging a warning?
> > > >
> > > > As Thomas notes, no need to discuss/describe what may or may not
> > > happen
> > > > on other platforms.
> > > >
> > > > Cheers,
> > > > David
> > > >
> > > > > Best regards,
> > > > > Goetz.
> > > > >
> > >
> > >
>
More information about the hotspot-runtime-dev
mailing list