RFR: 8219585: [TESTBUG] sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java passes trivially when it shouldn't

Daniel Fuchs daniel.fuchs at oracle.com
Mon Feb 25 17:12:18 UTC 2019


Hi Severin,

Thanks for looking into this!

On 25/02/2019 15:31, Severin Gehwolf wrote:
> Hi Daniel,
> 
> Thanks for the review!
> 
> Latest webrev:
> http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8219585/02/webrev/
> 
> On Fri, 2019-02-22 at 18:31 +0000, Daniel Fuchs wrote:
>> Hi Severin,
>>
>> Did you manage to make the test pass locally?
> 
> Yes. Here is the latest run:
> http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8219585/02/JMXInterfaceBindingTest.jtr
> 
> FWIW, it passed locally with the v1 change proposed. But then again, it
> didn't do what it was intended for: Try to bind to multiple host:port
> pairs on a single system. This didn't work prior JDK-6425769 as it
> would bind to *all* interfaces. The updated webrev tries to remediate
> this.

Thanks - I experimented with similar changes too.

>> This test has had a long history of failing, and I've come
>> to suspect that it might be flawed.
> 
> If it has a history of failing, why aren't there any bugs for it? How
> did it fail? Are you referring to JDK-8145982 and JDK-8146015?

Yes - well agreed - long history might have been a bit exaggerated.

>> First - it has /timeout=5. I believe that's much too short.
>> It immediately failed the first time I ran it locally on my machine.
> 
> I'm not sure we need a larger timeout. It's 20 seconds on my machine
> which seems more than enough. What makes you think we'd need to get
> this increased and it would actually do anything for test stability?

Experience - and the fact that I saw it fail in timeout on my
local machine (albeit intermittently).
The test system runs tests with many different configurations,
some of them with various combination like -Xcomp or -Xint
which tend to have some measurable effects on JVM startup.
Tests that do compilation or start sub-processes are often
more sensitive to these option sets.
Usually, I would recommend not setting the timeout at all -
unless proven that the default jtreg timeout is too short.
Especially for those cases where the test is not supposed to
timeout.

>> Then it uses well known ports. That's bad. There's no guarantee
>> that these ports will be free.
> 
> Fair enough. Fixed in the latest webrev. Now picks a random port in
> range [9100, 9200].

Thanks.

>> Then - it only use addresses configured for "localhost".
>>
>> Can there ever be more than one such address?
> 
> Yes, a multi-homed computer could use this for example this in
> /etc/hosts on Linux:
> 
> 192.168.1.18 localhost
> 192.168.122.1 localhost

OK - thanks. Not sure how much stable that would be. Ideally we
should use port 0 - but then retrieving the actual port might
not be easy. Let's wait until we see the test fail.

> Looks like this on my system:
> http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8219585/02/JMXInterfaceBindingTest-multihome.jtr
> 
>> If there is more
>> than one, I suspect the test will fail: I believe the subprocess
>> started by the test would need the additional
>>      -Djava.rmi.server.hostname=<adddress>
> 
> That's needed for 127.0.0.1 (loopback) support, so I've added it. Other
> IP addresses don't seem to need it. So the test does not need it per
> se, but it's useful so that more configs can actually test this.
> 
>> on the command line.
>> And even with that - it might still fail if those two addresses
>> can't be bound simultaneously on the same port.
> 
> No. Socket addresses are unique per host:port pair. If that wasn't
> possible, the whole test would be pointless.

Network tests that use "localhost" and listen to 0.0.0.0 are
often more prone to intermittent failures. I think this is due
to the policy of reusing addresses and ports of the
underlying OS. This test doesn't bind to the wildcard address
however - so we can hope it will not fall into this category.


>> Then why are loopback addresses filtered out? Because of two
>> things I guess:
>>
>>      - if several loopback are defined, I'm not sure you can
>>        bind them on the same port (and it might be difficult to
>>        figure that out)
>>
>>      - if you bind to the loopback address, then you most probably
>>        need to start the subprocess with
>>         -Djava.rmi.server.hostname=<loopback-adddress>
> 
> Yes. I've tried to avoid those issues by allowing one non-loopback
> address and 127.0.0.1 explicitly. Is that a reasonable assumption?

I believe so.

>> If we don't see this test failing, I suspect this is because
>> it is either never selected, or always passes trivially.
>> If we start selecting it - or have a configuration where it
>> doesn't trivially pass, I suspect it will fail.
> 
> My bet is on it passing trivially with:
> 
> "Ignoring manual test since no more than one IPs are configured for 'localhost'"

Well - I'm going to send your patch through our internal
test system - I'll let you know of the result.

best regards,

-- daniel


> 
> Thanks,
> Severin
> 
>>
>>
>> On 22/02/2019 15:04, Severin Gehwolf wrote:
>>> Hi!
>>>
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8219585
>>>
>>> Could somebody please review this trivial testbug. For a config like
>>> [1] the logic prior JDK-8145982 returned this list for
>>> getAddressesForLocalHost():
>>>
>>> [localhost/127.0.0.1, localhost/192.168.1.18, localhost/0:0:0:0:0:0:0:1]
>>>
>>> Post JDK-8145982, getAddressesForLocalHost() returns:
>>>
>>> [localhost/192.168.1.18]
>>>
>>> The fix is trivial. Just adjust the condition for as to when the test
>>> should actually trivially pass:
>>>
>>> diff --git a/test/jdk/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java b/test/jdk/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java
>>> --- a/test/jdk/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java
>>> +++ b/test/jdk/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java
>>> @@ -176,8 +176,8 @@
>>>        }
>>>    
>>>        public static void main(String[] args) {
>>> -        List<InetAddress> addrs = getAddressesForLocalHost();
>>> -        if (addrs.size() < 2) {
>>> +        List<InetAddress> addrs = getNonLoopbackAddressesForLocalHost();
>>> +        if (addrs.size() < 1) {
>>>                System.out.println("Ignoring manual test since no more than one IPs are configured for 'localhost'");
>>>                return;
>>>            }
>>> @@ -186,7 +186,7 @@
>>>            System.out.println("All tests PASSED.");
>>>        }
>>>    
>>> -    private static List<InetAddress> getAddressesForLocalHost() {
>>> +    private static List<InetAddress> getNonLoopbackAddressesForLocalHost() {
>>>    
>>>            try {
>>>                return NetworkInterface.networkInterfaces()
>>>
>>>
>>> Testing: Manual testing on local setup. jdk/submit (currently running)
>>>
>>> Thanks,
>>> Severin
>>>
>>>
>>> [1] $ grep localhost /etc/hosts | grep -v '::'
>>> 127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
>>> 192.168.1.18 localhost
>>>
> 



More information about the serviceability-dev mailing list