[Libreoffice-commits] online.git: 4 commits - loolwsd/ChildProcessSession.cpp loolwsd/ChildProcessSession.hpp loolwsd/Common.hpp loolwsd/configure.ac loolwsd/LOOLForKit.cpp loolwsd/LOOLTool.cpp loolwsd/LOOLWSD.cpp loolwsd/Makefile.am loolwsd/test scripts/logparse.pl scripts/segv-catch.pl
Michael Meeks
michael.meeks at collabora.com
Thu Apr 14 17:58:39 UTC 2016
loolwsd/ChildProcessSession.cpp | 2
loolwsd/ChildProcessSession.hpp | 3
loolwsd/Common.hpp | 3
loolwsd/LOOLForKit.cpp | 3
loolwsd/LOOLTool.cpp | 232 ++++++++++++++++++++++++++++++++++++++++
loolwsd/LOOLWSD.cpp | 3
loolwsd/Makefile.am | 4
loolwsd/configure.ac | 2
loolwsd/test/Makefile.am | 8 -
scripts/logparse.pl | 9 +
scripts/segv-catch.pl | 22 +++
11 files changed, 275 insertions(+), 16 deletions(-)
New commits:
commit 53c60b28421ea65fbc9da9abd4aa7a4a86eb423b
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Thu Apr 14 18:46:32 2016 +0100
Magic to cleanup autotools module linking of unit tests.
diff --git a/loolwsd/configure.ac b/loolwsd/configure.ac
index e372b25..a5cdd3a 100644
--- a/loolwsd/configure.ac
+++ b/loolwsd/configure.ac
@@ -4,7 +4,7 @@
AC_PREREQ([2.69])
AC_INIT([loolwsd], [1.6.0], [libreoffice at lists.freedesktop.org])
-LT_INIT([disable-static])
+LT_INIT([shared, disable-static, dlopen])
AM_INIT_AUTOMAKE([1.11 silent-rules subdir-objects])
diff --git a/loolwsd/test/Makefile.am b/loolwsd/test/Makefile.am
index cbeb4cc..d44e787 100644
--- a/loolwsd/test/Makefile.am
+++ b/loolwsd/test/Makefile.am
@@ -4,10 +4,12 @@ check_PROGRAMS = test
AM_CXXFLAGS = $(CPPUNIT_CFLAGS)
-check_LTLIBRARIES = \
+noinst_LTLIBRARIES = \
unit-timeout.la unit-prefork.la \
unit-storage.la unit-fonts.la
+MAGIC_TO_FORCE_SHLIB_CREATION = -rpath /dummy
+AM_LDFLAGS = -module $(MAGIC_TO_FORCE_SHLIB_CREATION)
AM_CPPFLAGS = -pthread -I$(top_srcdir)
test_CPPFLAGS = -DTDOC=\"$(top_srcdir)/test/data\"
@@ -16,13 +18,9 @@ test_LDADD = $(CPPUNIT_LIBS)
# unit test modules:
unit_fonts_la_SOURCES = UnitFonts.cpp
-unit_fonts_la_LDFLAGS = -module
unit_timeout_la_SOURCES = UnitTimeout.cpp
-unit_timeout_la_LDFLAGS = -module
unit_prefork_la_SOURCES = UnitPrefork.cpp
-unit_prefork_la_LDFLAGS = -module
unit_storage_la_SOURCES = UnitStorage.cpp
-unit_storage_la_LDFLAGS = -module
if HAVE_LO_PATH
SYSTEM_STAMP = @SYSTEMPLATE_PATH@/system_stamp
commit 688d1ab6e6bef0ae29ba2617e9f284b5f0dbdb12
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Thu Apr 14 18:04:19 2016 +0100
Remove confusing ChildProcessSession include on LOOLWSD.
Move the ClientPortNumber into both Kit and WSD.
diff --git a/loolwsd/ChildProcessSession.cpp b/loolwsd/ChildProcessSession.cpp
index a7d00ca..a681221 100644
--- a/loolwsd/ChildProcessSession.cpp
+++ b/loolwsd/ChildProcessSession.cpp
@@ -42,8 +42,6 @@ using Poco::StringTokenizer;
using Poco::Timestamp;
using Poco::URI;
-int ClientPortNumber = DEFAULT_CLIENT_PORT_NUMBER;
-
class CallbackNotification: public Notification
{
public:
diff --git a/loolwsd/ChildProcessSession.hpp b/loolwsd/ChildProcessSession.hpp
index bb55b68..b7e0af6 100644
--- a/loolwsd/ChildProcessSession.hpp
+++ b/loolwsd/ChildProcessSession.hpp
@@ -22,9 +22,6 @@
#include "Common.hpp"
#include "LOOLSession.hpp"
-// The client port number, which is changed via loolwsd args.
-extern int ClientPortNumber;
-
class CallbackWorker;
class ChildProcessSession final : public LOOLSession
diff --git a/loolwsd/Common.hpp b/loolwsd/Common.hpp
index cc9b4d1..2d9db68 100644
--- a/loolwsd/Common.hpp
+++ b/loolwsd/Common.hpp
@@ -40,6 +40,9 @@ constexpr auto JAILED_DOCUMENT_ROOT = "/user/docs/";
constexpr auto NEW_CHILD_URI = "/loolws/newchild?";
constexpr auto SSL_KEY_FILE = "key.pem";
+// The client port number, both loolwsd and the kits have this.
+extern int ClientPortNumber;
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loolwsd/LOOLForKit.cpp b/loolwsd/LOOLForKit.cpp
index 700273f..256a2c3 100644
--- a/loolwsd/LOOLForKit.cpp
+++ b/loolwsd/LOOLForKit.cpp
@@ -34,7 +34,6 @@
#include "LOOLKit.hpp"
#include "Util.hpp"
#include "Unit.hpp"
-#include "ChildProcessSession.hpp"
#include "security.h"
@@ -48,6 +47,8 @@ using Poco::Util::Application;
static std::string UnitTestLibrary;
static std::atomic<unsigned> ForkCounter( 0 );
+int ClientPortNumber = DEFAULT_CLIENT_PORT_NUMBER;
+
static int pipeFd = -1;
class ChildDispatcher
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index 38d5935..6c1d790 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -81,7 +81,6 @@
#include "Admin.hpp"
#include "Auth.hpp"
-#include "ChildProcessSession.hpp"
#include "Common.hpp"
#include "FileServer.hpp"
#include "LOOLProtocol.hpp"
@@ -143,6 +142,8 @@ using Poco::XML::InputSource;
using Poco::XML::Node;
using Poco::XML::NodeList;
+int ClientPortNumber = DEFAULT_CLIENT_PORT_NUMBER;
+
/// New LOK child processes ready to host documents.
//TODO: Move to a more sensible namespace.
static std::vector<std::shared_ptr<ChildProcess>> newChildren;
commit d817fc2c69d848a9f9e1ef756bb0379705576bcb
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Fri Mar 18 21:07:39 2016 +0000
Simple command-line tool for file format conversion.
diff --git a/loolwsd/LOOLTool.cpp b/loolwsd/LOOLTool.cpp
new file mode 100644
index 0000000..975ed4c
--- /dev/null
+++ b/loolwsd/LOOLTool.cpp
@@ -0,0 +1,232 @@
+/* -*- 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/Condition.h>
+#include <Poco/Mutex.h>
+#include <Poco/Net/HTMLForm.h>
+#include <Poco/Net/NetException.h>
+#include <Poco/Net/HTTPClientSession.h>
+#include <Poco/Net/HTTPRequest.h>
+#include <Poco/Net/HTTPResponse.h>
+#include <Poco/Net/FilePartSource.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 <Poco/Util/Application.h>
+#include <Poco/Util/OptionSet.h>
+
+class Tool: public Poco::Util::Application
+{
+public:
+ Tool();
+ ~Tool() {}
+
+ unsigned _numWorkers;
+ std::string _serverURI;
+ std::string _destinationFormat;
+ std::string _destinationDir; // FIXME: implement me.
+
+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::Condition;
+using Poco::Mutex;
+using Poco::Net::HTTPClientSession;
+using Poco::Net::HTTPRequest;
+using Poco::Net::HTTPResponse;
+using Poco::Runnable;
+using Poco::StringTokenizer;
+using Poco::Thread;
+using Poco::Timespan;
+using Poco::Timestamp;
+using Poco::URI;
+using Poco::Util::Application;
+using Poco::Util::HelpFormatter;
+using Poco::Util::Option;
+using Poco::Util::OptionSet;
+
+class Worker: public Runnable
+{
+public:
+ Tool& _app;
+ std::vector< std::string > _files;
+ Worker(Tool& app, const std::vector< std::string > & files) :
+ _app(app), _files(files)
+ {
+ }
+
+ void run() override
+ {
+ for (auto i : _files)
+ convertFile(i);
+ }
+
+ void convertFile(const std::string& document)
+ {
+ std::cerr << "convert file " << document << "\n";
+
+ Poco::URI uri(_app._serverURI);
+ Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort());
+ Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/convert-to");
+
+ try {
+ Poco::Net::HTMLForm form;
+ form.setEncoding(Poco::Net::HTMLForm::ENCODING_MULTIPART);
+ form.set("format", _app._destinationFormat);
+ form.addPart("data", new Poco::Net::FilePartSource(document));
+ form.prepareSubmit(request);
+
+ // If this results in a Poco::Net::ConnectionRefusedException, loolwsd is not running.
+ form.write(session.sendRequest(request));
+ }
+ catch (const Poco::Exception &e)
+ {
+ std::cerr << "Failed to connect: " << e.name() <<
+ " " << e.message() << "\n";
+ return;
+ }
+
+ Poco::Net::HTTPResponse response;
+ std::stringstream actualStream;
+
+ // receiveResponse() resulted in a Poco::Net::NoMessageException.
+ std::istream& responseStream = session.receiveResponse(response);
+ Poco::StreamCopier::copyStream(responseStream, actualStream);
+
+ // FIXME: implement destinationDir
+ Poco::Path path(document);
+
+ std::string outPath = path.getBaseName() + "." + _app._destinationFormat;
+ std::cerr << "write to " << outPath << "\n";
+ std::ifstream fileStream(outPath);
+ std::stringstream expectedStream;
+ expectedStream << fileStream.rdbuf();
+
+ // In some cases the result is prefixed with (the UTF-8 encoding of) the Unicode BOM
+ // (U+FEFF). Skip that.
+ std::string actualString = actualStream.str();
+ if (actualString.size() > 3 && actualString[0] == '\xEF' && actualString[1] == '\xBB' && actualString[2] == '\xBF')
+ actualString = actualString.substr(3);
+ }
+};
+
+Tool::Tool() :
+ _numWorkers(4),
+#if ENABLE_SSL
+ _serverURI("https://localhost:" + std::to_string(DEFAULT_CLIENT_PORT_NUMBER) + "/wss"),
+#else
+ _serverURI("http://localhost:" + std::to_string(DEFAULT_CLIENT_PORT_NUMBER) + "/ws"),
+#endif
+ _destinationFormat("txt")
+{
+}
+
+void Tool::defineOptions(OptionSet& optionSet)
+{
+ Application::defineOptions(optionSet);
+
+ optionSet.addOption(Option("help", "", "Display help information on command line arguments.")
+ .required(false).repeatable(false));
+ optionSet.addOption(Option("extension", "", "file format extension to convert to")
+ .required(false).repeatable(false)
+ .argument("format"));
+ optionSet.addOption(Option("outdir", "", "output directory for converted files")
+ .required(false).repeatable(false));
+ optionSet.addOption(Option("parallelism", "", "number of simultaneous threads to use")
+ .required(false) .repeatable(false)
+ .argument("threads"));
+ optionSet.addOption(Option("server", "", "URI of LOOL server")
+ .required(false).repeatable(false)
+ .argument("uri"));
+}
+
+void Tool::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 == "format")
+ _destinationFormat = value;
+ else if (optionName == "outdir")
+ _destinationDir = value;
+ else if (optionName == "threads")
+ _numWorkers = std::min(std::stoi(value), 1);
+ else if (optionName == "uri")
+ _serverURI = value;
+}
+
+int Tool::main(const std::vector<std::string>& args)
+{
+ Thread *clients[_numWorkers];
+
+ size_t chunk = (args.size() + _numWorkers - 1) / _numWorkers;
+ size_t offset = 0;
+ for (unsigned i = 0; i < _numWorkers; i++)
+ {
+ clients[i] = new Thread();
+ size_t toCopy = std::min(args.size() - offset, chunk);
+ if (toCopy > 0)
+ {
+ std::vector< std::string > files( toCopy );
+ std::copy( args.begin() + offset, args.begin() + offset + chunk, files.begin() );
+ offset += toCopy;
+ clients[i]->start(*(new Worker(*this, files)));
+ }
+ }
+
+ for (unsigned i = 0; i < _numWorkers; i++)
+ {
+ clients[i]->join();
+ }
+
+ return Application::EXIT_OK;
+}
+
+POCO_APP_MAIN(Tool)
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loolwsd/Makefile.am b/loolwsd/Makefile.am
index 0748c6c..d5feb3a 100644
--- a/loolwsd/Makefile.am
+++ b/loolwsd/Makefile.am
@@ -1,6 +1,6 @@
SUBDIRS = . test
-bin_PROGRAMS = loolwsd loolforkit loolmap loolmount
+bin_PROGRAMS = loolwsd loolforkit loolmap loolmount looltool
dist_bin_SCRIPTS = loolwsd-systemplate-setup
@@ -69,6 +69,8 @@ loolmount_SOURCES = loolmount.c
loolmap_SOURCES = loolmap.c
+looltool_SOURCES = LOOLTool.cpp
+
noinst_HEADERS = Admin.hpp \
AdminModel.hpp \
Auth.hpp \
commit 349e2a5a49eb4ebb0d5e542bf07a4aaf7a3aa1b6
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Thu Apr 14 14:30:27 2016 +0100
Add SEGV and trace hunter, and update log parser a little.
diff --git a/scripts/logparse.pl b/scripts/logparse.pl
index 72676ac..75444ef 100755
--- a/scripts/logparse.pl
+++ b/scripts/logparse.pl
@@ -98,7 +98,12 @@ while (my $line = shift @input) {
}
}
- if ($line =~/Initializing wsd/) {
+ # systemd[1]: loolwsd.service: main process exited, code=killed, status=11/SEGV
+ if ($line =~m/loolwsd.service: main process exited.*status=(.*)$/) {
+ print "loolwsd exit: $1\n";
+ }
+
+ if ($line =~m/Initializing wsd/) {
print "Re-started\n";
clear_state(\%sessions, \%lok_starting, \%lok_running);
}
@@ -109,7 +114,7 @@ while (my $line = shift @input) {
# [loolkit ] loolkit [1689] is ready.
# [loolbroker ] Child 1536 terminated.
# [loolbroker ] Child process [1689] exited with code: 0.
- if ($line =~ m/loolbroker.*Spawned kit \[(\d+)\]./) {
+ if ($line =~ m/loolbroker.*Forked kit \[(\d+)\]./) {
my $pid = $1;
$lok_starting{$pid} = 1;
$pevent = "newkit\t\"$pid\"";
diff --git a/scripts/segv-catch.pl b/scripts/segv-catch.pl
new file mode 100755
index 0000000..dc8bd8e
--- /dev/null
+++ b/scripts/segv-catch.pl
@@ -0,0 +1,22 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+while (<STDIN>) {
+ my $line = $_;
+ $line =~ s/\r*\n*//g;
+
+ $line =~ m/Fatal signal received: (.*)$/ || next;
+ my $signal = $1;
+
+ # 2016-04-12T20:06:49.626770+00:00 ip-172-31-34-231 loolwsd[5918]: kit-02721 Fatal signal received: SIGSEGV
+
+ $line =~ m/(\d+-\d+-\d+)T(\d+:\d+:\d+\.)\S+\s+\S+\s+(\S+)\s+(.*)$/ || die "bad line: '$line'";
+ my ($day, $time, $process, $msg) = ($1, $2, $3, $4);
+
+ print "$day $time $process $signal\n";
+}
+# 2016-04-12T20:06:49.627111+00:00 ip-172-31-34-231 loolwsd[5918]: Backtrace:
+# 2016-04-12T20:06:49.627455+00:00 ip-172-31-34-231 loolwsd[5918]: /usr/bin/loolforkit() [0x43e86d]
+# 2016-04-12T20:06:49.627795+00:00 ip-172-31-34-231 loolwsd[5918]: /lib64/libpthread.so.0(+0xf890) [0x7f9389f97890]
+
More information about the Libreoffice-commits
mailing list