RFR for JDK-7190106 RMI benchmark fails intermittently because of use of fixed port
Tristan Yan
tristan.yan at oracle.com
Fri Nov 8 11:00:46 UTC 2013
/Thank you, Stuart
There is one review point I want to ask you opinion. Which is the reason
that I moved from test/java/rmi/reliability/benchmark/bench/rmi to
test/java/rmi/reliability/benchmark is Main.java need access class
TestLibrary for supporting random port. TestLibrary is a unpackage
class, I couldn't find a way to let a class which has Package to access
the class without package. Do you have suggestion on that?
Thank you so much.
Tristan
On 11/06/2013 09:50 AM, Stuart Marks wrote:
/
> /
> / /
> On 11/1/13 9:18 AM, Tristan Yan wrote:
> /
>> /Hi Everyone
>> http://cr.openjdk.java.net/~pzhang/Tristan/7190106/webrev/
>> / /
>> Description:
>> 1. Convert shell script test to Java program test.
>> 2. Using random server port by reusing Darryl Mocek's work to replace
>> fixed
>> server port.
>> 3. Using java Process class to start client process.
>> 4. Also convert other shell script test runSerialBench.sh to java
>> program test also
>> /
> /
> Hi Tristan,
> / /
> Several comments on this webrev.
> / /
> / /
> ** The original arrangement within the
> test/java/rmi/reliability/benchmark directory had the main benchmark
> files (scripts) at the top, some benchmark framework files in the
> "bench" subdirectory, and the actual RMI and serialization benchmarks
> in bench/rmi and bench/serial subdirectories.
> / /
> The webrev moves all the RMI benchmarks to the top benchmark directory
> but leaves the serial benchmarks in bench/serial. The RMI benchmarks
> are now all cluttering the top directory, but the main serial
> benchmark test is now buried in the bench/serial directory. The nice
> organization that was there before is now spoiled. Is this
> rearrangement necessary in order to convert the scripts to Java? I
> would prefer the original arrangement be left in place.
> / /
> / /
> ** The RMI benchmark Main.java file has a @run tag of the form,
> / /
> @run main/othervm/policy=policy.all/timeout=1800 -server Main -c
> config
> / /
> There is a subtle but serious problem here: the -server option is
> passed to the >>JVM<< and not as an argument to the main() method. The
> main() method gets neither a -server nor a -client argument, so its
> default "run mode" as defined by the benchmark itself is SAMEVM. This
> runs the client and server in the same JVM, which is different from
> the shell script, which ran separate client and server JVMs.
> / /
> / /
> ** The logic to process the -server argument still expects to take a
> port, even though the port is assigned automatically. So the obvious
> fix to the above,
> / /
> @run main/othervm/policy=policy.all/timeout=1800 Main -server -c
> config
> / /
> doesn't work, since a port is missing. The logic to increment the
> argument index to collect the port argument should be removed. Also,
> the -server line should be restored to the usage message, but without
> the port argument.
> / /
> / /
> ** After this is done, the client's command line is constructed
> improperly. The command line ends up looking something like this:
> / /
> java client -cp <classpath> Main client localhost:58583 -c config
> / /
> The word "client" appears twice, but what's really required is
> "-client" to appear as an argument after Main.
> / /
> / /
> ** The client is run using ProcessBuilder, which by default sends
> stdout and stderr to pipes to be read by the parent. But the parent
> never reads them, thus any messages from the client are never seen.
> The client is the one that emits the benchmark report, so its output
> needs to be seen. It might be sufficient to have the client inherit
> the parent's stdout and stderr. This might intermix the client's and
> server's output, but it's better than nothing.
> / /
> / /
> ** The config file is checked with the following code:
> / /
> try {
> confFile = args[i];
> confstr = new FileInputStream(System.getProperty("test.src")
> + System.getProperty("file.separator") + confFile);
> } catch (IOException e) {
> die("Error: unable to open \"" + args[i] + "\"");
> }
> / /
> This is potentially misleading, as the message doesn't print the
> actual filename that was attempted to be opened.
> / /
> This is important, as the test.src property doesn't exist in the
> client JVM.
> / /
> Note that the original shell script passed full pathnames for the
> config file to both the client and the server. The new @run tag merely
> says "-c config" which redefines the config filename to be relative to
> the test.src directory. You could pass -Dtest.src=... to the client,
> but it seems like there should be something better than can be done.
> / /
> / /
> ** The client needs to have its security policy set up. This is
> missing from the construction of the client's command line.
> / /
> / /
> ** ProcessBuilder takes a List<String> for its command; there is no
> need to turn the list into an array.
> / /
> / /
> ** In the benchmark main methods, code of the form,
> / /
> while (true) {
> runBenchmarks();
> if (exitRequested) {
> System.exit();
> }
> }
> / /
> was replaced with
> / /
> while (!exitRequested) {
> runBenchmarks();
> }
> / /
> This is a subtle logic change, in that the former code always executed
> the loop at least once. It seems unlikely, but it's possible that a
> timer could set exitRequested before loop entry, resulting in the
> benchmark running zero times. I guess, if you really want to clean
> this up (we do need to avoid System.exit in jtreg tests), use a
> do-while loop instead.
> / /
> / /
> ** Don't forget to remove the 7190106/runRmiBench.sh entry from
> ProblemList.txt.
> / /
> / /
> ** Remove the references to RMISecurityManager and just use
> SecurityManager. This is just general cleanup. (I deprecated
> RMISecurityManager last week.) :-)
> / /
> / /
> It would be good if you could fix up these issues and post another
> webrev.
> / /
> Thanks.
> / /
> s'marks
> / /
> / /
> / /
> / /
> /
>> /Thank you
>> Tristan
>> / /
>> On 01/11/2013 23:58, Stuart Marks wrote:
>> /
>>> /On 10/31/13 10:22 PM, Tristan Yan wrote:
>>> /
>>>> /I am working on bug
>>>> https://bugs.openjdk.java.net/browse/JDK-7190106. Based
>>>> on my research, it looks like the issue of fixed port was already
>>>> addressed
>>>> by Stuart Marks in other RMI tests which are Java based. I would
>>>> like to
>>>> reuse his solution, however it does not work for shell based tests.
>>>> /
>>> /
>>> (Darryl Mocek did the unique port work for the RMI tests.)
>>> / /
>>> Was the patch attached to your message? If so, it didn't get
>>> through. Most
>>> OpenJDK mailing lists strip off attachments before forwarding the
>>> message to
>>> the recipients.
>>> / /
>>> /
>>>> /2. My recommendation would be to convert this shell script test
>>>> into Java
>>>> based test and re-use the dynamic port allocation solution by
>>>> Stuart Marks to
>>>> address the issue
>>>> / /
>>>> 3. Also this test was written with server/client mode in shell
>>>> script. In the
>>>> past there have been sync issues between server/client which caused
>>>> the test
>>>> to fail. If we convert the shell script into Java based test, it
>>>> would avoid
>>>> using "sleep 10" mechanism to allow for server and client to start
>>>> up and
>>>> also give us better control in synchronizing server and client.
>>>> /
>>> /
>>> (Background for interested readers.) In general, yes, it's quite
>>> difficult to
>>> make reliable shell tests, especially for multi-process tests like
>>> this one.
>>> There is the unique port issue, and there is also the issue of how
>>> long for
>>> the client to wait until the server is ready. Error handling is also a
>>> problem, for example, if one of the JVMs gets an unexpected
>>> exception, it's
>>> easy for shell tests to mishandle this case. They might hang or
>>> erroneously
>>> report success.
>>> / /
>>> --
>>> / /
>>> If this is a rewrite, it's probably fairly large, so you need to
>>> upload it
>>> somewhere (e.g., cr.openjdk.java.net) and then post a link to it.
>>> / /
>>> Thanks.
>>> / /
>>> s'marks
>>> /
>> /
>> /
/
/
More information about the core-libs-dev
mailing list