kit/Kit.cpp| 12 +---
wsd/DocumentBroker.cpp |2 +-
wsd/TileCache.cpp | 24 +---
3 files changed, 23 insertions(+), 15 deletions(-)
New commits:
commit cfbb8d56272c9834dc2c416221b00d139b5406ad
Author: Michael Meeks
AuthorDate: Fri Aug 7 18:37:53 2020 +0100
Commit: Jan Holesovsky
CommitDate: Tue Aug 11 19:03:46 2020 +0200
Notify WSD of tiles which we didn't need to render.
When we get a wid match, this helps WSD to cleanup its tile
subscriber list effectively.
Change-Id: I6517039fb3d8c9ad8f53aef549b8adbb79961ce1
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/100348
Tested-by: Jenkins
Tested-by: Jenkins CollaboraOffice
Reviewed-by: Michael Meeks
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/100507
Reviewed-by: Jan Holesovsky
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index 09b003efc..1eb0ab03f 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -1094,6 +1094,9 @@ public:
// The tile content is identical to what the client already
has, so skip it
LOG_TRC("Match for tile #" << tileIndex << " at (" <<
positionX << ',' <<
positionY << ") oldhash==hash (" << hash << "),
wireId: " << wireId << " skipping");
+// Push a zero byte image to inform WSD we didn't need that.
+// This allows WSD side TileCache to free up waiting
subscribers.
+pushRendered(renderedTiles, tiles[tileIndex], wireId, 0);
tileIndex++;
continue;
}
@@ -1165,13 +1168,16 @@ public:
tileIndex++;
}
+// empty ones come first
+size_t zeroCheckStart = renderedTiles.size();
+
_pngPool.run();
-for (auto : renderedTiles)
+for (size_t i = zeroCheckStart; i < renderedTiles.size(); ++i)
{
-if (i.getImgSize() == 0)
+if (renderedTiles[i].getImgSize() == 0)
{
-LOG_ERR("Encoded 0-sized tile!");
+LOG_TRC("Encoded 0-sized tile in slot !" << i);
assert(!"0-sized tile enocded!");
}
}
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 03f23c08a..05bd288f8 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -1992,7 +1992,7 @@ void DocumentBroker::handleTileCombinedResponse(const
std::vector& payload
try
{
const size_t length = payload.size();
-if (firstLine.size() < static_cast(length) - 1)
+if (firstLine.size() <= static_cast(length) -
1)
{
const TileCombined tileCombined = TileCombined::parse(firstLine);
const char* buffer = payload.data();
diff --git a/wsd/TileCache.cpp b/wsd/TileCache.cpp
index e1cdefe8d..982cd985b 100644
--- a/wsd/TileCache.cpp
+++ b/wsd/TileCache.cpp
@@ -175,19 +175,24 @@ void TileCache::saveTileAndNotify(const TileDesc& tile,
const char *data, const
{
assertCorrectThread();
-// Save to disk.
+if (size > 0)
+{
+// Save to in-memory cache.
-// Ignore if we can't save the tile, things will work anyway, but slower.
-// An error indication is supposed to be sent to all users in that case.
-saveDataToCache(tile, data, size);
-LOG_TRC("Saved cache tile: " << cacheFileName(tile) << " of size " << size
<< " bytes");
+// Ignore if we can't save the tile, things will work anyway, but
slower.
+// An error indication is supposed to be sent to all users in that
case.
+saveDataToCache(tile, data, size);
+LOG_TRC("Saved cache tile: " << cacheFileName(tile) << " of size " <<
size << " bytes");
+}
+else
+LOG_TRC("Zero sized cache tile: " << cacheFileName(tile));
// Notify subscribers, if any.
std::shared_ptr tileBeingRendered =
findTileBeingRendered(tile);
if (tileBeingRendered)
{
const size_t subscriberCount =
tileBeingRendered->getSubscribers().size();
-if (subscriberCount > 0)
+if (size > 0 && subscriberCount > 0)
{
std::string response = tile.serialize("tile:");
LOG_DBG("Sending tile message to " << subscriberCount << "
subscribers: " << response);
@@ -229,10 +234,9 @@ void TileCache::saveTileAndNotify(const TileDesc& tile,
const char *data, const
}
}
}
-else
-{
+else if (subscriberCount == 0)
LOG_DBG("No subscribers for: " << cacheFileName(tile));
-}
+// else zero sized
// Remove subscriptions.
if (tileBeingRendered->getVersion() <= tile.getVersion())
@@ -243,9 +247,7 @@ void TileCache::saveTileAndNotify(const TileDesc& tile,
const char *data, const
}
}
else
-{
LOG_DBG("No subscribers for: " << cacheFileName(tile));
-}
}
bool TileCache::getTextStream(StreamType