Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zenoh timestamps will roll over in 12 years #1252

Open
andrew-otiv opened this issue Jul 22, 2024 · 3 comments
Open

Zenoh timestamps will roll over in 12 years #1252

andrew-otiv opened this issue Jul 22, 2024 · 3 comments
Labels
bug Something isn't working

Comments

@andrew-otiv
Copy link

Describe the bug

The 32 bit seconds-since-unix-epoch format used by the uhlc crate, based on the 32 bit seconds in NTP, will roll over in only 12 years (2036). I've seen in a few places on the internet that the likely resolution will be for NTP's seconds to be upgraded to u64 seconds. Protobufs already use a 64 bit seconds, 32 bit nanoseconds format (but truncated to ). This seems compatible with the hybrid logical clock concept.

The rust protobuf library we're using is prost, which has a type:
https://docs.rs/prost-types/latest/prost_types/struct.Timestamp.html

Using an EPOCH other than the unix epoch would extend the usefulness of zenoh timestamps, but I think that would be more error prone for users than using a higher capacity clock.

To reproduce

Time travel a baker's decade into the future and watch systems build on zenoh fail.

System info

affects all platforms, unless I'm missing something.

@andrew-otiv andrew-otiv added the bug Something isn't working label Jul 22, 2024
@noxpardalis
Copy link

Hi, I'm not from the Zenoh team (from the Cyclone DDS sister project 🌪️ instead 👋) but I wanted to chime-in with a clarification that the 2038 roll-over is if you're using 32-bit signed integers for representing the time since Unix epoch. If you're using unsigned integers the boundary is 7 February 2106 at 06:28:15 UTC (2106-07-02T06:28:15Z).

When doing some quick testing with the uhlc crate by @JEnoch:

use uhlc::Timestamp;

fn main() {
    let timestamp_valid = Timestamp::parse_rfc3339("2106-02-07T06:28:15Z/33");
    println!("{timestamp_valid:?}");
    println!("{:#}", timestamp_valid.unwrap());
    let timestamp_panic = Timestamp::parse_rfc3339("2106-02-07T06:28:16Z/33");
    println!("it panics");
}

You'll have the first timestamp on the boundary parse and the subsequent timestamp panic.

Ok(18446744069414584321/33)
2106-02-07T06:28:15.000000000Z/33
thread 'main' panicked at .../.cargo/registry/src/index.crates.io-6f17d22bba15001f/uhlc-0.8.0/src/ntp64.rs:281:9:
assertion failed: secs <= MAX_NB_SEC

The MAX_NB_SEC constant is defined here as:

// maximal number of seconds that can be represented in the 32-bits part
const MAX_NB_SEC: u64 = (1u64 << 32) - 1;

According to https://datatracker.ietf.org/doc/html/rfc5905#section-6 the representation used in the NTP 64-bit timestamp format is capable of supporting 136 years per era which from Unix epoch indeed corresponds to 2106. So I think the boundary here is defintely more than 13 years away.

@Mallets
Copy link
Member

Mallets commented Jul 23, 2024

Thanks @noxpardalis , very insightful! Then I believe we are safe for now and for another 82 years...

@andrew-otiv
Copy link
Author

I stand corrected! I didn't dig deep enough... and just saw that uhlc was guaranteed to be close to NTP timestamps in the HLC paper: https://cse.buffalo.edu/tech-reports/2014-04.pdf

and that NTP Timestamps have issues starting in 2038:
https://www.ntp.org/reflib/y2k/#:~:text=An%20NTP%20timestamp%20is%20a,a%20precision%20of%20232%20ps.

For your entertainment, we are writing software for electric locomotives. They're expensive and do not get replaced frequently. Not counting old steam locomotives that are only kept alive for tourism, the oldest loco still in service, Amtrak 737, was built in 1942, so 82 years old. If we shipped our software on a brand new locomotive today, if the entire subsystem never gets ripped out and replaced, if we never had the opportunity to update our software for 82 years, and if nothing else dooms the locomotive to obsolescence first, then there is still an absurdly small remaining chance that the uint32 seconds in our zenoh dependency will be the first thing that breaks in exactly 82 years!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants