Skip to content

RRL-v3.0.4

Choose a tag to compare

@github-actions github-actions released this 21 Aug 13:19
· 1 commit to main since this release

Enodo Robotics fork of the Rerun viewer. Wheels for Linux x86_64, Windows x86_64 and macOS Apple Silicon are attached.

⚠️ Breaking: rotated files are named by time span, not by a counter

With --save-interval, rotated files change name:

before:  enodo_logging_7.rrd
now:     enodo_logging_1787311808091__1787311810091.rrd

Any consumer that parses the integer suffix must be updated in lockstep with this wheel.

  • Parse start_ms / end_ms from the filename. Both are epoch milliseconds — an offset from 1970-01-01T00:00:00Z, so no timezone is involved — zero-padded to 13 digits, so lexical order equals chronological order. This replaces deriving the span from mtime minus a hard-coded 12000 ms, which measured as wrong: real content spans were 3.0 s and 8.3 s against a 12 s assumption.
  • Sorting by integer suffix no longer works; ordering now comes from the names themselves.
  • Discovery is unchanged — the names still match enodo_logging_*.rrd.
  • Consecutive segments tile exactly: end_ms(N) == start_ms(N+1). A gap between filenames is therefore a real hole in coverage, not an artifact of the naming.
  • mtime is still the segment end to within ~1 ms, since the rename preserves it — so an interim end = mtime approach keeps working during migration.

The window is the interval during which the sink held the segment open, not the span of the data inside it, so an idle interval still produces a correctly-named file.

Half-written and crashed segments

  • A segment is written as <base>.partial_<start_ms>.rrd, fsynced, and only renamed into place once complete. That name deliberately does not match <base>_*.rrd, so a consumer globbing for finished segments can no longer pick up a file that is still being written — a race that existed before this release.
  • SIGINT and SIGTERM are now caught while a rotating sink is active, so a normal systemctl stop finalizes the open segment instead of orphaning it.
  • A hard crash (SIGKILL, power loss) still leaves a .partial_ file holding real data. It is not recovered automatically, but its start time is readable from the name and its end is approximately its mtime. The next start logs a warning listing any it finds.

Caveat for coverage logic

Idle intervals produce a file with no RRD footer, so those files fail rrd verify and raise when read. This is pre-existing behaviour, not new in this release — but it means "every segment in this hour parses" is not a safe assumption. The filename is the reliable source for a segment's span.

Installing

Every RRL-* wheel reports the same SDK version (0.32.0a1+dev), so pip will not see this as an upgrade from an earlier RRL build. Install with --force-reinstall, or pin by URL. Verify with rerun --version, which contains the RRL tag and commit.