Review request for 7195249: Some jtreg tests use hard coded ports
Yekaterina Kantserova
yekaterina.kantserova at oracle.com
Wed Dec 4 01:27:43 PST 2013
Taras,
I agree with the previous comments, that Utils.getFreePort() does not
guarantee the port will be still free when you start your process.
Unfortunately I don't think the library can do more. However, there is a
solution.
Please, look at the *jdk/test/sun/tools/jstatd/JstatdTest.java
tryToSetupJstatdProcess()*. In brief, the test will try to start a
process with a free port and then check if
/java.rmi.server.ExportException: Port already in use/ has been thrown.
If yes, you have to retry.
Thanks,
Katja
On 12/02/2013 01:39 PM, taras ledkov wrote:
> Hi Everyone,
>
> Whatever logic is to be chosen to select a free port, it is the
> library responsibility to implements it, would not you agree?
>
> Hence what I am suggesting is to integrate the tests as is.
>
> Should we decide to replace logic of the port selection, we could do
> it later in the library.
>
> On 21.11.2013 15:00, Jaroslav Bachorik wrote:
>> On 20.11.2013 18:38, Dmitry Samersoff wrote:
>>> Roger,
>>>
>>> As soon as we close a socket nobody can guarantee that the port is
>>> free.
>>>
>>> Moreover, port returned by getFreePort()[1] remains not accessible for
>>> some time - it depends to system setup, take a look to discussions
>>> around SO_REUSEPORT for Linux or SO_REUSEADDR and SO_LINGER for BSD.
>>>
>>> So from stability point of view it's better to just return random
>>> number
>>> between 49152 and 65535.
>>
>> Well, this doesn't seem to improve the odds by much. When there are more
>> tests run in parallel, all of them requiring a free port, nothing
>> prevents the random function to return the same port to all of them.
>> Also, two subsequent requests can return the same port and cause
>> problems with timing when a port used by a previous test is not fully
>> ready to be assigned to a different socket. And as Dmitry pointed out
>> unless one can keep hold of the allocated socket and use it later there
>> is no guarantee that a port which was tested unallocated will remain
>> unallocated also for the next few milliseconds.
>>
>> The only fail proof solution would be a port allocating service provided
>> by the harness. Until then we can only (hopefully) decrease the chance
>> of intermittent failures due to a port being in use.
>>
>> -JB-
>>
>>>
>>> -Dmitry
>>>
>>>
>>> [1]
>>>
>>> 141 public static int getFreePort() throws InterruptedException,
>>> IOException {
>>> 142 int port = -1;
>>> 143
>>> 144 while (port <= 0) {
>>> 145 Thread.sleep(100);
>>> 146
>>> 147 ServerSocket serverSocket = null;
>>> 148 try {
>>> 149 serverSocket = new ServerSocket(0);
>>> 150 port = serverSocket.getLocalPort();
>>> 151 } finally {
>>> 152 serverSocket.close();
>>> 153 }
>>> 154 }
>>> 155
>>> 156 return port;
>>> 157 }
>>> 158
>>>
>>>
>>> On 2013-11-20 19:40, roger riggs wrote:
>>>> Hi,
>>>>
>>>> fyi, The jdk.testlibrary.Utils.getFreePort() method will Open an free
>>>> Socket, close it and return
>>>> the port number.
>>>>
>>>> And as Alan recommended, use (0) when possible to have the system
>>>> assign
>>>> the port #.
>>>>
>>>> Roger
>>>>
>>>> On 11/20/2013 8:04 AM, Dmitry Samersoff wrote:
>>>>> Taras,
>>>>>
>>>>> *The only* correct way to take really free port is:
>>>>>
>>>>> 1. Chose random number between 49152 and 65535
>>>>> 2. Open socket
>>>>>
>>>>> if socket fails - repeat step 1
>>>>> if socket OK - return *socket*
>>>>>
>>>>>
>>>>> If you can't keep the socket open (e.g. you have to pass port
>>>>> number as
>>>>> property value) you shouldn't do any pre-check as it has no value
>>>>> - as
>>>>> as soon as you close socket someone can take the port.
>>>>>
>>>>> So just choose a random number within the range above and let
>>>>> networking
>>>>> code opening socket to handle port conflict.
>>>>>
>>>>> -Dmitry
>>>>>
>>>>>
>>>>>
>>>>> On 2013-11-20 15:54, taras ledkov wrote:
>>>>>> Hi Everyone,
>>>>>>
>>>>>> I am working on bug
>>>>>> https://bugs.openjdk.java.net/browse/JDK-7195249.
>>>>>>
>>>>>> There are two webrevs:
>>>>>> Webrev for jdk part:
>>>>>> http://cr.openjdk.java.net/~anazarov/7195249/jdk/webrev.00/
>>>>>>
>>>>>> Webrev for hs part:
>>>>>> http://cr.openjdk.java.net/~anazarov/7195249/hs/webrev.00/
>>>>>>
>>>>>> Please take a look at some notes:
>>>>>> - After discussing with Yekaterina Kantserova & Jaroslav Bachorik
>>>>>> some
>>>>>> shell tests have been converted to java based tests
>>>>>>
>>>>>> - PasswordFilePermissionTest & SSLConfigFilePermissionTest tests
>>>>>> looked
>>>>>> very similar, so a common parent class was created for them:
>>>>>> AbstractFilePermissionTest
>>>>>>
>>>>>> - What was called RmiRegistrySslTest.java I've renamed to
>>>>>> RmiRegistrySslTestApp.java. The java code to replace old shell
>>>>>> script
>>>>>> RmiRegistrySslTest.sh is called RmiRegistrySslTest.java, hence the
>>>>>> huge
>>>>>> diff.
>>>>>>
>>>>>> - The new RmiRegistrySslTest.java has some lines similar to the
>>>>>> AbstractFilePermissionTest.java, I nevertheless decided to not
>>>>>> complicate the code further and leave it as is. Please let me
>>>>>> know if
>>>>>> this is somehow not acceptable
>>>>>>
>>>>>> - com/oracle/java/testlibrary/Utils.java that is added to hotspot
>>>>>> repository is taken from this patch:
>>>>>> http://cr.openjdk.java.net/~ykantser/8023138/webrev.00/test/lib/testlibrary/jdk/testlibrary/Utils.java.sdiff.html
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> - These tests will need additional changes when test library process
>>>>>> tools will support command line options inheritance
>>>>>> (http://mail.openjdk.java.net/pipermail/serviceability-dev/2013-November/013235.html)
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20131204/388d4fe9/attachment.html
More information about the serviceability-dev
mailing list