[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/DocumentBroker.hpp loolwsd/LOOLWSD.cpp
Jan Holesovsky
kendy at collabora.com
Thu Sep 15 10:51:23 UTC 2016
loolwsd/DocumentBroker.cpp | 21 +++++++++++++++++++++
loolwsd/DocumentBroker.hpp | 3 +++
loolwsd/LOOLWSD.cpp | 11 ++++++++++-
3 files changed, 34 insertions(+), 1 deletion(-)
New commits:
commit 27bed804d5c33ed5c49fc648ccc9b1bb2a3c54a7
Author: Jan Holesovsky <kendy at collabora.com>
Date: Thu Sep 15 12:41:57 2016 +0200
bccu#2005: Make sure we don't create 2 jails for the same document.
When 2 users opened the document at the very same time, it happened that new
jails / instances were created for the document twice.
As a solution, insert a dummy (marked to destroy) document into the map of
DocumentBrokers, which will lead into synchronization between the two
instances.
[I suppose the synchronization did not work previously either, as emplace()
does not seem to modify the value when the key is already in the map.]
diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index 043218f..ff3fc1b 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -97,6 +97,27 @@ std::string DocumentBroker::getDocKey(const Poco::URI& uri)
return docKey;
}
+DocumentBroker::DocumentBroker() :
+ _uriPublic(),
+ _docKey(),
+ _childRoot(),
+ _cacheRoot(),
+ _childProcess(),
+ _lastSaveTime(std::chrono::steady_clock::now()),
+ _markToDestroy(true),
+ _lastEditableSession(true),
+ _cursorPosX(0),
+ _cursorPosY(0),
+ _cursorWidth(0),
+ _cursorHeight(0),
+ _isLoaded(false),
+ _isModified(false),
+ _isEditLockHeld(false),
+ _tileVersion(0)
+{
+ Log::info("Empty DocumentBroker (marked to destroy) created.");
+}
+
DocumentBroker::DocumentBroker(const Poco::URI& uriPublic,
const std::string& docKey,
const std::string& childRoot,
diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp
index fd28ed8..301f896 100644
--- a/loolwsd/DocumentBroker.hpp
+++ b/loolwsd/DocumentBroker.hpp
@@ -136,6 +136,9 @@ public:
static
std::string getDocKey(const Poco::URI& uri);
+ /// Dummy document broker that is marked to destroy.
+ DocumentBroker();
+
DocumentBroker(const Poco::URI& uriPublic,
const std::string& docKey,
const std::string& childRoot,
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index c2c7068..91746f8 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -565,6 +565,15 @@ private:
docBroker = it->second;
assert(docBroker);
}
+ else
+ {
+ // Store a dummy (marked to destroy) document broker until we
+ // have the real one, so that the other requests block
+ Log::debug("Inserting a dummy DocumentBroker for docKey [" + docKey + "] temporarily.");
+
+ std::shared_ptr<DocumentBroker> tempBroker = std::make_shared<DocumentBroker>();
+ docBrokers.emplace(docKey, tempBroker);
+ }
}
if (docBroker)
@@ -645,7 +654,7 @@ private:
if (newDoc)
{
std::unique_lock<std::mutex> lock(docBrokersMutex);
- docBrokers.emplace(docKey, docBroker);
+ docBrokers[docKey] = docBroker;
}
// Check if readonly session is required
More information about the Libreoffice-commits
mailing list