loolwsd/ChildSession.cpp | 3 +-- loolwsd/ChildSession.hpp | 1 - loolwsd/ClientSession.cpp | 18 +++++------------- loolwsd/ClientSession.hpp | 4 ++-- loolwsd/DocumentBroker.cpp | 27 +++++++++++++++++++++++---- loolwsd/DocumentBroker.hpp | 2 +- loolwsd/LOOLKit.cpp | 16 ++-------------- loolwsd/LOOLSession.cpp | 5 ----- loolwsd/LOOLWSD.cpp | 24 ++++++++++++------------ loolwsd/PrisonerSession.cpp | 3 +-- loolwsd/PrisonerSession.hpp | 1 - 11 files changed, 47 insertions(+), 57 deletions(-)
New commits: commit b44d71f0ae9016e8c47bb911905f80c4033afd52 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Wed Oct 12 23:04:07 2016 -0400 loolwsd: no need to create prisoner WS anymore Change-Id: Iaebac49f47353a6848fd2232a1838e4eaadaeefc Reviewed-on: https://gerrit.libreoffice.org/29937 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/ChildSession.cpp b/loolwsd/ChildSession.cpp index cf2115c..15fe4c5 100644 --- a/loolwsd/ChildSession.cpp +++ b/loolwsd/ChildSession.cpp @@ -35,10 +35,9 @@ using namespace LOOLProtocol; std::recursive_mutex ChildSession::Mutex; ChildSession::ChildSession(const std::string& id, - std::shared_ptr<WebSocket> ws, const std::string& jailId, IDocumentManager& docManager) : - LOOLSession(id, Kind::ToMaster, ws), + LOOLSession(id, Kind::ToMaster, nullptr), _jailId(jailId), _docManager(docManager), _viewId(-1), diff --git a/loolwsd/ChildSession.hpp b/loolwsd/ChildSession.hpp index d8d68bd..c901cf0 100644 --- a/loolwsd/ChildSession.hpp +++ b/loolwsd/ChildSession.hpp @@ -67,7 +67,6 @@ public: /// jailId The JailID of the jail root directory, // used by downloadas to construct jailed path. ChildSession(const std::string& id, - std::shared_ptr<Poco::Net::WebSocket> ws, const std::string& jailId, IDocumentManager& docManager); virtual ~ChildSession(); diff --git a/loolwsd/ClientSession.cpp b/loolwsd/ClientSession.cpp index 37f7f45..31df240 100644 --- a/loolwsd/ClientSession.cpp +++ b/loolwsd/ClientSession.cpp @@ -176,15 +176,6 @@ bool ClientSession::_handleInput(const char *buffer, int length) } else { - // All other commands are such that they always require a - // LibreOfficeKitDocument session, i.e. need to be handled in - // a child process. - if (_peer.expired()) - { - Log::error(getName() + " has no peer to handle [" + tokens[0] + "]."); - return false; - } - // Allow 'downloadas' for all kinds of views if ( (isReadOnly()) && tokens[0] != "downloadas" && tokens[0] != "userinactive" && tokens[0] != "useractive") @@ -352,12 +343,13 @@ bool ClientSession::sendCombinedTiles(const char* /*buffer*/, int /*length*/, St bool ClientSession::shutdownPeer(Poco::UInt16 statusCode) { - auto peer = _peer.lock(); - if (peer && !peer->isCloseFrame()) + if (_peer && !_peer->isCloseFrame()) { - peer->shutdown(statusCode); + _peer->shutdown(statusCode); + return true; } - return peer != nullptr; + + return false; } bool ClientSession::forwardToChild(const char *buffer, int length) diff --git a/loolwsd/ClientSession.hpp b/loolwsd/ClientSession.hpp index 6f76bb1..906a430 100644 --- a/loolwsd/ClientSession.hpp +++ b/loolwsd/ClientSession.hpp @@ -33,7 +33,7 @@ public: bool isReadOnly() const { return _isReadOnly; } void setPeer(const std::shared_ptr<PrisonerSession>& peer) { _peer = peer; } - std::shared_ptr<PrisonerSession> getPeer() const { return _peer.lock(); } + std::shared_ptr<PrisonerSession> getPeer() const { return _peer; } bool shutdownPeer(Poco::UInt16 statusCode); void setUserName(const std::string& userName) { _userName = userName; } @@ -86,7 +86,7 @@ private: bool _isReadOnly; /// Our peer that connects us to the child. - std::weak_ptr<PrisonerSession> _peer; + std::shared_ptr<PrisonerSession> _peer; /// Store URLs of completed 'save as' documents. MessageQueue _saveAsQueue; diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index adadee2..fd29bf5 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -160,7 +160,6 @@ bool DocumentBroker::load(const std::string& sessionId, const std::string& jailI return false; } - std::unique_lock<std::mutex> lock(_mutex); auto it = _sessions.find(sessionId); if (it == _sessions.end()) { @@ -382,7 +381,7 @@ bool DocumentBroker::sendUnoSave(const bool dontSaveIfUnmodified) const auto saveArgs = oss.str(); Log::trace(".uno:Save arguments: " + saveArgs); const auto command = "uno .uno:Save " + saveArgs; - sessionIt.second->handleInput(command.data(), command.size()); + forwardToChild(sessionIt.second->getId(), command.data(), command.size()); return true; } @@ -423,6 +422,28 @@ size_t DocumentBroker::addSession(std::shared_ptr<ClientSession>& session) _lastEditableSession = false; _markToDestroy = false; + try + { + load(id, std::to_string(_childProcess->getPid())); + } + 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. + alertAllUsersOfDocument("internal", "diskfull"); + throw; + } + + auto prisonerSession = std::make_shared<PrisonerSession>(id, shared_from_this()); + + // Connect the prison session to the client. + if (!connectPeers(prisonerSession)) + { + Log::warn("Failed to connect " + session->getName() + " to its peer."); + } + return _sessions.size(); } @@ -430,8 +451,6 @@ bool DocumentBroker::connectPeers(std::shared_ptr<PrisonerSession>& session) { const auto id = session->getId(); - std::lock_guard<std::mutex> lock(_mutex); - auto it = _sessions.find(id); if (it != _sessions.end()) { diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp index 5d0b414..6891507 100644 --- a/loolwsd/DocumentBroker.hpp +++ b/loolwsd/DocumentBroker.hpp @@ -143,7 +143,7 @@ class ClientSession; /// in jail and brokering loading it from Storage /// and saving it back. /// Contains URI, physical path, etc. -class DocumentBroker +class DocumentBroker : public std::enable_shared_from_this<DocumentBroker> { public: diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index cd62e12..172da5c 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -330,19 +330,7 @@ public: << " view for url: " << _url << " for sessionId: " << sessionId << " on jailId: " << _jailId << Log::end; - // Open websocket connection between the child process and the - // parent. The parent forwards us requests that it can't handle (i.e most). - HTTPClientSession cs("127.0.0.1", MasterPortNumber); - cs.setTimeout(0); - const auto childUrl = std::string(CHILD_URI) + "sessionId=" + sessionId + "&jailId=" + _jailId + "&docKey=" + _docKey; - HTTPRequest request(HTTPRequest::HTTP_GET, childUrl); - HTTPResponse response; - - auto ws = std::make_shared<WebSocket>(cs, request, response); - ws->setReceiveTimeout(0); - - auto session = std::make_shared<ChildSession>(sessionId, ws, _jailId, *this); - + auto session = std::make_shared<ChildSession>(sessionId, _jailId, *this); if (!_sessions.emplace(sessionId, session).second) { Log::error("Session already exists for child: " + _jailId + ", session: " + sessionId); @@ -1519,7 +1507,7 @@ void lokit_main(const std::string& childRoot, // Validate and create session. if (!(url == document->getUrl() && - document->createSession(sessionId))) + document->createSession(sessionId))) { Log::debug("CreateSession failed."); } diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp index 3b2c0d3..810a3fe 100644 --- a/loolwsd/LOOLSession.cpp +++ b/loolwsd/LOOLSession.cpp @@ -65,11 +65,6 @@ LOOLSession::LOOLSession(const std::string& id, const Kind kind, _haveDocPassword(false), _isDocPasswordProtected(false) { - // Only a post request can have a null ws. - if (_kind != Kind::ToClient) - { - assert(_ws && "Expected valid web-socket but got null."); - } } LOOLSession::~LOOLSession() diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index f9938c0..32354a5 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -813,9 +813,6 @@ private: Log::trace("Sending to Client [" + status + "]."); ws->sendFrame(status.data(), (int) status.size()); - // Wait until the client has connected with a prison socket. - waitBridgeCompleted(session); - LOOLWSD::dumpEventTrace(docBroker->getJailId(), id, "NewSession: " + uri); // Now the bridge beetween the client and kit process is connected @@ -844,6 +841,7 @@ private: []() { return !!TerminationFlag; }); // Connection terminated. Destroy session. + Log::debug("Client session [" + id + "] terminated. Cleaning up."); { std::unique_lock<std::mutex> docBrokersLock(docBrokersMutex); @@ -924,6 +922,8 @@ private: ws->shutdown(WebSocket::WS_ENDPOINT_GOING_AWAY); session->shutdownPeer(WebSocket::WS_ENDPOINT_GOING_AWAY); } + + Log::info("Finished GET request handler for session [" + id + "]."); } /// Sends back the WOPI Discovery XML. @@ -1159,15 +1159,15 @@ public: } } - if (pid <= 0) - { - Log::error("Invalid PID in child URI [" + request.getURI() + "]."); - return; - } + if (pid <= 0) + { + Log::error("Invalid PID in child URI [" + request.getURI() + "]."); + return; + } - Log::info("New child [" + std::to_string(pid) + "]."); - auto ws = std::make_shared<WebSocket>(request, response); - UnitWSD::get().newChild(ws); + Log::info("New child [" + std::to_string(pid) + "]."); + auto ws = std::make_shared<WebSocket>(request, response); + UnitWSD::get().newChild(ws); addNewChild(std::make_shared<ChildProcess>(pid, ws)); return; @@ -1239,7 +1239,7 @@ public: } auto ws = std::make_shared<WebSocket>(request, response); - auto session = std::make_shared<PrisonerSession>(sessionId, ws, docBroker); + auto session = std::make_shared<PrisonerSession>(sessionId, docBroker); // Connect the prison session to the client. if (!docBroker->connectPeers(session)) diff --git a/loolwsd/PrisonerSession.cpp b/loolwsd/PrisonerSession.cpp index 09783d1..30b76fa 100644 --- a/loolwsd/PrisonerSession.cpp +++ b/loolwsd/PrisonerSession.cpp @@ -34,9 +34,8 @@ using Poco::Path; using Poco::StringTokenizer; PrisonerSession::PrisonerSession(const std::string& id, - std::shared_ptr<Poco::Net::WebSocket> ws, std::shared_ptr<DocumentBroker> docBroker) : - LOOLSession(id, Kind::ToPrisoner, ws), + LOOLSession(id, Kind::ToPrisoner, nullptr), _docBroker(std::move(docBroker)), _curPart(0) { diff --git a/loolwsd/PrisonerSession.hpp b/loolwsd/PrisonerSession.hpp index bcd386a..3d6ac6c 100644 --- a/loolwsd/PrisonerSession.hpp +++ b/loolwsd/PrisonerSession.hpp @@ -20,7 +20,6 @@ class PrisonerSession final : public LOOLSession, public std::enable_shared_from { public: PrisonerSession(const std::string& id, - std::shared_ptr<Poco::Net::WebSocket> ws, std::shared_ptr<DocumentBroker> docBroker); virtual ~PrisonerSession(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits