[Libreoffice-commits] online.git: Branch 'feature/latency' - 2 commits - loleaflet/src wsd/ClientSession.cpp wsd/ClientSession.hpp wsd/DocumentBroker.cpp wsd/protocol.txt

Tamás Zolnai tamas.zolnai at collabora.com
Wed Jun 13 15:25:24 UTC 2018


 loleaflet/src/layer/tile/TileLayer.js |    3 +-
 wsd/ClientSession.cpp                 |   37 +++++++++++++++++++++++-----------
 wsd/ClientSession.hpp                 |    7 +++---
 wsd/DocumentBroker.cpp                |   14 ++----------
 wsd/protocol.txt                      |    2 -
 5 files changed, 36 insertions(+), 27 deletions(-)

New commits:
commit fee9f1fc1cb1ec5da184374e67b1328b3fd749c3
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date:   Wed Jun 13 16:21:48 2018 +0200

    Removed these printout lines used for debugging
    
    Change-Id: Id87def8c69a15077bee47ab02c67e0995aeb0a12

diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 7271d3d25..dda63f52e 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -1288,7 +1288,6 @@ void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined,
     std::unique_lock<std::mutex> lock(_mutex);
 
     LOG_TRC("TileCombined request for " << tileCombined.serialize());
-    std::cerr << "handleTileCombinedRequest: " << std::endl;
 
     // Check which newly requested tiles needs rendering.
     std::vector<TileDesc> tilesNeedsRendering;
