loolwsd/LOOLBroker.cpp | 127 +++++++++++-------------------------------------- loolwsd/LOOLKit.cpp | 29 ++++++----- 2 files changed, 46 insertions(+), 110 deletions(-)
New commits: commit b596c80e34ea16323292e35f0e9db73abc7a98c0 Author: Ashod Nakashian <[email protected]> Date: Sat Jan 30 13:03:03 2016 -0500 loolwsd: simplified child searching Change-Id: I0d817876f5b83acff69e51c2c64cd6acfa8dc27d Reviewed-on: https://gerrit.libreoffice.org/21974 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp index 3f32483..ce829da 100644 --- a/loolwsd/LOOLBroker.cpp +++ b/loolwsd/LOOLBroker.cpp @@ -164,10 +164,19 @@ namespace { std::lock_guard<std::recursive_mutex> lock(forkMutex); - const auto it = std::find_if(_childProcesses.begin(), _childProcesses.end(), - [&url](const std::pair<Process::PID, std::shared_ptr<ChildProcess>>& pair) { return pair.second->getUrl() == url; }); + std::shared_ptr<ChildProcess> child; + for (const auto& it : _childProcesses) + { + if (it.second->getUrl() == url) + { + return it.second; + } - return (it != _childProcesses.end() ? it->second : std::shared_ptr<ChildProcess>()); + if (it.second->getUrl().empty()) + child = it.second; + } + + return child; } /// Safely looks up the pipe descriptor @@ -355,12 +364,12 @@ public: // Sanitize cache. Log::trace("Verifying Childs."); - for (auto it = _cacheURL.cbegin(); it != _cacheURL.cend(); ) + for (auto& it : _childProcesses) { - const auto aMessage = "search " + it->first + "\r\n"; - if (Util::writeFIFO(getChildPipe(it->second), aMessage) < 0) + const auto aMessage = "query url \r\n"; + if (Util::writeFIFO(it.second->getWritePipe(), aMessage) < 0) { - Log::error("Error sending search message to child [" + std::to_string(it->second) + "]. Clearing cache."); + Log::error("Error sending query message to child [" + std::to_string(it.second->getPid()) + "]. Clearing cache."); _cacheURL.clear(); break; } @@ -368,79 +377,19 @@ public: std::string aResponse; if (getResponseLine(readerChild, aResponse) < 0) { - Log::error("Error reading response to thread message from child [" + std::to_string(it->second) + "]. Clearing cache."); + Log::error("Error reading response to thread message from child [" + std::to_string(it.second->getPid()) + "]. Clearing cache."); _cacheURL.clear(); break; } StringTokenizer tokens(aResponse, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); - if (tokens.count() != 2 || tokens[0] != std::to_string(it->second) || tokens[1] != "ok") - { - Log::debug() << "Removed expired Kit [" << it->second << "] hosts URL [" << it->first << "]." << Log::end; - it = _cacheURL.erase(it); - continue; - } - - ++it; - } - } - - Process::PID searchURL(const std::string& aURL) - { - std::lock_guard<std::recursive_mutex> lock(forkMutex); - - const std::string aMessage = "search " + aURL + "\r\n"; - Process::PID nPID = -1; - for (auto it = _childProcesses.cbegin(); it != _childProcesses.cend(); ) - { - assert(it->first > 0); - - Log::trace("Query to kit [" + std::to_string(it->first) + "]: " + aMessage); - ssize_t nBytes = Util::writeFIFO(it->second->getWritePipe(), aMessage); - if ( nBytes < 0 ) - { - Log::error("Error sending search message to child pipe: " + std::to_string(it->first) + ". Terminating."); - removeChild(it->first); - it = _childProcesses.cbegin(); - continue; - } - - std::string aResponse; - nBytes = getResponseLine(readerChild, aResponse); - Log::trace("Response from kit [" + std::to_string(it->first) + "]: " + aResponse); - if ( nBytes < 0 ) - { - Log::error("Error reading response to search message from child [" + std::to_string(it->first) + "]. Terminating."); - removeChild(it->first); - it = _childProcesses.cbegin(); - continue; - } - - StringTokenizer tokens(aResponse, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); - if (tokens.count() != 2 || tokens[0] != std::to_string(it->first)) + if (tokens.count() != 2 || tokens[0] != std::to_string(it.second->getPid()) || tokens[1] != "ok") { - Log::error("Error wrong child response from child [" + std::to_string(it->first) + "] != [" + tokens[0] + "]"); + Log::debug() << "Removed expired Kit [" << it.second->getPid() << "] hosts URL [" << it.second->getUrl() << "]." << Log::end; + //it = _cacheURL.erase(it); continue; } - - if (tokens[1] == "ok") - { - // Found, but find all empty instances. - nPID = it->first; - Log::debug("Kit [" + std::to_string(nPID) + "] hosts URL [" + aURL + "]."); - break; - } - else if (tokens[1] == "empty") - { - // Remember the last empty. - nPID = it->first; - Log::debug("Kit [" + std::to_string(nPID) + "] is empty."); - } - - ++it; } - - return nPID; } void handleInput(const std::string& aMessage) @@ -455,40 +404,24 @@ public: Log::debug("Finding kit for URL [" + aURL + "] on thread [" + aTID + "]."); - // Check the cache first. const auto child = findChild(aURL); if (child) { - Log::debug("Cache found URL [" + aURL + "] hosted on child [" + std::to_string(child->getPid()) + - "]. Creating view for thread [" + aTID + "]."); - if (createThread(child->getPid(), aTID, aURL)) - return; + if (child->getUrl() == aURL) + Log::debug("Found URL [" + aURL + "] hosted on child [" + std::to_string(child->getPid()) + "]."); + else + Log::debug("URL [" + aURL + "] is not hosted. Using empty child[" + std::to_string(child->getPid()) + "]."); - Log::error("Cache: Error creating thread [" + aTID + "] for URL [" + aURL + "]. Will search."); + if (!createThread(child->getPid(), aTID, aURL)) + { + Log::error("Cache: Error creating thread [" + aTID + "] for URL [" + aURL + "]."); + } } else { - // Not found in cache, do a full search. - Log::debug("URL [" + aURL + "] is not in cache. Will search."); + Log::info("No children available. Creating more."); + ++forkCounter; } - - const Process::PID nPID = searchURL(aURL); - if ( nPID > 0 ) - { - Log::debug("Search found child [" + std::to_string(nPID) + - "] to host URL [" + aURL + - "]. Creating view for thread [" + aTID + "]."); - if (createThread(nPID, aTID, aURL)) - { - _cacheURL[aURL] = nPID; - return; - } - - Log::error("Search: Error creating thread [" + aTID + "] for URL [" + aURL + "]."); - } - - Log::info("No children available. Creating more."); - ++forkCounter; } } diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 40ee3de..04e5d82 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -607,21 +607,24 @@ void lokit_main(const std::string &loSubPath, const std::string& jailId, const s aResponse = std::to_string(Process::id()) + " "; Log::trace("Recv: " + aMessage); - if (tokens[0] == "search") + if (tokens[0] == "query" && tokens.count() > 1) { - for (auto it = _documents.cbegin(); it != _documents.cend(); ) + if (tokens[1] == "url") { - it = (it->second->canDiscard() ? _documents.erase(it) : ++it); - } - - if (_documents.empty()) - { - aResponse += "empty \r\n"; - } - else - { - const auto& it = _documents.find(tokens[1]); - aResponse += (it != _documents.end() ? "ok \r\n" : "no \r\n"); + for (auto it = _documents.cbegin(); it != _documents.cend(); ) + { + it = (it->second->canDiscard() ? _documents.erase(it) : ++it); + } + + if (_documents.empty()) + { + aResponse += "empty \r\n"; + } + else + { + // We really only support single URL hosting. + aResponse += _documents.cbegin()->first + "\r\n"; + } } } else if (tokens[0] == "thread") _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
