wsd/Admin.cpp | 9 +++++++++ wsd/Admin.hpp | 1 + wsd/AdminModel.cpp | 27 +++++++++++++++++++++++++-- wsd/AdminModel.hpp | 15 +++++++++++---- 4 files changed, 46 insertions(+), 6 deletions(-)
New commits: commit 16f6d8c25a99fcd47b40b27c01d0f24e80341348 Author: Gabriel Masei <[email protected]> AuthorDate: Fri May 29 14:32:04 2020 +0300 Commit: Michael Meeks <[email protected]> CommitDate: Thu Jun 4 12:59:34 2020 +0200 admin: notify subscribers that doc memory has changed Change-Id: I139c7d49a2cd1b86c3a281613f5628f6af8b3365 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/95133 Tested-by: Jenkins Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Meeks <[email protected]> diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp index 8d85dfbc7..78956b222 100644 --- a/wsd/Admin.cpp +++ b/wsd/Admin.cpp @@ -443,6 +443,8 @@ void Admin::pollingThread() std::chrono::duration_cast<std::chrono::milliseconds>(now - lastMem).count(); if (memWait <= MinStatsIntervalMs / 2) // Close enough { + _model.UpdateMemoryDirty(); + const size_t totalMem = getTotalMemoryUsage(); _model.addMemStats(totalMem); @@ -454,6 +456,8 @@ void Admin::pollingThread() _lastTotalMemory = totalMem; } + notifyDocsMemDirtyChanged(); + memWait += _memStatsTaskIntervalMs; lastMem = now; } @@ -764,6 +768,11 @@ void Admin::triggerMemoryCleanup(const size_t totalMem) } } +void Admin::notifyDocsMemDirtyChanged() +{ + _model.notifyDocsMemDirtyChanged(); +} + void Admin::dumpState(std::ostream& os) { // FIXME: be more helpful ... diff --git a/wsd/Admin.hpp b/wsd/Admin.hpp index 42e7a247a..5a3feee61 100644 --- a/wsd/Admin.hpp +++ b/wsd/Admin.hpp @@ -148,6 +148,7 @@ private: /// Memory consumption has increased, start killing kits etc. till memory consumption gets back /// under @hardModeLimit void triggerMemoryCleanup(size_t hardModeLimit); + void notifyDocsMemDirtyChanged(); /// Round the interval up to multiples of MinStatsIntervalMs. /// This is to avoid arbitrarily small intervals that hammer the server. diff --git a/wsd/AdminModel.cpp b/wsd/AdminModel.cpp index ab2d81df7..387796452 100644 --- a/wsd/AdminModel.cpp +++ b/wsd/AdminModel.cpp @@ -134,16 +134,18 @@ std::string Document::to_string() const return oss.str(); } -int Document::getMemoryDirty() const +void Document::updateMemoryDirty() { // Avoid accessing smaps too often const time_t now = std::time(nullptr); if (now - _lastTimeSMapsRead >= 5) { + int lastMemDirty = _memoryDirty; _memoryDirty = _procSMaps ? Util::getPssAndDirtyFromSMaps(_procSMaps).second : 0; _lastTimeSMapsRead = now; + if (lastMemDirty != _memoryDirty) + _hasMemDirtyChanged = true; } - return _memoryDirty; } bool Subscriber::notify(const std::string& message) @@ -1041,4 +1043,25 @@ std::set<pid_t> AdminModel::getDocumentPids() const return pids; } +void AdminModel::UpdateMemoryDirty() +{ + for (const auto& it: _documents) + { + it.second->updateMemoryDirty(); + } +} + +void AdminModel::notifyDocsMemDirtyChanged() +{ + for (const auto& it: _documents) + { + int memoryDirty = it.second->getMemoryDirty(); + if (it.second->hasMemDirtyChanged()) + { + notify("propchange " + std::to_string(it.second->getPid()) + " mem " + std::to_string(memoryDirty)); + it.second->setMemDirtyChanged(false); + } + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/wsd/AdminModel.hpp b/wsd/AdminModel.hpp index ae88ef8cd..98bd01495 100644 --- a/wsd/AdminModel.hpp +++ b/wsd/AdminModel.hpp @@ -121,7 +121,8 @@ public: _wopiUploadDuration(0), _procSMaps(nullptr), _lastTimeSMapsRead(0), - _isModified(false) + _isModified(false), + _hasMemDirtyChanged(true) { } @@ -155,7 +156,8 @@ public: const std::map<std::string, View>& getViews() const { return _views; } void updateLastActivityTime() { _lastActivity = std::time(nullptr); } - int getMemoryDirty() const; + void updateMemoryDirty(); + int getMemoryDirty() const { return _memoryDirty; } std::pair<std::time_t, std::string> getSnapshot() const; const std::string getHistory() const; @@ -182,6 +184,8 @@ public: void setWopiUploadDuration(const std::chrono::milliseconds wopiUploadDuration) { _wopiUploadDuration = wopiUploadDuration; } std::chrono::milliseconds getWopiUploadDuration() const { return _wopiUploadDuration; } void setProcSMapsFD(const int smapsFD) { _procSMaps = fdopen(smapsFD, "r"); } + bool hasMemDirtyChanged() const { return _hasMemDirtyChanged; } + void setMemDirtyChanged(bool changeStatus) { _hasMemDirtyChanged = changeStatus; } std::string to_string() const; @@ -195,7 +199,7 @@ private: /// Hosted filename std::string _filename; /// The dirty (ie. un-shared) memory of the document's Kit process. - mutable int _memoryDirty; + int _memoryDirty; /// Last noted Jiffy count unsigned _lastJiffy; @@ -212,11 +216,12 @@ private: std::chrono::milliseconds _wopiUploadDuration; FILE* _procSMaps; - mutable std::time_t _lastTimeSMapsRead; + std::time_t _lastTimeSMapsRead; /// Per-doc kit process settings. DocProcSettings _docProcSettings; bool _isModified; + bool _hasMemDirtyChanged; }; /// An Admin session subscriber. @@ -337,6 +342,8 @@ public: void getMetrics(std::ostringstream &oss); std::set<pid_t> getDocumentPids() const; + void UpdateMemoryDirty(); + void notifyDocsMemDirtyChanged(); static int getPidsFromProcName(const std::regex& procNameRegEx, std::vector<int> *pids); _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
