loolwsd/DocumentBroker.cpp | 10 ++++++++++ loolwsd/DocumentBroker.hpp | 4 ++++ loolwsd/LOOLWSD.cpp | 11 ++++++++++- loolwsd/Storage.cpp | 16 ++++++++++++---- loolwsd/Storage.hpp | 10 +++++++++- loolwsd/protocol.txt | 5 +++++ 6 files changed, 50 insertions(+), 6 deletions(-)
New commits: commit 07f10570cc4228795837e87cc2e43330de7dc81b Author: Pranav Kant <pran...@collabora.co.uk> Date: Fri Oct 14 18:16:49 2016 +0530 loolwsd: Add wopiloadduration - time taken to interact with WOPI host Change-Id: Ia2d763ef721128450bf402a61d0e0f3e75701441 diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index 5ab7790..67710bb 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -796,4 +796,14 @@ bool DocumentBroker::forwardToClient(const std::string& prefix, const std::vecto return false; } +const std::chrono::duration<double> DocumentBroker::getStorageLoadDuration() const +{ + if (dynamic_cast<WopiStorage*>(_storage.get()) != nullptr) + { + return dynamic_cast<WopiStorage*>(_storage.get())->getWopiLoadDuration(); + } + + return std::chrono::duration<double>::zero(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp index 186b174..72b507a 100644 --- a/loolwsd/DocumentBroker.hpp +++ b/loolwsd/DocumentBroker.hpp @@ -236,6 +236,10 @@ public: int getRenderedTileCount() { return _debugRenderedTileCount; } + /// Returns time taken in making calls to storage during load + /// Currently, only makes sense in case storage is WOPI + const std::chrono::duration<double> getStorageLoadDuration() const; + private: /// Sends the .uno:Save command to LoKit. diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index c76bdd7..4d85ddd 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -834,6 +834,15 @@ private: Util::checkDiskSpaceOnRegisteredFileSystems(); + // If its a WOPI host, return time taken to make calls to it + const auto storageCallDuration = docBroker->getStorageLoadDuration(); + if (storageCallDuration != std::chrono::duration<double>::zero()) + { + status = "stats: wopiloadduration " + std::to_string(storageCallDuration.count()); + Log::trace("Sending to Client [" + status + "]."); + ws->sendFrame(status.data(), (int) status.size()); + } + // Let messages flow. IoUtil::SocketProcessor(ws, [&session](const std::vector<char>& payload) diff --git a/loolwsd/Storage.cpp b/loolwsd/Storage.cpp index 7e5d222..3236c28 100644 --- a/loolwsd/Storage.cpp +++ b/loolwsd/Storage.cpp @@ -263,6 +263,7 @@ StorageBase::FileInfo WopiStorage::getFileInfo() return _fileInfo; } + const auto startTime = std::chrono::steady_clock::now(); std::unique_ptr<Poco::Net::HTTPClientSession> psession(getHTTPClientSession(_uri)); Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, _uri.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1); @@ -270,8 +271,8 @@ StorageBase::FileInfo WopiStorage::getFileInfo() psession->sendRequest(request); Poco::Net::HTTPResponse response; - std::istream& rs = psession->receiveResponse(response); + std::istream& rs = psession->receiveResponse(response); auto logger = Log::trace(); logger << "WOPI::CheckFileInfo header for URI [" << _uri.toString() << "]:\n"; for (auto& pair : response) @@ -288,7 +289,11 @@ StorageBase::FileInfo WopiStorage::getFileInfo() std::string userName; std::string resMsg; Poco::StreamCopier::copyToString(rs, resMsg); - Log::debug("WOPI::CheckFileInfo returned: " + resMsg); + + const auto endTime = std::chrono::steady_clock::now(); + const std::chrono::duration<double> diff = (endTime - startTime); + _wopiLoadDuration += diff; + Log::debug("WOPI::CheckFileInfo returned: " + resMsg + ". Call duration: " + std::to_string(diff.count()) + "s"); const auto index = resMsg.find_first_of('{'); if (index != std::string::npos) { @@ -327,6 +332,7 @@ std::string WopiStorage::loadStorageFileToLocal() uriObject.setPath(uriObject.getPath() + "/contents"); Log::debug("Wopi requesting: " + uriObject.toString()); + const auto startTime = std::chrono::steady_clock::now(); std::unique_ptr<Poco::Net::HTTPClientSession> psession(getHTTPClientSession(uriObject)); Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, uriObject.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1); @@ -350,10 +356,12 @@ std::string WopiStorage::loadStorageFileToLocal() std::copy(std::istreambuf_iterator<char>(rs), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>(ofs)); + const auto endTime = std::chrono::steady_clock::now(); + const std::chrono::duration<double> diff = (endTime - startTime); + _wopiLoadDuration += diff; const auto size = getFileSize(_jailedFilePath); - Log::info() << "WOPI::GetFile downloaded " << size << " bytes from [" << uriObject.toString() - << "] -> " << _jailedFilePath << ": " + << "] -> " << _jailedFilePath << " in " + std::to_string(diff.count()) + "s : " << response.getStatus() << " " << response.getReason() << Log::end; _isLoaded = true; diff --git a/loolwsd/Storage.hpp b/loolwsd/Storage.hpp index 4050906..36edd1d 100644 --- a/loolwsd/Storage.hpp +++ b/loolwsd/Storage.hpp @@ -154,7 +154,8 @@ public: WopiStorage(const Poco::URI& uri, const std::string& localStorePath, const std::string& jailPath) : - StorageBase(uri, localStorePath, jailPath) + StorageBase(uri, localStorePath, jailPath), + _wopiLoadDuration(0) { Log::info("WopiStorage ctor with localStorePath: [" + localStorePath + "], jailPath: [" + jailPath + "], uri: [" + uri.toString() + "]."); @@ -166,6 +167,13 @@ public: std::string loadStorageFileToLocal() override; bool saveLocalFileToStorage() override; + + /// Total time taken for making WOPI calls during load (includes GetFileInfo calls) + const std::chrono::duration<double> getWopiLoadDuration() const { return _wopiLoadDuration; } + +private: + // Time spend in waiting for WOPI host during document load + std::chrono::duration<double> _wopiLoadDuration; }; /// WebDAV protocol backed storage. diff --git a/loolwsd/protocol.txt b/loolwsd/protocol.txt index 3aaa840..51d608a 100644 --- a/loolwsd/protocol.txt +++ b/loolwsd/protocol.txt @@ -332,6 +332,11 @@ redlinetablechanged: Signals that the redlines table has been modified. Redlines are used for tracking changes. +stats: <key> <value> + + Contains statistical data. Eg: 'stats: wopiduration 5' means that + wopi calls made in loading of document took 5 seconds. + child -> parent =============== commit 7cacaa070d73b3b1e037ac05893f6c71da63afdf Author: Pranav Kant <pran...@collabora.co.uk> Date: Sat Oct 15 21:59:35 2016 +0530 loolwsd: Make this const Change-Id: Ieb1be92323061110798da23f066a5be0e8314472 diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index d801502..c76bdd7 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -794,7 +794,7 @@ private: // Check if readonly session is required bool isReadOnly = false; - for (auto& param: uriPublic.getQueryParameters()) + for (const auto& param: uriPublic.getQueryParameters()) { Log::debug("Query param: " + param.first + ", value: " + param.second); if (param.first == "permission") _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits