Ref T126, fixed too early timeout

* use timeout timestamp
* used approch with trials was wrong, as number of trials also depends on number of reader
This commit is contained in:
Klaus Basan
2017-08-11 18:02:36 +02:00
committed by Mathew Sutcliffe
parent f694ded5f2
commit d995bcf59c
2 changed files with 23 additions and 19 deletions

View File

@@ -1147,28 +1147,34 @@ namespace BlackCore
bool CWebDataServices::waitForDbInfoObjectsThenRead(CEntityFlags::Entity entities) bool CWebDataServices::waitForDbInfoObjectsThenRead(CEntityFlags::Entity entities)
{ {
const bool read = this->waitForInfoObjectsThenRead(entities, "DB", m_dbInfoDataReader, m_dbInfoObjectTrials); if (!m_dbInfoObjectTimeout.isValid()) { m_dbInfoObjectTimeout = QDateTime::currentDateTimeUtc().addMSecs(10 * 1000); }
const bool read = this->waitForInfoObjectsThenRead(entities, "DB", m_dbInfoDataReader, m_dbInfoObjectTimeout);
if (read) { m_dbInfoObjectTimeout = QDateTime(); } // reset to null
return read; return read;
} }
bool CWebDataServices::waitForSharedInfoObjectsThenRead(CEntityFlags::Entity entities) bool CWebDataServices::waitForSharedInfoObjectsThenRead(CEntityFlags::Entity entities)
{ {
const bool read = this->waitForInfoObjectsThenRead(entities, "shared", m_sharedInfoDataReader, m_sharedInfoObjectsTrials); if (!m_sharedInfoObjectsTimeout.isValid()) { m_sharedInfoObjectsTimeout = QDateTime::currentDateTimeUtc().addMSecs(10 * 1000); }
const bool read = this->waitForInfoObjectsThenRead(entities, "shared", m_sharedInfoDataReader, m_sharedInfoObjectsTimeout);
if (read) { m_sharedInfoObjectsTimeout = QDateTime(); } // reset to null
return read; return read;
} }
bool CWebDataServices::waitForInfoObjectsThenRead(CEntityFlags::Entity entities, const QString &info, CInfoDataReader *reader, int &trials) bool CWebDataServices::waitForInfoObjectsThenRead(CEntityFlags::Entity entities, const QString &info, CInfoDataReader *reader, const QDateTime &timeOut)
{ {
Q_ASSERT_X(reader, Q_FUNC_INFO, "Need info data reader"); Q_ASSERT_X(reader, Q_FUNC_INFO, "Need info data reader");
// this will called for each entity readers, i.e. model reader, ICAO reader ... // this will called for each entity readers, i.e. model reader, ICAO reader ...
const int waitForInfoObjectsMs = 1000; // ms const int waitForInfoObjectsMs = 1000; // ms
const int maxWaitCycles = 10;
// try to read // try to read if not timed out
if (trials > maxWaitCycles) if (QDateTime::currentDateTimeUtc() > timeOut)
{ {
CLogMessage(this).warning("Could not read '%1' info objects for '%2' from '%3', tried %4 times. Marking reader as failed and continue.") << info << CEntityFlags::flagToString(entities) << reader->getInfoObjectsUrl().toQString() << trials; const QString timeOutString = timeOut.toString();
CLogMessage(this).warning("Could not read '%1' info objects for '%2' from '%3', time out '%4'. Marking reader as failed and continue.")
<< info << CEntityFlags::flagToString(entities)
<< reader->getInfoObjectsUrl().toQString() << timeOutString;
// continue here and read data without info objects // continue here and read data without info objects
reader->setMarkedAsFailed(true); reader->setMarkedAsFailed(true);
@@ -1179,7 +1185,7 @@ namespace BlackCore
if (reader->areAllDataRead()) if (reader->areAllDataRead())
{ {
// we have all data and carry on // we have all data and carry on
CLogMessage(this).info("Info objects (%1) for '%2' loaded (trial %3) from '%4'") << info << CEntityFlags::flagToString(entities) << trials << reader->getInfoObjectsUrl().toQString(); CLogMessage(this).info("Info objects (%1) for '%2' loaded from '%3'") << info << CEntityFlags::flagToString(entities) << reader->getInfoObjectsUrl().toQString();
return true; // no need to wait any longer return true; // no need to wait any longer
} }
else else
@@ -1188,9 +1194,8 @@ namespace BlackCore
if (reader->hasReceivedOkReply()) if (reader->hasReceivedOkReply())
{ {
// ok, this means we are parsing // ok, this means we are parsing
trials++;
this->readDeferredInBackground(entities, waitForInfoObjectsMs); this->readDeferredInBackground(entities, waitForInfoObjectsMs);
CLogMessage(this).info("Waiting for objects (%1) for '%2', trial %3 from '%4'") << info << CEntityFlags::flagToString(entities) << trials << reader->getInfoObjectsUrl().toQString(); CLogMessage(this).info("Waiting for objects (%1) for '%2' from '%3'") << info << CEntityFlags::flagToString(entities) << reader->getInfoObjectsUrl().toQString();
return false; // wait return false; // wait
} }
else else
@@ -1206,8 +1211,7 @@ namespace BlackCore
else else
{ {
// wait for 1st reply // wait for 1st reply
trials++; // CLogMessage(this).info("Waiting for 1st reply of info objects (%1) for '%2', from '%4'") << info << CEntityFlags::flagToString(entities) << reader->getInfoObjectsUrl().toQString();
CLogMessage(this).info("Waiting for 1st reply of info objects (%1) for '%2', trial %3 from '%4'") << info << CEntityFlags::flagToString(entities) << trials << reader->getInfoObjectsUrl().toQString();
this->readDeferredInBackground(entities, waitForInfoObjectsMs); this->readDeferredInBackground(entities, waitForInfoObjectsMs);
return false; // wait return false; // wait
} }

View File

@@ -502,16 +502,16 @@ namespace BlackCore
//! Wait for info objects to be read //! Wait for info objects to be read
//! \return true means info objects available //! \return true means info objects available
bool waitForInfoObjectsThenRead(BlackMisc::Network::CEntityFlags::Entity entities, const QString &info, BlackCore::Db::CInfoDataReader *reader, int &trials); bool waitForInfoObjectsThenRead(BlackMisc::Network::CEntityFlags::Entity entities, const QString &info, BlackCore::Db::CInfoDataReader *reader, const QDateTime &timeOut);
CWebReaderFlags::WebReader m_readers = CWebReaderFlags::WebReaderFlag::None; //!< which readers are available CWebReaderFlags::WebReader m_readers = CWebReaderFlags::WebReaderFlag::None; //!< which readers are available
BlackMisc::Network::CEntityFlags::Entity m_entitiesPeriodicallyRead = BlackMisc::Network::CEntityFlags::NoEntity; //!< entities permanently updated by timers BlackMisc::Network::CEntityFlags::Entity m_entitiesPeriodicallyRead = BlackMisc::Network::CEntityFlags::NoEntity; //!< entities permanently updated by timers
BlackMisc::Network::CEntityFlags::Entity m_swiftDbEntitiesRead = BlackMisc::Network::CEntityFlags::NoEntity; //!< entities read BlackMisc::Network::CEntityFlags::Entity m_swiftDbEntitiesRead = BlackMisc::Network::CEntityFlags::NoEntity; //!< entities read
BlackCore::Db::CDatabaseReaderConfigList m_dbReaderConfig; //!< how to read DB data BlackCore::Db::CDatabaseReaderConfigList m_dbReaderConfig; //!< how to read DB data
bool m_initialRead = false; //!< Initial read started bool m_initialRead = false; //!< initial read started
bool m_signalledHeaders = false; //!< headers loading has been signalled bool m_signalledHeaders = false; //!< haders loading has been signalled
int m_dbInfoObjectTrials = 0; //!< Tried to read info objects QDateTime m_dbInfoObjectTimeout; //!< started reading DB info objects
int m_sharedInfoObjectsTrials = 0; //!< Tried to read shared file headers QDateTime m_sharedInfoObjectsTimeout; //!< started reading shared info objects
QSet<BlackMisc::Network::CEntityFlags::Entity> m_signalledEntities; //!< remember signalled entites QSet<BlackMisc::Network::CEntityFlags::Entity> m_signalledEntities; //!< remember signalled entites
// for reading XML and VATSIM data files // for reading XML and VATSIM data files