[Libreoffice-commits] online.git: 3 commits - loolwsd/LOOLWSD.cpp

Jan Holesovsky kendy at collabora.com
Thu Sep 15 15:57:36 UTC 2016


 loolwsd/LOOLWSD.cpp |   47 +++++++++++++++++++++++++++++++----------------
 1 file changed, 31 insertions(+), 16 deletions(-)

New commits:
commit a6f70aad79b938cb909ba60a3e9a75b2cfc69b22
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Thu Sep 15 17:48:01 2016 +0200

    bccu#2005 follow-up: Another place where we need the dummy document broker.
    
    I think this is another potential race condition...

diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index a2e327d..57b996b 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -593,6 +593,11 @@ private:
                 {
                     // went away successfully
                     docBroker.reset();
+                    Log::debug("Inserting a dummy DocumentBroker for docKey [" + docKey + "] temporarily after the other instance is gone.");
+
+                    std::shared_ptr<DocumentBroker> tempBroker = std::make_shared<DocumentBroker>();
+                    docBrokers.emplace(docKey, tempBroker);
+
                     timedOut = false;
                     break;
                 }
commit 10392f9ba6c1dc172e77713449ec97f7ea013177
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Thu Sep 15 17:22:28 2016 +0200

    Decrease the level of indentation.

diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index 41d952d..a2e327d 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -576,42 +576,40 @@ private:
             }
         }
 
-        if (docBroker)
+        if (docBroker && docBroker->isMarkedToDestroy())
         {
             // If this document is going out, wait.
-            if (docBroker->isMarkedToDestroy())
+            Log::debug("Document [" + docKey + "] is marked to destroy, waiting to reload.");
+
+            const auto timeout = POLL_TIMEOUT_MS / 2;
+            bool timedOut = true;
+            for (size_t i = 0; i < COMMAND_TIMEOUT_MS / timeout; ++i)
             {
-                Log::debug("Document [" + docKey + "] is marked to destroy, waiting to reload.");
-                const auto timeout = POLL_TIMEOUT_MS / 2;
-                bool timedOut = true;
-                for (size_t i = 0; i < COMMAND_TIMEOUT_MS / timeout; ++i)
-                {
-                    std::this_thread::sleep_for(std::chrono::milliseconds(timeout));
+                std::this_thread::sleep_for(std::chrono::milliseconds(timeout));
 
-                    std::unique_lock<std::mutex> lock(docBrokersMutex);
-                    auto it = docBrokers.find(docKey);
-                    if (it == docBrokers.end())
-                    {
-                        // went away successfully
-                        docBroker.reset();
-                        timedOut = false;
-                        break;
-                    }
-                    else if (it->second && !it->second->isMarkedToDestroy())
-                    {
-                        // was actually replaced by a real document
-                        docBroker = it->second;
-                        timedOut = false;
-                        break;
-                    }
+                std::unique_lock<std::mutex> lock(docBrokersMutex);
+                auto it = docBrokers.find(docKey);
+                if (it == docBrokers.end())
+                {
+                    // went away successfully
+                    docBroker.reset();
+                    timedOut = false;
+                    break;
                 }
-
-                if (timedOut)
+                else if (it->second && !it->second->isMarkedToDestroy())
                 {
-                    // Still here, but marked to destroy. Proceed and hope to recover.
-                    Log::error("Timed out while waiting for document to unload before loading.");
+                    // was actually replaced by a real document
+                    docBroker = it->second;
+                    timedOut = false;
+                    break;
                 }
             }
+
+            if (timedOut)
+            {
+                // Still here, but marked to destroy. Proceed and hope to recover.
+                Log::error("Timed out while waiting for document to unload before loading.");
+            }
         }
 
         bool newDoc = false;
commit d1e0b978d671d166589b2a7c63d3fb6275c6a75d
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Thu Sep 15 16:14:59 2016 +0200

    bccu#2005 follow-up: If the document appearead in the meantime, finish early.

diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index 91746f8..41d952d 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -583,18 +583,30 @@ private:
             {
                 Log::debug("Document [" + docKey + "] is marked to destroy, waiting to reload.");
                 const auto timeout = POLL_TIMEOUT_MS / 2;
+                bool timedOut = true;
                 for (size_t i = 0; i < COMMAND_TIMEOUT_MS / timeout; ++i)
                 {
                     std::this_thread::sleep_for(std::chrono::milliseconds(timeout));
+
                     std::unique_lock<std::mutex> lock(docBrokersMutex);
-                    if (docBrokers.find(docKey) == docBrokers.end())
+                    auto it = docBrokers.find(docKey);
+                    if (it == docBrokers.end())
                     {
+                        // went away successfully
                         docBroker.reset();
+                        timedOut = false;
+                        break;
+                    }
+                    else if (it->second && !it->second->isMarkedToDestroy())
+                    {
+                        // was actually replaced by a real document
+                        docBroker = it->second;
+                        timedOut = false;
                         break;
                     }
                 }
 
-                if (docBroker)
+                if (timedOut)
                 {
                     // Still here, but marked to destroy. Proceed and hope to recover.
                     Log::error("Timed out while waiting for document to unload before loading.");


More information about the Libreoffice-commits mailing list