@@ -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
4850void 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 }
0 commit comments