From 1ced7f3c0b4ccc351f9c49184260141ce52e4666 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 12 Jan 2017 18:07:35 +0100 Subject: [PATCH] refs #857, check if network is accessible in readers * new read state "skipped" * renamed to "isNetworkConnectedAndAccessible" * checking before reading, which would only fail if network is not accessible --- src/blackcore/db/airportdatareader.cpp | 6 ++++++ src/blackcore/db/databasereader.cpp | 4 ++-- src/blackcore/db/icaodatareader.cpp | 8 +++++++- src/blackcore/db/modeldatareader.cpp | 14 ++++++++++---- src/blackcore/db/modeldatareader.h | 3 ++- src/blackcore/threadedreader.cpp | 9 ++++----- src/blackcore/threadedreader.h | 2 +- src/blackcore/vatsim/vatsimbookingreader.cpp | 2 +- src/blackcore/vatsim/vatsimdatafilereader.cpp | 2 +- src/blackcore/vatsim/vatsimmetarreader.cpp | 2 +- src/blackcore/vatsim/vatsimstatusfilereader.cpp | 1 + src/blackmisc/network/entityflags.cpp | 3 +++ src/blackmisc/network/entityflags.h | 3 ++- src/plugins/weatherdata/gfs/weatherdatagfs.cpp | 11 ++++++++--- 14 files changed, 49 insertions(+), 21 deletions(-) diff --git a/src/blackcore/db/airportdatareader.cpp b/src/blackcore/db/airportdatareader.cpp index 5a02a0b85..cfdb6f89d 100644 --- a/src/blackcore/db/airportdatareader.cpp +++ b/src/blackcore/db/airportdatareader.cpp @@ -181,6 +181,12 @@ namespace BlackCore { this->threadAssertCheck(); if (this->isShuttingDown()) { return; } + entity &= CEntityFlags::AirportEntity; + if (!this->isNetworkConnectedAndAccessible()) + { + emit this->dataRead(entity, CEntityFlags::ReadSkipped, 0); + return; + } if (entity.testFlag(CEntityFlags::AirportEntity)) { diff --git a/src/blackcore/db/databasereader.cpp b/src/blackcore/db/databasereader.cpp index d18f6ac85..59c0d72d0 100644 --- a/src/blackcore/db/databasereader.cpp +++ b/src/blackcore/db/databasereader.cpp @@ -167,7 +167,7 @@ namespace BlackCore // ps_read is implemented in the derived classes if (entities == CEntityFlags::NoEntity) { return; } - if (!this->isNetworkAvailable()) + if (!this->isNetworkConnectedAndAccessible()) { CLogMessage(this).warning("No network, will not read %1") << CEntityFlags::flagToString(entities); return; @@ -318,7 +318,7 @@ namespace BlackCore bool CDatabaseReader::requestHeadersOfSharedFiles(const CEntityFlags::Entity &entities) { - if (!this->isNetworkAvailable()) + if (!this->isNetworkConnectedAndAccessible()) { CLogMessage(this).warning("No network, will not read shared file headers for %1") << CEntityFlags::flagToString(entities); return false; diff --git a/src/blackcore/db/icaodatareader.cpp b/src/blackcore/db/icaodatareader.cpp index 6357a37f1..02247244c 100644 --- a/src/blackcore/db/icaodatareader.cpp +++ b/src/blackcore/db/icaodatareader.cpp @@ -132,6 +132,12 @@ namespace BlackCore { this->threadAssertCheck(); // runs in background thread if (this->isShuttingDown()) { return; } + entities &= CEntityFlags::AllIcaoAndCountries; + if (!this->isNetworkConnectedAndAccessible()) + { + emit this->dataRead(entities, CEntityFlags::ReadSkipped, 0); + return; + } CEntityFlags::Entity entitiesTriggered = CEntityFlags::NoEntity; if (entities.testFlag(CEntityFlags::AircraftIcaoEntity)) @@ -181,7 +187,7 @@ namespace BlackCore if (entitiesTriggered != CEntityFlags::NoEntity) { - emit dataRead(entitiesTriggered, CEntityFlags::StartRead, 0); + emit this->dataRead(entitiesTriggered, CEntityFlags::StartRead, 0); } } diff --git a/src/blackcore/db/modeldatareader.cpp b/src/blackcore/db/modeldatareader.cpp index 241dc6629..ddf6aebca 100644 --- a/src/blackcore/db/modeldatareader.cpp +++ b/src/blackcore/db/modeldatareader.cpp @@ -147,13 +147,19 @@ namespace BlackCore getDistributorsCount() > 0; } - void CModelDataReader::ps_read(CEntityFlags::Entity entity, CDbFlags::DataRetrievalModeFlag mode, const QDateTime &newerThan) + void CModelDataReader::ps_read(CEntityFlags::Entity entities, CDbFlags::DataRetrievalModeFlag mode, const QDateTime &newerThan) { this->threadAssertCheck(); if (this->isShuttingDown()) { return; } + entities &= CEntityFlags::DistributorLiveryModel; + if (!this->isNetworkConnectedAndAccessible()) + { + emit this->dataRead(entities, CEntityFlags::ReadSkipped, 0); + return; + } CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity; - if (entity.testFlag(CEntityFlags::LiveryEntity)) + if (entities.testFlag(CEntityFlags::LiveryEntity)) { CUrl url(getLiveryUrl(mode)); if (!url.isEmpty()) @@ -172,7 +178,7 @@ namespace BlackCore } } - if (entity.testFlag(CEntityFlags::DistributorEntity)) + if (entities.testFlag(CEntityFlags::DistributorEntity)) { CUrl url(getDistributorUrl(mode)); if (!url.isEmpty()) @@ -191,7 +197,7 @@ namespace BlackCore } } - if (entity.testFlag(CEntityFlags::ModelEntity)) + if (entities.testFlag(CEntityFlags::ModelEntity)) { CUrl url(getModelUrl(mode)); if (!url.isEmpty()) diff --git a/src/blackcore/db/modeldatareader.h b/src/blackcore/db/modeldatareader.h index a1d97e202..0b01f3e5c 100644 --- a/src/blackcore/db/modeldatareader.h +++ b/src/blackcore/db/modeldatareader.h @@ -136,6 +136,7 @@ namespace BlackCore virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual BlackMisc::Network::CUrl getDbServiceBaseUrl() const override; + private slots: //! Liveries have been read void ps_parseLiveryData(QNetworkReply *nwReply); @@ -147,7 +148,7 @@ namespace BlackCore void ps_parseModelData(QNetworkReply *nwReply); //! Read / re-read data file - void ps_read(BlackMisc::Network::CEntityFlags::Entity entity = BlackMisc::Network::CEntityFlags::DistributorLiveryModel, + void ps_read(BlackMisc::Network::CEntityFlags::Entity entities = BlackMisc::Network::CEntityFlags::DistributorLiveryModel, BlackMisc::Db::CDbFlags::DataRetrievalModeFlag mode = BlackMisc::Db::CDbFlags::DbReading, const QDateTime &newerThan = QDateTime()); void ps_liveryCacheChanged(); diff --git a/src/blackcore/threadedreader.cpp b/src/blackcore/threadedreader.cpp index 797dca182..13d56cddd 100644 --- a/src/blackcore/threadedreader.cpp +++ b/src/blackcore/threadedreader.cpp @@ -69,10 +69,9 @@ namespace BlackCore return delta <= timeLastMs; } - bool CThreadedReader::isNetworkAvailable() const + bool CThreadedReader::isNetworkConnectedAndAccessible() const { - static const bool nw = CNetworkUtils::hasConnectedInterface(); - return nw; + return sApp->isNetworkConnectedAndAccessible(); } void CThreadedReader::gracefulShutdown() @@ -98,9 +97,9 @@ namespace BlackCore bool CThreadedReader::isShuttingDown() const { - if (this->m_shutdown) { return true; } - if (this->isAbandoned()) { return true; } if (!sApp) { return true; } // sApp object is gone, whole system shutdown + if (this->m_shutdown) { return true; } // marked as shutdown + if (this->isAbandoned()) { return true; } // worker abandoned return false; } diff --git a/src/blackcore/threadedreader.h b/src/blackcore/threadedreader.h index b09c7f560..d4766f57c 100644 --- a/src/blackcore/threadedreader.h +++ b/src/blackcore/threadedreader.h @@ -53,7 +53,7 @@ namespace BlackCore bool updatedWithinLastMs(qint64 timeLastMs); //! Network available - bool isNetworkAvailable() const; + bool isNetworkConnectedAndAccessible() const; //! Is marked as read failed //! \threadsafe diff --git a/src/blackcore/vatsim/vatsimbookingreader.cpp b/src/blackcore/vatsim/vatsimbookingreader.cpp index 6e9ad41d6..20c77f7a4 100644 --- a/src/blackcore/vatsim/vatsimbookingreader.cpp +++ b/src/blackcore/vatsim/vatsimbookingreader.cpp @@ -67,7 +67,7 @@ namespace BlackCore void CVatsimBookingReader::ps_read() { - if (!this->isNetworkAvailable()) + if (!this->isNetworkConnectedAndAccessible()) { CLogMessage(this).warning("No network, cannot read VATSIM bookings"); return; diff --git a/src/blackcore/vatsim/vatsimdatafilereader.cpp b/src/blackcore/vatsim/vatsimdatafilereader.cpp index a8c1f1255..1cdf5831d 100644 --- a/src/blackcore/vatsim/vatsimdatafilereader.cpp +++ b/src/blackcore/vatsim/vatsimdatafilereader.cpp @@ -185,7 +185,7 @@ namespace BlackCore void CVatsimDataFileReader::ps_read() { - if (!this->isNetworkAvailable()) + if (!this->isNetworkConnectedAndAccessible()) { CLogMessage(this).warning("No network, cannot read VATSIM data file"); return; diff --git a/src/blackcore/vatsim/vatsimmetarreader.cpp b/src/blackcore/vatsim/vatsimmetarreader.cpp index 7d85d20f1..b4b5cde65 100644 --- a/src/blackcore/vatsim/vatsimmetarreader.cpp +++ b/src/blackcore/vatsim/vatsimmetarreader.cpp @@ -80,7 +80,7 @@ namespace BlackCore void CVatsimMetarReader::readMetars() { if (this->isAbandoned()) { return; } - if (!this->isNetworkAvailable()) + if (!this->isNetworkConnectedAndAccessible()) { CLogMessage(this).warning("No network, cannot read METARs"); return; diff --git a/src/blackcore/vatsim/vatsimstatusfilereader.cpp b/src/blackcore/vatsim/vatsimstatusfilereader.cpp index d14b287e3..cfac88f99 100644 --- a/src/blackcore/vatsim/vatsimstatusfilereader.cpp +++ b/src/blackcore/vatsim/vatsimstatusfilereader.cpp @@ -71,6 +71,7 @@ namespace BlackCore void CVatsimStatusFileReader::ps_read() { this->threadAssertCheck(); + if (!this->isNetworkConnectedAndAccessible()) { return; } Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing application"); CFailoverUrlList urls(sApp->getGlobalSetup().getVatsimStatusFileUrls()); diff --git a/src/blackmisc/network/entityflags.cpp b/src/blackmisc/network/entityflags.cpp index 151d9f9e9..768adc4f2 100644 --- a/src/blackmisc/network/entityflags.cpp +++ b/src/blackmisc/network/entityflags.cpp @@ -79,6 +79,7 @@ namespace BlackMisc case ReadFinished: return "finished"; case ReadFinishedRestricted: return "finished (restricted)"; case ReadFailed: return "failed"; + case ReadSkipped: return "skipped"; case StartRead: return "read started"; default: BLACK_VERIFY_X(false, Q_FUNC_INFO, "wrong flags"); @@ -94,6 +95,8 @@ namespace BlackMisc case ReadFinishedRestricted: case StartRead: return CStatusMessage::SeverityInfo; + case ReadSkipped: + return CStatusMessage::SeverityWarning; case ReadFailed: return CStatusMessage::SeverityError; default: diff --git a/src/blackmisc/network/entityflags.h b/src/blackmisc/network/entityflags.h index 8bab07409..37f0d605b 100644 --- a/src/blackmisc/network/entityflags.h +++ b/src/blackmisc/network/entityflags.h @@ -62,7 +62,8 @@ namespace BlackMisc StartRead, //!< reading has been started ReadFinished, //!< reading done ReadFinishedRestricted, //!< finished a timestamp restricted read - ReadFailed //!< reading failed + ReadFailed, //!< reading failed + ReadSkipped //!< read skipped, e.g. because network is down }; //! Convert to string diff --git a/src/plugins/weatherdata/gfs/weatherdatagfs.cpp b/src/plugins/weatherdata/gfs/weatherdatagfs.cpp index 7942c0e17..c4486bd10 100644 --- a/src/plugins/weatherdata/gfs/weatherdatagfs.cpp +++ b/src/plugins/weatherdata/gfs/weatherdatagfs.cpp @@ -65,9 +65,14 @@ namespace BlackWxPlugin m_maxRange = range; if (m_gribData.isEmpty()) { - CLogMessage(this).debug() << "Started to download GFS data..."; - QUrl url = getDownloadUrl(); - CLogMessage(this).debug() << "Download url:" << url.toString(); + if (!sApp->isNetworkConnectedAndAccessible()) + { + CLogMessage(this).error("No wether download since network not accessible"); + return; + } + + const QUrl url = getDownloadUrl(); + CLogMessage(this).debug() << "Started to download GFS data from" << url.toString(); QNetworkRequest request(url); sApp->getFromNetwork(request, { this, &CWeatherDataGfs::ps_parseGfsFile }); }