...
Safely allocating ports. To reduce this risk, Gradle Geode's build system now assigns each test worker JVM a distinct range of non-membership ports. No two concurrently executing tests will have any ports in common. In CI, which runs 24 distributed tests concurrently, each test gets a range of about 400 non-membership ports.
In JVMs running the latest version of GeodeGeode version 1.14 or later, AvailablePort
and AvailablePortHelper
will choose random ports from this assigned range. As a result, no two well-behaved tests will ever try to bind to receive the same port number from these classes, no matter how many are running concurrently.
When you write a test, keep the following guidelines in mind, to make sure your test uses only the ranges of ports that Gradle the Geode build system assigned to it:
- To assign an available port, call
AvailablePortHelper
orAvailablePort
. These are the only classes that know about the reduced port range for the test. - Call
AvailablePort
andAvailablePortHelper
only in the current version of Geode. Do not call these classes in Child VMs running older versions of Geode. Older versions of Geode do not honor the new, reduced port ranges. - Do not launch any service using Geode’s default port for that service. Always explicitly assign an available port. The only safe use of default ports is in a test to verify that a service uses its default port by default.
- Do not launch any service using a port number hard-coded into the test. Always explicitly assign an available port. There is no safe use of any hard-coded port number in tests that can run concurrently.
- Do not attempt to reuse an ephemeral port. Some tests start a member on an ephemeral port, stop the member, and attempt to restart it on the same port. This is not safe. It was never safe. During the time between when the member stops and when it restarts, the port is available for the operating system to give to any other process. In CI, it is very, very likely that one or more concurrently-running tests (or other processes) will request ephemeral ports during the time when your test is not bound to it. If one of those processes gets the port your test was using, your test will fail.
...