[Libreoffice-commits] online.git: wsd/ClientSession.cpp wsd/ClientSession.hpp wsd/DocumentBroker.cpp wsd/TestStubs.cpp wsd/TileCache.cpp wsd/TileCache.hpp
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Sat Mar 2 20:43:06 UTC 2019
wsd/ClientSession.cpp | 35 -----------------------------------
wsd/ClientSession.hpp | 13 -------------
wsd/DocumentBroker.cpp | 9 +++------
wsd/TestStubs.cpp | 7 -------
wsd/TileCache.cpp | 28 +++++++++++++++-------------
wsd/TileCache.hpp | 6 ++++--
6 files changed, 22 insertions(+), 76 deletions(-)
New commits:
commit 829e94b779afad5bc6192e54868ecbf17a61633f
Author: Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Sat Mar 2 19:26:08 2019 +0100
Commit: Michael Meeks <michael.meeks at collabora.com>
CommitDate: Sat Mar 2 21:42:34 2019 +0100
TileCache: remove redundant, expensive tracking in ClientSession.
No need for all these call outs. removeOutdatedTileSubscriptions can't,
Expect it is quicker now and more reliable to trace the tiles being
rendered and count the waiters.
Change-Id: I9724c7f38cf888b35c628857c0f11b51e74613ca
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index c0a02b806..c3d5b9a83 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -1315,39 +1315,4 @@ void ClientSession::traceTileBySend(const TileDesc& tile, bool deduplicated)
addTileOnFly(tile);
}
-void ClientSession::traceSubscribeToTile(const std::string& cacheName)
-{
- _tilesBeingRendered.insert(cacheName);
-}
-
-void ClientSession::traceUnSubscribeToTile(const std::string& cacheName)
-{
- _tilesBeingRendered.erase(cacheName);
-}
-
-void ClientSession::removeOutdatedTileSubscriptions()
-{
- const std::shared_ptr<DocumentBroker> docBroker = getDocumentBroker();
- if(!docBroker)
- return;
-
- auto iterator = _tilesBeingRendered.begin();
- while(iterator != _tilesBeingRendered.end())
- {
- double elapsedTime = docBroker->tileCache().getTileBeingRenderedElapsedTimeMs(*iterator);
- if(elapsedTime < 0.0 && elapsedTime > 200.0)
- {
- LOG_INF("Tracked TileBeingRendered was dropped because of time out.");
- _tilesBeingRendered.erase(iterator);
- }
- else
- ++iterator;
- }
-}
-
-void ClientSession::clearTileSubscription()
-{
- _tilesBeingRendered.clear();
-}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp
index 827a0f857..8db5b3718 100644
--- a/wsd/ClientSession.hpp
+++ b/wsd/ClientSession.hpp
@@ -21,7 +21,6 @@
#include <map>
#include <list>
#include <utility>
-#include <unordered_set>
class DocumentBroker;
@@ -130,14 +129,6 @@ public:
/// Call this method anytime when a new tile is sent to the client
void traceTileBySend(const TileDesc& tile, bool deduplicated = false);
- /// Trask tiles what we a subscription to
- void traceSubscribeToTile(const std::string& tileCacheName);
- void traceUnSubscribeToTile(const std::string& tileCacheName);
- void removeOutdatedTileSubscriptions();
- void clearTileSubscription();
-
- size_t getTilesBeingRenderedCount() const {return _tilesBeingRendered.size();}
-
/// Clear wireId map anytime when client visible area changes (visible area, zoom, part number)
void resetWireIdMap();
@@ -227,10 +218,6 @@ private:
/// TileID's of the sent tiles. Push by sending and pop by tileprocessed message from the client.
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)
- std::unordered_set<std::string> _tilesBeingRendered;
-
/// Requested tiles are stored in this list, before we can send them to the client
std::deque<TileDesc> _requestedTiles;
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 8f058bd2c..888500de8 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -1462,9 +1462,6 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se
tilesOnFlyUpperLimit = 200; // Have a big number here to get all tiles requested by file openning
}
-
- // Update client's tilesBeingRendered list
- session->removeOutdatedTileSubscriptions();
// Drop tiles which we are waiting for too long
session->removeOutdatedTilesOnFly();
@@ -1475,7 +1472,8 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se
{
size_t delayedTiles = 0;
std::vector<TileDesc> tilesNeedsRendering;
- while(session->getTilesOnFlyCount() + session->getTilesBeingRenderedCount() < tilesOnFlyUpperLimit &&
+ size_t beingRendered = _tileCache->countTilesBeingRenderedForSession(session);
+ while(session->getTilesOnFlyCount() + beingRendered < tilesOnFlyUpperLimit &&
!requestedTiles.empty() &&
// If we delayed all tiles we don't send any tile (we will when next tileprocessed message arrives)
delayedTiles < requestedTiles.size())
@@ -1516,6 +1514,7 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se
_debugRenderedTileCount++;
}
tileCache().subscribeToTileRendering(tile, session);
+ beingRendered++;
}
requestedTiles.pop_front();
}
@@ -1542,8 +1541,6 @@ void DocumentBroker::cancelTileRequests(const std::shared_ptr<ClientSession>& se
session->getRequestedTiles().clear();
- session->clearTileSubscription();
-
session->resetWireIdMap();
const std::string canceltiles = tileCache().cancelTiles(session);
diff --git a/wsd/TestStubs.cpp b/wsd/TestStubs.cpp
index 405b7a6c4..68b6f8d95 100644
--- a/wsd/TestStubs.cpp
+++ b/wsd/TestStubs.cpp
@@ -19,15 +19,8 @@
void DocumentBroker::assertCorrectThread() const {}
-
void ClientSession::traceTileBySend(const TileDesc& /*tile*/, bool /*deduplicated = false*/) {}
-void ClientSession::traceSubscribeToTile(const std::string& /*tileCacheName*/) {};
-
-void ClientSession::traceUnSubscribeToTile(const std::string& /*tileCacheName*/) {};
-
-void ClientSession::clearTileSubscription() {};
-
void ClientSession::enqueueSendMessage(const std::shared_ptr<Message>& /*data*/) {};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/wsd/TileCache.cpp b/wsd/TileCache.cpp
index b8e138563..6ca40c9f9 100644
--- a/wsd/TileCache.cpp
+++ b/wsd/TileCache.cpp
@@ -98,6 +98,19 @@ private:
std::string _cachedName;
};
+size_t TileCache::countTilesBeingRenderedForSession(const std::shared_ptr<ClientSession>& session)
+{
+ size_t count = 0;
+ for (auto &it : _tilesBeingRendered)
+ {
+ for (auto &s : it.second->getSubscribers()) {
+ if (s.lock() == session)
+ count++;
+ }
+ }
+ return count;
+}
+
std::shared_ptr<TileCache::TileBeingRendered> TileCache::findTileBeingRendered(const TileDesc& tileDesc)
{
const std::string cachedName = cacheFileName(tileDesc);
@@ -108,19 +121,12 @@ std::shared_ptr<TileCache::TileBeingRendered> TileCache::findTileBeingRendered(c
return tile != _tilesBeingRendered.end() ? tile->second : nullptr;
}
-void TileCache::forgetTileBeingRendered(const std::shared_ptr<TileCache::TileBeingRendered>& tileBeingRendered, const TileDesc& tile)
+void TileCache::forgetTileBeingRendered(const std::shared_ptr<TileCache::TileBeingRendered>& tileBeingRendered)
{
assertCorrectThread();
assert(tileBeingRendered);
assert(_tilesBeingRendered.find(tileBeingRendered->getCacheName()) != _tilesBeingRendered.end());
- for(auto& subscriber : tileBeingRendered->getSubscribers())
- {
- std::shared_ptr<ClientSession> session = subscriber.lock();
- if(session && tile.getId() == -1)
- session->traceUnSubscribeToTile(tileBeingRendered->getCacheName());
- }
-
_tilesBeingRendered.erase(tileBeingRendered->getCacheName());
}
@@ -244,7 +250,7 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const
{
LOG_DBG("STATISTICS: tile " << tile.getVersion() << " internal roundtrip " <<
tileBeingRendered->getElapsedTimeMs() << " ms.");
- forgetTileBeingRendered(tileBeingRendered, tile);
+ forgetTileBeingRendered(tileBeingRendered);
}
}
else
@@ -439,8 +445,6 @@ void TileCache::subscribeToTileRendering(const TileDesc& tile, const std::shared
LOG_DBG("Subscribing " << subscriber->getName() << " to tile " << name << " which has " <<
tileBeingRendered->getSubscribers().size() << " subscribers already.");
tileBeingRendered->getSubscribers().push_back(subscriber);
- if(tile.getId() == -1)
- subscriber->traceSubscribeToTile(tileBeingRendered->getCacheName());
const auto duration = (std::chrono::steady_clock::now() - tileBeingRendered->getStartTime());
if (std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() > COMMAND_TIMEOUT_MS)
@@ -460,8 +464,6 @@ void TileCache::subscribeToTileRendering(const TileDesc& tile, const std::shared
tileBeingRendered = std::make_shared<TileBeingRendered>(cachedName, tile);
tileBeingRendered->getSubscribers().push_back(subscriber);
- if(tile.getId() == -1)
- subscriber->traceSubscribeToTile(tileBeingRendered->getCacheName());
_tilesBeingRendered[cachedName] = tileBeingRendered;
}
}
diff --git a/wsd/TileCache.hpp b/wsd/TileCache.hpp
index fe5a7ca34..70dc04fa1 100644
--- a/wsd/TileCache.hpp
+++ b/wsd/TileCache.hpp
@@ -85,11 +85,13 @@ public:
/// Parse invalidateTiles message to a part number and a rectangle of the invalidated area
static std::pair<int, Util::Rectangle> parseInvalidateMsg(const std::string& tiles);
- void forgetTileBeingRendered(const std::shared_ptr<TileCache::TileBeingRendered>& tileBeingRendered, const TileDesc& tile);
+ void forgetTileBeingRendered(const std::shared_ptr<TileCache::TileBeingRendered>& tileBeingRendered);
double getTileBeingRenderedElapsedTimeMs(const std::string& tileCacheName) const;
+ size_t countTilesBeingRenderedForSession(const std::shared_ptr<ClientSession>& subscriber);
+
bool hasTileBeingRendered(const TileDesc& tile);
- int getTileBeingRenderedVersion(const TileDesc& tile);
+ int getTileBeingRenderedVersion(const TileDesc& tile);
// Debugging bits ...
void dumpState(std::ostream& os);
More information about the Libreoffice-commits
mailing list