Skip to content

Commit a4233ac

Browse files
committed
RingBuffer: Fix gaps being ignored in __len__()
Signed-off-by: Mathias L. Baumann <[email protected]>
1 parent 1de6688 commit a4233ac

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/frequenz/sdk/timeseries/_ringbuffer/buffer.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,10 +517,24 @@ def __len__(self) -> int:
517517
if self._datetime_newest == self._DATETIME_MIN:
518518
return 0
519519

520+
# Sum of all elements in the gap ranges
521+
sum_missing_entries = max(
522+
0,
523+
sum(
524+
(
525+
gap.end
526+
# Don't look further back than oldest timestamp
527+
- max(gap.start, self._datetime_oldest)
528+
)
529+
// self._sampling_period
530+
for gap in self._gaps
531+
),
532+
)
533+
520534
start_index = self.datetime_to_index(self._datetime_oldest)
521535
end_index = self.datetime_to_index(self._datetime_newest)
522536

523537
if end_index < start_index:
524-
return len(self._buffer) - start_index + end_index + 1
538+
return len(self._buffer) - start_index + end_index + 1 - sum_missing_entries
525539

526-
return end_index + 1 - start_index
540+
return end_index + 1 - start_index - sum_missing_entries

tests/timeseries/test_ringbuffer.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,21 @@ def test_len_ringbuffer_samples_fit_buffer_size() -> None:
289289
assert len(buffer) == len(test_samples)
290290

291291

292+
def test_len_with_gaps() -> None:
293+
"""Test the length when there are gaps in the buffer."""
294+
buffer = OrderedRingBuffer(
295+
np.empty(shape=10, dtype=float),
296+
sampling_period=timedelta(seconds=1),
297+
align_to=datetime(1, 1, 1, tzinfo=timezone.utc),
298+
)
299+
300+
for i in range(10):
301+
buffer.update(
302+
Sample(datetime(2, 2, 2, 0, 0, i, tzinfo=timezone.utc), Quantity(float(i)))
303+
)
304+
assert len(buffer) == i + 1
305+
306+
292307
def test_len_ringbuffer_samples_overwrite_buffer() -> None:
293308
"""Test the length of ordered ring buffer.
294309

0 commit comments

Comments
 (0)