Mercurial > prosody-hg
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 |
| parents | 9c13c11b199d |
| children | 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 |
