From: Sébastien Lesaint Date: Thu, 5 Sep 2019 07:50:08 +0000 (+0200) Subject: stop should be allowed when SQ is not yet fully operational X-Git-Tag: 8.0~147 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a05a09de9fc16b7d33e886e399853290ae24a2f0;p=sonarqube.git stop should be allowed when SQ is not yet fully operational this allows to keep stop code behing lifecycle transition test which prevents multiple stop sequence to be initiated in parallel from different thread which may interrupt each other and create unstable behaviors (with cryptic non reproducible errors) --- diff --git a/server/sonar-main/src/main/java/org/sonar/application/NodeLifecycle.java b/server/sonar-main/src/main/java/org/sonar/application/NodeLifecycle.java index 20aa56b3782..288f329260f 100644 --- a/server/sonar-main/src/main/java/org/sonar/application/NodeLifecycle.java +++ b/server/sonar-main/src/main/java/org/sonar/application/NodeLifecycle.java @@ -73,7 +73,7 @@ class NodeLifecycle { private static Map> buildTransitions() { Map> res = new EnumMap<>(State.class); res.put(INIT, toSet(STARTING)); - res.put(STARTING, toSet(OPERATIONAL, RESTARTING, HARD_STOPPING, STOPPED)); + res.put(STARTING, toSet(OPERATIONAL, RESTARTING, STOPPING, HARD_STOPPING, STOPPED)); res.put(OPERATIONAL, toSet(RESTARTING, STOPPING, HARD_STOPPING, STOPPED)); res.put(STOPPING, toSet(HARD_STOPPING, STOPPED)); res.put(RESTARTING, toSet(STARTING, HARD_STOPPING, STOPPED)); diff --git a/server/sonar-main/src/main/java/org/sonar/application/SchedulerImpl.java b/server/sonar-main/src/main/java/org/sonar/application/SchedulerImpl.java index 93a258a0a9a..ed071280168 100644 --- a/server/sonar-main/src/main/java/org/sonar/application/SchedulerImpl.java +++ b/server/sonar-main/src/main/java/org/sonar/application/SchedulerImpl.java @@ -201,8 +201,8 @@ public class SchedulerImpl implements Scheduler, ManagedProcessEventListener, Pr public void stop() { if (nodeLifecycle.tryToMoveTo(STOPPING)) { LOG.info("Stopping SonarQube"); + stopImpl(); } - stopImpl(); } private void stopImpl() { diff --git a/server/sonar-main/src/test/java/org/sonar/application/NodeLifecycleTest.java b/server/sonar-main/src/test/java/org/sonar/application/NodeLifecycleTest.java index 5ebfd9587fd..1190f0c601c 100644 --- a/server/sonar-main/src/test/java/org/sonar/application/NodeLifecycleTest.java +++ b/server/sonar-main/src/test/java/org/sonar/application/NodeLifecycleTest.java @@ -46,6 +46,17 @@ public class NodeLifecycleTest { assertThat(underTest.getState()).isEqualTo(STOPPED); } + @Test + public void verify_regular_start_and_early_graceful_stop_cycle() { + assertThat(underTest.getState()).isEqualTo(INIT); + assertThat(underTest.tryToMoveTo(STARTING)).isTrue(); + assertThat(underTest.getState()).isEqualTo(STARTING); + assertThat(underTest.tryToMoveTo(STOPPING)).isTrue(); + assertThat(underTest.getState()).isEqualTo(STOPPING); + assertThat(underTest.tryToMoveTo(STOPPED)).isTrue(); + assertThat(underTest.getState()).isEqualTo(STOPPED); + } + @Test public void verify_start_and_hard_stop_cycle() { assertThat(underTest.getState()).isEqualTo(INIT);