From 0694a7d4a5ebcde09793ec4be013361ebf788bfd Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 13 Jan 2014 16:09:36 -0800 Subject: [PATCH] When we fail to download textures or geometry, retry after steadily increasing delays. Closes #1471. --- interface/src/renderer/GeometryCache.cpp | 32 ++++++++++++++++------ interface/src/renderer/GeometryCache.h | 4 +++ interface/src/renderer/TextureCache.cpp | 35 ++++++++++++++++++------ interface/src/renderer/TextureCache.h | 8 ++++-- 4 files changed, 61 insertions(+), 18 deletions(-) diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 1a32a70c71..7ec61a8942 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -251,18 +251,16 @@ QSharedPointer GeometryCache::getGeometry(const QUrl& url) { } NetworkGeometry::NetworkGeometry(const QUrl& url) : + _modelRequest(url), _modelReply(NULL), - _mappingReply(NULL) + _mappingReply(NULL), + _attempts(0) { if (!url.isValid()) { return; } - QNetworkRequest modelRequest(url); - modelRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - _modelReply = Application::getInstance()->getNetworkAccessManager()->get(modelRequest); - - connect(_modelReply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(maybeReadModelWithMapping())); - connect(_modelReply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(handleModelReplyError())); + _modelRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); + makeModelRequest(); QUrl mappingURL = url; QString path = url.path(); @@ -312,12 +310,30 @@ glm::vec4 NetworkGeometry::computeAverageColor() const { return (totalTriangles == 0) ? glm::vec4(1.0f, 1.0f, 1.0f, 1.0f) : totalColor / totalTriangles; } +void NetworkGeometry::makeModelRequest() { + _modelReply = Application::getInstance()->getNetworkAccessManager()->get(_modelRequest); + + connect(_modelReply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(maybeReadModelWithMapping())); + connect(_modelReply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(handleModelReplyError())); +} + void NetworkGeometry::handleModelReplyError() { - qDebug() << _modelReply->errorString() << "\n"; + QDebug debug = qDebug() << _modelReply->errorString(); _modelReply->disconnect(this); _modelReply->deleteLater(); _modelReply = NULL; + + // retry with increasing delays + const int MAX_ATTEMPTS = 8; + const int BASE_DELAY_MS = 1000; + if (++_attempts < MAX_ATTEMPTS) { + QTimer::singleShot(BASE_DELAY_MS * (int)pow(2.0, _attempts), this, SLOT(makeModelRequest())); + debug << " -- retrying...\n"; + + } else { + debug << "\n"; + } } void NetworkGeometry::handleMappingReplyError() { diff --git a/interface/src/renderer/GeometryCache.h b/interface/src/renderer/GeometryCache.h index d880d25855..8a68917ba5 100644 --- a/interface/src/renderer/GeometryCache.h +++ b/interface/src/renderer/GeometryCache.h @@ -10,6 +10,7 @@ #define __interface__GeometryCache__ #include +#include #include #include #include @@ -67,15 +68,18 @@ public: private slots: + void makeModelRequest(); void handleModelReplyError(); void handleMappingReplyError(); void maybeReadModelWithMapping(); private: + QNetworkRequest _modelRequest; QNetworkReply* _modelReply; QNetworkReply* _mappingReply; + int _attempts; FBXGeometry _geometry; QVector _meshes; }; diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index 778fb8fb12..6a7d64da5f 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -252,16 +252,17 @@ Texture::~Texture() { glDeleteTextures(1, &_id); } -NetworkTexture::NetworkTexture(const QUrl& url, bool normalMap) : _reply(NULL), _averageColor(1.0f, 1.0f, 1.0f, 1.0f) { +NetworkTexture::NetworkTexture(const QUrl& url, bool normalMap) : + _request(url), + _reply(NULL), + _attempts(0), + _averageColor(1.0f, 1.0f, 1.0f, 1.0f) { + if (!url.isValid()) { return; } - QNetworkRequest request(url); - request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - _reply = Application::getInstance()->getNetworkAccessManager()->get(request); - - connect(_reply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(handleDownloadProgress(qint64,qint64))); - connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(handleReplyError())); + _request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); + makeRequest(); // default to white/blue glBindTexture(GL_TEXTURE_2D, getID()); @@ -279,6 +280,13 @@ void NetworkTexture::imageLoaded(const QImage& image) { // nothing by default } +void NetworkTexture::makeRequest() { + _reply = Application::getInstance()->getNetworkAccessManager()->get(_request); + + connect(_reply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(handleDownloadProgress(qint64,qint64))); + connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(handleReplyError())); +} + void NetworkTexture::handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) { if (bytesReceived < bytesTotal && !_reply->isFinished()) { return; @@ -314,11 +322,22 @@ void NetworkTexture::handleDownloadProgress(qint64 bytesReceived, qint64 bytesTo } void NetworkTexture::handleReplyError() { - qDebug() << _reply->errorString() << "\n"; + QDebug debug = qDebug() << _reply->errorString(); _reply->disconnect(this); _reply->deleteLater(); _reply = NULL; + + // retry with increasing delays + const int MAX_ATTEMPTS = 8; + const int BASE_DELAY_MS = 1000; + if (++_attempts < MAX_ATTEMPTS) { + QTimer::singleShot(BASE_DELAY_MS * (int)pow(2.0, _attempts), this, SLOT(makeRequest())); + debug << " -- retrying...\n"; + + } else { + debug << "\n"; + } } DilatableNetworkTexture::DilatableNetworkTexture(const QUrl& url, bool normalMap) : diff --git a/interface/src/renderer/TextureCache.h b/interface/src/renderer/TextureCache.h index 40f2bc5ac3..d3f138254f 100644 --- a/interface/src/renderer/TextureCache.h +++ b/interface/src/renderer/TextureCache.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -126,12 +127,15 @@ protected: private slots: + void makeRequest(); void handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal); void handleReplyError(); - + private: - + + QNetworkRequest _request; QNetworkReply* _reply; + int _attempts; glm::vec4 _averageColor; };