core: Fix shutdown crash and improve application logging

Signed-off-by: Simon Stürz <simon.stuerz@nymea.io>
pull/688/head
Simon Stürz 2024-11-25 14:50:26 +01:00
parent 4fe03a10ea
commit a31daf7742
6 changed files with 42 additions and 33 deletions

View File

@ -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)) {

View File

@ -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);
}

View File

@ -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;

View File

@ -79,44 +79,47 @@ static void catchUnixSignals(const std::vector<int>& 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();
}
}

View File

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

View File

@ -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();
}