From a31daf7742c868fd579d88da37f28ab1740950f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Mon, 25 Nov 2024 14:50:26 +0100 Subject: [PATCH] core: Fix shutdown crash and improve application logging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Simon Stürz --- libnymea-core/nymeacore.cpp | 11 ----------- libnymea-core/time/timemanager.cpp | 3 +-- server/main.cpp | 24 ++++++++++++++++++------ server/nymeaapplication.cpp | 30 +++++++++++++++++++----------- server/nymeaapplication.h | 1 + server/nymeaservice.cpp | 6 +++--- 6 files changed, 42 insertions(+), 33 deletions(-) diff --git a/libnymea-core/nymeacore.cpp b/libnymea-core/nymeacore.cpp index 4b1f5c1b..3122b9eb 100644 --- a/libnymea-core/nymeacore.cpp +++ b/libnymea-core/nymeacore.cpp @@ -365,19 +365,8 @@ void NymeaCore::thingManagerLoaded() emit initialized(); - // Do some houskeeping... qCDebug(dcCore()) << "Starting housekeeping..."; QDateTime startTime = QDateTime::currentDateTime(); -// ThingsFetchJob *job = m_logger->fetchThings(); -// connect(job, &ThingsFetchJob::finished, m_thingManager, [this, job, startTime](){ -// foreach (const ThingId &thingId, job->results()) { -// if (!m_thingManager->findConfiguredThing(thingId)) { -// qCDebug(dcCore()) << "Cleaning stale thing entries from log DB for thing id" << thingId; -// m_logger->removeThingLogs(thingId); -// } -// } -// qCDebug(dcCore()) << "Housekeeping done in" << startTime.msecsTo(QDateTime::currentDateTime()) << "ms."; -// }); foreach (const ThingId &thingId, m_ruleEngine->thingsInRules()) { if (!m_thingManager->findConfiguredThing(thingId)) { diff --git a/libnymea-core/time/timemanager.cpp b/libnymea-core/time/timemanager.cpp index eddc9cc8..df542acb 100644 --- a/libnymea-core/time/timemanager.cpp +++ b/libnymea-core/time/timemanager.cpp @@ -68,8 +68,7 @@ QDateTime TimeManager::currentDateTime() const */ void TimeManager::stopTimer() { - qCWarning(dcTimeManager()) << "TimeManager timer stopped. You should only see this in tests."; - // Stop clock (used for testing) + qCDebug(dcTimeManager()) << "Stopping TimeManager"; killTimer(m_timerId); } diff --git a/server/main.cpp b/server/main.cpp index 2c78b4ca..cca3f6ec 100644 --- a/server/main.cpp +++ b/server/main.cpp @@ -222,19 +222,31 @@ int main(int argc, char *argv[]) qCInfo(dcApplication()) << "====================================="; } + QStringList arguments; + for (int i = 0; i < argc; i++) { + arguments << QString(argv[i]); + } + qCInfo(dcApplication()) << "Started:" << arguments.takeFirst(); + qCInfo(dcApplication()) << "Parameters:" << arguments.join(' '); + // If running in a snappy environment, print out some details about it. if (!qgetenv("SNAP").isEmpty()) { // Note: http://snapcraft.io/docs/reference/env - qCInfo(dcApplication) << "Snap name :" << qgetenv("SNAP_NAME"); - qCInfo(dcApplication) << "Snap version :" << qgetenv("SNAP_VERSION"); - qCInfo(dcApplication) << "Snap directory :" << qgetenv("SNAP"); - qCInfo(dcApplication) << "Snap app data :" << qgetenv("SNAP_DATA"); - qCInfo(dcApplication) << "Snap user data :" << qgetenv("SNAP_USER_DATA"); - qCInfo(dcApplication) << "Snap app common :" << qgetenv("SNAP_COMMON"); + qCInfo(dcApplication()) << "Snap name :" << qgetenv("SNAP_NAME"); + qCInfo(dcApplication()) << "Snap version :" << qgetenv("SNAP_VERSION"); + qCInfo(dcApplication()) << "Snap directory :" << qgetenv("SNAP"); + qCInfo(dcApplication()) << "Snap app data :" << qgetenv("SNAP_DATA"); + qCInfo(dcApplication()) << "Snap user data :" << qgetenv("SNAP_USER_DATA"); + qCInfo(dcApplication()) << "Snap app common :" << qgetenv("SNAP_COMMON"); } // create core instance + QObject::connect(NymeaCore::instance(), &NymeaCore::initialized, NymeaCore::instance(), [](){ + qCInfo(dcApplication()) << "The core is now up and running."; + }); + NymeaCore::instance()->init(parser.values(interfacesOption), parser.isSet(noLogDbOption)); + int ret = application.exec(); closeLogFile(); return ret; diff --git a/server/nymeaapplication.cpp b/server/nymeaapplication.cpp index 5ae18776..2a011ad6 100644 --- a/server/nymeaapplication.cpp +++ b/server/nymeaapplication.cpp @@ -79,44 +79,47 @@ static void catchUnixSignals(const std::vector& quitSignals, const std::vec NymeaCore::ShutdownReason reason = NymeaCore::ShutdownReasonQuit; switch (sig) { case SIGQUIT: - qCDebug(dcApplication) << "Cought SIGQUIT signal..."; + qCDebug(dcApplication()) << "Cought SIGQUIT signal..."; reason = NymeaCore::ShutdownReasonQuit; break; case SIGINT: - qCDebug(dcApplication) << "Cought SIGINT signal..."; + qCDebug(dcApplication()) << "Cought SIGINT signal..."; reason = NymeaCore::ShutdownReasonTerm; break; case SIGTERM: - qCDebug(dcApplication) << "Cought SIGTERM signal..."; + qCDebug(dcApplication()) << "Cought SIGTERM signal..."; reason = NymeaCore::ShutdownReasonTerm; break; case SIGHUP: - qCDebug(dcApplication) << "Cought SIGHUP signal..."; + qCDebug(dcApplication()) << "Cought SIGHUP signal..."; reason = NymeaCore::ShutdownReasonTerm; break; case SIGKILL: - qCDebug(dcApplication) << "Cought SIGKILL signal..."; + qCDebug(dcApplication()) << "Cought SIGKILL signal..."; reason = NymeaCore::ShutdownReasonTerm; break; case SIGSEGV: - qCDebug(dcApplication) << "Cought SIGSEGV quit signal..."; + qCDebug(dcApplication()) << "Cought SIGSEGV quit signal..."; reason = NymeaCore::ShutdownReasonFailure; break; case SIGFPE: - qCDebug(dcApplication) << "Cought SIGFPE quit signal..."; + qCDebug(dcApplication()) << "Cought SIGFPE quit signal..."; reason = NymeaCore::ShutdownReasonFailure; break; default: - qCDebug(dcApplication) << "Cought signal" << sig; + qCDebug(dcApplication()) << "Cought signal" << sig; break; } - qCInfo(dcApplication) << "====================================="; - qCInfo(dcApplication) << "Shutting down nymea:core"; - qCInfo(dcApplication) << "====================================="; + qCInfo(dcApplication()) << "====================================="; + qCInfo(dcApplication()) << "Shutting down nymea:core"; + qCInfo(dcApplication()) << "====================================="; s_shutdownCounter++; NymeaCore::instance()->destroy(reason); + + qCInfo(dcApplication()) << "nymea:core shut down successfully"; + NymeaApplication::processEvents(); NymeaApplication::quit(); }; @@ -137,4 +140,9 @@ NymeaApplication::NymeaApplication(int &argc, char **argv) : catchUnixSignals({SIGQUIT, SIGINT, SIGTERM, SIGHUP, SIGKILL, /*SIGSEGV,*/ SIGFPE}); } +NymeaApplication::~NymeaApplication() +{ + quit(); +} + } diff --git a/server/nymeaapplication.h b/server/nymeaapplication.h index 75bc6b4b..0f05084b 100644 --- a/server/nymeaapplication.h +++ b/server/nymeaapplication.h @@ -41,6 +41,7 @@ class NymeaApplication : public QCoreApplication { public: NymeaApplication(int &argc, char **argv); + ~NymeaApplication() override; }; } diff --git a/server/nymeaservice.cpp b/server/nymeaservice.cpp index 4dc70707..17fdd823 100644 --- a/server/nymeaservice.cpp +++ b/server/nymeaservice.cpp @@ -83,9 +83,9 @@ void NymeaService::start() exit(EXIT_FAILURE); } - qCDebug(dcApplication) << "====================================="; - qCDebug(dcApplication) << "nymead" << NYMEA_VERSION_STRING << "started as daemon."; - qCDebug(dcApplication) << "====================================="; + qCDebug(dcApplication()) << "====================================="; + qCDebug(dcApplication()) << "nymead" << NYMEA_VERSION_STRING << "started as daemon."; + qCDebug(dcApplication()) << "====================================="; NymeaCore::instance(); }