Skip to content

Commit d72dcba

Browse files
committed
Improve Record Node disk space monitoring accuracy
Implement smoothed data rate calculation
1 parent 27a672f commit d72dcba

3 files changed

Lines changed: 22 additions & 9 deletions

File tree

Source/Processors/RecordNode/DiskMonitor/DiskSpaceChecker.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ DiskSpaceChecker::DiskSpaceChecker (RecordNode* rn)
2929
lastUpdateTime (0),
3030
lastFreeSpace (0),
3131
dataRate (0),
32+
smoothedDataRate (0),
3233
recordingTimeLeftInSeconds (0)
3334
{
3435
startTimerHz (1);
@@ -43,6 +44,7 @@ void DiskSpaceChecker::reset()
4344
{
4445
lastUpdateTime = Time::getMillisecondCounterHiRes();
4546
lastFreeSpace = recordNode->getDataDirectory().getBytesFreeOnVolume();
47+
smoothedDataRate = 0.0f;
4648
}
4749

4850
void DiskSpaceChecker::addListener (DiskSpaceListener* listener)
@@ -94,18 +96,27 @@ void DiskSpaceChecker::checkDirectoryAndDiskSpace()
9496
lastUpdateTime = currentTime;
9597
lastFreeSpace = bytesFree;
9698

97-
recordingTimeLeftInSeconds = bytesFree / dataRate / 1000.0f;
99+
// Smooth with an exponential moving average to prevent a single OS write-back
100+
// cache flush from transiently inflating dataRate and causing a false positive.
101+
// Seed the EMA with the first positive measurement so it is useful immediately.
102+
static constexpr float alpha = 0.25f;
103+
if (smoothedDataRate <= 0.0f)
104+
smoothedDataRate = (dataRate > 0.0f) ? dataRate : 0.0f;
105+
else if (dataRate > 0.0f)
106+
smoothedDataRate = alpha * dataRate + (1.0f - alpha) * smoothedDataRate;
98107

99-
// Stop recording and show warning when less than 5 minutes of disk space left
100-
if (dataRate > 0.0f && recordingTimeLeftInSeconds < (60.0f * 5.0f))
108+
if (smoothedDataRate > 0.0f)
101109
{
102-
CoreServices::setRecordingStatus (false);
103-
notifyLowDiskSpace();
104-
}
110+
recordingTimeLeftInSeconds = bytesFree / smoothedDataRate / 1000.0f;
105111

106-
if (dataRate > 0.0f)
107-
{
108-
update (dataRate, bytesFree, recordingTimeLeftInSeconds);
112+
// Stop recording and show warning when less than 5 minutes of disk space left
113+
if (recordingTimeLeftInSeconds < (60.0f * 5.0f))
114+
{
115+
CoreServices::setRecordingStatus (false);
116+
notifyLowDiskSpace();
117+
}
118+
119+
update (smoothedDataRate, bytesFree, recordingTimeLeftInSeconds);
109120
}
110121
}
111122
}

Source/Processors/RecordNode/DiskMonitor/DiskSpaceChecker.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class DiskSpaceChecker : public Timer
6767
float lastUpdateTime;
6868
int64 lastFreeSpace;
6969
float dataRate;
70+
float smoothedDataRate;
7071
float recordingTimeLeftInSeconds;
7172

7273
std::vector<DiskSpaceListener*> listeners;

Source/Processors/RecordNode/RecordNode.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,7 @@ void RecordNode::startRecording()
920920

921921
recordThread->setFileComponents (rootFolder, experimentNumber, recordingNumber);
922922
recordThread->startThread (Thread::Priority::highest);
923+
diskSpaceChecker->reset();
923924

924925
if (settingsNeeded)
925926
{

0 commit comments

Comments
 (0)