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

Ashod Nakashian ashod.nakashian at collabora.co.uk
Sun Oct 16 22:05:12 UTC 2016


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

New commits:
commit d98e019994222a689c008aafa609f3f71bba3911
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Wed Oct 12 23:39:04 2016 -0400

    loolwsd: kill priosoner connection listener
    
    Change-Id: Ica69c80fc9094c1139d05eaf08b9c1fa6b222347
    Reviewed-on: https://gerrit.libreoffice.org/29938
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index 32354a5..957749f 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -1132,32 +1132,24 @@ public:
                 request, response))
             return;
 
-        handlePrisonerRequest(request, response);
-    }
-
-    static void handlePrisonerRequest(HTTPServerRequest& request, HTTPServerResponse& response)
-    {
-        Util::setThreadName("prison_ws");
-
-        Log::debug("Child connection with URI [" + request.getURI() + "].");
-
+        Log::trace("Child connection with URI [" + request.getURI() + "].");
         assert(request.serverAddress().port() == MasterPortNumber);
-        if (request.getURI().find(NEW_CHILD_URI) == 0)
+        assert(request.getURI().find(NEW_CHILD_URI) == 0);
+
+        // New Child is spawned.
+        const auto params = Poco::URI(request.getURI()).getQueryParameters();
+        Poco::Process::PID pid = -1;
+        for (const auto& param : params)
         {
-            // New Child is spawned.
-            const auto params = Poco::URI(request.getURI()).getQueryParameters();
-            Poco::Process::PID pid = -1;
-            for (const auto& param : params)
+            if (param.first == "pid")
             {
-                if (param.first == "pid")
-                {
-                    pid = std::stoi(param.second);
-                }
-                else if (param.first == "version")
-                {
-                    LOOLWSD::LOKitVersion = param.second;
-                }
+                pid = std::stoi(param.second);
+            }
+            else if (param.first == "version")
+            {
+                LOOLWSD::LOKitVersion = param.second;
             }
+        }
 
         if (pid <= 0)
         {
@@ -1169,159 +1161,7 @@ public:
         auto ws = std::make_shared<WebSocket>(request, response);
         UnitWSD::get().newChild(ws);
 
-            addNewChild(std::make_shared<ChildProcess>(pid, ws));
-            return;
-        }
-
-        if (request.getURI().find(CHILD_URI) != 0)
-        {
-            Log::error("Invalid request URI: [" + request.getURI() + "].");
-            return;
-        }
-
-        std::string sessionId;
-        std::string jailId;
-        std::string docKey;
-        try
-        {
-            const auto params = Poco::URI(request.getURI()).getQueryParameters();
-            for (const auto& param : params)
-            {
-                if (param.first == "sessionId")
-                {
-                    sessionId = param.second;
-                }
-                else if (param.first == "jailId")
-                {
-                    jailId = param.second;
-                }
-                else if (param.first == "docKey")
-                {
-                    // We store encoded docKey in DocumentBroker only
-                    URI::encode(param.second, "", docKey);
-                }
-            }
-
-            Util::setThreadName("prison_ws_" + sessionId);
-
-            // Misleading debug message, we obviously started already a while ago and have done lots
-            // of stuff already.
-            Log::debug("Thread started.");
-
-            Log::debug("Child socket for SessionId: " + sessionId + ", jailId: " + jailId +
-                       ", docKey: " + docKey + " connected.");
-
-            // Jail id should be the PID, beacuse Admin need it to calculate the memory
-            const Poco::Process::PID pid = std::stoi(jailId);
-
-            std::shared_ptr<DocumentBroker> docBroker;
-            {
-                // This lock could become a bottleneck.
-                // In that case, we can use a pool and index by publicPath.
-                std::unique_lock<std::mutex> lock(docBrokersMutex);
-
-                // Lookup this document.
-                auto it = docBrokers.find(docKey);
-                if (it != docBrokers.end())
-                {
-                    // Get the DocumentBroker from the Cache.
-                    docBroker = it->second;
-                    assert(docBroker);
-                }
-                else
-                {
-                    // The client closed before we started,
-                    // or some early failure happened.
-                    Log::error("Failed to find DocumentBroker for docKey [" + docKey +
-                               "] while handling child connection for session [" + sessionId + "].");
-                    throw std::runtime_error("Invalid docKey.");
-                }
-            }
-
-            auto ws = std::make_shared<WebSocket>(request, response);
-            auto session = std::make_shared<PrisonerSession>(sessionId, docBroker);
-
-            // Connect the prison session to the client.
-            if (!docBroker->connectPeers(session))
-            {
-                Log::warn("Failed to connect " + session->getName() + " to its peer.");
-            }
-
-            try
-            {
-                docBroker->load(sessionId, jailId);
-            }
-            catch (const StorageSpaceLowException&)
-            {
-                // 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
-                // some other type of storage somewhere). This message is not sent to all clients,
-                // though, just to all sessions of this document.
-                docBroker->alertAllUsersOfDocument("internal", "diskfull");
-                throw;
-            }
-
-            std::unique_lock<std::mutex> lock(AvailableChildSessionMutex);
-            AvailableChildSessions.emplace(sessionId, session);
-
-            Log::info() << " mapped " << session << " jailId=" << jailId << ", id=" << sessionId
-                        << " into _availableChildSessions, size=" << AvailableChildSessions.size() << Log::end;
-
-            lock.unlock();
-            AvailableChildSessionCV.notify_one();
-
-            Log::info("Adding doc " + docKey + " to Admin");
-            Admin::instance().addDoc(docKey, pid, docBroker->getFilename(), sessionId);
-
-            UnitWSD::get().onChildConnected(pid, sessionId);
-
-            IoUtil::SocketProcessor(ws,
-                [&session](const std::vector<char>& payload)
-                {
-                    return session->handleInput(payload.data(), payload.size());
-                },
-                [&session]() { session->closeFrame(); },
-                []() { return TerminationFlag.load(); });
-
-            if (session->isCloseFrame())
-            {
-                Log::trace("Normal close handshake.");
-                if (session->shutdownPeer(WebSocket::WS_NORMAL_CLOSE))
-                {
-                    // LOKit initiated close handshake
-                    // respond close frame
-                    ws->shutdown();
-                }
-            }
-            else
-            {
-                // something wrong, with internal exceptions
-                Log::trace("Abnormal close handshake.");
-                session->closeFrame();
-                ws->shutdown(WebSocket::WS_ENDPOINT_GOING_AWAY);
-                session->shutdownPeer(WebSocket::WS_ENDPOINT_GOING_AWAY);
-            }
-        }
-        catch (const Exception& exc)
-        {
-            Log::error() << "PrisonerRequestHandler::handleRequest: Exception: " << exc.displayText()
-                         << (exc.nested() ? " (" + exc.nested()->displayText() + ")" : "")
-                         << Log::end;
-        }
-        catch (const std::exception& exc)
-        {
-            Log::error(std::string("PrisonerRequestHandler::handleRequest: Exception: ") + exc.what());
-        }
-
-        if (!jailId.empty())
-        {
-            Log::info("Removing doc " + docKey + " from Admin");
-            Admin::instance().rmDoc(docKey, sessionId);
-        }
-
-        // Replenish.
-        prespawnChildren();
-        Log::debug("Thread finished.");
+        addNewChild(std::make_shared<ChildProcess>(pid, ws));
     }
 };
 
@@ -2141,7 +1981,7 @@ void UnitWSD::testHandleRequest(TestRequest type, UnitHTTPServerRequest& request
         ClientRequestHandler::handleClientRequest(request, response);
         break;
     case TestRequest::TEST_REQ_PRISONER:
-        PrisonerRequestHandler::handlePrisonerRequest(request, response);
+        // No longer used. Only bridges WSD with child.
         break;
     default:
         assert(false);


More information about the Libreoffice-commits mailing list