[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-2-1' - wsd/Admin.cpp wsd/LOOLWSD.cpp wsd/LOOLWSD.hpp

Pranav Kant pranavk at collabora.co.uk
Mon Jul 31 21:15:09 UTC 2017


 wsd/Admin.cpp   |    9 +++++++++
 wsd/LOOLWSD.cpp |   13 +++++++++++++
 wsd/LOOLWSD.hpp |    3 +++
 3 files changed, 25 insertions(+)

New commits:
commit d8217e17e67de2751e6daa9efa01469c85416fb5
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Mon Jul 10 22:45:04 2017 +0530

    Save unsaved documents when memory consumption is high
    
    These saved documents are then removed to free some memory when next
    memory cleanup is triggered in the admin loop.
    
    Change-Id: Ia789a65dc204b546f1d3627a8006c4590bdca371
    (cherry picked from commit 160c1f555a12f53c0cd6e3f7994bf2d62ed49230)
    Reviewed-on: https://gerrit.libreoffice.org/39820
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp
index 9d673906..37c3cac8 100644
--- a/wsd/Admin.cpp
+++ b/wsd/Admin.cpp
@@ -489,6 +489,15 @@ void Admin::triggerMemoryCleanup(size_t totalMem)
             else
                 ++docIt;
         }
+
+        // Save unsaved documents
+        docIt = docList.begin();
+        while (docIt != docList.end() && memToFree > 0)
+        {
+            LOG_TRC("Saving document: DocKey[" << docIt->_docKey << "].");
+            LOOLWSD::autoSave(docIt->_docKey);
+            ++docIt;
+        }
     }
 
     LOG_TRC("OOM: Memory to free percentage : " << memToFreePercentage);
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 78d7afc1..074dc643 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -1118,6 +1118,19 @@ void LOOLWSD::closeDocument(const std::string& docKey, const std::string& messag
     }
 }
 
+void LOOLWSD::autoSave(const std::string& docKey)
+{
+    std::unique_lock<std::mutex> docBrokersLock(DocBrokersMutex);
+    auto docBrokerIt = DocBrokers.find(docKey);
+    if (docBrokerIt != DocBrokers.end())
+    {
+        std::shared_ptr<DocumentBroker> docBroker = docBrokerIt->second;
+        docBroker->addCallback([docBroker]() {
+                docBroker->autoSave(true);
+            });
+    }
+}
+
 /// Really do the house-keeping
 void PrisonerPoll::wakeupHook()
 {
diff --git a/wsd/LOOLWSD.hpp b/wsd/LOOLWSD.hpp
index 6b51ae51..86f8dbcb 100644
--- a/wsd/LOOLWSD.hpp
+++ b/wsd/LOOLWSD.hpp
@@ -124,6 +124,9 @@ public:
     /// Close document with @docKey and a @message
     static void closeDocument(const std::string& docKey, const std::string& message);
 
+    /// Autosave a given document
+    static void autoSave(const std::string& docKey);
+
 protected:
     void initialize(Poco::Util::Application& self) override;
     void defineOptions(Poco::Util::OptionSet& options) override;


More information about the Libreoffice-commits mailing list