[ 
https://issues.apache.org/jira/browse/ZOOKEEPER-2183?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Chris Nauroth updated ZOOKEEPER-2183:
-------------------------------------
    Attachment: ZOOKEEPER-2183.001.patch

I'm attaching a patch.  Here is a summary of the changes:
# build.xml: Add support for concurrent execution of tests.  The default is 
still a single JUnit process (same as today), but you can override it by 
passing a command line argument.  This would require everyone to upgrade to Ant 
1.9.4.  I don't know what version Jenkins runs, so if it fails on this, then 
I'll provide another patch without the build.xml change.  On my fairly wimpy 
CentOS VM, I can do a full test run with {{ant -Dtest.junit.threads=8 
-Dtest.output=yes clean test-core-java}} in ~10-15 minutes, down from ~60 
minutes.
# {{PortAssignment}}: I rewrote this to assign ports by binding to an ephemeral 
port temporarily.  I documented that there is still a very small race condition 
risk, but it's going to be much better than the current situation where 
multiple JUnit processes starting from the same base port number could collide. 
 I did explore trying to bootstrap test servers with port 0 to eliminate this 
race condition completely, but that would have required intrusive changes in 
product code and tests that expect to know all their port numbers upfront 
before running anything.
# Multiple test suites are updated to skip starting {{JettyAdminServer}}, so 
that we don't get a {{BindException}} when they all try to use the same port.  
All test suites that inherit from {{ZKTestCase}} already do this.
# Multiple tests are updated to remove "+ 1000" logic from their port 
assignments.  This looks like it was an attempt to offset port numbers a bit in 
certain tests to try to increase the probability of uniqueness.  This is no 
longer necessary with the new {{PortAssignment}}.  Also, the logic is 
incorrect, because it could inadvertently cause a port collision or overflow 
past the valid range for port numbers.

I've tried multiple concurrent test runs with this patch, and there are no 
signs of a {{BindException}}, so I think this covers the changes we need in 
port assignments.

> Change test port assignments to improve uniqueness of ports for multiple 
> concurrent test processes on the same host.
> --------------------------------------------------------------------------------------------------------------------
>
>                 Key: ZOOKEEPER-2183
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2183
>             Project: ZooKeeper
>          Issue Type: Improvement
>          Components: tests
>            Reporter: Chris Nauroth
>            Assignee: Chris Nauroth
>         Attachments: ZOOKEEPER-2183.001.patch
>
>
> Tests use {{PortAssignment#unique}} for assignment of the ports to bind 
> during tests.  Currently, this method works by using a monotonically 
> increasing counter from a static starting point.  Generally, this is 
> sufficient to achieve uniqueness within a single JVM process, but it does not 
> achieve uniqueness across multiple processes on the same host.  This can 
> cause tests to get bind errors if there are multiple pre-commit jobs running 
> concurrently on the same Jenkins host.  This also prevents running tests in 
> parallel to improve the speed of pre-commit runs.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to