refs #781, use admit in database reader

* added amit functions in readers
* cacheHasChanged functions (needed because data of caches are loaded in background)
* pinned small caches
* CDatabaseReader::readInBackgroundThread uses admitCaches now
This commit is contained in:
Klaus Basan
2016-10-28 03:04:15 +02:00
parent f385e46d67
commit de7821ff86
13 changed files with 83 additions and 24 deletions

View File

@@ -42,8 +42,8 @@ namespace BlackCore
//! Trait for DB distributor cache //! Trait for DB distributor cache
struct TDbDistributorCache : public BlackMisc::TDataTrait<BlackMisc::Simulation::CDistributorList> struct TDbDistributorCache : public BlackMisc::TDataTrait<BlackMisc::Simulation::CDistributorList>
{ {
//! Defer loading (no currently small) //! First load is synchronous, distributors is a small cache
static constexpr bool isDeferred() { return false; } static constexpr bool isPinned() { return true; }
//! Key in data cache //! Key in data cache
static const char *key() { return "dbdistributorcache"; } static const char *key() { return "dbdistributorcache"; }
@@ -83,8 +83,8 @@ namespace BlackCore
//! Trait for DB countries //! Trait for DB countries
struct TDbCountryCache : public BlackMisc::TDataTrait<BlackMisc::CCountryList> struct TDbCountryCache : public BlackMisc::TDataTrait<BlackMisc::CCountryList>
{ {
//! Defer loading (no currently small) //! First load is synchronous, countries is a small cache
static constexpr bool isDeferred() { return false; } static constexpr bool isPinned() { return true; }
//! Key in data cache //! Key in data cache
static const char *key() { return "dbcountrycache"; } static const char *key() { return "dbcountrycache"; }

View File

@@ -47,6 +47,11 @@ namespace BlackCore
if (entities.testFlag(CEntityFlags::AirportEntity)) { this->m_airportCache.synchronize(); } if (entities.testFlag(CEntityFlags::AirportEntity)) { this->m_airportCache.synchronize(); }
} }
void CAirportDataReader::admitCaches(CEntityFlags::Entity entities)
{
if (entities.testFlag(CEntityFlags::AirportEntity)) { this->m_airportCache.admit(); }
}
void CAirportDataReader::invalidateCaches(CEntityFlags::Entity entities) void CAirportDataReader::invalidateCaches(CEntityFlags::Entity entities)
{ {
if (entities.testFlag(CEntityFlags::AirportEntity)) { CDataCache::instance()->clearAllValues(this->m_airportCache.getKey()); } if (entities.testFlag(CEntityFlags::AirportEntity)) { CDataCache::instance()->clearAllValues(this->m_airportCache.getKey()); }
@@ -125,7 +130,7 @@ namespace BlackCore
void CAirportDataReader::ps_airportCacheChanged() void CAirportDataReader::ps_airportCacheChanged()
{ {
// void this->cacheHasChanged(CEntityFlags::AirportEntity);
} }
void CAirportDataReader::ps_baseUrlCacheChanged() void CAirportDataReader::ps_baseUrlCacheChanged()

View File

@@ -41,10 +41,11 @@ namespace BlackCore
// base class overrides // base class overrides
virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entities) const override; virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entities) const override;
virtual int getCacheCount(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual int getCacheCount(BlackMisc::Network::CEntityFlags::Entity entity) const override;
virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
virtual void admitCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
protected: protected:
// base class overrides // base class overrides
virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const override;

View File

@@ -74,7 +74,7 @@ namespace BlackCore
Q_ASSERT_X(latestEntityTimestamp >= 0, Q_FUNC_INFO, "Missing timestamp"); Q_ASSERT_X(latestEntityTimestamp >= 0, Q_FUNC_INFO, "Missing timestamp");
if (!changedUrl && cacheTimestamp >= latestEntityTimestamp && cacheTimestamp >= 0 && latestEntityTimestamp >= 0) if (!changedUrl && cacheTimestamp >= latestEntityTimestamp && cacheTimestamp >= 0 && latestEntityTimestamp >= 0)
{ {
this->synchronizeCaches(currentEntity); this->admitCaches(currentEntity);
entities &= ~currentEntity; // do not load from web database entities &= ~currentEntity; // do not load from web database
cachedEntities |= currentEntity; // read from cache cachedEntities |= currentEntity; // read from cache
CLogMessage(this).info("Using cache for %1 (%2, %3)") << currentEntityName << cacheTs.toString() << cacheTimestamp; CLogMessage(this).info("Using cache for %1 (%2, %3)") << currentEntityName << cacheTs.toString() << cacheTimestamp;
@@ -94,7 +94,7 @@ namespace BlackCore
else else
{ {
// no info objects, server down // no info objects, server down
this->synchronizeCaches(currentEntity); this->admitCaches(currentEntity);
const int c = this->getCacheCount(currentEntity); const int c = this->getCacheCount(currentEntity);
CLogMessage(this).info("No info object for %1, using cache with %2 objects") << currentEntityName << c; CLogMessage(this).info("No info object for %1, using cache with %2 objects") << currentEntityName << c;
entities &= ~currentEntity; // do not load from web database entities &= ~currentEntity; // do not load from web database
@@ -105,7 +105,7 @@ namespace BlackCore
} }
// signals for the cached entities // signals for the cached entities
this->emitReadSignalPerSingleCachedEntity(cachedEntities); this->emitReadSignalPerSingleCachedEntity(cachedEntities, true);
// Real read from DB // Real read from DB
this->startReadFromDbInBackgroundThread(entities, newerThan); this->startReadFromDbInBackgroundThread(entities, newerThan);
@@ -211,17 +211,23 @@ namespace BlackCore
return this->m_config.findFirstOrDefaultForEntity(entity); return this->m_config.findFirstOrDefaultForEntity(entity);
} }
void CDatabaseReader::emitReadSignalPerSingleCachedEntity(CEntityFlags::Entity cachedEntities) CEntityFlags::Entity CDatabaseReader::emitReadSignalPerSingleCachedEntity(CEntityFlags::Entity cachedEntities, bool onlyIfHasData)
{ {
if (cachedEntities == CEntityFlags::NoEntity) { return; } if (cachedEntities == CEntityFlags::NoEntity) { return CEntityFlags::NoEntity; }
CEntityFlags::Entity emitted = CEntityFlags::NoEntity;
CEntityFlags::Entity cachedEntitiesToEmit = cachedEntities; CEntityFlags::Entity cachedEntitiesToEmit = cachedEntities;
CEntityFlags::Entity currentCachedEntity = CEntityFlags::iterateDbEntities(cachedEntitiesToEmit); CEntityFlags::Entity currentCachedEntity = CEntityFlags::iterateDbEntities(cachedEntitiesToEmit);
while (currentCachedEntity) while (currentCachedEntity)
{ {
const int c = this->getCacheCount(currentCachedEntity); const int c = this->getCacheCount(currentCachedEntity);
emit dataRead(currentCachedEntity, CEntityFlags::ReadFinished, c); if (!onlyIfHasData || c > 0)
{
emit dataRead(currentCachedEntity, CEntityFlags::ReadFinished, c);
emitted |= currentCachedEntity;
}
currentCachedEntity = CEntityFlags::iterateDbEntities(cachedEntitiesToEmit); currentCachedEntity = CEntityFlags::iterateDbEntities(cachedEntitiesToEmit);
} }
return emitted;
} }
bool CDatabaseReader::isChangedUrl(const CUrl &oldUrl, const CUrl &currentUrl) bool CDatabaseReader::isChangedUrl(const CUrl &oldUrl, const CUrl &currentUrl)
@@ -307,6 +313,11 @@ namespace BlackCore
return sApp->getGlobalSetup().getSwiftSharedUrls().getRandomWorkingUrl(); return sApp->getGlobalSetup().getSwiftSharedUrls().getRandomWorkingUrl();
} }
void CDatabaseReader::cacheHasChanged(CEntityFlags::Entity entities)
{
this->emitReadSignalPerSingleCachedEntity(entities, false);
}
bool CDatabaseReader::canPingSwiftServer() bool CDatabaseReader::canPingSwiftServer()
{ {
const CUrl url(getDbUrl()); const CUrl url(getDbUrl());

View File

@@ -154,8 +154,8 @@ namespace BlackCore
protected: protected:
CDatabaseReaderConfigList m_config; //!< DB reder configuration CDatabaseReaderConfigList m_config; //!< DB reder configuration
QString m_statusMessage; //!< Returned status message from watchdog QString m_statusMessage; //!< Returned status message from watchdog
bool m_1stReplyReceived = false; //!< Successful connection? Does not mean data / authorizations are correct
QNetworkReply::NetworkError m_1stReplyStatus = QNetworkReply::UnknownServerError; //!< Successful connection? QNetworkReply::NetworkError m_1stReplyStatus = QNetworkReply::UnknownServerError; //!< Successful connection?
bool m_1stReplyReceived = false; //!< Successful connection? Does not mean data / authorizations are correct
mutable QReadWriteLock m_statusLock; //!< Lock mutable QReadWriteLock m_statusLock; //!< Lock
//! Constructor //! Constructor
@@ -172,7 +172,7 @@ namespace BlackCore
CDatabaseReaderConfig getConfigForEntity(BlackMisc::Network::CEntityFlags::Entity entity) const; CDatabaseReaderConfig getConfigForEntity(BlackMisc::Network::CEntityFlags::Entity entity) const;
//! Split into single entity and send dataRead signal //! Split into single entity and send dataRead signal
void emitReadSignalPerSingleCachedEntity(BlackMisc::Network::CEntityFlags::Entity cachedEntities); BlackMisc::Network::CEntityFlags::Entity emitReadSignalPerSingleCachedEntity(BlackMisc::Network::CEntityFlags::Entity cachedEntities, bool onlyIfHasData);
//! DB base URL //! DB base URL
static const BlackMisc::Network::CUrl &getDbUrl(); static const BlackMisc::Network::CUrl &getDbUrl();
@@ -185,12 +185,18 @@ namespace BlackCore
//! Synchronize caches for given entities //! Synchronize caches for given entities
virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) = 0; virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) = 0;
//! Admit caches for given entities
virtual void admitCaches(BlackMisc::Network::CEntityFlags::Entity entities) = 0;
//! Invalidate the caches for given entities //! Invalidate the caches for given entities
virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) = 0; virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) = 0;
//! Changed URL, means the cache values have been read from elsewhere //! Changed URL, means the cache values have been read from elsewhere
virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const = 0; virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const = 0;
//! Cache for given entity has changed
virtual void cacheHasChanged(BlackMisc::Network::CEntityFlags::Entity entities);
//! Has URL been changed? Means we load from a differrent server //! Has URL been changed? Means we load from a differrent server
static bool isChangedUrl(const BlackMisc::Network::CUrl &oldUrl, const BlackMisc::Network::CUrl &currentUrl); static bool isChangedUrl(const BlackMisc::Network::CUrl &oldUrl, const BlackMisc::Network::CUrl &currentUrl);
//! @} //! @}

