[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/TileCache.cpp

2016-10-30 Thread Ashod Nakashian
 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

2016-09-20 Thread Ashod Nakashian
 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

2016-09-20 Thread Ashod Nakashian
 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

2016-09-16 Thread Ashod Nakashian
 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

2016-08-21 Thread Ashod Nakashian
 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

2016-05-04 Thread Ashod Nakashian
 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