From 82474d356403d6b91c6b8ad1937e942f53f809e8 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Fri, 2 Sep 2022 21:57:32 +0000 Subject: [PATCH] Handle monotonic clock going backwards during runtime We've had some users complain that `duration_since` is panic'ing for them. This is possible if the machine being run on is buggy and the "monotonic clock" goes backwards, which sadly some ancient systems can do. Rust addressed this issue in 1.60 by forcing `Instant::duration_since` to not panic if the machine is buggy (and time goes backwards), but for users on older rust versions we do the same by hand here. --- lightning/src/util/time.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lightning/src/util/time.rs b/lightning/src/util/time.rs index d3768aa7..f450dc2c 100644 --- a/lightning/src/util/time.rs +++ b/lightning/src/util/time.rs @@ -65,7 +65,12 @@ impl Time for std::time::Instant { } fn duration_since(&self, earlier: Self) -> Duration { - self.duration_since(earlier) + // On rust prior to 1.60 `Instant::duration_since` will panic if time goes backwards. + // However, we support rust versions prior to 1.60 and some users appear to have "monotonic + // clocks" that go backwards in practice (likely relatively ancient kernels/etc). Thus, we + // manually check for time going backwards here and return a duration of zero in that case. + let now = Self::now(); + if now > earlier { now - earlier } else { Duration::from_secs(0) } } fn duration_since_epoch() -> Duration { -- 2.30.2