[Libreoffice-commits] online.git: loolwsd/.gitignore loolwsd/LOOLStress.cpp loolwsd/Makefile.am

Ashod Nakashian ashod.nakashian at collabora.co.uk
Mon Aug 8 03:48:53 UTC 2016


 loolwsd/.gitignore     |    1 
 loolwsd/LOOLStress.cpp |  198 +++++++++++++++++++++++++++++++++++++++++++++++++
 loolwsd/Makefile.am    |    4 
 3 files changed, 202 insertions(+), 1 deletion(-)

New commits:
commit a7c1a17f98f906eef5356067546640bab4ea0957
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Jul 31 11:18:03 2016 -0400

    loolwsd: new LOOLStress utility to stress benchmark LOOL
    
    Change-Id: Ic43f15f9bda4e08feb6df97caeb7cc40a7d24e23
    Reviewed-on: https://gerrit.libreoffice.org/27957
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/.gitignore b/loolwsd/.gitignore
index 52e0067..9bdd0f7 100644
--- a/loolwsd/.gitignore
+++ b/loolwsd/.gitignore
@@ -46,5 +46,6 @@ loolforkit
 loolmount
 loolmap
 looltool
+loolstress
 loolforkit-nocaps
 loadtest
diff --git a/loolwsd/LOOLStress.cpp b/loolwsd/LOOLStress.cpp
new file mode 100644
index 0000000..6232128
--- /dev/null
+++ b/loolwsd/LOOLStress.cpp
@@ -0,0 +1,198 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <unistd.h>
+
+#include <algorithm>
+#include <cstdlib>
+#include <cstring>
+#include <fstream>
+#include <iostream>
+#include <random>
+
+#include <Poco/Net/HTMLForm.h>
+#include <Poco/Net/NetException.h>
+#include <Poco/Net/HTTPClientSession.h>
+#include <Poco/Net/HTTPSClientSession.h>
+#include <Poco/Net/HTTPRequest.h>
+#include <Poco/Net/HTTPResponse.h>
+#include <Poco/Net/FilePartSource.h>
+#include <Poco/Net/SSLManager.h>
+#include <Poco/Net/KeyConsoleHandler.h>
+#include <Poco/Net/AcceptCertificateHandler.h>
+#include <Poco/StreamCopier.h>
+#include <Poco/URI.h>
+#include <Poco/Process.h>
+#include <Poco/StringTokenizer.h>
+#include <Poco/Thread.h>
+#include <Poco/Timespan.h>
+#include <Poco/Timestamp.h>
+#include <Poco/URI.h>
+#include <Poco/Util/Application.h>
+#include <Poco/Util/HelpFormatter.h>
+#include <Poco/Util/Option.h>
+#include <Poco/Util/OptionSet.h>
+
+#include "Common.hpp"
+#include "LOOLProtocol.hpp"
+#include "Util.hpp"
+#include "test/helpers.hpp"
+
+#include <Poco/Util/Application.h>
+#include <Poco/Util/OptionSet.h>
+
+/// Stress testing and performance/scalability benchmarking tool.
+
+class Stress: public Poco::Util::Application
+{
+public:
+    Stress();
+    ~Stress() {}
+
+    unsigned    _numClients;
+    std::string _serverURI;
+
+protected:
+    void defineOptions(Poco::Util::OptionSet& options) override;
+    void handleOption(const std::string& name, const std::string& value) override;
+    int  main(const std::vector<std::string>& args) override;
+};
+
+
+using namespace LOOLProtocol;
+
+using Poco::Net::HTTPClientSession;
+using Poco::Net::HTTPRequest;
+using Poco::Net::HTTPResponse;
+using Poco::Runnable;
+using Poco::Thread;
+using Poco::URI;
+using Poco::Util::Application;
+using Poco::Util::HelpFormatter;
+using Poco::Util::Option;
+using Poco::Util::OptionSet;
+
+class Worker: public Runnable
+{
+public:
+
+    Worker(Stress& app, const std::string& traceFilePath) :
+        _app(app), _traceFilePath(traceFilePath)
+    {
+    }
+
+    void run() override
+    {
+        std::cerr << "Connecting to server: " << _app._serverURI << "\n";
+
+        Poco::URI uri(_app._serverURI);
+
+        const auto documentURL = "lool/ws/file://" + Poco::Path(_traceFilePath).makeAbsolute().toString();
+
+        std::unique_ptr<Poco::Net::HTTPClientSession> session;
+        if (_app._serverURI.compare(0, 5, "https"))
+            session.reset(new Poco::Net::HTTPSClientSession(uri.getHost(), uri.getPort()));
+        else
+            session.reset(new Poco::Net::HTTPClientSession(uri.getHost(), uri.getPort()));
+
+        try
+        {
+
+        }
+        catch (const Poco::Exception &e)
+        {
+            std::cerr << "Failed to write data: " << e.name() <<
+                  " " << e.message() << "\n";
+            return;
+        }
+    }
+
+private:
+    Stress& _app;
+    std::string _traceFilePath;
+};
+
+Stress::Stress() :
+    _numClients(4),
+#if ENABLE_SSL
+    _serverURI("https://127.0.0.1:" + std::to_string(DEFAULT_CLIENT_PORT_NUMBER))
+#else
+    _serverURI("http://127.0.0.1:" + std::to_string(DEFAULT_CLIENT_PORT_NUMBER))
+#endif
+{
+}
+
+void Stress::defineOptions(OptionSet& optionSet)
+{
+    Application::defineOptions(optionSet);
+
+    optionSet.addOption(Option("help", "", "Display help information on command line arguments.")
+                        .required(false).repeatable(false));
+    optionSet.addOption(Option("clientsperdoc", "", "Number of simultaneous clients on each doc.")
+                        .required(false).repeatable(false)
+                        .argument("concurrency"));
+    optionSet.addOption(Option("server", "", "URI of LOOL server")
+                        .required(false).repeatable(false)
+                        .argument("uri"));
+}
+
+void Stress::handleOption(const std::string& optionName,
+                        const std::string& value)
+{
+    Application::handleOption(optionName, value);
+
+    if (optionName == "help")
+    {
+        HelpFormatter helpFormatter(options());
+
+        helpFormatter.setCommand(commandName());
+        helpFormatter.setUsage("OPTIONS");
+        helpFormatter.setHeader("LibreOffice On-Line tool.");
+        helpFormatter.format(std::cout);
+        std::exit(Application::EXIT_OK);
+    }
+    else if (optionName == "clientsperdoc")
+        _numClients = std::max(std::stoi(value), 1);
+    else if (optionName == "server")
+        _serverURI = value;
+    else
+    {
+        std::cerr << "Unknown option: " << optionName << std::endl;
+        exit(1);
+    }
+}
+
+int Stress::main(const std::vector<std::string>& args)
+{
+    std::vector<std::unique_ptr<Thread>> clients(_numClients * args.size());
+
+    std::cout << "Args: " << args.size() << std::endl;
+
+    unsigned index = 0;
+    for (unsigned i = 0; i < args.size(); ++i)
+    {
+        std::cout << "Arg: " << args[i] << std::endl;
+        for (unsigned j = 0; j < _numClients; ++j, ++index)
+        {
+            clients[index].reset(new Thread());
+            clients[index]->start(*(new Worker(*this, args[i])));
+        }
+    }
+
+    for (const auto& client : clients)
+    {
+        client->join();
+    }
+
+    return Application::EXIT_OK;
+}
+
+POCO_APP_MAIN(Stress)
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loolwsd/Makefile.am b/loolwsd/Makefile.am
index 148e9c9..d3cd9ef 100644
--- a/loolwsd/Makefile.am
+++ b/loolwsd/Makefile.am
@@ -2,7 +2,7 @@ SUBDIRS = . test
 
 export ENABLE_DEBUG
 
-bin_PROGRAMS = loolwsd loolforkit loolmap loolmount looltool
+bin_PROGRAMS = loolwsd loolforkit loolmap loolmount looltool loolstress
 
 dist_bin_SCRIPTS = loolwsd-systemplate-setup
 
@@ -78,6 +78,8 @@ loolmap_SOURCES = loolmap.c
 
 looltool_SOURCES = LOOLTool.cpp
 
+loolstress_SOURCES = LOOLStress.cpp
+
 noinst_HEADERS = Admin.hpp \
                  AdminModel.hpp \
                  Auth.hpp \


More information about the Libreoffice-commits mailing list