Update checker: Try first couple of mirrors in "quick" mode (reduced connection timeout), then revert to default behavior + various improvements.
This commit is contained in:
parent
5620cdda3a
commit
f3a762cfba
@ -137,6 +137,6 @@ namespace MUtils
|
||||
bool getFile(const QString &url, const QString &outFile, const unsigned int maxRedir = 5U);
|
||||
bool getFile(const QString &url, const bool forceIp4, const QString &outFile, const unsigned int maxRedir = 5U);
|
||||
bool checkSignature(const QString &file, const QString &signature);
|
||||
bool tryUpdateMirror(UpdateCheckerInfo *updateInfo, const QString &url);
|
||||
bool tryUpdateMirror(UpdateCheckerInfo *updateInfo, const QString &url, const bool &quick);
|
||||
};
|
||||
}
|
||||
|
@ -215,6 +215,7 @@ static const char *known_hosts[] = //Taken form: http://www.alexa.com/topsites
|
||||
};
|
||||
|
||||
static const int MIN_CONNSCORE = 5;
|
||||
static const int QUICK_MIRRORS = 3;
|
||||
static const int MAX_CONN_TIMEOUT = 8000;
|
||||
static const int DOWNLOAD_TIMEOUT = 30000;
|
||||
|
||||
@ -240,9 +241,13 @@ while(0)
|
||||
|
||||
static int getMaxProgress(void)
|
||||
{
|
||||
int counter = MIN_CONNSCORE + 2;
|
||||
for(int i = 0; update_mirrors[i]; i++) counter++;
|
||||
return counter;
|
||||
int counter = 0;
|
||||
while (update_mirrors[counter])
|
||||
{
|
||||
counter++;
|
||||
}
|
||||
counter += MIN_CONNSCORE + QUICK_MIRRORS + 2;
|
||||
return counter; ;
|
||||
}
|
||||
|
||||
static QStringList buildRandomList(const char *const values[])
|
||||
@ -367,7 +372,7 @@ void UpdateChecker::checkForUpdates(void)
|
||||
// ----- Test Known Hosts Connectivity ----- //
|
||||
|
||||
int connectionScore = 0;
|
||||
QStringList hostList = buildRandomList(known_hosts);
|
||||
QStringList mirrorList = buildRandomList(known_hosts);
|
||||
|
||||
for(int connectionTimout = 125; connectionTimout <= MAX_CONN_TIMEOUT; connectionTimout *= 2)
|
||||
{
|
||||
@ -376,7 +381,7 @@ void UpdateChecker::checkForUpdates(void)
|
||||
const int globalTimout = 2 * MIN_CONNSCORE * connectionTimout;
|
||||
while (!elapsedTimer.hasExpired(globalTimout))
|
||||
{
|
||||
const QString hostName = hostList.takeFirst();
|
||||
const QString hostName = mirrorList.takeFirst();
|
||||
if (tryContactHost(hostName, connectionTimout))
|
||||
{
|
||||
connectionScore += 1;
|
||||
@ -389,7 +394,7 @@ void UpdateChecker::checkForUpdates(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
hostList.append(hostName); /*re-schedule*/
|
||||
mirrorList.append(hostName); /*re-schedule*/
|
||||
}
|
||||
CHECK_CANCELLED();
|
||||
msleep(1);
|
||||
@ -410,27 +415,35 @@ endLoop:
|
||||
log("----", "", "Checking for updates online...");
|
||||
setStatus(UpdateStatus_FetchingUpdates);
|
||||
|
||||
QStringList mirrorList = buildRandomList(update_mirrors);
|
||||
int mirrorCount = 0;
|
||||
mirrorList = buildRandomList(update_mirrors);
|
||||
|
||||
while(!mirrorList.isEmpty())
|
||||
{
|
||||
const QString currentMirror = mirrorList.takeFirst();
|
||||
setProgress(m_progress + 1);
|
||||
if(!m_success)
|
||||
const QString currentMirror = mirrorList.takeFirst();
|
||||
const bool isQuick = (mirrorCount++ < QUICK_MIRRORS);
|
||||
if(tryUpdateMirror(m_updateInfo.data(), currentMirror, isQuick))
|
||||
{
|
||||
m_success = true; /*success*/
|
||||
break;
|
||||
}
|
||||
if (isQuick)
|
||||
{
|
||||
mirrorList.append(currentMirror); /*re-schedule*/
|
||||
}
|
||||
CHECK_CANCELLED();
|
||||
if(tryUpdateMirror(m_updateInfo.data(), currentMirror))
|
||||
{
|
||||
m_success = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
msleep(25);
|
||||
}
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
while (m_progress < m_maxProgress)
|
||||
{
|
||||
msleep(16);
|
||||
setProgress(m_progress + 1);
|
||||
CHECK_CANCELLED();
|
||||
setProgress(m_maxProgress);
|
||||
}
|
||||
|
||||
// ----- Generate final result ----- //
|
||||
|
||||
if(m_success)
|
||||
{
|
||||
@ -508,14 +521,14 @@ void UpdateChecker::log(const QString &str1, const QString &str2, const QString
|
||||
if(!str4.isNull()) emit messageLogged(str4);
|
||||
}
|
||||
|
||||
bool UpdateChecker::tryUpdateMirror(UpdateCheckerInfo *updateInfo, const QString &url)
|
||||
bool UpdateChecker::tryUpdateMirror(UpdateCheckerInfo *updateInfo, const QString &url, const bool &quick)
|
||||
{
|
||||
bool success = false;
|
||||
log("", "Trying mirror:", url, "");
|
||||
|
||||
if (!tryContactHost(QUrl(url).host(), MAX_CONN_TIMEOUT))
|
||||
if (!tryContactHost(QUrl(url).host(), quick ? (MAX_CONN_TIMEOUT / 10) : MAX_CONN_TIMEOUT))
|
||||
{
|
||||
log("", "Mirror is unreachable!");
|
||||
log("", quick ? "Mirror is too slow!" :"Mirror is unreachable!");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user