[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/DocumentBroker.hpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Mon Nov 7 06:43:36 UTC 2016
loolwsd/DocumentBroker.cpp | 47 +++++++++++++++++++++------------------------
loolwsd/DocumentBroker.hpp | 2 -
2 files changed, 23 insertions(+), 26 deletions(-)
New commits:
commit 2507f7f89cbdc6787c6fa806b7b7fe7970dc68cd
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sun Nov 6 23:14:23 2016 -0500
loolwsd: refactor DocumentBroker load and addSession
Change-Id: I01db44561f79280f152bdf802efcbc064b22ab89
Reviewed-on: https://gerrit.libreoffice.org/30646
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index 50208ba..723b73b 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -165,8 +165,12 @@ DocumentBroker::~DocumentBroker()
_childProcess.reset();
}
-bool DocumentBroker::load(const std::string& sessionId, const std::string& jailId)
+bool DocumentBroker::load(std::shared_ptr<ClientSession>& session, const std::string& jailId)
{
+ Util::assertIsLocked(_mutex);
+
+ const std::string sessionId = session->getId();
+
LOG_INF("Loading [" << _docKey << "] for session [" << sessionId << "] and jail [" << jailId << "].");
{
@@ -182,14 +186,6 @@ bool DocumentBroker::load(const std::string& sessionId, const std::string& jailI
return false;
}
- auto it = _sessions.find(sessionId);
- if (it == _sessions.end() || !it->second)
- {
- LOG_ERR("Session with sessionId [" << sessionId << "] not found while loading");
- return false;
- }
-
- auto session = it->second;
const Poco::URI& uriPublic = session->getPublicUri();
LOG_DBG("Loading from URI: " << uriPublic.toString());
@@ -466,21 +462,13 @@ size_t DocumentBroker::addSession(std::shared_ptr<ClientSession>& session)
const auto id = session->getId();
const std::string aMessage = "session " + id + " " + _docKey;
- std::lock_guard<std::mutex> lock(_mutex);
-
- auto ret = _sessions.emplace(id, session);
- if (!ret.second)
- {
- LOG_WRN("DocumentBroker: Trying to add already existing session.");
- }
+ std::unique_lock<std::mutex> lock(_mutex);
try
{
// First load the document, since this can fail.
- if (!load(id, std::to_string(_childProcess->getPid())))
+ if (!load(session, std::to_string(_childProcess->getPid())))
{
- _sessions.erase(id);
-
const auto msg = "Failed to load document with URI [" + session->getPublicUri().toString() + "].";
LOG_ERR(msg);
throw std::runtime_error(msg);
@@ -489,7 +477,6 @@ size_t DocumentBroker::addSession(std::shared_ptr<ClientSession>& session)
catch (const StorageSpaceLowException&)
{
LOG_ERR("Out of storage while loading document with URI [" << session->getPublicUri().toString() << "].");
- _sessions.erase(id);
// We use the same message as is sent when some of lool's own locations are full,
// even if in this case it might be a totally different location (file system, or
@@ -504,14 +491,23 @@ size_t DocumentBroker::addSession(std::shared_ptr<ClientSession>& session)
_lastEditableSession = false;
_markToDestroy = false;
- // Request a new session from the child kit.
- _childProcess->sendTextFrame(aMessage);
-
if (session->isReadOnly())
{
LOG_DBG("Adding a readonly session [" << id << "]");
}
+ if (!_sessions.emplace(id, session).second)
+ {
+ LOG_WRN("DocumentBroker: Trying to add already existing session.");
+ }
+
+ const auto count = _sessions.size();
+
+ lock.unlock();
+
+ // Request a new session from the child kit.
+ _childProcess->sendTextFrame(aMessage);
+
// Tell the admin console about this new doc
Admin::instance().addDoc(_docKey, getPid(), getFilename(), id);
@@ -521,7 +517,7 @@ size_t DocumentBroker::addSession(std::shared_ptr<ClientSession>& session)
session->setPeer(prisonerSession);
prisonerSession->setPeer(session);
- return _sessions.size();
+ return count;
}
size_t DocumentBroker::removeSession(const std::string& id)
@@ -550,9 +546,10 @@ void DocumentBroker::alertAllUsersOfDocument(const std::string& cmd, const std::
std::stringstream ss;
ss << "error: cmd=" << cmd << " kind=" << kind;
+ const auto msg = ss.str();
for (auto& it : _sessions)
{
- it.second->sendTextFrame(ss.str());
+ it.second->sendTextFrame(msg);
}
}
diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp
index 60a7099..34195c9 100644
--- a/loolwsd/DocumentBroker.hpp
+++ b/loolwsd/DocumentBroker.hpp
@@ -198,7 +198,7 @@ public:
~DocumentBroker();
/// Loads a document from the public URI into the jail.
- bool load(const std::string& sessionId, const std::string& jailId);
+ bool load(std::shared_ptr<ClientSession>& session, const std::string& jailId);
bool isLoaded() const { return _isLoaded; }
void setLoaded() { _isLoaded = true; }
More information about the Libreoffice-commits
mailing list