Request for Review: 5049299: (process) Use posix_spawn, not fork, on S10 to avoid swap exhaustion

Martin Buchholz martinrb at google.com
Thu Dec 20 04:04:29 UTC 2012


Thanks for this.  I agree with the strategy.

I'm hoping build folks and macosx folks also take a look at this hairy
change.

+LINKFLAG =
+ifeq ($(ARCH_DATA_MODEL), 64)
+LINKFLAG = -m64
+endif

It looks wrong to be specifying toolchain-specific flags here.   Also, -m64
is logically a compiler flag, i.e. belongs in a variable with a name like
CFLAGS.

---
 ifeq ($(OPENJDK_TARGET_OS), solaris)
- ifeq ($(OPENJDK_TARGET_CPU_BITS), 32)
- BUILD_JEXEC := 1
- endif
+    ifeq ($(OPENJDK_TARGET_CPU_BITS), 32)
+        BUILD_JEXEC := 1
+    endif
 endif

Why mess with jexec?

---

+                String s = System.getProperty("java.lang.useFork");

"java.lang.Process.useFork" is a better name.
Also, useFork suggests it's a binary choice.  Wouldn't it be better to have
the system property
"java.lang.Process.spawn.mechanism" with values fork, vfork, posix_spawn,
clone

---

+    enum LaunchMechanism {
+        CLONE(1), FORK(2),
+        VFORK(3), SPAWN(4);

I would rename SPAWN to POSIX_SPAWN.
The enum can be moved to a unix-flavor-independent file.

---

+                helperpath = javahome + "/lib/" + osarch + "/jspawnhelper";

There ought to be a standard way to get the "libarchdir"


---

Of course, WhyCantJohnnyExec should have been WhyJohnnyCantExec
This is your chance to correct my mistake!


---

Sometimes I see __APPLE__ sometimes I see _ALLBSD_SOURCE.  Hopefully such
things will be removed later when the new build system is obligatory.

---


+    /* Initialize xx_parentPathv[] */

It's not called xx_anything any more.


---

+            shutItDown();

How about renaming to usageError() ?

---

+    r = sscanf (argv[argc-1], "%d:%d", &fdin, &fdout);

How about checking for argc == 2 ?

Martin

On Wed, Dec 19, 2012 at 6:28 PM, Rob McKenna <rob.mckenna at oracle.com> wrote:

> Hi folks,
>
> Thanks for the feedback so far. I've uploaded a new webrev to:
>
> http://cr.openjdk.java.net/~**robm/5049299/webrev.02/<http://cr.openjdk.java.net/~robm/5049299/webrev.02/><
> http://cr.openjdk.java.net/%**7Erobm/5049299/webrev.02/<http://cr.openjdk.java.net/%7Erobm/5049299/webrev.02/>
> >
>
> I've made the following headline changes:
>
> - Initial effort to get this stuff into the new build-infra. Hoping
> build-infra can steer me in the right direction. (note to build infra
> reviewers: see links below)
>
> - Source thats shared between jspawnhelper.c and UNIXProcess_md.c now
> resides in childproc.h/c. This results in cleaner changes to the makefiles.
>
> - jspawnhelper moved to <jdk_home>/lib/<arch> on solaris (ipc necessitate
> the use of a separate jspawnhelper for each arch) and just /lib on macosx.
>
> The following links to earlier threads are well worth reading for
> additional context:
>
> http://mail.openjdk.java.net/**pipermail/core-libs-dev/2012-**
> November/012417.html<http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-November/012417.html>
> http://mail.openjdk.java.net/**pipermail/core-libs-dev/2009-**
> June/001747.html<http://mail.openjdk.java.net/pipermail/core-libs-dev/2009-June/001747.html>
>
>     -Rob
>
>
> On 30/11/12 03:48, Rob McKenna wrote:
>
>> Hi David,
>>
>> On 30/11/12 02:31, David Holmes wrote:
>>
>>> Hi Rob,
>>>
>>> This is only a superficial scan.
>>>
>>> The changes in java/java/makefile look pretty horrible. What are all
>>> those -R entries?
>>>
>> Library search paths. Currently jprochelper is linked to libjava. I'm
>> hoping to either cut their number (by altering jprochelpers home) or get
>> rid of them altogether (by avoiding linking at all) in the next draft, they
>> are indeed ungainly.
>>
>>>
>>> We will need equivalent changes for the new build system before this is
>>> pushed.
>>>
>>>  Indeed.
>>
>>> Is the spawn use BSD specific (as per UnixProcess.java.BSD) or Apple
>>> specific (as per __APPLE_ in UNIXProcess_md.c) ?
>>>
>>>  Eesh, thanks, it applies to both platforms.
>>
>>> Are the UnixProcess.java files similar enough that we could use a single
>>> template and generate the per-OS variants?
>>>
>>>  Before this change .bsd & .linux were identical (iirc) unfortunately,
>> no longer. Solaris has  differences. When you say "generate the per-OS
>> variants" how do you mean? I'd like to keep it as straightforward as
>> possible from a sustaining perspective. (personally I'd like to just extend
>> a base class and try to get away from the makefiles as much as possible -
>> we can discuss this in 8000975 which I'll revisit once I get through this)
>>
>>> In UNIXProcess_md.c:
>>>
>>> 209 #ifdef _CS_PATH
>>>  210     char *pathbuf;
>>>  211     size_t n;
>>>  212     n = confstr(_CS_PATH,NULL,(size_t) 0);
>>>  213     pathbuf = malloc(n);
>>>  214     if (pathbuf == NULL)
>>>  215         abort();
>>>  216     confstr(_CS_PATH, pathbuf, n);
>>>  217     return pathbuf;
>>>  218 #else
>>>
>>> what is _CS_PATH and why are we calling abort()? !!!!
>>>
>>>  As per Martins comments I'm going to separate this into another change.
>> See:
>>
>> http://mail.openjdk.java.net/**pipermail/core-libs-dev/2009-**
>> May/001686.html<http://mail.openjdk.java.net/pipermail/core-libs-dev/2009-May/001686.html>
>>
>> and
>>
>> http://mail.openjdk.java.net/**pipermail/core-libs-dev/2012-**
>> November/012456.html<http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-November/012456.html>
>>
>> for context. I'll look to fall back to the previous code if the pathbuf
>> malloc fails.
>>
>>> What is all the xx_ naming ??
>>>
>>>  I believe Michael was using it to denote shared calls. (functions
>> called from both jprochelper and within UNIXProcess_md.c). I presumed it
>> was placeholder text actually, in any case it may go away in the next
>> iteration as per previous comments. If not, I'm happy to replace it with
>> whatever gets it past codereview.
>>
>>     -Rob
>>
>>  David
>>> -----
>>>
>>>
>>> On 23/11/2012 7:27 AM, Rob McKenna wrote:
>>>
>>>> Hi folks,
>>>>
>>>> Looking for a review for the webrev below, which also resolves:
>>>>
>>>> 7175692: (process) Process.exec should use posix_spawn [macosx]
>>>>
>>>> For additional context and a brief description it would be well worth
>>>> looking at the following thread started by Michael McMahon, who did the
>>>> brunt of the work for this fix:
>>>>
>>>> http://mail.openjdk.java.net/**pipermail/core-libs-dev/2009-**
>>>> May/thread.html#1644<http://mail.openjdk.java.net/pipermail/core-libs-dev/2009-May/thread.html#1644>
>>>>
>>>>
>>>> Basically the fix aims to swap fork for posix_spawn as the default
>>>> process launch mechanism on Solaris and Mac OSX in order to avoid swap
>>>> exhaustion issues encountered with fork()/exec(). It also offers a flag
>>>> (java.lang.useFork) to allow a user to revert to the old behaviour.
>>>>
>>>> I'm having trouble seeing the wood for the trees at this point so I'm
>>>> anticipating plenty of feedback. In particular I'd appreciate some
>>>> discussion on:
>>>>
>>>> - The binary launcher name & property name may need some work. A more
>>>> general property ("java.lang.launchMechanism") to allow a user to
>>>> specify a particular call was mooted too. It may be more future proof
>>>> and I'm completely open to that. (e.g.
>>>> launchMechanism=spawn|fork|**vfork|clone - we would obviously ignore
>>>> inapplicable values on a per-platform basis)
>>>> - I'd like a more robust way of checking that someone isn't trying to
>>>> use jprochelper outside of the context for which it is meant.
>>>> - The decision around which call to use getting moved to the java level
>>>> and away from the native preprocessor.
>>>>
>>>> The webrev is at:
>>>>
>>>> http://cr.openjdk.java.net/~**robm/5049299/webrev.01/<http://cr.openjdk.java.net/~robm/5049299/webrev.01/>
>>>> <http://cr.openjdk.java.net/%**7Erobm/5049299/webrev.01/<http://cr.openjdk.java.net/%7Erobm/5049299/webrev.01/>
>>>> >
>>>>
>>>> Thanks a lot,
>>>>
>>>> -Rob
>>>>
>>>>
>>
>



More information about the build-dev mailing list