From 93794c9e4a4baa9c7a1a08c06b4303da1c7ae4f3 Mon Sep 17 00:00:00 2001 From: Davin McCall Date: Wed, 28 Feb 2018 12:08:37 +0000 Subject: [PATCH] Fix: stop milestone dependency before started. Stopping a milestone dependency before its dependent has started must also stop the dependent (the "milestone" hasn't been reached). Add a test. --- src/service.cc | 4 +++- src/tests/tests.cc | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/service.cc b/src/service.cc index 1abe899..5195c56 100644 --- a/src/service.cc +++ b/src/service.cc @@ -517,7 +517,9 @@ bool service_record::stop_dependents() noexcept { bool all_deps_stopped = true; for (auto dept : dependents) { - if (dept->dep_type == dependency_type::REGULAR) { + if (dept->dep_type == dependency_type::REGULAR || + (dept->dep_type == dependency_type::MILESTONE && + dept->get_from()->service_state != service_state_t::STARTED)) { if (! dept->get_from()->is_stopped()) { // Note we check *first* since if the dependent service is not stopped, // 1. We will issue a stop to it shortly and diff --git a/src/tests/tests.cc b/src/tests/tests.cc index 8e7cbfc..115535d 100644 --- a/src/tests/tests.cc +++ b/src/tests/tests.cc @@ -479,6 +479,37 @@ void test10() assert(! sset.is_queued_for_console(s2)); } +// Test 11: if a milestone dependency doesn't start, dependent doesn't start. +void test11() +{ + service_set sset; + + test_service *s1 = new test_service(&sset, "test-service-1", service_type_t::INTERNAL, {}); + service_record *s2 = new service_record(&sset, "test-service-2", service_type_t::INTERNAL, {{s1, MS}}); + + sset.add_service(s1); + sset.add_service(s2); + + assert(sset.find_service("test-service-1") == s1); + assert(sset.find_service("test-service-2") == s2); + + // Request start of the s2 service: + sset.start_service(s2); + sset.process_queues(); + + assert(s1->get_state() == service_state_t::STARTING); + assert(s2->get_state() == service_state_t::STARTING); + + s1->stop(); + sset.process_queues(); + s1->bring_down(); + sset.process_queues(); + + assert(s1->get_state() == service_state_t::STOPPED); + assert(s2->get_state() == service_state_t::STOPPED); +} + + #define RUN_TEST(name) \ std::cout << #name "... "; \ name(); \ @@ -499,4 +530,5 @@ int main(int argc, char **argv) RUN_TEST(test8); RUN_TEST(test9); RUN_TEST(test10); + RUN_TEST(test11); } -- 2.25.1