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

Reply via email to