wsd/DocumentBroker.cpp | 13 +++++++++++-- wsd/DocumentBroker.hpp | 8 +++++++- wsd/LOOLWSD.cpp | 6 ++++-- 3 files changed, 22 insertions(+), 5 deletions(-)
New commits: commit 5e7cac28fa74131461f6d9e25334e9cc7568f444 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Fri Oct 4 10:30:49 2019 +0100 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Fri Oct 4 11:01:45 2019 +0100 belt & braces fix erroneous popup of limit dialog The shared_ptr allows the DocumentBroker's and ConvertToBroker to linger after they are removed from the list, making ConvertToBroker::getInstanceCount potentially larger than the number of documents transiently. Fix this with a dispose method called on list removal. Also make the arithmetic signed, to avoid unfortunate wrapping. Also when the limit is large, don't show a message whatever happens. Change-Id: Id2571429de48ae75e851c3fdc49e24a02aaaf6e9 diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index ab71fe5ba..c332f7c52 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -2072,10 +2072,19 @@ ConvertToBroker::ConvertToBroker(const std::string& uri, NumConverters++; } +void ConvertToBroker::dispose() +{ + if (!_uriOrig.empty()) + { + NumConverters--; + removeFile(_uriOrig); + _uriOrig.clear(); + } +} + ConvertToBroker::~ConvertToBroker() { - NumConverters--; - removeFile(_uriOrig); + dispose(); } void ConvertToBroker::removeFile(const std::string &uriOrig) diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp index 576906d9e..7c66832a5 100644 --- a/wsd/DocumentBroker.hpp +++ b/wsd/DocumentBroker.hpp @@ -225,6 +225,9 @@ public: virtual ~DocumentBroker(); + /// Called when removed from the DocBrokers list + virtual void dispose() {} + /// Start processing events void startThread(); @@ -420,7 +423,7 @@ private: void getIOStats(uint64_t &sent, uint64_t &recv); protected: - const std::string _uriOrig; + std::string _uriOrig; private: const Poco::URI _uriPublic; /// URL-based key. May be repeated during the lifetime of WSD. @@ -498,6 +501,9 @@ public: const std::string& docKey); virtual ~ConvertToBroker(); + /// Called when removed from the DocBrokers list + void dispose() override; + /// How many live conversions are running. static size_t getInstanceCount(); diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index f404798d0..b460d75d8 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -258,8 +258,9 @@ inline void shutdownLimitReached(WebSocketHandler& ws) inline void checkSessionLimitsAndWarnClients() { #if !MOBILEAPP - size_t docBrokerCount = DocBrokers.size() - ConvertToBroker::getInstanceCount(); - if (docBrokerCount > LOOLWSD::MaxDocuments || LOOLWSD::NumConnections >= LOOLWSD::MaxConnections) + ssize_t docBrokerCount = DocBrokers.size() - ConvertToBroker::getInstanceCount(); + if (LOOLWSD::MaxDocuments < 10000 && + (docBrokerCount > LOOLWSD::MaxDocuments || LOOLWSD::NumConnections >= LOOLWSD::MaxConnections)) { const std::string info = Poco::format(PAYLOAD_INFO_LIMIT_REACHED, LOOLWSD::MaxDocuments, LOOLWSD::MaxConnections); LOG_INF("Sending client 'limitreached' message: " << info); @@ -333,6 +334,7 @@ void cleanupDocBrokers() if (!docBroker->isAlive()) { LOG_INF("Removing DocumentBroker for docKey [" << it->first << "]."); + docBroker->dispose(); it = DocBrokers.erase(it); continue; } else { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits