You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2026/05/30 18:01:35 UTC
(tinkerpop) branch master updated: Fix port binding race between sequential GLV integration test runs
This is an automated email from the ASF dual-hosted git repository.
spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/master by this push:
new 86a0612c85 Fix port binding race between sequential GLV integration test runs
86a0612c85 is described below
commit 86a0612c85acf95f095901023598b3f26c65052a
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Sat May 30 13:59:50 2026 -0400
Fix port binding race between sequential GLV integration test runs
docker compose down can return before docker-proxy has fully released its socket bindings. Since all four GLV modules share host ports 45940-45942 and 4588 and Maven runs them sequentially, the next module would intermittently fail to bind those ports. After each module's final compose down, poll sstlnp for up to 30 seconds until all four ports are confirmed free before returning control to Maven. CTR
---
gremlin-dotnet/test/pom.xml | 14 +++++++++++++-
gremlin-go/pom.xml | 14 +++++++++++++-
gremlin-js/gremlin-javascript/pom.xml | 14 +++++++++++++-
gremlin-python/pom.xml | 14 ++++++++++++--
4 files changed, 51 insertions(+), 5 deletions(-)
diff --git a/gremlin-dotnet/test/pom.xml b/gremlin-dotnet/test/pom.xml
index 13ebf543e1..d7d9f8842a 100644
--- a/gremlin-dotnet/test/pom.xml
+++ b/gremlin-dotnet/test/pom.xml
@@ -103,9 +103,21 @@ limitations under the License.
<HOME>${user.home}</HOME>
</environmentVariables>
<executable>bash</executable>
+ <!--
+ Command breakdown:
+ compose down (first) - remove any containers left over from a previously failed run
+ compose up - build images, start the server and test containers,
+ and wait for the test container to finish
+ compose down (second) - tear down this run's containers and network
+ port-wait loop - wait up to 30 s for ports 45940-45942 and 4588 to be released by
+ the Docker daemon before returning to Maven; all GLV modules share
+ these host ports and run sequentially, so the next module would
+ fail to bind them if docker-proxy has not fully exited yet
+ image prune - remove dangling test images to reclaim disk space
+ -->
<arguments>
<argument>-c</argument>
- <argument>docker compose down; docker compose up --build --exit-code-from gremlin-dotnet-integration-tests; EXIT=$?; docker compose down; docker image prune --filter label=maintainer=dev@tinkerpop.apache.org -f; exit $EXIT</argument>
+ <argument>docker compose down; docker compose up --build --exit-code-from gremlin-dotnet-integration-tests; EXIT=$?; docker compose down; for i in $(seq 1 30); do ss -tlnp | grep -qE ':(45940|45941|45942|4588) ' || break; sleep 1; done; docker image prune --filter label=maintainer=dev@tinkerpop.apache.org -f; exit $EXIT</argument>
</arguments>
</configuration>
</execution>
diff --git a/gremlin-go/pom.xml b/gremlin-go/pom.xml
index 41413b26d5..5d5019a476 100644
--- a/gremlin-go/pom.xml
+++ b/gremlin-go/pom.xml
@@ -114,9 +114,21 @@ limitations under the License.
<HOME>${user.home}</HOME>
</environmentVariables>
<executable>bash</executable>
+ <!--
+ Command breakdown:
+ compose down (first) - remove any containers left over from a previously failed run
+ compose up - build images, start the server and test containers,
+ and wait for the test container to finish
+ compose down (second) - tear down this run's containers and network
+ port-wait loop - wait up to 30 s for ports 45940-45942 and 4588 to be released by
+ the Docker daemon before returning to Maven; all GLV modules share
+ these host ports and run sequentially, so the next module would
+ fail to bind them if docker-proxy has not fully exited yet
+ image prune - remove dangling test images to reclaim disk space
+ -->
<arguments>
<argument>-c</argument>
- <argument>docker compose down; docker compose up --build --exit-code-from gremlin-go-integration-tests; EXIT=$?; docker compose down; docker image prune --filter label=maintainer=dev@tinkerpop.apache.org -f; exit $EXIT</argument>
+ <argument>docker compose down; docker compose up --build --exit-code-from gremlin-go-integration-tests; EXIT=$?; docker compose down; for i in $(seq 1 30); do ss -tlnp | grep -qE ':(45940|45941|45942|4588) ' || break; sleep 1; done; docker image prune --filter label=maintainer=dev@tinkerpop.apache.org -f; exit $EXIT</argument>
</arguments>
</configuration>
</execution>
diff --git a/gremlin-js/gremlin-javascript/pom.xml b/gremlin-js/gremlin-javascript/pom.xml
index fcbab8a41b..f2dd798544 100644
--- a/gremlin-js/gremlin-javascript/pom.xml
+++ b/gremlin-js/gremlin-javascript/pom.xml
@@ -282,9 +282,21 @@ limitations under the License.
<HOST_GID>${host.gid}</HOST_GID>
</environmentVariables>
<executable>bash</executable>
+ <!--
+ Command breakdown:
+ compose down (first) - remove any containers left over from a previously failed run
+ compose up - build images, start the server and test containers,
+ and wait for the test container to finish
+ compose down (second) - tear down this run's containers and network
+ port-wait loop - wait up to 30 s for ports 45940-45942 and 4588 to be released by
+ the Docker daemon before returning to Maven; all GLV modules share
+ these host ports and run sequentially, so the next module would
+ fail to bind them if docker-proxy has not fully exited yet
+ image prune - remove dangling test images to reclaim disk space
+ -->
<arguments>
<argument>-c</argument>
- <argument>docker compose down; docker compose up --build --exit-code-from gremlin-js-integration-tests; EXIT=$?; docker compose down; docker image prune --filter label=maintainer=dev@tinkerpop.apache.org -f; exit $EXIT</argument>
+ <argument>docker compose down; docker compose up --build --exit-code-from gremlin-js-integration-tests; EXIT=$?; docker compose down; for i in $(seq 1 30); do ss -tlnp | grep -qE ':(45940|45941|45942|4588) ' || break; sleep 1; done; docker image prune --filter label=maintainer=dev@tinkerpop.apache.org -f; exit $EXIT</argument>
</arguments>
<workingDirectory>.</workingDirectory>
</configuration>
diff --git a/gremlin-python/pom.xml b/gremlin-python/pom.xml
index 40d8ad819f..9ef88c19df 100644
--- a/gremlin-python/pom.xml
+++ b/gremlin-python/pom.xml
@@ -155,7 +155,17 @@ limitations under the License.
</execution>
<!--
- use docker compose to run unit tests, radish, and integration tests.
+ Use docker compose to run unit tests, radish, and integration tests.
+ Command breakdown:
+ compose down (first) - remove any containers left over from a previously failed run
+ compose up - build images, start the server and test containers,
+ and stop everything when either container exits
+ compose down (second) - tear down this run's containers and network
+ port-wait loop - wait up to 30 s for ports 45940-45942 and 4588 to be released by
+ the Docker daemon before returning to Maven; all GLV modules share
+ these host ports and run sequentially, so the next module would
+ fail to bind them if docker-proxy has not fully exited yet
+ image prune - remove dangling test images to reclaim disk space
-->
<execution>
<id>python-tests</id>
@@ -174,7 +184,7 @@ limitations under the License.
<env key="PYTEST_ARGS" value="${pytestArgs}"/>
<env key="RADISH_ARGS" value="${radishArgs}"/>
<arg value="-c"/>
- <arg value="docker compose down; docker compose up --build --abort-on-container-exit gremlin-server-test-python gremlin-python-integration-tests; EXIT=$?; docker compose down; docker image prune --filter label=maintainer=dev@tinkerpop.apache.org -f; exit $EXIT"/>
+ <arg value="docker compose down; docker compose up --build --abort-on-container-exit gremlin-server-test-python gremlin-python-integration-tests; EXIT=$?; docker compose down; for i in $(seq 1 30); do ss -tlnp | grep -qE ':(45940|45941|45942|4588) ' || break; sleep 1; done; docker image prune --filter label=maintainer=dev@tinkerpop.apache.org -f; exit $EXIT"/>
</exec>
</target>
</configuration>