loolwsd/LOOLWSD.cpp | 37 ++++++++++++++--------------------- loolwsd/MasterProcessSession.cpp | 41 +++++++++++++++++++++++---------------- loolwsd/MasterProcessSession.hpp | 12 +++++------ 3 files changed, 46 insertions(+), 44 deletions(-)
New commits: commit 64d2ff98b8e8329a8f0a2b57dbdc490733ecb28a Author: Ashod Nakashian <[email protected]> Date: Sat Mar 12 09:07:33 2016 -0500 loolwsd: document saving and restructuring Change-Id: Ia4c644d07a16ba5284e9cdfaf7b838134fbf640b Reviewed-on: https://gerrit.libreoffice.org/23212 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index 162dae7..1e833d9 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -508,29 +508,13 @@ private: const auto uri = DocumentStoreManager::getUri(request.getURI()); const auto docKey = uri.getPath(); - // This lock could become a bottleneck. - // In that case, we can use a pool and index by publicPath. - std::unique_lock<std::mutex> lock(LOOLWSD::SessionsMutex); - - // Lookup this document. - auto it = LOOLWSD::Sessions.find(docKey); - std::shared_ptr<DocumentStoreManager> document; - if (it != LOOLWSD::Sessions.end()) - { - // Get the DocumentStoreManager from the first session. - auto sessionsMap = it->second; - assert(!sessionsMap.empty()); - document = sessionsMap.begin()->second->getDocumentStoreManager(); - } - else - { - // Set up the document and its storage. - const auto jailRoot = Poco::Path(LOOLWSD::ChildRoot, id); - document = DocumentStoreManager::create(uri, jailRoot.toString(), id); - } + // Request a kit process for this doc. + const std::string aMessage = "request " + id + " " + docKey + "\r\n"; + Log::debug("MasterToBroker: " + aMessage.substr(0, aMessage.length() - 2)); + Util::writeFIFO(LOOLWSD::BrokerWritePipe, aMessage); auto ws = std::make_shared<WebSocket>(request, response); - auto session = std::make_shared<MasterProcessSession>(id, LOOLSession::Kind::ToClient, ws, document); + auto session = std::make_shared<MasterProcessSession>(id, LOOLSession::Kind::ToClient, ws, nullptr); // For ToClient sessions, we store incoming messages in a queue and have a separate // thread that handles them. This is so that we can empty the queue when we get a @@ -646,7 +630,16 @@ public: Log::debug("Thread [" + thread_name + "] started."); auto ws = std::make_shared<WebSocket>(request, response); - auto session = std::make_shared<MasterProcessSession>(id, LOOLSession::Kind::ToPrisoner, ws, nullptr); + auto session = std::make_shared<MasterProcessSession>(sessionId, LOOLSession::Kind::ToPrisoner, ws, nullptr); + + std::unique_lock<std::mutex> lock(MasterProcessSession::AvailableChildSessionMutex); + MasterProcessSession::AvailableChildSessions.emplace(sessionId, session); + + Log::info() << " mapped " << session << " jailId=" << jailId << ", id=" << sessionId + << " into _availableChildSessions, size=" << MasterProcessSession::AvailableChildSessions.size() << Log::end; + + lock.unlock(); + MasterProcessSession::AvailableChildSessionCV.notify_one(); SocketProcessor(ws, response, [&session](const char* data, const int size, bool) { diff --git a/loolwsd/MasterProcessSession.cpp b/loolwsd/MasterProcessSession.cpp index 46174c9..5e1e33b 100644 --- a/loolwsd/MasterProcessSession.cpp +++ b/loolwsd/MasterProcessSession.cpp @@ -117,7 +117,7 @@ bool MasterProcessSession::_handleInput(const char *buffer, int length) // Note that this handles both forwarding requests from the client to the child process, and // forwarding replies from the child process to the client. Or does it? - // Snoop at some messages and manipulate tile cache information as needed + // Snoop at some messages and manipulate tile cache information as needed auto peer = _peer.lock(); if (_kind == Kind::ToPrisoner) @@ -128,6 +128,27 @@ bool MasterProcessSession::_handleInput(const char *buffer, int length) return false; } + if (tokens[0] == "unocommandresult:") + { + const std::string stringMsg(buffer, length); + Log::info(getName() +"Command: " + stringMsg); + const auto index = stringMsg.find_first_of("{"); + if (index != std::string::npos) + { + const std::string stringJSON = stringMsg.substr(index); + Poco::JSON::Parser parser; + const auto result = parser.parse(stringJSON); + const auto object = result.extract<Poco::JSON::Object::Ptr>(); + if (object->get("commandName").toString() == ".uno:Save" && + object->get("success").toString() == "true") + { + Log::info() << getName() << " " << _docStoreManager << Log::end; + _docStoreManager->save(); + return true; + } + } + } + if (tokens[0] == "error:") { std::string errorCommand; @@ -282,14 +303,7 @@ bool MasterProcessSession::_handleInput(const char *buffer, int length) setId(tokens[1]); _childId = tokens[2]; - std::unique_lock<std::mutex> lock(AvailableChildSessionMutex); - AvailableChildSessions.emplace(getId(), shared_from_this()); - - Log::info() << getName() << " mapped " << this << " jailId=" << _childId << ", id=" << getId() - << " into _availableChildSessions, size=" << AvailableChildSessions.size() << Log::end; - - lock.unlock(); - AvailableChildSessionCV.notify_one(); + Log::info() << getName() << " Child jailId=" << _childId << ", sessionId=" << getId() << Log::end; } else if (_kind == Kind::ToPrisoner) { @@ -396,7 +410,6 @@ bool MasterProcessSession::_handleInput(const char *buffer, int length) if ((tokens.count() > 1 && tokens[0] == "uno" && tokens[1] == ".uno:Save")) { - _docStoreManager->save(); _tileCache->documentSaved(); } else if (tokens[0] == "disconnect") @@ -454,12 +467,6 @@ bool MasterProcessSession::loadDocument(const char* /*buffer*/, int /*length*/, std::string timestamp; parseDocOptions(tokens, _loadPart, timestamp); - // Request a kit process for this doc. - Poco::URI uri(_docURL); - const std::string aMessage = "request " + getId() + " " + uri.getPath() + "\r\n"; - Log::debug("MasterToBroker: " + aMessage.substr(0, aMessage.length() - 1)); - Util::writeFIFO(LOOLWSD::BrokerWritePipe, aMessage); - _tileCache.reset(new TileCache(_docURL, timestamp)); // Finally, wait for the Child to connect to Master, @@ -804,8 +811,10 @@ void MasterProcessSession::dispatchChild() const auto jailRoot = Poco::Path(LOOLWSD::ChildRoot, childSession->_childId); auto document = DocumentStoreManager::create(_docURL, jailRoot.toString(), childSession->_childId); + _docStoreManager = document; _peer = childSession; childSession->_peer = shared_from_this(); + childSession->_docStoreManager = document; std::ostringstream oss; oss << "load"; diff --git a/loolwsd/MasterProcessSession.hpp b/loolwsd/MasterProcessSession.hpp index 1168651..5d2d7ca 100644 --- a/loolwsd/MasterProcessSession.hpp +++ b/loolwsd/MasterProcessSession.hpp @@ -44,6 +44,12 @@ public: std::shared_ptr<DocumentStoreManager> getDocumentStoreManager() const { return _docStoreManager; } + // Sessions to pre-spawned child processes that have connected but are not yet assigned a + // document to work on. + static std::map<std::string, std::shared_ptr<MasterProcessSession>> AvailableChildSessions; + static std::mutex AvailableChildSessionMutex; + static std::condition_variable AvailableChildSessionCV; + protected: bool invalidateTiles(const char *buffer, int length, Poco::StringTokenizer& tokens); @@ -67,12 +73,6 @@ public: // per document being edited (i.e., per child process). std::weak_ptr<MasterProcessSession> _peer; - // Sessions to pre-spawned child processes that have connected but are not yet assigned a - // document to work on. - static std::map<std::string, std::shared_ptr<MasterProcessSession>> AvailableChildSessions; - static std::mutex AvailableChildSessionMutex; - static std::condition_variable AvailableChildSessionCV; - std::unique_ptr<TileCache> _tileCache; private: _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