View File

@@ -181,17 +181,17 @@ namespace BlackCore
void CIcaoDataReader::ps_aircraftIcaoCacheChanged() void CIcaoDataReader::ps_aircraftIcaoCacheChanged()
{ {
// void this->cacheHasChanged(CEntityFlags::AircraftIcaoEntity);
} }
void CIcaoDataReader::ps_airlineIcaoCacheChanged() void CIcaoDataReader::ps_airlineIcaoCacheChanged()
{ {
// void this->cacheHasChanged(CEntityFlags::AirlineIcaoEntity);
} }
void CIcaoDataReader::ps_countryCacheChanged() void CIcaoDataReader::ps_countryCacheChanged()
{ {
// void this->cacheHasChanged(CEntityFlags::CountryEntity);
} }
void CIcaoDataReader::ps_baseUrlCacheChanged() void CIcaoDataReader::ps_baseUrlCacheChanged()
@@ -400,6 +400,13 @@ namespace BlackCore
if (entities.testFlag(CEntityFlags::CountryEntity)) { this->m_countryCache.synchronize(); } if (entities.testFlag(CEntityFlags::CountryEntity)) { this->m_countryCache.synchronize(); }
} }
void CIcaoDataReader::admitCaches(CEntityFlags::Entity entities)
{
if (entities.testFlag(CEntityFlags::AircraftIcaoEntity)) { this->m_aircraftIcaoCache.admit(); }
if (entities.testFlag(CEntityFlags::AirlineIcaoEntity)) { this->m_airlineIcaoCache.admit(); }
if (entities.testFlag(CEntityFlags::CountryEntity)) { this->m_countryCache.admit(); }
}
void CIcaoDataReader::invalidateCaches(CEntityFlags::Entity entities) void CIcaoDataReader::invalidateCaches(CEntityFlags::Entity entities)
{ {
if (entities.testFlag(CEntityFlags::AircraftIcaoEntity)) { CDataCache::instance()->clearAllValues(this->m_aircraftIcaoCache.getKey()); } if (entities.testFlag(CEntityFlags::AircraftIcaoEntity)) { CDataCache::instance()->clearAllValues(this->m_aircraftIcaoCache.getKey()); }

View File

@@ -118,6 +118,7 @@ namespace BlackCore
virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entity) const override;
virtual int getCacheCount(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual int getCacheCount(BlackMisc::Network::CEntityFlags::Entity entity) const override;
virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
virtual void admitCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
protected: protected:
// cache handling for base class // cache handling for base class

View File

@@ -56,6 +56,12 @@ namespace BlackCore
Q_UNUSED(entities); Q_UNUSED(entities);
} }
void CInfoDataReader::admitCaches(CEntityFlags::Entity entities)
{
// no caching used here
Q_UNUSED(entities);
}
void CInfoDataReader::invalidateCaches(CEntityFlags::Entity entities) void CInfoDataReader::invalidateCaches(CEntityFlags::Entity entities)
{ {
// no caching used here // no caching used here

View File

@@ -51,6 +51,8 @@ namespace BlackCore
// cache handling for base class // cache handling for base class
virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entity) const override;
virtual int getCacheCount(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual int getCacheCount(BlackMisc::Network::CEntityFlags::Entity entity) const override;
virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
virtual void admitCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
public slots: public slots:
//! Allow to call CInfoDataReader::ps_read directly, special for info objects //! Allow to call CInfoDataReader::ps_read directly, special for info objects
@@ -58,7 +60,6 @@ namespace BlackCore
protected: protected:
// cache handling for base class // cache handling for base class
virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const override;

View File

@@ -217,17 +217,17 @@ namespace BlackCore
void CModelDataReader::ps_liveryCacheChanged() void CModelDataReader::ps_liveryCacheChanged()
{ {
// void this->cacheHasChanged(CEntityFlags::LiveryEntity);
} }
void CModelDataReader::ps_modelCacheChanged() void CModelDataReader::ps_modelCacheChanged()
{ {
// void this->cacheHasChanged(CEntityFlags::ModelEntity);
} }
void CModelDataReader::ps_distributorCacheChanged() void CModelDataReader::ps_distributorCacheChanged()
{ {
// void this->cacheHasChanged(CEntityFlags::DistributorEntity);
} }
void CModelDataReader::ps_baseUrlCacheChanged() void CModelDataReader::ps_baseUrlCacheChanged()
@@ -387,7 +387,7 @@ namespace BlackCore
{ {
CLiveryList liveries; CLiveryList liveries;
liveries.convertFromJson(liveriesJson); liveries.convertFromJson(liveriesJson);
int c = liveries.size(); const int c = liveries.size();
this->m_liveryCache.set(liveries); this->m_liveryCache.set(liveries);
emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFinished, c); emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFinished, c);
@@ -402,7 +402,7 @@ namespace BlackCore
{ {
CAircraftModelList models; CAircraftModelList models;
models.convertFromJson(Json::jsonObjectFromString(modelsJson)); models.convertFromJson(Json::jsonObjectFromString(modelsJson));
int c = models.size(); const int c = models.size();
this->m_modelCache.set(models); this->m_modelCache.set(models);
emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFinished, c); emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFinished, c);
@@ -417,7 +417,7 @@ namespace BlackCore
{ {
CDistributorList distributors; CDistributorList distributors;
distributors.convertFromJson(Json::jsonObjectFromString(distributorsJson)); distributors.convertFromJson(Json::jsonObjectFromString(distributorsJson));
int c = distributors.size(); const int c = distributors.size();
this->m_distributorCache.set(distributors); this->m_distributorCache.set(distributors);
emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFinished, c); emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFinished, c);
@@ -473,6 +473,13 @@ namespace BlackCore
if (entities.testFlag(CEntityFlags::DistributorEntity)) { this->m_distributorCache.synchronize(); } if (entities.testFlag(CEntityFlags::DistributorEntity)) { this->m_distributorCache.synchronize(); }
} }
void CModelDataReader::admitCaches(CEntityFlags::Entity entities)
{
if (entities.testFlag(CEntityFlags::LiveryEntity)) { this->m_liveryCache.admit(); }
if (entities.testFlag(CEntityFlags::ModelEntity)) { this->m_modelCache.admit(); }
if (entities.testFlag(CEntityFlags::DistributorEntity)) { this->m_distributorCache.admit(); }
}
void CModelDataReader::invalidateCaches(CEntityFlags::Entity entities) void CModelDataReader::invalidateCaches(CEntityFlags::Entity entities)
{ {
if (entities.testFlag(CEntityFlags::LiveryEntity)) { CDataCache::instance()->clearAllValues(this->m_liveryCache.getKey()); } if (entities.testFlag(CEntityFlags::LiveryEntity)) { CDataCache::instance()->clearAllValues(this->m_liveryCache.getKey()); }

View File

@@ -128,6 +128,7 @@ namespace BlackCore
virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entity) const override;
virtual int getCacheCount(BlackMisc::Network::CEntityFlags::Entity entity) const override; virtual int getCacheCount(BlackMisc::Network::CEntityFlags::Entity entity) const override;
virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
virtual void admitCaches(BlackMisc::Network::CEntityFlags::Entity entities) override;
protected: protected:
// cache handling for base class // cache handling for base class

View File

@@ -172,8 +172,18 @@ namespace BlackCore
void CWebDataServices::synchronizeDbCaches(CEntityFlags::Entity entities) void CWebDataServices::synchronizeDbCaches(CEntityFlags::Entity entities)
{ {
if (this->m_infoDataReader) { this->m_infoDataReader->synchronizeCaches(entities); }
if (this->m_modelDataReader) { this->m_modelDataReader->synchronizeCaches(entities); } if (this->m_modelDataReader) { this->m_modelDataReader->synchronizeCaches(entities); }
if (this->m_icaoDataReader) { this->m_icaoDataReader->synchronizeCaches(entities); } if (this->m_icaoDataReader) { this->m_icaoDataReader->synchronizeCaches(entities); }
if (this->m_airportDataReader) { this->m_airportDataReader->synchronizeCaches(entities); }
}
void CWebDataServices::admitDbCaches(CEntityFlags::Entity entities)
{
if (this->m_infoDataReader) { this->m_infoDataReader->admitCaches(entities); }
if (this->m_modelDataReader) { this->m_modelDataReader->admitCaches(entities); }
if (this->m_icaoDataReader) { this->m_icaoDataReader->admitCaches(entities); }
if (this->m_airportDataReader) { this->m_airportDataReader->admitCaches(entities); }
} }
CEntityFlags::Entity CWebDataServices::triggerRead(CEntityFlags::Entity whatToRead, const QDateTime &newerThan) CEntityFlags::Entity CWebDataServices::triggerRead(CEntityFlags::Entity whatToRead, const QDateTime &newerThan)

View File

@@ -339,6 +339,9 @@ namespace BlackCore
//! Synchronize all DB caches //! Synchronize all DB caches
void synchronizeDbCaches(BlackMisc::Network::CEntityFlags::Entity entities); void synchronizeDbCaches(BlackMisc::Network::CEntityFlags::Entity entities);
//! Admit all DB caches
void admitDbCaches(BlackMisc::Network::CEntityFlags::Entity entities);
//! Write data to disk (mainly for testing scenarios) //! Write data to disk (mainly for testing scenarios)
bool writeDbDataToDisk(const QString &dir) const; bool writeDbDataToDisk(const QString &dir) const;