From 56c70e2b807e02b54e19cc29405d16cfda32e830 Mon Sep 17 00:00:00 2001 From: Thibault Charbonnier Date: Wed, 31 Aug 2016 11:38:59 -0700 Subject: [PATCH] fix(cli) stop all services when Kong cannot start - use an xpcall to catch errors and stop all services from there (no error checking) - new test for this behavior Fix #1530 --- kong/cmd/start.lua | 30 ++++++++++++++----- .../01-cmd/02-start_stop_spec.lua | 22 ++++++++++++++ spec/helpers.lua | 1 + 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/kong/cmd/start.lua b/kong/cmd/start.lua index 4be6ab929df..e052161c3e9 100644 --- a/kong/cmd/start.lua +++ b/kong/cmd/start.lua @@ -12,14 +12,28 @@ local function execute(args) })) local dao = DAOFactory(conf) - assert(dao:run_migrations()) - assert(prefix_handler.prepare_prefix(conf, args.nginx_conf)) - if conf.dnsmasq then - assert(dnsmasq_signals.start(conf)) - end - assert(serf_signals.start(conf, dao)) - assert(nginx_signals.start(conf)) - log("Kong started") + local err + xpcall(function() + assert(dao:run_migrations()) + assert(prefix_handler.prepare_prefix(conf, args.nginx_conf)) + if conf.dnsmasq then + assert(dnsmasq_signals.start(conf)) + end + assert(serf_signals.start(conf, dao)) + assert(nginx_signals.start(conf)) + log("Kong started") + end, function(e) + log.verbose("could not start Kong, stopping services") + nginx_signals.stop(conf) + serf_signals.stop(conf, dao) + if conf.dnsmasq then + dnsmasq_signals.stop(conf) + end + err = e -- cannot throw from this function + log.verbose("stopped services") + end) + + error(err) -- report to main error handler end local lapp = [[ diff --git a/spec/02-integration/01-cmd/02-start_stop_spec.lua b/spec/02-integration/01-cmd/02-start_stop_spec.lua index b74e23b2bc5..af982d365b7 100644 --- a/spec/02-integration/01-cmd/02-start_stop_spec.lua +++ b/spec/02-integration/01-cmd/02-start_stop_spec.lua @@ -203,5 +203,27 @@ describe("kong start/stop", function() assert.False(ok) assert.matches("nginx is already running in "..helpers.test_conf.prefix, stderr, nil, true) end) + it("stops other services when could not start", function() + local kill = require "kong.cmd.utils.kill" + local thread = helpers.tcp_server(helpers.test_conf.proxy_port) + finally(function() + -- make tcp server receive and close + helpers.proxy_client():send { + method = "GET", + path = "/" + } + thread:join() + end) + + local ok, err = helpers.kong_exec("start --conf "..helpers.test_conf_path, { + dnsmasq = true, + dns_resolver = "" + }) + assert.False(ok) + assert.matches("Address already in use", err, nil, true) + + assert.falsy(kill.is_running(helpers.test_conf.dnsmasq_pid)) + assert.falsy(kill.is_running(helpers.test_conf.serf_pid)) + end) end) end) diff --git a/spec/helpers.lua b/spec/helpers.lua index cd31414ef74..aaa1989fa3d 100644 --- a/spec/helpers.lua +++ b/spec/helpers.lua @@ -225,6 +225,7 @@ local function tcp_server(port, ...) function(port) local socket = require "socket" local server = assert(socket.tcp()) + server:settimeout(10) assert(server:setoption('reuseaddr', true)) assert(server:bind("*", port)) assert(server:listen())