Merge pull request #2725 from apache/merge-rename

Renamed steps around "merge" for better consistency.
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 50ecb2d..c0dafdf 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -67,6 +67,7 @@
 * Fix cases where Map keys of incomparable types could panic in `gremlin-go`.
 * Fixed an issue where missing necessary parameters for logging, resulting in '%!x(MISSING)' output in `gremlin-go`.
 * Added getter method to `ConcatStep`, `ConjoinStep`, `SplitGlobalStep` and `SplitLocalStep` for their private fields.
+* Gremlin Server docker containers shutdown gracefully when receiving a SIGTERM.
 
 [[release-3-7-2]]
 === TinkerPop 3.7.2 (April 8, 2024)
@@ -364,6 +365,7 @@
 * Fixed bug in Java driver where connection pool was not removing dead connections under certain error conditions.
 * Raised handshake exceptions for Java driver for `NoHostAvailableException` situations.
 * The default logging level for Gremlin Console in Windows is set to the same WARN level as for Linux.
+* Updated to Docker Compose V2 with `docker-compose` changed to `docker compose` in pom and script files.
 * Add command line option `-l` to change logging level for Gremlin Console in Windows.
 
 [[release-3-6-7]]
diff --git a/docker/build.sh b/docker/build.sh
index 1b299d5..d495ff5 100755
--- a/docker/build.sh
+++ b/docker/build.sh
@@ -106,7 +106,7 @@
 
 function check_status {
   status=$?
-  [ "$1" == "down" ] && docker-compose down
+  [ "$1" == "down" ] && docker compose down
   popd > /dev/null
   [ $status -ne 0 ] && exit $status
 }
@@ -128,7 +128,7 @@
 check_status
 
 if [ -n "${RUN_TESTS}" ]; then
-  # If testing, then build base server which is required by the following docker-compose.
+  # If testing, then build base server which is required by the following docker compose.
   pushd ${ABS_PROJECT_HOME}/gremlin-server > /dev/null
   docker build -f ./Dockerfile --build-arg GREMLIN_SERVER_DIR=target/apache-tinkerpop-gremlin-server-${GREMLIN_SERVER}-standalone -t tinkerpop/gremlin-server:${GREMLIN_SERVER} .
   check_status
@@ -136,7 +136,7 @@
 
 if [ -n "${INCLUDE_GO}" ] && [ -n "${RUN_TESTS}" ]; then
   pushd ${ABS_PROJECT_HOME}/gremlin-go > /dev/null
-  docker-compose up --build --exit-code-from gremlin-go-integration-tests
+  docker compose up --build --exit-code-from gremlin-go-integration-tests
   check_status "down"
 fi
 