@@ -1309,7 +1308,6 @@ void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined,
     // Send rendering request, prerender before we actually send the tiles
     if (!tilesNeedsRendering.empty())
     {
-        std::cerr << "tilesNeedsRendering.size(): " << tilesNeedsRendering.size() << std::endl;
         TileCombined newTileCombined = TileCombined::create(tilesNeedsRendering);
 
         // Forward to child to render.
@@ -1374,15 +1372,12 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se
         session->setTilesOnFly(requestedTiles.get());
 
         // Satisfy as many tiles from the cache.
-    std::cerr << "requestedTiles.size(): " << requestedTiles.get().getTiles().size() << std::endl;
         std::vector<TileDesc> tilesNeedsRendering;
         for (auto& tile : requestedTiles.get().getTiles())
         {
-        std::cerr << "alma: "<< std::endl;
             std::unique_ptr<std::fstream> cachedTile = _tileCache->lookupTile(tile);
             if (cachedTile)
             {
-        std::cerr << "cachedTile: "<< std::endl;
                 //TODO: Combine the response to reduce latency.
 #if ENABLE_DEBUG
                 const std::string response = tile.serialize("tile:") + " renderid=cached\n";
@@ -1408,7 +1403,6 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se
             }
             else
             {
-        std::cerr << "not cachedTile: "<< std::endl;
                 // Not cached, needs rendering.
                 if(tile.getVersion() == -1) // Rendering of this tile was not requested yet
                 {
@@ -1417,7 +1411,6 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se
                     _debugRenderedTileCount++;
                 }
                 tileCache().subscribeToTileRendering(tile, session);
-        std::cerr << "not cachedTile2: "<< std::endl;
             }
         }
 
commit 454a6307ee9e6ad0b116994aafee24472245c8da
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date:   Wed Jun 13 15:04:09 2018 +0200

    Store sent tiles's id instead of using a simple counter
    
    Change-Id: I8cbf84923a53fb6b294bd4039eb7382326f8c445

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 1dcdf8df6..dbd1b0871 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -1430,7 +1430,8 @@ L.TileLayer = L.GridLayer.extend({
 		L.Log.log(textMsg, L.INCOMING, key);
 
 		// Send acknowledgment, that the tile message arrived
-		this._map._socket.sendMessage('tileprocessed tile= ' + key);
+		var tileID = command.part + ':' + command.x + ':' + command.y + ':' + command.tileWidth + ':' + command.tileHeight;
+		this._map._socket.sendMessage('tileprocessed tile=' + tileID);
 	},
 
 	_tileOnLoad: function (done, tile) {
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index 4d1c5c0e5..9a9762dcb 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -12,6 +12,7 @@
 #include "ClientSession.hpp"
 
 #include <fstream>
+#include <sstream>
 
 #include <Poco/Net/HTTPResponse.h>
 #include <Poco/StringTokenizer.h>
@@ -47,8 +48,7 @@ ClientSession::ClientSession(const std::string& id,
     _tileWidthPixel(0),
     _tileHeightPixel(0),
     _tileWidthTwips(0),
-    _tileHeightTwips(0),
-    _tilesOnFly(0)
+    _tileHeightTwips(0)
 {
     const size_t curConnections = ++LOOLWSD::NumConnections;
     LOG_INF("ClientSession ctor [" << getName() << "], current number of connections: " << curConnections);
@@ -327,13 +327,20 @@ bool ClientSession::_handleInput(const char *buffer, int length)
     }
     else if (tokens[0] == "tileprocessed")
     {
-        if(_tilesOnFly > 0) // canceltiles message can zero this value
+        std::string tileID;
+        if (tokens.size() != 2 ||
+            !getTokenString(tokens[1], "tile", tileID))
         {
-            --_tilesOnFly;
-            if(_tilesOnFly == 0)
-            {
-                _tileCounterStartTime = boost::none;
-            }
+            sendTextFrame("error: cmd=tileprocessed kind=syntax");
+            return false;
+        }
+        auto iter = std::find(_tilesOnFly.begin(), _tilesOnFly.end(), tileID);
+        if(iter != _tilesOnFly.end())
+            _tilesOnFly.erase(iter);
+
+        if(_tilesOnFly.empty())
+        {
+            _tileCounterStartTime = boost::none;
         }
         docBroker->sendRequestedTiles(shared_from_this());
         return true;
@@ -970,15 +977,23 @@ Authorization ClientSession::getAuthorization() const
     return Authorization();
 }
 
-void ClientSession::setTilesOnFly(int tilesOnFly)
+void ClientSession::setTilesOnFly(boost::optional<TileCombined> tiles)
 {
-    _tilesOnFly = tilesOnFly;
-    if(tilesOnFly == 0)
+
+    _tilesOnFly.clear();
+    if(tiles == boost::none)
     {
         _tileCounterStartTime = boost::none;
     }
     else
     {
+        for (auto& tile : tiles.get().getTiles())
+        {
+            std::ostringstream tileID;
+            tileID << tile.getPart() << ":" << tile.getTilePosX() << ":" << tile.getTilePosY() << ":"
+                   << tile.getTileWidth() << ":" << tile.getTileHeight();
+            _tilesOnFly.push_back(tileID.str());
+        }
         _tileCounterStartTime = std::chrono::steady_clock::now();
     }
 }
diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp
index abd535891..ed8266bbc 100644
--- a/wsd/ClientSession.hpp
+++ b/wsd/ClientSession.hpp
@@ -18,6 +18,7 @@
 #include <Poco/URI.h>
 #include <Rectangle.hpp>
 #include <boost/optional.hpp>
+#include <vector>
 
 class DocumentBroker;
 
@@ -109,8 +110,8 @@ public:
 
     boost::optional<TileCombined>& getRequestedTiles() { return _requestedTiles; }
 
-    int getTilesOnFly() const { return _tilesOnFly; }
-    void setTilesOnFly(int tilesOnFly);
+    const std::vector<std::string>& getTilesOnFly() const { return _tilesOnFly; }
+    void setTilesOnFly(boost::optional<TileCombined> tiles);
 
 
 private:
@@ -196,7 +197,7 @@ private:
     // Type of the docuemnt, extracter from status message
     std::string _docType;
 
-    int _tilesOnFly;
+    std::vector<std::string> _tilesOnFly;
     boost::optional<std::chrono::time_point<std::chrono::steady_clock>> _tileCounterStartTime;
 
     boost::optional<TileCombined> _requestedTiles;
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 6947eb7f3..7271d3d25 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -1364,15 +1364,14 @@ void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined,
 
 void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& session)
 {
-    assert(session->getTilesOnFly() >= 0);
     std::unique_lock<std::mutex> lock(_mutex);
 
     // 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
     boost::optional<TileCombined>& requestedTiles = session->getRequestedTiles();
-    if(session->getTilesOnFly() == 0 && requestedTiles != boost::none && !requestedTiles.get().getTiles().empty())
+    if(session->getTilesOnFly().empty() && requestedTiles != boost::none && !requestedTiles.get().getTiles().empty())
     {
-        session->setTilesOnFly(requestedTiles.get().getTiles().size());
+        session->setTilesOnFly(requestedTiles.get());
 
         // Satisfy as many tiles from the cache.
     std::cerr << "requestedTiles.size(): " << requestedTiles.get().getTiles().size() << std::endl;
@@ -1442,7 +1441,7 @@ void DocumentBroker::cancelTileRequests(const std::shared_ptr<ClientSession>& se
     std::unique_lock<std::mutex> lock(_mutex);
 
     // Clear tile requests
-    session->setTilesOnFly(0);
+    session->setTilesOnFly(boost::none);
     session->getRequestedTiles() = boost::none;
 
     const std::string canceltiles = tileCache().cancelTiles(session);
diff --git a/wsd/protocol.txt b/wsd/protocol.txt
index c7a126670..7c8d7e6a2 100644
--- a/wsd/protocol.txt
+++ b/wsd/protocol.txt
@@ -34,7 +34,7 @@ canceltiles
 tileprocessed tile=<tileid>
 
     Previously sent tile (server -> client) arrived and processed by the client.
-    Tileid has the next stucture : <tile x coord>:<tile y coord>:<zoom level>:<selected part>
+    Tileid has the next stucture : <selected part>:<tile x coord>:<tile y coord>:<tile width in twips>:<tile height in twips>
 
 downloadas name=<fileName> id=<id> format=<document format> options=<SkipImages, etc>
 


More information about the Libreoffice-commits mailing list