Comparison

util/startup.lua @ 13311:ab36edc7c217

util.startup: Attempt to bring some order to startup/shutdown with util.fsm
author Matthew Wild <mwild1@gmail.com>
date Tue, 07 Nov 2023 12:12:18 +0000
parent 13165:9c13c11b199d
child 13342:d0a9b631a937
comparison
equal deleted inserted replaced
13310:7bc1cabb3c6c 13311:ab36edc7c217
420 420
421 function startup.init_data_store() 421 function startup.init_data_store()
422 require "prosody.core.storagemanager"; 422 require "prosody.core.storagemanager";
423 end 423 end
424 424
425 local running_state = require "util.fsm".new({
426 default_state = "uninitialized";
427 transitions = {
428 { name = "begin_startup", from = "uninitialized", to = "starting" };
429 { name = "finish_startup", from = "starting", to = "running" };
430 { name = "begin_shutdown", from = { "running", "starting" }, to = "stopping" };
431 { name = "finish_shutdown", from = "stopping", to = "stopped" };
432 };
433 handlers = {
434 transitioned = function (transition)
435 prosody.state = transition.to;
436 end;
437 };
438 state_handlers = {
439 starting = function ()
440 prosody.log("debug", "Firing server-starting event");
441 prosody.events.fire_event("server-starting");
442 prosody.start_time = os.time();
443 end;
444 running = function ()
445 prosody.log("debug", "Startup complete, firing server-started");
446 prosody.events.fire_event("server-started");
447 end;
448 };
449 }):init();
450
425 function startup.prepare_to_start() 451 function startup.prepare_to_start()
426 log("info", "Prosody is using the %s backend for connection handling", server.get_backend()); 452 log("info", "Prosody is using the %s backend for connection handling", server.get_backend());
453
427 -- Signal to modules that we are ready to start 454 -- Signal to modules that we are ready to start
428 prosody.started = require "prosody.util.promise".new(function (resolve) 455 prosody.started = require "prosody.util.promise".new(function (resolve)
429 prosody.events.add_handler("server-started", function () 456 if prosody.state == "running" then
430 resolve(); 457 resolve();
431 end); 458 else
432 prosody.log("debug", "Firing server-starting event"); 459 prosody.events.add_handler("server-started", function ()
433 prosody.events.fire_event("server-starting"); 460 resolve();
434 prosody.start_time = os.time(); 461 end);
462 end
435 end):catch(function (err) 463 end):catch(function (err)
436 prosody.log("error", "Prosody startup error: %s", err); 464 prosody.log("error", "Prosody startup error: %s", err);
437 end); 465 end);
466
467 running_state:begin_startup();
438 end 468 end
439 469
440 function startup.init_global_protection() 470 function startup.init_global_protection()
441 -- Catch global accesses 471 -- Catch global accesses
442 -- luacheck: ignore 212/t 472 -- luacheck: ignore 212/t
477 function startup.log_greeting() 507 function startup.log_greeting()
478 log("info", "Hello and welcome to Prosody version %s", prosody.version); 508 log("info", "Hello and welcome to Prosody version %s", prosody.version);
479 end 509 end
480 510
481 function startup.notify_started() 511 function startup.notify_started()
482 require "prosody.util.timer".add_task(0, function () 512 running_state:finish_startup();
483 prosody.log("debug", "Firing server-started event");
484 prosody.events.fire_event("server-started");
485 end);
486 end 513 end
487 514
488 -- Override logging config (used by prosodyctl) 515 -- Override logging config (used by prosodyctl)
489 function startup.force_console_logging() 516 function startup.force_console_logging()
490 original_logging_config = config.get("*", "log"); 517 original_logging_config = config.get("*", "log");
646 prosody.log("info", "Shutdown status: Cleaning up"); 673 prosody.log("info", "Shutdown status: Cleaning up");
647 prosody.events.fire_event("server-cleanup"); 674 prosody.events.fire_event("server-cleanup");
648 end 675 end
649 676
650 function startup.shutdown() 677 function startup.shutdown()
678 running_state:begin_shutdown();
679
651 prosody.log("info", "Shutting down..."); 680 prosody.log("info", "Shutting down...");
652 startup.cleanup(); 681 startup.cleanup();
653 prosody.events.fire_event("server-stopped"); 682 prosody.events.fire_event("server-stopped");
683
684 running_state:finish_shutdown();
685
654 prosody.log("info", "Shutdown complete"); 686 prosody.log("info", "Shutdown complete");
655
656 prosody.log("debug", "Shutdown reason was: %s", prosody.shutdown_reason or "not specified"); 687 prosody.log("debug", "Shutdown reason was: %s", prosody.shutdown_reason or "not specified");
657 prosody.log("debug", "Exiting with status code: %d", prosody.shutdown_code or 0); 688 prosody.log("debug", "Exiting with status code: %d", prosody.shutdown_code or 0);
658 server.setquitting(true); 689 server.setquitting(true);
659 end 690 end
660 691