mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-20 12:35:43 +08:00
#42 Remove code for reading update info from datastore
This commit is contained in:
@@ -77,7 +77,6 @@ namespace BlackCore
|
|||||||
|
|
||||||
if (m_bootstrapMode == CacheOnly)
|
if (m_bootstrapMode == CacheOnly)
|
||||||
{
|
{
|
||||||
m_updateInfoUrls = cachedSetup.getSwiftUpdateInfoFileUrls(); // we use the info URLs from cached setup
|
|
||||||
msgs.push_back(cacheAvailable ?
|
msgs.push_back(cacheAvailable ?
|
||||||
CStatusMessage(this, CStatusMessage::SeverityInfo, u"Cache only setup, using it as it is") :
|
CStatusMessage(this, CStatusMessage::SeverityInfo, u"Cache only setup, using it as it is") :
|
||||||
CStatusMessage(this, CStatusMessage::SeverityError, u"Cache only setup, but cache is empty"));
|
CStatusMessage(this, CStatusMessage::SeverityError, u"Cache only setup, but cache is empty"));
|
||||||
@@ -281,43 +280,6 @@ namespace BlackCore
|
|||||||
return msgs;
|
return msgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSetupReader::readUpdateInfo()
|
|
||||||
{
|
|
||||||
const CUrlList randomUrls = m_updateInfoUrls.randomElements(2);
|
|
||||||
if (randomUrls.isEmpty())
|
|
||||||
{
|
|
||||||
CLogMessage(this).warning(u"Cannot read update info, no URLs");
|
|
||||||
this->manageUpdateInfoAvailability(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_updateInfo.lastUpdatedAge() < 5000)
|
|
||||||
{
|
|
||||||
CLogMessage(this).info(u"Update info just updated, skip read");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sApp || m_shutdown) { return; }
|
|
||||||
CUrl url = randomUrls.front();
|
|
||||||
const CStatusMessage m1(this, CStatusMessage::SeverityInfo, u"Start reading update info 1st URL: " % url.toQString());
|
|
||||||
sApp->getFromNetwork(url.toNetworkRequest(), { this, &CSetupReader::parseUpdateInfoFile }, { this, &CSetupReader::networkReplyProgress });
|
|
||||||
|
|
||||||
url = randomUrls.back();
|
|
||||||
const CStatusMessage m2(this, CStatusMessage::SeverityInfo, u"Will also trigger deferred update info reading 2nd URL: " % url.toQString());
|
|
||||||
QPointer<CSetupReader> myself(this);
|
|
||||||
QTimer::singleShot(2000, this, [ = ]
|
|
||||||
{
|
|
||||||
if (!myself || !sApp || sApp->isShuttingDown()) { return; }
|
|
||||||
if (!m_lastSuccessfulUpdateInfoUrl.isEmpty())
|
|
||||||
{
|
|
||||||
// already read
|
|
||||||
CLogMessage(this).info(u"Cancel second update info read ('%1'), as there was a 1st read '%2'") << url.toQString() << m_lastSuccessfulUpdateInfoUrl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sApp->getFromNetwork(url.toNetworkRequest(), { this, &CSetupReader::parseUpdateInfoFile }, { this, &CSetupReader::networkReplyProgress });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
CSetupReader::BootstrapMode CSetupReader::stringToEnum(const QString &s)
|
CSetupReader::BootstrapMode CSetupReader::stringToEnum(const QString &s)
|
||||||
{
|
{
|
||||||
const QString bsm(s.toLower().trimmed());
|
const QString bsm(s.toLower().trimmed());
|
||||||
@@ -417,7 +379,6 @@ namespace BlackCore
|
|||||||
bool sameVersionLoaded = (loadedSetup == currentSetup);
|
bool sameVersionLoaded = (loadedSetup == currentSetup);
|
||||||
if (sameVersionLoaded)
|
if (sameVersionLoaded)
|
||||||
{
|
{
|
||||||
m_updateInfoUrls = currentSetup.getSwiftUpdateInfoFileUrls(); // defaults
|
|
||||||
CLogMessage(this).info(u"Same setup version loaded from '%1' as already in data cache '%2'") << urlString << m_setup.getFilename();
|
CLogMessage(this).info(u"Same setup version loaded from '%1' as already in data cache '%2'") << urlString << m_setup.getFilename();
|
||||||
CLogMessage::preformatted(this->manageSetupAvailability(true));
|
CLogMessage::preformatted(this->manageSetupAvailability(true));
|
||||||
return; // success
|
return; // success
|
||||||
@@ -430,7 +391,6 @@ namespace BlackCore
|
|||||||
if (m.isSeverityInfoOrLess())
|
if (m.isSeverityInfoOrLess())
|
||||||
{
|
{
|
||||||
// no issue with cache
|
// no issue with cache
|
||||||
m_updateInfoUrls = loadedSetup.getSwiftUpdateInfoFileUrls();
|
|
||||||
const CStatusMessage m2 = CLogMessage(this).info(u"Loaded setup from '%1'") << urlString;
|
const CStatusMessage m2 = CLogMessage(this).info(u"Loaded setup from '%1'") << urlString;
|
||||||
emit this->setupLoadingMessages(m2);
|
emit this->setupLoadingMessages(m2);
|
||||||
CLogMessage(this).info(u"Setup: Updated data cache in '%1'") << m_setup.getFilename();
|
CLogMessage(this).info(u"Setup: Updated data cache in '%1'") << m_setup.getFilename();
|
||||||
@@ -471,80 +431,6 @@ namespace BlackCore
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSetupReader::parseUpdateInfoFile(QNetworkReply *nwReplyPtr)
|
|
||||||
{
|
|
||||||
// wrap pointer, make sure any exit cleans up reply
|
|
||||||
// required to use delete later as object is created in a different thread
|
|
||||||
QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> nwReply(nwReplyPtr);
|
|
||||||
if (m_shutdown) { return; }
|
|
||||||
|
|
||||||
const QUrl url(nwReply->url());
|
|
||||||
const QString urlString(url.toString());
|
|
||||||
|
|
||||||
if (nwReply->error() == QNetworkReply::NoError)
|
|
||||||
{
|
|
||||||
const qint64 lastModified = CNetworkUtils::lastModifiedMsSinceEpoch(nwReply.data());
|
|
||||||
const QString updateInfoJsonString(nwReplyPtr->readAll());
|
|
||||||
nwReplyPtr->close();
|
|
||||||
if (updateInfoJsonString.isEmpty())
|
|
||||||
{
|
|
||||||
CLogMessage(this).info(u"No update info file content");
|
|
||||||
// try next URL
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
const CUpdateInfo updateInfo = CUpdateInfo::fromDatabaseJson(updateInfoJsonString);
|
|
||||||
if (updateInfo.isEmpty())
|
|
||||||
{
|
|
||||||
CLogMessage(this).error(u"Loading of update info yielded no data, '%1'") << urlString;
|
|
||||||
this->manageUpdateInfoAvailability(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CStatusMessage m = m_updateInfo.set(updateInfo, lastModified);
|
|
||||||
if (m.isFailure())
|
|
||||||
{
|
|
||||||
m.addCategories(this);
|
|
||||||
CLogMessage::preformatted(m);
|
|
||||||
this->manageUpdateInfoAvailability(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
{
|
|
||||||
QWriteLocker l(&m_lockUpdateInfo);
|
|
||||||
m_lastSuccessfulUpdateInfoUrl = urlString;
|
|
||||||
}
|
|
||||||
CLogMessage(this).info(u"Update info loaded from '%1") << urlString;
|
|
||||||
CLogMessage(this).info(u"Update info: Updated data cache in '%1', artifacts: %2, distributions: %3") << m_updateInfo.getFilename() << updateInfo.getArtifactsPilotClient().size() << updateInfo.getDistributions().size();
|
|
||||||
this->manageUpdateInfoAvailability(true);
|
|
||||||
} // cache
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch (const CJsonException &ex)
|
|
||||||
{
|
|
||||||
// we downloaded an unparsable JSON file.
|
|
||||||
// as we control those files something is wrong
|
|
||||||
const QString errorMsg = QStringLiteral("Update info file loaded from '%1' cannot be parsed").arg(urlString);
|
|
||||||
const CStatusMessage msg = ex.toStatusMessage(this, errorMsg);
|
|
||||||
CLogMessage::preformatted(msg);
|
|
||||||
|
|
||||||
// in dev. I get notified, in productive code I try next URL by falling thru
|
|
||||||
BLACK_VERIFY_X(false, Q_FUNC_INFO, errorMsg.toLocal8Bit().constData());
|
|
||||||
m_updateInfoReadErrors++;
|
|
||||||
}
|
|
||||||
} // json empty
|
|
||||||
} // no error
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// network error, try next URL
|
|
||||||
nwReply->abort();
|
|
||||||
m_updateInfoReadErrors++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const CLogCategoryList &CSetupReader::getLogCategories()
|
const CLogCategoryList &CSetupReader::getLogCategories()
|
||||||
{
|
{
|
||||||
static const CLogCategoryList cats({ CLogCategory("swift.setupreader"), CLogCategory::webservice(), CLogCategory::startup()});
|
static const CLogCategoryList cats({ CLogCategory("swift.setupreader"), CLogCategory::webservice(), CLogCategory::startup()});
|
||||||
@@ -608,32 +494,9 @@ namespace BlackCore
|
|||||||
return m_lastSuccessfulSetupUrl;
|
return m_lastSuccessfulSetupUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
CUpdateInfo CSetupReader::getUpdateInfo() const
|
|
||||||
{
|
|
||||||
return m_updateInfo.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CSetupReader::hasCachedUpdateInfo() const
|
|
||||||
{
|
|
||||||
const CUpdateInfo updateInfo = m_updateInfo.get();
|
|
||||||
return !updateInfo.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
QDateTime CSetupReader::getUpdateInfoCacheTimestamp() const
|
|
||||||
{
|
|
||||||
return m_updateInfo.getTimestamp();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString CSetupReader::getLastSuccessfulUpdateInfoUrl() const
|
|
||||||
{
|
|
||||||
QReadLocker l(&m_lockUpdateInfo);
|
|
||||||
return m_lastSuccessfulUpdateInfoUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CSetupReader::synchronize()
|
void CSetupReader::synchronize()
|
||||||
{
|
{
|
||||||
m_setup.synchronize();
|
m_setup.synchronize();
|
||||||
m_updateInfo.synchronize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CStatusMessageList CSetupReader::getLastSetupReadErrorMessages() const
|
CStatusMessageList CSetupReader::getLastSetupReadErrorMessages() const
|
||||||
@@ -680,26 +543,6 @@ namespace BlackCore
|
|||||||
CStatusMessageList msgs;
|
CStatusMessageList msgs;
|
||||||
QPointer<CSetupReader> myself(this);
|
QPointer<CSetupReader> myself(this);
|
||||||
|
|
||||||
if (webRead)
|
|
||||||
{
|
|
||||||
msgs.push_back(CStatusMessage(this).info(u"Setup loaded from web, will trigger read of update information"));
|
|
||||||
QTimer::singleShot(500, this, [ = ]
|
|
||||||
{
|
|
||||||
if (!myself) { return; }
|
|
||||||
this->readUpdateInfo();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (localRead)
|
|
||||||
{
|
|
||||||
msgs.push_back(CStatusMessage(this).info(u"Setup loaded locally, will trigger read of update information"));
|
|
||||||
QTimer::singleShot(500, this, [ = ]
|
|
||||||
{
|
|
||||||
if (!myself) { return; }
|
|
||||||
this->readUpdateInfo();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
bool available = false;
|
bool available = false;
|
||||||
if (webRead || localRead)
|
if (webRead || localRead)
|
||||||
{
|
{
|
||||||
@@ -725,27 +568,6 @@ namespace BlackCore
|
|||||||
}
|
}
|
||||||
m_setupAvailable = available;
|
m_setupAvailable = available;
|
||||||
emit this->setupHandlingCompleted(available);
|
emit this->setupHandlingCompleted(available);
|
||||||
|
|
||||||
if (!webRead && !localRead)
|
|
||||||
{
|
|
||||||
msgs.push_back(CStatusMessage(this).warning(u"Since setup was not updated this time, will not start loading of update information"));
|
|
||||||
this->manageUpdateInfoAvailability(false);
|
|
||||||
}
|
|
||||||
return msgs;
|
return msgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSetupReader::manageUpdateInfoAvailability(bool webRead)
|
|
||||||
{
|
|
||||||
if (webRead)
|
|
||||||
{
|
|
||||||
m_updateInfoAvailable = true;
|
|
||||||
emit updateInfoAvailable(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const bool cached = m_updateInfo.isSaved();
|
|
||||||
m_updateInfoAvailable = cached;
|
|
||||||
emit updateInfoAvailable(cached);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ namespace BlackCore
|
|||||||
//! Read the central URLs / locations of our data, setup and versions.
|
//! Read the central URLs / locations of our data, setup and versions.
|
||||||
//!
|
//!
|
||||||
//! \details This class should be only used in BlackCore::CApplication.
|
//! \details This class should be only used in BlackCore::CApplication.
|
||||||
//! It will also trigger reading update information.
|
|
||||||
//!
|
//!
|
||||||
//! \note This class is no(!) BlackCore::CThreadedReader as it will be loaded once during startup
|
//! \note This class is no(!) BlackCore::CThreadedReader as it will be loaded once during startup
|
||||||
//! and reading setup data is fast. The read file is also called "bootstrap" file as it tells
|
//! and reading setup data is fast. The read file is also called "bootstrap" file as it tells
|
||||||
@@ -89,22 +88,6 @@ namespace BlackCore
|
|||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
QString getLastSuccessfulSetupUrl() const;
|
QString getLastSuccessfulSetupUrl() const;
|
||||||
|
|
||||||
//! Update info (artifacts and distributions)
|
|
||||||
//! \threadsafe
|
|
||||||
BlackMisc::Db::CUpdateInfo getUpdateInfo() const;
|
|
||||||
|
|
||||||
//! Has cached distribution info?
|
|
||||||
//! \threadsafe
|
|
||||||
bool hasCachedUpdateInfo() const;
|
|
||||||
|
|
||||||
//! Update info cache timestamp
|
|
||||||
//! \threadsafe
|
|
||||||
QDateTime getUpdateInfoCacheTimestamp() const;
|
|
||||||
|
|
||||||
//! Last update info URL successfully read
|
|
||||||
//! \threadsafe
|
|
||||||
QString getLastSuccessfulUpdateInfoUrl() const;
|
|
||||||
|
|
||||||
//! Synchronize the caches
|
//! Synchronize the caches
|
||||||
void synchronize();
|
void synchronize();
|
||||||
|
|
||||||
@@ -121,9 +104,6 @@ namespace BlackCore
|
|||||||
//! Setup fetched or failed (from web, cache, or local file)?
|
//! Setup fetched or failed (from web, cache, or local file)?
|
||||||
void setupHandlingCompleted(bool available);
|
void setupHandlingCompleted(bool available);
|
||||||
|
|
||||||
//! Update info available (from web, cache)?
|
|
||||||
void updateInfoAvailable(bool available);
|
|
||||||
|
|
||||||
//! A shared URL was successfully read
|
//! A shared URL was successfully read
|
||||||
void successfullyReadSharedUrl(const BlackMisc::Network::CUrl &sharedUrl);
|
void successfullyReadSharedUrl(const BlackMisc::Network::CUrl &sharedUrl);
|
||||||
|
|
||||||
@@ -154,10 +134,6 @@ namespace BlackCore
|
|||||||
//! \remark check for cached setup if the read check never got triggered
|
//! \remark check for cached setup if the read check never got triggered
|
||||||
void forceAvailabilityUpdate();
|
void forceAvailabilityUpdate();
|
||||||
|
|
||||||
//! Version info available?
|
|
||||||
//! \threadsafe
|
|
||||||
bool isUpdateInfoAvailable() const { return m_updateInfoAvailable; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//! Bootstrap mode
|
//! Bootstrap mode
|
||||||
enum BootstrapMode
|
enum BootstrapMode
|
||||||
@@ -169,7 +145,6 @@ namespace BlackCore
|
|||||||
|
|
||||||
std::atomic<bool> m_shutdown { false }; //!< shutdown in progress
|
std::atomic<bool> m_shutdown { false }; //!< shutdown in progress
|
||||||
std::atomic<bool> m_setupAvailable { false }; //!< setup available?
|
std::atomic<bool> m_setupAvailable { false }; //!< setup available?
|
||||||
std::atomic<bool> m_updateInfoAvailable { false }; //!< update info available
|
|
||||||
std::atomic<bool> m_ignoreCmdBootstrapUrl { false }; //!< ignore the explicitly set bootstrap URL
|
std::atomic<bool> m_ignoreCmdBootstrapUrl { false }; //!< ignore the explicitly set bootstrap URL
|
||||||
std::atomic<bool> m_checkCmdBootstrapUrl { true }; //!< check connection on CMD bootstrap URL
|
std::atomic<bool> m_checkCmdBootstrapUrl { true }; //!< check connection on CMD bootstrap URL
|
||||||
std::atomic_int m_bootstrapReadErrors { 0 }; //!< failed bootstrap reads
|
std::atomic_int m_bootstrapReadErrors { 0 }; //!< failed bootstrap reads
|
||||||
@@ -178,16 +153,13 @@ namespace BlackCore
|
|||||||
QString m_bootstrapUrlFileValue; //!< Bootstrap URL if not local
|
QString m_bootstrapUrlFileValue; //!< Bootstrap URL if not local
|
||||||
BootstrapMode m_bootstrapMode = Explicit; //!< How to bootstrap
|
BootstrapMode m_bootstrapMode = Explicit; //!< How to bootstrap
|
||||||
BlackMisc::Network::CUrlList m_bootstrapUrls; //!< location of setup files
|
BlackMisc::Network::CUrlList m_bootstrapUrls; //!< location of setup files
|
||||||
BlackMisc::Network::CUrlList m_updateInfoUrls; //!< location of info files
|
|
||||||
QCommandLineOption m_cmdBootstrapUrl; //!< bootstrap URL
|
QCommandLineOption m_cmdBootstrapUrl; //!< bootstrap URL
|
||||||
QCommandLineOption m_cmdBootstrapMode; //!< bootstrap mode
|
QCommandLineOption m_cmdBootstrapMode; //!< bootstrap mode
|
||||||
mutable QReadWriteLock m_lockSetup; //!< lock for setup
|
mutable QReadWriteLock m_lockSetup; //!< lock for setup
|
||||||
mutable QReadWriteLock m_lockUpdateInfo; //!< lock for update info
|
mutable QReadWriteLock m_lockUpdateInfo; //!< lock for update info
|
||||||
QString m_lastSuccessfulSetupUrl; //!< last successful read setup URL
|
QString m_lastSuccessfulSetupUrl; //!< last successful read setup URL
|
||||||
QString m_lastSuccessfulUpdateInfoUrl; //!< last successful read update info URL
|
|
||||||
BlackMisc::CStatusMessageList m_setupReadErrorMsgs; //!< last parsing error messages
|
BlackMisc::CStatusMessageList m_setupReadErrorMsgs; //!< last parsing error messages
|
||||||
BlackMisc::CData<Data::TGlobalSetup> m_setup { this }; //!< data cache setup
|
BlackMisc::CData<Data::TGlobalSetup> m_setup { this }; //!< data cache setup
|
||||||
BlackMisc::CData<BlackMisc::Db::TUpdateInfo> m_updateInfo { this }; //!< data cache distributions
|
|
||||||
|
|
||||||
//! Setup has been read (aka bootstrap file)
|
//! Setup has been read (aka bootstrap file)
|
||||||
void parseBootstrapFile(QNetworkReply *nwReplyPtr);
|
void parseBootstrapFile(QNetworkReply *nwReplyPtr);
|
||||||
@@ -198,9 +170,6 @@ namespace BlackCore
|
|||||||
//! Do reading
|
//! Do reading
|
||||||
void readSetup();
|
void readSetup();
|
||||||
|
|
||||||
//! Do reading of distributions
|
|
||||||
void readUpdateInfo();
|
|
||||||
|
|
||||||
//! Read by local individual file and update cache from that
|
//! Read by local individual file and update cache from that
|
||||||
BlackMisc::CStatusMessageList readLocalBootstrapFile(const QString &fileName);
|
BlackMisc::CStatusMessageList readLocalBootstrapFile(const QString &fileName);
|
||||||
|
|
||||||
@@ -211,10 +180,6 @@ namespace BlackCore
|
|||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
BlackMisc::CStatusMessageList manageSetupAvailability(bool webRead, bool localRead = false);
|
BlackMisc::CStatusMessageList manageSetupAvailability(bool webRead, bool localRead = false);
|
||||||
|
|
||||||
//! Emit the availability signal
|
|
||||||
//! \threadsafe
|
|
||||||
void manageUpdateInfoAvailability(bool webRead);
|
|
||||||
|
|
||||||
//! Set last setup parsing messages
|
//! Set last setup parsing messages
|
||||||
void setLastSetupReadErrorMessages(const BlackMisc::CStatusMessageList &messages);
|
void setLastSetupReadErrorMessages(const BlackMisc::CStatusMessageList &messages);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user