You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "Chris Nauroth (JIRA)" <ji...@apache.org> on 2015/05/12 01:48:01 UTC

[jira] [Updated] (ZOOKEEPER-2183) Change test port assignments to improve uniqueness of ports for multiple concurrent test processes on the same host.

     [ 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)