@@ -145,19 +145,19 @@
   export BUILD_DIR=$(pwd)/target/python3/
   mkdir -p ${BUILD_DIR}
   cp -r ./src/main/python/* ${BUILD_DIR}
-  docker-compose up --build --abort-on-container-exit gremlin-server-test-python gremlin-python-integration-tests
+  docker compose up --build --abort-on-container-exit gremlin-server-test-python gremlin-python-integration-tests
   check_status "down"
 fi
 
 if [ -n "${INCLUDE_DOTNET}" ] && [ -n "${RUN_TESTS}" ]; then
   pushd ${ABS_PROJECT_HOME}/gremlin-dotnet/test > /dev/null
-  docker-compose up --build --exit-code-from gremlin-dotnet-integration-tests
+  docker compose up --build --exit-code-from gremlin-dotnet-integration-tests
   check_status "down"
 fi
 
 if [ -n "${INCLUDE_JAVASCRIPT}" ] && [ -n "${RUN_TESTS}" ]; then
   pushd ${ABS_PROJECT_HOME}/gremlin-javascript/src/main/javascript/gremlin-javascript > /dev/null
-  docker-compose up --build --exit-code-from gremlin-js-integration-tests
+  docker compose up --build --exit-code-from gremlin-js-integration-tests
   check_status "down"
 fi
 
diff --git a/docs/src/dev/developer/development-environment.asciidoc b/docs/src/dev/developer/development-environment.asciidoc
index 3026abe..d9f8ab4 100644
--- a/docs/src/dev/developer/development-environment.asciidoc
+++ b/docs/src/dev/developer/development-environment.asciidoc
@@ -352,7 +352,7 @@
 Docker allows you to test the driver without installing any dependencies. The following command can be used to run docker:
 
 [source,text]
-docker-compose up --exit-code-from gremlin-go-integration-tests
+docker compose up --exit-code-from gremlin-go-integration-tests
 
 See the <<release-environment,Release Environment>> section for more information on release manager configurations.
 
@@ -635,12 +635,12 @@
 
 * Run Maven commands, e.g. `mvn clean install` inside of project folder e.g. `tinkerpop/gremlin-go`, or `mvn clean install -pl gremlin-go`
 inside of `tinkerpop` (platform-agnostic - recommended)
-* Add `GREMLIN_SERVER=<server-image-version>` and `HOME=<user-home-directory>` to an `.env` file inside project folder and run `docker-compose up --exit-code-from gremlin-go-integration-tests` (Platform-agnostic).
-* Run `GREMLIN_SERVER=<server-image-version> docker-compose up --exit-code-from gremlin-go-integration-tests` in Unix/Linux.
-* Run `$env:GREMLIN_SERVER="<server-image-version>";$env:HOME=$env:USERPROFILE;docker-compose up --exit-code-from gremlin-go-integration-tests` in Windows PowerShell.
+* Add `GREMLIN_SERVER=<server-image-version>` and `HOME=<user-home-directory>` to an `.env` file inside project folder and run `docker compose up --exit-code-from gremlin-go-integration-tests` (Platform-agnostic).
+* Run `GREMLIN_SERVER=<server-image-version> docker compose up --exit-code-from gremlin-go-integration-tests` in Unix/Linux.
+* Run `$env:GREMLIN_SERVER="<server-image-version>";$env:HOME=$env:USERPROFILE;docker compose up --exit-code-from gremlin-go-integration-tests` in Windows PowerShell.
 
-You should see exit code 0 upon successful completion of the test suites. Run `docker-compose down` to remove the
-service containers (not needed if you executed Maven commands or `run.sh`), or `docker-compose down --rmi all` to
+You should see exit code 0 upon successful completion of the test suites. Run `docker compose down` to remove the
+service containers (not needed if you executed Maven commands or `run.sh`), or `docker compose down --rmi all` to
 remove the service containers while deleting all used images.
 
 Note for running docker with MacOS on ARM processors: Docker's performance is extremely poor on ARM Mac's in its
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
index 955dacb..73414cf 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
@@ -74,6 +74,10 @@
         this.loopName = loopName;
     }
 
+    public String getLoopName() {
+        return this.loopName;
+    }
+
     public void setUntilTraversal(final Traversal.Admin<S, ?> untilTraversal) {
         if (null != this.untilTraversal)
             throw new IllegalStateException("The repeat()-step already has its until()-modulator declared: " + this);
diff --git a/gremlin-dotnet/docker-compose.yml b/gremlin-dotnet/docker-compose.yml
index 7c84aa0..7f5efab 100644
--- a/gremlin-dotnet/docker-compose.yml
+++ b/gremlin-dotnet/docker-compose.yml
@@ -15,8 +15,6 @@
 #    specific language governing permissions and limitations
 #    under the License.
 
-version: "3.8"
-
 services:
 
   gremlin-server-test-dotnet:
diff --git a/gremlin-dotnet/test/pom.xml b/gremlin-dotnet/test/pom.xml
index edcd258..3a6b530 100644
--- a/gremlin-dotnet/test/pom.xml
+++ b/gremlin-dotnet/test/pom.xml
@@ -102,8 +102,9 @@
                                         <!-- setting this env variable is needed to be cross-platform compatible -->
                                         <HOME>${user.home}</HOME>
                                     </environmentVariables>
-                                    <executable>docker-compose</executable>
+                                    <executable>docker</executable>
                                     <arguments>
+                                        <argument>compose</argument>
                                         <argument>up</argument>
                                         <argument>--build</argument>
                                         <argument>--exit-code-from</argument>
@@ -120,8 +121,9 @@
                                 <configuration>
                                     <skip>${skipTests}</skip>
                                     <!-- don't need to set env variables for container tear down -->
-                                    <executable>docker-compose</executable>
+                                    <executable>docker</executable>
                                     <arguments>
+                                        <argument>compose</argument>
                                         <argument>down</argument>
                                     </arguments>
                                 </configuration>
diff --git a/gremlin-go/docker-compose.yml b/gremlin-go/docker-compose.yml
index a12e4f2..07c49a7 100644
--- a/gremlin-go/docker-compose.yml
+++ b/gremlin-go/docker-compose.yml
@@ -15,8 +15,6 @@
 #    specific language governing permissions and limitations
 #    under the License.
 
-version: "3.8"
-
 services:
 
   gremlin-server-test:
diff --git a/gremlin-go/driver/README.md b/gremlin-go/driver/README.md
index bbae31e..6524328 100644
--- a/gremlin-go/driver/README.md
+++ b/gremlin-go/driver/README.md
@@ -132,11 +132,11 @@
 There are different ways to launch the test suite and set the `GREMLIN_SERVER` environment variable depending on your Platform:
 - Run Maven commands, e.g. `mvn clean install` inside of `tinkerpop/gremlin-go`, or `mvn clean install -pl gremlin-go` inside of `tinkerpop` (platform-agnostic - recommended)
 - Run the `run.sh` script, which sets `GREMLIN_SERVER` by default. Run `./run.sh -h` for usage information (Unix/Linux - recommended).
-- Add `GREMLIN_SERVER=<server-image-version>` and `HOME=<user-home-directory>` to an `.env` file inside `gremlin-go` and run `docker-compose up --exit-code-from gremlin-go-integration-tests` (Platform-agnostic).
-- Run `GREMLIN_SERVER=<server-image-version> docker-compose up --exit-code-from gremlin-go-integration-tests` in Unix/Linux.
-- Run `$env:GREMLIN_SERVER="<server-image-version>";$env:HOME=$env:USERPROFILE;docker-compose up --exit-code-from gremlin-go-integration-tests` in Windows PowerShell.
+- Add `GREMLIN_SERVER=<server-image-version>` and `HOME=<user-home-directory>` to an `.env` file inside `gremlin-go` and run `docker compose up --exit-code-from gremlin-go-integration-tests` (Platform-agnostic).
+- Run `GREMLIN_SERVER=<server-image-version> docker compose up --exit-code-from gremlin-go-integration-tests` in Unix/Linux.
+- Run `$env:GREMLIN_SERVER="<server-image-version>";$env:HOME=$env:USERPROFILE;docker compose up --exit-code-from gremlin-go-integration-tests` in Windows PowerShell.
 
-You should see exit code 0 upon successful completion of the test suites. Run `docker-compose down` to remove the service containers (not needed if you executed Maven commands or `run.sh`), or `docker-compose down --rmi all` to remove the service containers while deleting all used images.
+You should see exit code 0 upon successful completion of the test suites. Run `docker compose down` to remove the service containers (not needed if you executed Maven commands or `run.sh`), or `docker compose down --rmi all` to remove the service containers while deleting all used images.
 
 [go]: https://go.dev/dl/
 [gomods]: https://go.dev/blog/using-go-modules
diff --git a/gremlin-go/pom.xml b/gremlin-go/pom.xml
index f020030..2affbfa 100644
--- a/gremlin-go/pom.xml
+++ b/gremlin-go/pom.xml
@@ -113,8 +113,9 @@
                                         <!-- setting this env variable is needed to be cross-platform compatible -->
                                         <HOME>${user.home}</HOME>
                                     </environmentVariables>
-                                    <executable>docker-compose</executable>
+                                    <executable>docker</executable>
                                     <arguments>
+                                        <argument>compose</argument>
                                         <argument>up</argument>
                                         <argument>--build</argument>
                                         <argument>--exit-code-from</argument>
@@ -131,8 +132,9 @@
                                 <configuration>
                                     <skip>${skipTests}</skip>
                                     <!-- don't need to set env variables for container tear down -->
-                                    <executable>docker-compose</executable>
+                                    <executable>docker</executable>
                                     <arguments>
+                                        <argument>compose</argument>
                                         <argument>down</argument>
                                     </arguments>
                                 </configuration>
diff --git a/gremlin-go/run.sh b/gremlin-go/run.sh
index 5f62072..23a3763 100755
--- a/gremlin-go/run.sh
+++ b/gremlin-go/run.sh
@@ -48,8 +48,8 @@
 export ABS_PROJECT_HOME
 
 # Passes current gremlin server version into docker compose as environment variable
-docker-compose up --build --exit-code-from gremlin-go-integration-tests
+docker compose up --build --exit-code-from gremlin-go-integration-tests
 EXIT_CODE=$?
 # Removes all service containers
-docker-compose down
+docker compose down
 exit $EXIT_CODE
diff --git a/gremlin-javascript/pom.xml b/gremlin-javascript/pom.xml
index bf722c9..c8eab64 100644
--- a/gremlin-javascript/pom.xml
+++ b/gremlin-javascript/pom.xml
@@ -256,8 +256,9 @@
                                         <!-- setting this env variable is needed to be cross-platform compatible -->
                                         <HOME>${user.home}</HOME>
                                     </environmentVariables>
-                                    <executable>docker-compose</executable>
+                                    <executable>docker</executable>
                                     <arguments>
+                                        <argument>compose</argument>
                                         <argument>up</argument>
                                         <argument>--build</argument>
                                         <argument>--exit-code-from</argument>
@@ -275,8 +276,9 @@
                                 <configuration>
                                     <skip>${skipTests}</skip>
                                     <!-- don't need to set env variables for container tear down -->
-                                    <executable>docker-compose</executable>
+                                    <executable>docker</executable>
                                     <arguments>
+                                        <argument>compose</argument>
                                         <argument>down</argument>
                                     </arguments>
                                     <workingDirectory>./src/main/javascript/gremlin-javascript</workingDirectory>
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/docker-compose.yml b/gremlin-javascript/src/main/javascript/gremlin-javascript/docker-compose.yml
index 65fc675..54b8392 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/docker-compose.yml
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/docker-compose.yml
@@ -15,8 +15,6 @@
 #    specific language governing permissions and limitations
 #    under the License.
 
-version: "3.8"
-
 services:
 
   gremlin-server-test-js:
diff --git a/gremlin-python/docker-compose.yml b/gremlin-python/docker-compose.yml
index 8b46dff..b03ec9c 100644
--- a/gremlin-python/docker-compose.yml
+++ b/gremlin-python/docker-compose.yml
@@ -15,8 +15,6 @@
 #    specific language governing permissions and limitations
 #    under the License.
 
-version: "3.8"
-
 services:
 
   gremlin-server-test-python:
diff --git a/gremlin-python/pom.xml b/gremlin-python/pom.xml
index 1979c15..f9bea3c 100644
--- a/gremlin-python/pom.xml
+++ b/gremlin-python/pom.xml
@@ -135,16 +135,16 @@
                                 </goals>
                                 <configuration>
                                     <target>
-                                        <exec executable="docker-compose" failonerror="true">
+                                        <exec executable="docker" failonerror="true">
                                             <env key="PACKAGE_DIR" value="${project.build.directory}/python-packaged"/>
                                             <env key="VERSION" value="${project.version}"/>
                                             <env key="PYTHONPATH" value=""/>
-                                            <arg line="up --build --abort-on-container-exit gremlin-python-package"/>
+                                            <arg line="compose up --build --abort-on-container-exit gremlin-python-package"/>
                                         </exec>
-                                        <exec executable="docker-compose" failonerror="true">
+                                        <exec executable="docker" failonerror="true">
                                             <env key="PYTHONPATH" value=""/>
                                             <env key="PACKAGE_DIR" value="${project.build.directory}/python-packaged"/>
-                                            <arg line="down"/>
+                                            <arg line="compose down"/>
                                         </exec>
                                         <exec executable="docker" failonerror="true">
                                             <env key="PYTHONPATH" value=""/>
@@ -156,7 +156,7 @@
                             </execution>
 
                             <!--
-                            use docker-compose to run unit tests, radish, and integration tests.
+                            use docker compose to run unit tests, radish, and integration tests.
                             -->
                             <execution>
                                 <id>python-tests</id>
@@ -167,18 +167,18 @@
                                 <configuration>
                                     <skip>${skipTests}</skip>
                                     <target>
-                                        <exec executable="docker-compose" failonerror="true">
+                                        <exec executable="docker" failonerror="true">
                                             <env key="VERSION" value="${project.version}"/>
                                             <env key="PYTHONPATH" value=""/>
                                             <env key="GREMLIN_SERVER" value="${project.version}"/>
                                             <env key="ABS_PROJECT_HOME" value="${project.basedir}/../"/>
                                             <env key="BUILD_DIR" value="${project.build.directory}/python3"/>
-                                            <arg line="up --build --abort-on-container-exit gremlin-server-test-python gremlin-python-integration-tests"/>
+                                            <arg line="compose up --build --abort-on-container-exit gremlin-server-test-python gremlin-python-integration-tests"/>
                                         </exec>
-                                        <exec executable="docker-compose" failonerror="true">
+                                        <exec executable="docker" failonerror="true">
                                             <env key="PYTHONPATH" value=""/>
                                             <env key="BUILD_DIR" value="${project.build.directory}/python3"/>
-                                            <arg line="down"/>
+                                            <arg line="compose down"/>
                                         </exec>
                                         <exec executable="docker" failonerror="true">
                                             <env key="PYTHONPATH" value=""/>
diff --git a/gremlin-server/src/main/bin/gremlin-server.sh b/gremlin-server/src/main/bin/gremlin-server.sh
index 41e446b..b7aebf2 100755
--- a/gremlin-server/src/main/bin/gremlin-server.sh
+++ b/gremlin-server/src/main/bin/gremlin-server.sh
@@ -209,7 +209,7 @@
   fi
 
   if [[ -z "$RUNAS" ]]; then
-    $JAVA -Dlogback.configurationFile=$LOGBACK_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_SERVER_CMD "$GREMLIN_YAML"
+    exec $JAVA -Dlogback.configurationFile=$LOGBACK_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_SERVER_CMD "$GREMLIN_YAML"
     exit 0
   else
     echo Starting in foreground not supported with RUNAS
diff --git a/gremlin-server/src/main/docker/docker-entrypoint.sh b/gremlin-server/src/main/docker/docker-entrypoint.sh
index af7050c..1b7456d 100755
--- a/gremlin-server/src/main/docker/docker-entrypoint.sh
+++ b/gremlin-server/src/main/docker/docker-entrypoint.sh
@@ -29,12 +29,4 @@
 IP=$(ip -o -4 addr list eth0 | perl -n -e 'if (m{inet\s([\d\.]+)\/\d+\s}xms) { print $1 }')
 sed -i "s|^host:.*|host: $IP|" $CONF_FILE
 
-handler()
-{
-  kill -s SIGINT "$PID"
-}
-
-exec $GREMLIN_SERVER "$@" &
-PID=$(ps | grep -w $GREMLIN_SERVER | grep -v grep | awk 'NR==1 {print $1}')
-trap 'handler $PID' SIGTERM
-wait "$PID"
+exec $GREMLIN_SERVER "$@"