wsd/ClientSession.cpp | 37 ++++++++++++++++++++++++++++++++++--- wsd/ClientSession.hpp | 5 ++++- wsd/DocumentBroker.cpp | 2 ++ 3 files changed, 40 insertions(+), 4 deletions(-)
New commits: commit c819651600a337627543a6855202468a8b6eae6e Author: Tamás Zolnai <tamas.zol...@collabora.com> AuthorDate: Fri Aug 24 14:01:44 2018 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 28 10:43:28 2018 +0200 First forward invalidation to client and request tiles after (cherry picked from commit 1b01af36059623627fd8895353f028efc20ef26f) Change-Id: I48a9e5783312801468651e55f4c05d3c08ff9189 Reviewed-on: https://gerrit.libreoffice.org/59649 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index ef3380199..00fd8373d 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -947,7 +947,12 @@ bool ClientSession::handleKitToClientMessage(const char* buffer, const int lengt else if (tokens[0] == "invalidatetiles:") { assert(firstLine.size() == static_cast<std::string::size_type>(length)); + + // First forward invalidation + bool ret = forwardToClient(payload); + handleTileInvalidation(firstLine, docBroker); + return ret; } else if (tokens[0] == "invalidatecursor:") { commit dce9d960fe8e059e8d60f0a93b88dba54f53a7ee Author: Tamás Zolnai <tamas.zol...@collabora.com> AuthorDate: Thu Aug 23 12:46:49 2018 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 28 10:43:15 2018 +0200 Drop too old tileID's from tiles-on-fly list So we can avoid that tile sending stop working because server is waiting for tileprocessed messages which will not arrive. Change-Id: I545346c50d49340999608aadac32b5190ede43c5 (cherry picked from commit 759d1fe72294b22669f19dabf28a4fcf4922af8c) Fix previous commit Change-Id: I7d3bce0132d124e52f7885c8cb3c26acc6f7b41d (cherry picked from commit 3bd7c6b5084bb2505cf0f2629450974e68b8c050) Go back using list for tilesOnFly It can handle duplicates which we need to have. Change-Id: Ia4cd813dd173bc538dd27953c4886d460b5b1c49 (cherry picked from commit 185b933353c670ef4639ada323ed2f803f209e70) Reviewed-on: https://gerrit.libreoffice.org/59648 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index 9ed10cf30..ef3380199 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -51,7 +51,6 @@ ClientSession::ClientSession(const std::string& id, _tileWidthTwips(0), _tileHeightTwips(0), _isTextDocument(false), - _tilesOnFly(0), _tilesBeingRendered(0) { const size_t curConnections = ++LOOLWSD::NumConnections; @@ -342,7 +341,13 @@ bool ClientSession::_handleInput(const char *buffer, int length) sendTextFrame("error: cmd=tileprocessed kind=syntax"); return false; } - auto iter = std::find(_tilesOnFly.begin(), _tilesOnFly.end(), tileID); + + auto iter = std::find_if(_tilesOnFly.begin(), _tilesOnFly.end(), + [&tileID](const std::pair<std::string, std::chrono::steady_clock::time_point>& curTile) + { + return curTile.first == tileID; + }); + if(iter != _tilesOnFly.end()) _tilesOnFly.erase(iter); else @@ -1040,7 +1045,7 @@ Authorization ClientSession::getAuthorization() const void ClientSession::addTileOnFly(const TileDesc& tile) { - _tilesOnFly.push_back(generateTileID(tile)); + _tilesOnFly.push_back({generateTileID(tile), std::chrono::steady_clock::now()}); } void ClientSession::clearTilesOnFly() @@ -1048,6 +1053,24 @@ void ClientSession::clearTilesOnFly() _tilesOnFly.clear(); } +void ClientSession::removeOutdatedTilesOnFly() +{ + // Check only the beginning of the list, tiles are ordered by timestamp + bool continueLoop = true; + while(!_tilesOnFly.empty() && continueLoop) + { + auto tileIter = _tilesOnFly.begin(); + double elapsedTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - tileIter->second).count(); + if(elapsedTimeMs > 3000) + { + LOG_WRN("Tracker tileID was dropped because of time out. Tileprocessed message did not arrive"); + _tilesOnFly.erase(tileIter); + } + else + continueLoop = false; + } +} + void ClientSession::onDisconnect() { LOG_INF(getName() << " Disconnected, current number of connections: " << LOOLWSD::NumConnections); @@ -1242,7 +1265,10 @@ void ClientSession::removeOutdatedTileSubscriptions() { double elapsedTime = docBroker->tileCache().getTileBeingRenderedElapsedTimeMs(*iterator); if(elapsedTime < 0.0 && elapsedTime > 5000.0) + { + LOG_WRN("Tracked TileBeingRendered was dropped because of time out."); _tilesBeingRendered.erase(iterator); + } else ++iterator; } diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp index 13f0b141c..397f7b670 100644 --- a/wsd/ClientSession.hpp +++ b/wsd/ClientSession.hpp @@ -19,6 +19,8 @@ #include <Rectangle.hpp> #include <deque> #include <map> +#include <list> +#include <utility> #include <unordered_set> class DocumentBroker; @@ -125,6 +127,7 @@ public: void addTileOnFly(const TileDesc& tile); void clearTilesOnFly(); size_t getTilesOnFlyCount() const { return _tilesOnFly.size(); } + void removeOutdatedTilesOnFly(); Util::Rectangle getVisibleArea() const { return _clientVisibleArea; } int getTileWidthInTwips() const { return _tileWidthTwips; } @@ -230,7 +233,7 @@ private: bool _isTextDocument; /// TileID's of the sent tiles. Push by sending and pop by tileprocessed message from the client. - std::list<std::string> _tilesOnFly; + std::list<std::pair<std::string, std::chrono::steady_clock::time_point>> _tilesOnFly; /// Names of tiles requested from kit, which this session is subsrcibed to /// Track only non-thumbnail tiles (getId() == -1) diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index 913510064..9f9e63304 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -1401,6 +1401,8 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se // Update client's tilesBeingRendered list session->removeOutdatedTileSubscriptions(); + // Drop tiles which we are waiting for too long + session->removeOutdatedTilesOnFly(); // All tiles were processed on client side what we sent last time, so we can send a new banch of tiles // which was invalidated / requested in the meantime _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits