Software /
code /
prosody
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 |