loolwsd/test/Makefile.am | 2 - loolwsd/test/UnitPrefork.cpp | 70 ++++++++++++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 25 deletions(-)
New commits: commit 8a8323d0a05d3cb42662790d304b14f9e4788bd3 Author: Michael Meeks <michael.me...@collabora.com> Date: Wed Oct 5 23:17:33 2016 +0100 More UnitPrefork cleanup. Log data to std::cerr - so it goes to the log files. Dump PSS / Dirty per child process for comparison. Copy the child socket array before operating on it to fix a crash. Add debug to ensure we are getting each child's true size. diff --git a/loolwsd/test/Makefile.am b/loolwsd/test/Makefile.am index 0dfe9b7..70c073a 100644 --- a/loolwsd/test/Makefile.am +++ b/loolwsd/test/Makefile.am @@ -68,7 +68,7 @@ if HAVE_LO_PATH check-local: ./run_unit.sh --log-file test.log --trs-file test.trs # FIXME unit-fonts.la is unstable, disabled for now. -TESTS = unit-tilecache.la unit-admin.la unit-timeout.la unit-storage.la unit-prefork.la +TESTS = unit-timeout.la unit-prefork.la unit-tilecache.la unit-admin.la unit-storage.la else TESTS = ${top_builddir}/test/test endif diff --git a/loolwsd/test/UnitPrefork.cpp b/loolwsd/test/UnitPrefork.cpp index d3c2804..393d449 100644 --- a/loolwsd/test/UnitPrefork.cpp +++ b/loolwsd/test/UnitPrefork.cpp @@ -10,6 +10,7 @@ #include <dirent.h> #include <dlfcn.h> #include <ftw.h> +#include <sys/time.h> #include <sys/types.h> #include <cassert> @@ -36,18 +37,21 @@ class UnitPrefork : public UnitWSD { std::string _failure; Poco::Timestamp _startTime; - size_t _totalPSS; - size_t _totalDirty; + size_t _childPSS; + size_t _childDirty; std::mutex _mutex; std::condition_variable _cv; std::vector< std::shared_ptr<Poco::Net::WebSocket> > _childSockets; public: UnitPrefork() - : _totalPSS(0), - _totalDirty(0) + : _childPSS(0), + _childDirty(0) { setHasKitHooks(); +#ifdef TEST_DIRTY_NUMBERS + setTimeout(100 * 1000); +#endif } virtual void preSpawnCount(int &numPrefork) override @@ -67,8 +71,8 @@ public: Log::info("Got memory stats [" + memory + "]."); Poco::StringTokenizer tokens(memory, " "); assert(tokens.count() == 2); - _totalPSS += atoi(tokens[0].c_str()); - _totalDirty += atoi(tokens[1].c_str()); + _childPSS = atoi(tokens[0].c_str()); + _childDirty = atoi(tokens[1].c_str()); } // Don't signal before wait. @@ -78,7 +82,7 @@ public: } bool getMemory(const std::shared_ptr<Poco::Net::WebSocket> &socket, - size_t &totalPSS, size_t &totalDirty) + size_t &childPSS, size_t &childDirty) { std::unique_lock<std::mutex> lock(_mutex); @@ -88,12 +92,14 @@ public: if (_cv.wait_for(lock, std::chrono::milliseconds(5 * 1000)) == std::cv_status::timeout) { _failure = "Timed out waiting for child to respond to unit-memdump."; - Log::error(_failure); + std::cerr << _failure << std::endl; return false; } - totalPSS = _totalPSS; - totalDirty = _totalDirty; + childPSS = _childPSS; + childDirty = _childDirty; + _childPSS = 0; + _childDirty = 0; return true; } @@ -109,37 +115,44 @@ public: << totalTime << Log::end; size_t totalPSSKb = 0; size_t totalDirtyKb = 0; + + auto socketsCopy = _childSockets; + // Skip the last one as it's not completely initialized yet. - for (size_t i = 0; i < _childSockets.size() - 1; ++i) + for (size_t i = 0; i < socketsCopy.size() - 1; ++i) { - Log::info() << "Getting memory of child #" << i + 1 << " of " << _childSockets.size() << Log::end; - if (!getMemory(_childSockets[i], totalPSSKb, totalDirtyKb)) + Log::info() << "Getting memory of child #" << i + 1 << " of " << socketsCopy.size() << Log::end; + size_t childPSSKb = 0, childDirtyKb = 0; + if (!getMemory(socketsCopy[i], childPSSKb, childDirtyKb)) { exitTest(TestResult::TEST_FAILED); return; } + std::cerr << "child # " << i + 1 << " pss: " << childPSSKb << " dirty: " << childDirtyKb << std::endl; + totalPSSKb += childPSSKb; + totalDirtyKb += childDirtyKb; } - Log::info() << "Memory use total " << totalPSSKb << "k shared " - << totalDirtyKb << "k dirty" << Log::end; + std::cerr << "Memory use total " << totalPSSKb << "k shared " + << totalDirtyKb << "k dirty" << std::endl; - totalPSSKb /= _childSockets.size(); - totalDirtyKb /= _childSockets.size(); - Log::info() << "Memory use average " << totalPSSKb << "k shared " - << totalDirtyKb << "k dirty" << Log::end; + totalPSSKb /= socketsCopy.size(); + totalDirtyKb /= socketsCopy.size(); + std::cerr << "Memory use average " << totalPSSKb << "k shared " + << totalDirtyKb << "k dirty" << std::endl; - Log::info() << "Launch time total " << totalTime << " ms" << Log::end; - totalTime /= _childSockets.size(); - Log::info() << "Launch time average " << totalTime << " ms" << Log::end; + std::cerr << "Launch time total " << totalTime << " ms" << std::endl; + totalTime /= socketsCopy.size(); + std::cerr << "Launch time average " << totalTime << " ms" << std::endl; if (!_failure.empty()) { - Log::error("UnitPrefork failed due to: " + _failure); + std::cerr << "UnitPrefork failed due to: " << _failure << std::endl; exitTest(TestResult::TEST_FAILED); } else { - Log::error("UnitPrefork success."); + std::cerr << "UnitPrefork success." << std::endl; exitTest(TestResult::TEST_OK); } } @@ -293,6 +306,15 @@ public: const auto token = LOOLProtocol::getFirstToken(message); if (token == "unit-memdump:") { +#ifdef TEST_DIRTY_NUMBERS + // Jitter the numbers so they're not all the same. + struct timeval t; + gettimeofday(&t, NULL); + srand(t.tv_usec); + size_t size = ((size_t)rand() * 4096 * 1024) / RAND_MAX; + std::cerr << "allocate " << size << std::endl; + memset (malloc (size), 0, size); +#endif std::string memory; if (!_failure.empty()) memory = _failure; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits