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

Ashod Nakashian ashod.nakashian at collabora.co.uk
Sun Oct 23 21:15:05 UTC 2016


 loolwsd/LOOLWSD.cpp          |   46 ++++++++++++++++++++++++++-----------------
 loolwsd/test/httpwserror.cpp |    6 +++++
 2 files changed, 34 insertions(+), 18 deletions(-)

New commits:
commit f68ece00377ef41e68996f78f2ac4cd868794930
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Oct 23 11:51:10 2016 -0400

    loolwsd: fix testMaxDocuments unittest
    
    Checking for document limit must be done before allocating
    a child process, otherwise the new child process will not
    be cleaned up or released, thereby failing the test.
    
    Change-Id: I99b1155bdacf2f0b7a24c7b7330d207e4c7beee8
    Reviewed-on: https://gerrit.libreoffice.org/30208
    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 6694f81..a9aa59d 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -192,17 +192,27 @@ void shutdownLimitReached(WebSocket& ws)
         int retries = 7;
         std::vector<char> buffer(READ_BUFFER_SIZE * 100);
 
-        // 5 seconds timeout
-        ws.setReceiveTimeout(5000000);
+        const Poco::Timespan waitTime(POLL_TIMEOUT_MS * 1000);
         do
         {
-            // ignore loolclient, load and partpagerectangles
-            ws.receiveFrame(buffer.data(), buffer.capacity(), flags);
-            if (--retries == 4)
+            if (ws.poll(Poco::Timespan(0), Poco::Net::Socket::SelectMode::SELECT_ERROR))
             {
-                ws.sendFrame(error.data(), error.size());
-                ws.shutdown(WebSocket::WS_POLICY_VIOLATION);
+                // Already disconnected, can't send 'close' frame.
+                ws.close();
+                return;
+            }
+
+            // Let the client know we are shutting down.
+            ws.sendFrame(error.data(), error.size());
+
+            // Ignore incoming messages.
+            if (ws.poll(waitTime, Poco::Net::Socket::SELECT_READ))
+            {
+                ws.receiveFrame(buffer.data(), buffer.capacity(), flags);
             }
+
+            // Shutdown.
+            ws.shutdown(WebSocket::WS_POLICY_VIOLATION);
         }
         while (retries > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
     }
@@ -684,6 +694,17 @@ private:
             }
             else
             {
+                // New Document.
+#if MAX_DOCUMENTS > 0
+                if (DocBrokers.size() + 1 > MAX_DOCUMENTS)
+                {
+                    Log::error() << "Limit on maximum number of open documents of "
+                                 << MAX_DOCUMENTS << " reached." << Log::end;
+                    shutdownLimitReached(*ws);
+                    return;
+                }
+#endif
+
                 // Store a dummy (marked to destroy) document broker until we
                 // have the real one, so that the other requests block
                 Log::debug("Inserting a dummy DocumentBroker for docKey [" + docKey + "] temporarily.");
@@ -759,17 +780,6 @@ private:
                 throw WebSocketErrorMessageException(SERVICE_UNAVAILABLE_INTERNAL_ERROR);
             }
 
-#if MAX_DOCUMENTS > 0
-            std::unique_lock<std::mutex> DocBrokersLock(DocBrokersMutex);
-            if (DocBrokers.size() + 1 > MAX_DOCUMENTS)
-            {
-                Log::error("Maximum number of open documents reached.");
-                shutdownLimitReached(*ws);
-                return;
-            }
-            DocBrokersLock.unlock();
-#endif
-
             // Set one we just created.
             Log::debug("New DocumentBroker for docKey [" + docKey + "].");
             docBroker = std::make_shared<DocumentBroker>(uriPublic, docKey, LOOLWSD::ChildRoot, child);
diff --git a/loolwsd/test/httpwserror.cpp b/loolwsd/test/httpwserror.cpp
index 011806b..1d686e4 100644
--- a/loolwsd/test/httpwserror.cpp
+++ b/loolwsd/test/httpwserror.cpp
@@ -103,11 +103,15 @@ void HTTPWSError::testMaxDocuments()
         // Load a document.
         std::vector<std::shared_ptr<Poco::Net::WebSocket>> docs;
 
+        std::cerr << "Loading max number of documents: " << MAX_DOCUMENTS << std::endl;
         for (int it = 1; it <= MAX_DOCUMENTS; ++it)
         {
             docs.emplace_back(loadDocAndGetSocket("empty.odt", _uri, testname));
+            std::cerr << "Loaded document #" << it << " of " << MAX_DOCUMENTS << std::endl;
         }
 
+        std::cerr << "Loading one more document beyond the limit." << std::endl;
+
         // try to open MAX_DOCUMENTS + 1
         std::string docPath;
         std::string docURL;
@@ -121,6 +125,8 @@ void HTTPWSError::testMaxDocuments()
         sendTextFrame(socket, "load ", testname);
         sendTextFrame(socket, "partpagerectangles ", testname);
 
+        assertResponseString(socket, "error:", testname);
+
         std::string message;
         const auto statusCode = getErrorCode(socket, message);
         CPPUNIT_ASSERT_EQUAL(static_cast<int>(Poco::Net::WebSocket::WS_POLICY_VIOLATION), statusCode);


More information about the Libreoffice-commits mailing list