Every source behind this page, graded. This corpus is unusually strong in
source-code records (the arguments happened in public issue trackers) and carries no talk
tier: the relevant talks exist but sit on hosts this research session could not reach, so
they are pointed to in section 8 rather than cited as read.
Postmortem
Cloudflare2017-01
How and why the leap second affected Cloudflare DNS
The canonical backwards-time incident: a negative wall-clock subtraction stored as
state, a panic three steps later, and a fleet failing simultaneously. Names its own root
cause as a belief, not a bug.
Carry forwardGrep for durations computed from wall-clock reads; each one is a fleet-wide simultaneous fault waiting for a clock step.
blog.cloudflare.com
Postmortem
Microsoft2012-03
Summary of Windows Azure Service Disruption on Feb 29th, 2012
Year+1 date arithmetic met February 29. The lasting lesson is the amplifier: health
automation read a software bug as mass hardware failure and quarantined healthy hosts.
Carry forwardBound the blast radius of automated health verdicts; a time bug fires everywhere at once and looks exactly like fleet-wide hardware death.
azure.microsoft.com
Source
Linux kernel2012
commit 6b43ae8a: ntp: Fix leap-second hrtimer livelock
The leap-second insertion path could deadlock against the timekeeping locks. The
subsystem that implements clocks is not immune to clock bugs.
Carry forwardIf your platform steps time, the step itself is in your failure model; smearing exists to retire this whole class.
github.com/torvalds/linux
Source
Linux kernel2012-07
commit 4873fa07: timekeeping: Fix leapsecond triggered load spike issue
After the June 2012 leap second, CLOCK_REALTIME hrtimers fired a second early and
applications spun. The commit message preserves the industry-wide workaround,
date -s "`date`", as a fossil of the night.
Carry forwardTimers armed against the wall clock inherit every wall-clock discontinuity; absolute deadlines belong on the monotonic clock.
github.com/torvalds/linux
Source
Go project2015-10
Issue #12914: time: use monotonic clock to measure elapsed time
The request that sat for 15 months: Go offered no monotonic source, so measuring an
operation reliably required platform-specific code. Milestoned to Go 1.9 only after the
2017 outage.
Carry forwardA known API gap costs little until the day it costs a fleet; the issue tracker dates let you show a review exactly how that timeline runs.
github.com/golang/go
ADR
Go project2017-01
Proposal: Monotonic Elapsed Time Measurements in Go
Russ Cox's design record: cites the Cloudflare outage as motivation, quantifies the
corpus (30% of call sites measure elapsed time), and rejects the two-API design because
its failures are simultaneous fleet-wide, not random.
Carry forwardJudge API designs by the correlation of their failure modes, not just their frequency; rare-but-simultaneous is worse than common-but-independent.
github.com/golang/proposal
Vendor
Go project2017
Go 1.9 release notes: transparent monotonic time
The shipped outcome: "the time package now transparently tracks monotonic time in
each Time value, making computing durations between two Time values a safe operation in
the presence of wall clock adjustments."
Carry forwardLanguage-level fixes retire bug classes; if your platform predates one, the class is still open in your codebase.
github.com/golang/go
Vendor
Go projectcurrent
package time, Monotonic Clocks section
The operating rule and its boundary: subtraction and comparison use the monotonic
reading; serialisation strips it because it has no meaning outside the process.
Carry forwardThe protection ends at the process boundary; any timestamp that crosses a wire is wall-clock again, with everything that implies.
pkg.go.dev/time
Source
Rust project2018-12
Issue #56612: Instant::now can go backward
The monotonic clock itself lying: QueryPerformanceCounter regressing on some Windows
multi-core systems, panicking Rust programs with "specified instant was later than
self".
Carry forward"Monotonic" is a promise the OS sometimes breaks via hardware and hypervisors; decide before shipping what your code does when it happens.
github.com/rust-lang/rust
Source
Rust project2019-01
PR #56988: std: Force Instant::now() to be monotonic
The first answer: a global watermark in std, mirroring Firefox, because platform
clocks "seem buggy enough that we can't rely on them in practice".
Carry forwardEnforcement in a hot path has a price you have not measured yet; record the option to retreat when you take this road.
github.com/rust-lang/rust
Source
Rust project2022-02
PR #89926: make Instant arithmetic saturating, remove workarounds
The reversal, three years later: "we must choose between two poisons", enforcement
costing over 100x worst-case, versus rare panics from platform bugs. Rust chose the
quiet poison and saturates to zero.
Carry forwardWhen both options are poisons, pick the one whose failure is survivable in production and loud in tests; saturate in release, panic in debug.
github.com/rust-lang/rust
Source
Kubernetescurrent
client-go leaderelection.go package comment
Production leader election that says the quiet part in its doc comment: "this
implementation does not guarantee that only one client is acting as a leader (a.k.a.
fencing)". Tolerates arbitrary skew, is sensitive to skew rate.
Carry forwardRead the package comment before betting exclusivity on a lease; if the comment says no fencing, your storage layer needs the token check.
github.com/kubernetes/client-go
Blog
Martin Kleppmann2016-02
How to do distributed locking
The GC-pause argument: a client can acquire a lease, stall past expiry, and resume
convinced it still holds the lock. The repair is a fencing token, a monotonically
increasing number the protected resource itself checks. Also the source of the
efficiency-versus-correctness framing in the Redlock debate.
Carry forwardA lease bounds how long you wait for a dead leader, not who may write; only the resource can enforce exclusivity, via a token it verifies.
martin.kleppmann.com
ADR
CockroachDB2026 (maintained)
docs/design.md: hybrid logical clocks and uncertainty intervals
The public design record of ordering on commodity clocks: per-node HLCs, transaction
reads carrying an interval up to t+ε, conflicts inside it forcing a retry, and
an explicit note that with better clocks it would commit-wait like Spanner instead.
Carry forwardε is a design input, not a constant; write the flip condition into your design doc the way this one does.
github.com/cockroachdb/cockroach
Vendor
Cockroach Labs2026 (maintained)
Runbook: clock management
The operational contract behind the design: 500 ms default max offset, node suicide
at 80% drift versus a majority, chrony recommended, and only smeared or slewed leap
second sources permitted across a cluster.
Carry forwardA consistency guarantee conditioned on clock bounds needs an enforcement mechanism for the bounds themselves; self-termination is that mechanism.
github.com/cockroachlabs
Paper
Google2012-10
Spanner: Google's Globally-Distributed Database (OSDI 2012)
TrueTime measured in production: ε a sawtooth of 1 to 7 ms, 4 ms typical,
derived from an assumed 200 µs/s worst-case drift; commit wait around 5 ms; GPS
and atomic references chosen for uncorrelated failure. Read via the Papers We Love
mirror of the OSDI publication.
Carry forwardExternal consistency is purchasable: its price is ε per commit, so every dollar spent shrinking ε is latency bought back.
papers-we-love mirror
Paper
Kulkarni, Demirbas et al.2014-05
Logical Physical Clocks and Consistent Snapshots
The hybrid logical clock: causality tracking that stays close to physical NTP time,
so one timestamp orders related events and cuts consistent snapshots. The construction
CockroachDB's design doc cites and implements. (Paper host unreachable in this session;
mechanism corroborated through the fetched design doc.)
Carry forwardWhen you cannot bound the clock, bound the causality: HLC gives LWW-style convenience without ordering unrelated writes by skew.
cse.buffalo.edu
Blog
Google2016-11
Making every (leap) second count with our new public NTP servers
The smear, first-party: clocks 0.0014% slower for ten hours either side of the leap
second, so "December 31 will seem like any other day".
Carry forwardSmearing converts a discontinuity into a bounded rate error; your monotonic-derived measurements during the window are off by that rate, knowingly.
cloud.google.com
Vendor
Googlecurrent
Leap Smear documentation (developers.google.com/time)
The proposed standard: 24-hour linear smear, noon to noon, roughly 11.6 ppm, adopted
by AWS; Google itself moved from 20 hours to align. Standardisation is explicitly the
goal because divergent smears disagree.
Carry forwardBefore a leap event, inventory every time source your estate consumes and confirm they share one smear regime; the disagreement window is hours long.
developers.google.com/time/smear
Blog
Meta2022-07
It's time to leave the leap second in the past
Meta's position paper: 27 leap seconds so far, each one an industry incident;
Meta smears over 17 hours from midnight UTC; "introducing new leap seconds is a risky
practice that does more harm than good".
Carry forwardThe mechanism is scheduled for retirement politically as well as technically; design for the smear era, not for heroic step handling.
engineering.fb.com
Source
AWS2026 (maintained)
ClockBound: daemon and library for bounded timestamps
Bounded uncertainty as an open-source commodity: every reading is (earliest, latest)
"within which true time exists", and the bound honestly grows between clock updates.
Carry forwardIf your ordering logic cannot articulate what it does with an interval instead of an instant, it is not ready for ε-aware design.
github.com/aws/clock-bound
Vendor
AWS2023-11
Amazon Time Sync: microsecond-accurate time
The claim that changes the economics: Nitro-based, GPS-disciplined clocks
synchronised "within microseconds of UTC" on supported instances, at no extra charge.
Unverified independently in this corpus.
Carry forwardCommodity ε in microseconds makes commit-wait designs rentable; re-run the wait-versus-retry decision if you last made it on 500 ms assumptions.
aws.amazon.com
Blog
Kyle Kingsbury2013-10
The trouble with timestamps
Why last-write-wins plus wall clocks is a data-loss design: timestamps decide
conflicts, clocks decide timestamps, and skew decides clocks. Jepsen's controlled tests
made the loss visible; production dashboards do not.
Carry forwardTreat any LWW store as "loses concurrent writes by design" and make the business sign off on that sentence, not on "eventually consistent".
aphyr.com