Merge PR #688: core: Fix shutdown crash and improve application logging

This commit is contained in:
jenkins 2024-12-20 13:39:07 +01:00
commit 628c2c9be7
6 changed files with 42 additions and 33 deletions

View File

@ -379,19 +379,8 @@ void NymeaCore::thingManagerLoaded()
emit initialized(); emit initialized();
// Do some houskeeping...
qCDebug(dcCore()) << "Starting housekeeping..."; qCDebug(dcCore()) << "Starting housekeeping...";
QDateTime startTime = QDateTime::currentDateTime(); 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()) { foreach (const ThingId &thingId, m_ruleEngine->thingsInRules()) {
if (!m_thingManager->findConfiguredThing(thingId)) { if (!m_thingManager->findConfiguredThing(thingId)) {

View File

@ -68,8 +68,7 @@ QDateTime TimeManager::currentDateTime() const
*/ */
void TimeManager::stopTimer() void TimeManager::stopTimer()
{ {
qCWarning(dcTimeManager()) << "TimeManager timer stopped. You should only see this in tests."; qCDebug(dcTimeManager()) << "Stopping TimeManager";
// Stop clock (used for testing)
killTimer(m_timerId); killTimer(m_timerId);
} }

View File

@ -222,19 +222,31 @@ int main(int argc, char *argv[])
qCInfo(dcApplication()) << "====================================="; 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 running in a snappy environment, print out some details about it.
if (!qgetenv("SNAP").isEmpty()) { if (!qgetenv("SNAP").isEmpty()) {
// Note: http://snapcraft.io/docs/reference/env // Note: http://snapcraft.io/docs/reference/env
qCInfo(dcApplication) << "Snap name :" << qgetenv("SNAP_NAME"); qCInfo(dcApplication()) << "Snap name :" << qgetenv("SNAP_NAME");
qCInfo(dcApplication) << "Snap version :" << qgetenv("SNAP_VERSION"); qCInfo(dcApplication()) << "Snap version :" << qgetenv("SNAP_VERSION");
qCInfo(dcApplication) << "Snap directory :" << qgetenv("SNAP"); qCInfo(dcApplication()) << "Snap directory :" << qgetenv("SNAP");
qCInfo(dcApplication) << "Snap app data :" << qgetenv("SNAP_DATA"); qCInfo(dcApplication()) << "Snap app data :" << qgetenv("SNAP_DATA");
qCInfo(dcApplication) << "Snap user data :" << qgetenv("SNAP_USER_DATA"); qCInfo(dcApplication()) << "Snap user data :" << qgetenv("SNAP_USER_DATA");
qCInfo(dcApplication) << "Snap app common :" << qgetenv("SNAP_COMMON"); qCInfo(dcApplication()) << "Snap app common :" << qgetenv("SNAP_COMMON");
} }
// create core instance // 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)); NymeaCore::instance()->init(parser.values(interfacesOption), parser.isSet(noLogDbOption));
int ret = application.exec(); int ret = application.exec();
closeLogFile(); closeLogFile();
return ret; return ret;

View File

@ -79,44 +79,47 @@ static void catchUnixSignals(const std::vector<int>& quitSignals, const std::vec
NymeaCore::ShutdownReason reason = NymeaCore::ShutdownReasonQuit; NymeaCore::ShutdownReason reason = NymeaCore::ShutdownReasonQuit;
switch (sig) { switch (sig) {
case SIGQUIT: case SIGQUIT:
qCDebug(dcApplication) << "Cought SIGQUIT signal..."; qCDebug(dcApplication()) << "Cought SIGQUIT signal...";
reason = NymeaCore::ShutdownReasonQuit; reason = NymeaCore::ShutdownReasonQuit;
break; break;
case SIGINT: case SIGINT:
qCDebug(dcApplication) << "Cought SIGINT signal..."; qCDebug(dcApplication()) << "Cought SIGINT signal...";
reason = NymeaCore::ShutdownReasonTerm; reason = NymeaCore::ShutdownReasonTerm;
break; break;
case SIGTERM: case SIGTERM:
qCDebug(dcApplication) << "Cought SIGTERM signal..."; qCDebug(dcApplication()) << "Cought SIGTERM signal...";
reason = NymeaCore::ShutdownReasonTerm; reason = NymeaCore::ShutdownReasonTerm;
break; break;
case SIGHUP: case SIGHUP:
qCDebug(dcApplication) << "Cought SIGHUP signal..."; qCDebug(dcApplication()) << "Cought SIGHUP signal...";
reason = NymeaCore::ShutdownReasonTerm; reason = NymeaCore::ShutdownReasonTerm;
break; break;
case SIGKILL: case SIGKILL:
qCDebug(dcApplication) << "Cought SIGKILL signal..."; qCDebug(dcApplication()) << "Cought SIGKILL signal...";
reason = NymeaCore::ShutdownReasonTerm; reason = NymeaCore::ShutdownReasonTerm;
break; break;
case SIGSEGV: case SIGSEGV:
qCDebug(dcApplication) << "Cought SIGSEGV quit signal..."; qCDebug(dcApplication()) << "Cought SIGSEGV quit signal...";
reason = NymeaCore::ShutdownReasonFailure; reason = NymeaCore::ShutdownReasonFailure;
break; break;
case SIGFPE: case SIGFPE:
qCDebug(dcApplication) << "Cought SIGFPE quit signal..."; qCDebug(dcApplication()) << "Cought SIGFPE quit signal...";
reason = NymeaCore::ShutdownReasonFailure; reason = NymeaCore::ShutdownReasonFailure;
break; break;
default: default:
qCDebug(dcApplication) << "Cought signal" << sig; qCDebug(dcApplication()) << "Cought signal" << sig;
break; break;
} }
qCInfo(dcApplication) << "====================================="; qCInfo(dcApplication()) << "=====================================";
qCInfo(dcApplication) << "Shutting down nymea:core"; qCInfo(dcApplication()) << "Shutting down nymea:core";
qCInfo(dcApplication) << "====================================="; qCInfo(dcApplication()) << "=====================================";
s_shutdownCounter++; s_shutdownCounter++;
NymeaCore::instance()->destroy(reason); NymeaCore::instance()->destroy(reason);
qCInfo(dcApplication()) << "nymea:core shut down successfully";
NymeaApplication::processEvents();
NymeaApplication::quit(); NymeaApplication::quit();
}; };
@ -137,4 +140,9 @@ NymeaApplication::NymeaApplication(int &argc, char **argv) :
catchUnixSignals({SIGQUIT, SIGINT, SIGTERM, SIGHUP, SIGKILL, /*SIGSEGV,*/ SIGFPE}); catchUnixSignals({SIGQUIT, SIGINT, SIGTERM, SIGHUP, SIGKILL, /*SIGSEGV,*/ SIGFPE});
} }
NymeaApplication::~NymeaApplication()
{
quit();
}
} }

View File

@ -41,6 +41,7 @@ class NymeaApplication : public QCoreApplication
{ {
public: public:
NymeaApplication(int &argc, char **argv); NymeaApplication(int &argc, char **argv);
~NymeaApplication() override;
}; };
} }

View File

@ -83,9 +83,9 @@ void NymeaService::start()
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
qCDebug(dcApplication) << "====================================="; qCDebug(dcApplication()) << "=====================================";
qCDebug(dcApplication) << "nymead" << NYMEA_VERSION_STRING << "started as daemon."; qCDebug(dcApplication()) << "nymead" << NYMEA_VERSION_STRING << "started as daemon.";
qCDebug(dcApplication) << "====================================="; qCDebug(dcApplication()) << "=====================================";
NymeaCore::instance(); NymeaCore::instance();
} }