From d31a08f1d59e9f70b0d2fc2a139efa52d1b03d75 Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Sat, 13 Jan 2018 22:25:15 +0200 Subject: [PATCH] Keep syncing regardless of connectivity (#93) --- include/ChatPage.h | 2 +- src/ChatPage.cc | 29 ++++++++++++++++------------- src/MatrixClient.cc | 2 +- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/include/ChatPage.h b/include/ChatPage.h index 93b98a76..0eae3838 100644 --- a/include/ChatPage.h +++ b/include/ChatPage.h @@ -86,7 +86,6 @@ private slots: void setOwnAvatar(const QPixmap &img); void initialSyncCompleted(const mtx::responses::Sync &response); void syncCompleted(const mtx::responses::Sync &response); - void syncFailed(const QString &msg); void changeTopRoomInfo(const QString &room_id); void logout(); void addRoom(const QString &room_id); @@ -157,6 +156,7 @@ private: // Safety net if consensus is not possible or too slow. QTimer *showContentTimer_; QTimer *consensusTimer_; + QTimer *syncTimeoutTimer_; QString current_room_; QString current_community_; diff --git a/src/ChatPage.cc b/src/ChatPage.cc index 4e57e280..9bb90134 100644 --- a/src/ChatPage.cc +++ b/src/ChatPage.cc @@ -43,7 +43,7 @@ #include "timeline/TimelineViewManager.h" constexpr int MAX_INITIAL_SYNC_FAILURES = 5; -constexpr int SYNC_RETRY_TIMEOUT = 10000; +constexpr int SYNC_RETRY_TIMEOUT = 40000; ChatPage *ChatPage::instance_ = nullptr; @@ -304,7 +304,6 @@ ChatPage::ChatPage(QSharedPointer client, client_->initialSync(); }); connect(client_.data(), &MatrixClient::syncCompleted, this, &ChatPage::syncCompleted); - connect(client_.data(), &MatrixClient::syncFailed, this, &ChatPage::syncFailed); connect(client_.data(), &MatrixClient::getOwnProfileResponse, this, @@ -365,6 +364,17 @@ ChatPage::ChatPage(QSharedPointer client, } }); + syncTimeoutTimer_ = new QTimer(this); + connect(syncTimeoutTimer_, &QTimer::timeout, this, [=]() { + if (client_->getHomeServer().isEmpty()) { + syncTimeoutTimer_->stop(); + return; + } + + qDebug() << "Sync took too long. Retrying..."; + client_->sync(); + }); + connect(communitiesList_, &CommunitiesList::communityChanged, this, @@ -474,20 +484,11 @@ ChatPage::setOwnAvatar(const QPixmap &img) user_info_widget_->setAvatar(img.toImage()); } -void -ChatPage::syncFailed(const QString &msg) -{ - // Stop if sync is not active. e.g user is logged out. - if (client_->getHomeServer().isEmpty()) - return; - - qWarning() << "Sync error:" << msg; - QTimer::singleShot(SYNC_RETRY_TIMEOUT, this, [=]() { client_->sync(); }); -} - void ChatPage::syncCompleted(const mtx::responses::Sync &response) { + syncTimeoutTimer_->stop(); + updateJoinedRooms(response.rooms.join); removeLeftRooms(response.rooms.leave); @@ -504,6 +505,8 @@ ChatPage::syncCompleted(const mtx::responses::Sync &response) client_->setNextBatchToken(nextBatchToken); client_->sync(); + + syncTimeoutTimer_->start(SYNC_RETRY_TIMEOUT); } void diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc index 53f6a32e..70a9bbf5 100644 --- a/src/MatrixClient.cc +++ b/src/MatrixClient.cc @@ -260,7 +260,7 @@ MatrixClient::sync() noexcept int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (status == 0 || status >= 400) { - emit syncFailed(reply->errorString()); + qDebug() << reply->errorString(); return; }