[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/TileCache.cpp
loolwsd/DocumentBroker.cpp | 29 ++--- loolwsd/TileCache.cpp |8 2 files changed, 14 insertions(+), 23 deletions(-) New commits: commit c8eb2ba6127f9d3da56811c25860c89ce085f588 Author: Ashod Nakashian Date: Sun Oct 30 15:24:27 2016 -0400 loolwsd: cleanup tile response handling Change-Id: I34b76b463c05e3479d1fd1516906c9a75282c753 Reviewed-on: https://gerrit.libreoffice.org/30419 Reviewed-by: Ashod Nakashian Tested-by: Ashod Nakashian diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index 185d610..7516cc5 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -740,29 +740,27 @@ void DocumentBroker::cancelTileRequests(const std::shared_ptr& se void DocumentBroker::handleTileResponse(const std::vector& payload) { const std::string firstLine = getFirstLine(payload); +Log::debug("Handling tile combined: " + firstLine); + try { -auto tile = TileDesc::parse(firstLine); -const auto buffer = payload.data(); const auto length = payload.size(); - if (firstLine.size() < static_cast(length) - 1) { +const auto tile = TileDesc::parse(firstLine); +const auto buffer = payload.data(); const auto offset = firstLine.size() + 1; tileCache().saveTileAndNotify(tile, buffer + offset, length - offset); } else { Log::debug() << "Render request declined for " << firstLine << Log::end; -std::unique_lock tileBeingRenderedLock(tileCache().getTilesBeingRenderedLock()); -tileCache().forgetTileBeingRendered(tile); +// They will get re-issued if we don't forget them. } } catch (const std::exception& exc) { Log::error("Failed to process tile response [" + firstLine + "]: " + exc.what() + "."); -//FIXME: Return error. -//sendTextFrame("error: cmd=tile kind=syntax"); } } @@ -773,13 +771,12 @@ void DocumentBroker::handleTileCombinedResponse(const std::vector& payload try { -auto tileCombined = TileCombined::parse(firstLine); -const auto buffer = payload.data(); const auto length = payload.size(); -auto offset = firstLine.size() + 1; - if (firstLine.size() < static_cast(length) - 1) { +const auto tileCombined = TileCombined::parse(firstLine); +const auto buffer = payload.data(); +auto offset = firstLine.size() + 1; for (const auto& tile : tileCombined.getTiles()) { tileCache().saveTileAndNotify(tile, buffer + offset, tile.getImgSize()); @@ -788,19 +785,13 @@ void DocumentBroker::handleTileCombinedResponse(const std::vector& payload } else { -Log::error() << "Render request failed for " << firstLine << Log::end; -std::unique_lock tileBeingRenderedLock(tileCache().getTilesBeingRenderedLock()); -for (const auto& tile : tileCombined.getTiles()) -{ -tileCache().forgetTileBeingRendered(tile); -} +Log::error() << "Render request declined for " << firstLine << Log::end; +// They will get re-issued if we don't forget them. } } catch (const std::exception& exc) { Log::error("Failed to process tile response [" + firstLine + "]: " + exc.what() + "."); -//FIXME: Return error. -//sendTextFrame("error: cmd=tile kind=syntax"); } } diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp index e8ebdd1..d26db3b 100644 --- a/loolwsd/TileCache.cpp +++ b/loolwsd/TileCache.cpp @@ -444,14 +444,14 @@ void TileCache::subscribeToTileRendering(const TileDesc& tile, const std::shared { assert(subscriber->getKind() == LOOLSession::Kind::ToClient); -std::unique_lock lock(_tilesBeingRenderedMutex); - -std::shared_ptr tileBeingRendered = findTileBeingRendered(tile); - std::ostringstream oss; oss << '(' << tile.getPart() << ',' << tile.getTilePosX() << ',' << tile.getTilePosY() << ')'; const auto name = oss.str(); +std::unique_lock lock(_tilesBeingRenderedMutex); + +std::shared_ptr tileBeingRendered = findTileBeingRendered(tile); + if (tileBeingRendered) { for (const auto &s : tileBeingRendered->_subscribers) ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/TileCache.cpp
loolwsd/DocumentBroker.cpp | 12 +--- loolwsd/TileCache.cpp |2 +- 2 files changed, 6 insertions(+), 8 deletions(-) New commits: commit ae4a9f7110f6d6677b3f3ef5d545f8021222d5da Author: Ashod Nakashian Date: Tue Sep 20 22:26:19 2016 -0400 loolwsd: always request newer tile version And accept any version newer than expected. Since we have proper de-duplication of tiles requesting newer versions reduces changes of races between client and the renderer. Change-Id: I30bb53f98ef6f1461b53c1cf527d315dc35f7f26 Reviewed-on: https://gerrit.libreoffice.org/29125 Reviewed-by: Ashod Nakashian Tested-by: Ashod Nakashian diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index 55ecbfa..289842c 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -510,14 +510,12 @@ void DocumentBroker::handleTileRequest(TileDesc& tile, return; } -if (tileCache().subscribeToTileRendering(tile, session) > 0) -{ -Log::debug() << "Sending render request for tile (" << tile.getPart() << ',' << tile.getTilePosX() << ',' << tile.getTilePosY() << ")." << Log::end; +tileCache().subscribeToTileRendering(tile, session); -// Forward to child to render. -const std::string request = "tile " + tile.serialize(); -_childProcess->getWebSocket()->sendFrame(request.data(), request.size()); -} +// Forward to child to render. +Log::debug() << "Sending render request for tile (" << tile.getPart() << ',' << tile.getTilePosX() << ',' << tile.getTilePosY() << ")." << Log::end; +const std::string request = "tile " + tile.serialize(); +_childProcess->getWebSocket()->sendFrame(request.data(), request.size()); } void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined, diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp index eb8e8d8..416543e 100644 --- a/loolwsd/TileCache.cpp +++ b/loolwsd/TileCache.cpp @@ -195,7 +195,7 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const } // Remove subscriptions. -if (tileBeingRendered->getVersion() == tile.getVersion()) +if (tileBeingRendered->getVersion() <= tile.getVersion()) { Log::debug() << "STATISTICS: tile " << tile.getVersion() << " internal roundtrip " << tileBeingRendered->getElapsedTimeMs() << " ms." << Log::end; ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/TileCache.cpp loolwsd/TileCache.hpp
loolwsd/DocumentBroker.cpp |7 ++- loolwsd/TileCache.cpp | 30 +++--- loolwsd/TileCache.hpp |2 +- 3 files changed, 30 insertions(+), 9 deletions(-) New commits: commit 6bf643183e4a93dcb85546f146c364b9f0621a83 Author: Ashod Nakashian Date: Mon Sep 19 22:16:45 2016 -0400 loolwsd: cancel subscriber tiles only Change-Id: I207f2332520f29308a2994769aa3a12ea5178477 Reviewed-on: https://gerrit.libreoffice.org/29118 Reviewed-by: Ashod Nakashian Tested-by: Ashod Nakashian diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index a54483c..a30b371 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -569,7 +569,12 @@ void DocumentBroker::cancelTileRequests(const std::shared_ptr& se { std::unique_lock lock(_mutex); -tileCache().cancelTiles(session); +const auto canceltiles = tileCache().cancelTiles(session); +if (!canceltiles.empty()) +{ +Log::debug() << "Forwarding canceltiles request: " << canceltiles << Log::end; +_childProcess->getWebSocket()->sendFrame(canceltiles.data(), canceltiles.size()); +} } void DocumentBroker::handleTileResponse(const std::vector& payload) diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp index 1ad4907..a5f7c0f 100644 --- a/loolwsd/TileCache.cpp +++ b/loolwsd/TileCache.cpp @@ -475,26 +475,42 @@ int TileCache::subscribeToTileRendering(const TileDesc& tile, const std::shared_ } } -void TileCache::cancelTiles(const std::shared_ptr &subscriber) +std::string TileCache::cancelTiles(const std::shared_ptr &subscriber) { std::unique_lock lock(_tilesBeingRenderedMutex); const auto sub = subscriber.get(); Log::trace("Cancelling tiles for " + subscriber->getName()); +std::ostringstream oss; for (auto it = _tilesBeingRendered.begin(); it != _tilesBeingRendered.end(); ) { auto& subscribers = it->second->_subscribers; Log::trace("Tile " + it->first + " has " + std::to_string(subscribers.size()) + " subscribers."); -subscribers.erase(std::remove_if(subscribers.begin(), subscribers.end(), - [sub](std::weak_ptr& ptr){ return ptr.lock().get() == sub; }), - subscribers.end()); -Log::trace(" Tile " + it->first + " has " + std::to_string(subscribers.size()) + " subscribers."); -// Remove if there are no more subscribers on this tile. -it = (subscribers.empty() ? _tilesBeingRendered.erase(it) : ++it); +const auto itRem = std::find_if(subscribers.begin(), subscribers.end(), +[sub](std::weak_ptr& ptr){ return ptr.lock().get() == sub; }); +if (itRem != subscribers.end()) +{ +Log::trace("Tile " + it->first + " has " + std::to_string(subscribers.size()) + " subscribers. Removing one."); +subscribers.erase(itRem, itRem + 1); +if (subscribers.empty()) +{ +// No other subscriber, remove it from the render queue. +oss << it->second->getVersion() << ','; +it = _tilesBeingRendered.erase(it); +} +} + +if (!subscribers.empty()) +{ +++it; +} } + +const auto canceltiles = oss.str(); +return (canceltiles.empty() ? canceltiles : "canceltiles " + canceltiles); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/TileCache.hpp b/loolwsd/TileCache.hpp index 2801e22..6d206fc 100644 --- a/loolwsd/TileCache.hpp +++ b/loolwsd/TileCache.hpp @@ -43,7 +43,7 @@ public: int subscribeToTileRendering(const TileDesc& tile, const std::shared_ptr &subscriber); /// Cancels all tile requests by the given subscriber. -void cancelTiles(const std::shared_ptr &subscriber); +std::string cancelTiles(const std::shared_ptr &subscriber); std::unique_ptr lookupTile(const TileDesc& tile); ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/TileCache.cpp
loolwsd/DocumentBroker.cpp |2 +- loolwsd/TileCache.cpp |2 +- 2 files changed, 2 insertions(+), 2 deletions(-) New commits: commit ffa146a8700aee5ab9dc0d9b5192a11f96eeecf9 Author: Ashod Nakashian Date: Tue Sep 13 18:40:23 2016 -0400 loolwsd: log tile version in stats Change-Id: Ia8a466b50f5236cb555c962830843c4d7d77fa97 Reviewed-on: https://gerrit.libreoffice.org/28956 Reviewed-by: Ashod Nakashian Tested-by: Ashod Nakashian diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index ff3fc1b..3c6c3fb 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -574,7 +574,7 @@ void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined, assert(cachedTile->is_open()); cachedTile->seekg(0, std::ios_base::end); -size_t pos = output.size(); +const auto pos = output.size(); std::streamsize size = cachedTile->tellg(); output.resize(pos + size); cachedTile->seekg(0, std::ios_base::beg); diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp index 0f6936a..b3cf0ea 100644 --- a/loolwsd/TileCache.cpp +++ b/loolwsd/TileCache.cpp @@ -188,7 +188,7 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const // Remove subscriptions. if (tileBeingRendered->getVersion() == tile.getVersion()) { -Log::debug() << "STATISTICS: tile internal roundtrip " +Log::debug() << "STATISTICS: tile " << tile.getVersion() << " internal roundtrip " << tileBeingRendered->getElapsedTimeMs() << " ms." << Log::end; _tilesBeingRendered.erase(cachedName); } ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/TileCache.cpp loolwsd/TileCache.hpp
loolwsd/DocumentBroker.cpp |7 --- loolwsd/TileCache.cpp | 12 +++- loolwsd/TileCache.hpp |2 +- 3 files changed, 12 insertions(+), 9 deletions(-) New commits: commit 3af0d69d22deabcd1970f5aa5b59a6e993d8a273 Author: Ashod Nakashian Date: Thu Aug 18 10:28:55 2016 -0400 loolwsd: isTileBeingRenderedIfSoSubscribe -> subscribeToTileRendering Simpler yet descriptive function name and better logging. Change-Id: Ic903197d5772b7994ffa8136cfae771deee3a24a Reviewed-on: https://gerrit.libreoffice.org/28291 Reviewed-by: Ashod Nakashian Tested-by: Ashod Nakashian diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index a0d59ca..e3f1954 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -504,7 +504,7 @@ void DocumentBroker::handleTileRequest(TileDesc& tile, return; } -if (tileCache().isTileBeingRenderedIfSoSubscribe(tile, session) > 0) +if (tileCache().subscribeToTileRendering(tile, session) > 0) { Log::debug() << "Sending render request for tile (" << tile.getPart() << ',' << tile.getTilePosX() << ',' << tile.getTilePosY() << ")." << Log::end; @@ -530,7 +530,7 @@ void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined, std::unique_ptr cachedTile = _tileCache->lookupTile(tile); if (cachedTile) { -//TODO: Combine. +//TODO: Combine the response to reduce latency. #if ENABLE_DEBUG const std::string response = tile.serialize("tile:") + " renderid=cached\n"; #else @@ -556,8 +556,9 @@ void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined, } else { +// Not cached, needs rendering. tile.setVersion(_tileVersion); -const auto ver = tileCache().isTileBeingRenderedIfSoSubscribe(tile, session); +const auto ver = tileCache().subscribeToTileRendering(tile, session); if (ver <= 0) { // Already rendering. Skip. diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp index 5dd987e..9b76a15 100644 --- a/loolwsd/TileCache.cpp +++ b/loolwsd/TileCache.cpp @@ -410,7 +410,7 @@ void TileCache::saveLastModified(const Timestamp& timestamp) } // FIXME: to be further simplified when we centralize tile messages. -int TileCache::isTileBeingRenderedIfSoSubscribe(const TileDesc& tile, const std::shared_ptr &subscriber) +int TileCache::subscribeToTileRendering(const TileDesc& tile, const std::shared_ptr &subscriber) { std::unique_lock lock(_tilesBeingRenderedMutex); @@ -418,8 +418,10 @@ int TileCache::isTileBeingRenderedIfSoSubscribe(const TileDesc& tile, const std: if (tileBeingRendered) { -Log::debug() << "Tile (" << tile.getPart() << ',' << tile.getTilePosX() << ',' - << tile.getTilePosY() << ") is already being rendered, subscribing." << Log::end; +Log::debug() << "Subscribing to tile (" << tile.getPart() << ',' << tile.getTilePosX() << ',' + << tile.getTilePosY() << ") which has " + << tileBeingRendered->_subscribers.size() + << " subscribers already. Adding one more." << Log::end; assert(subscriber->getKind() == LOOLSession::Kind::ToClient); for (const auto &s : tileBeingRendered->_subscribers) @@ -443,8 +445,8 @@ int TileCache::isTileBeingRenderedIfSoSubscribe(const TileDesc& tile, const std: } else { -Log::debug() << "Tile (" << tile.getPart() << ',' << tile.getTilePosX() << ',' - << tile.getTilePosY() << ") needs rendering, subscribing for ver: " +Log::debug() << "Subscribing to tile (" << tile.getPart() << ',' << tile.getTilePosX() << ',' + << tile.getTilePosY() << ") which has no subscribers. Subscribing for ver: " << tile.getVersion() << "." << Log::end; const std::string cachedName = cacheFileName(tile); diff --git a/loolwsd/TileCache.hpp b/loolwsd/TileCache.hpp index b1194bb..bbe5aa0 100644 --- a/loolwsd/TileCache.hpp +++ b/loolwsd/TileCache.hpp @@ -40,7 +40,7 @@ public: /// Subscribes if no subscription exists and returns the version number. /// Otherwise returns 0 to signify a subscription exists. -int isTileBeingRenderedIfSoSubscribe(const TileDesc& tile, const std::shared_ptr &subscriber); +int subscribeToTileRendering(const TileDesc& tile, const std::shared_ptr &subscriber); std::unique_ptr lookupTile(const TileDesc& tile); ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/TileCache.cpp
loolwsd/DocumentBroker.cpp |5 +++-- loolwsd/TileCache.cpp |4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) New commits: commit cd8d48e6bb78cb616e63da3bd37d0dfb39967ff3 Author: Ashod Nakashian Date: Wed May 4 22:05:09 2016 -0400 loolwsd: tile logs Change-Id: Id5c8b688c36038dc6f02ad95ad1c43412dcd2c31 Reviewed-on: https://gerrit.libreoffice.org/24668 Reviewed-by: Ashod Nakashian Tested-by: Ashod Nakashian diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index e3b2b0e..040e7b0 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -409,7 +409,7 @@ void DocumentBroker::handleTileRequest(int part, int width, int height, int tile std::unique_lock lock(_mutex); -std::unique_ptr cachedTile = tileCache().lookupTile(part, width, height, tilePosX, tilePosY, tileWidth, tileHeight); +std::unique_ptr cachedTile = _tileCache->lookupTile(part, width, height, tilePosX, tilePosY, tileWidth, tileHeight); if (cachedTile) { @@ -442,9 +442,10 @@ void DocumentBroker::handleTileRequest(int part, int width, int height, int tile tileHeight, session)) return; +Log::debug() << "Sending render request for tile (" << part << ',' << tilePosX << ',' << tilePosY << ")." << Log::end; + // Forward to child to render. const std::string request = "tile " + tileMsg; - _childProcess->getWebSocket()->sendFrame(request.data(), request.size()); } diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp index bdf726e..3242344 100644 --- a/loolwsd/TileCache.cpp +++ b/loolwsd/TileCache.cpp @@ -377,7 +377,7 @@ bool TileCache::isTileBeingRenderedIfSoSubscribe(int part, int width, int height if (tileBeingRendered) { -Log::debug("Tile is already being rendered, subscribing"); +Log::debug() << "Tile (" << part << ',' << tilePosX << ',' << tilePosY << ") is already being rendered, subscribing." << Log::end; assert(subscriber->getKind() == LOOLSession::Kind::ToClient); for (const auto &s : tileBeingRendered->_subscribers) @@ -394,6 +394,8 @@ bool TileCache::isTileBeingRenderedIfSoSubscribe(int part, int width, int height } else { +Log::debug() << "Tile (" << part << ',' << tilePosX << ',' << tilePosY << ") needs rendering, subscribing." << Log::end; + const std::string cachedName = cacheFileName(part, width, height, tilePosX, tilePosY, tileWidth, tileHeight); assert(_tilesBeingRendered.find(cachedName) == _tilesBeingRendered.end()); ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits