[Libreoffice-commits] online.git: wsd/Admin.cpp wsd/Admin.hpp wsd/AdminModel.cpp wsd/AdminModel.hpp
Gabriel Masei (via logerrit)
logerrit at kemper.freedesktop.org
Thu Jun 4 10:59:54 UTC 2020
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 <gabriel.masei at 1and1.ro>
AuthorDate: Fri May 29 14:32:04 2020 +0300
Commit: Michael Meeks <michael.meeks at collabora.com>
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 <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
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);
More information about the Libreoffice-commits
mailing list