Carry a time budget across different clock domains
Propagate remaining work budgets without copying local clock epochs, resetting retries, or mistaking cancellation for rollback.
On this page
The question for today
What you’ll understand
- Distinguish a local absolute deadline from a portable remaining-duration budget.
- Allocate processing and transport margins without granting downstream work a fresh full timeout.
- Explain how cancellation, retries, and uncertain side effects interact with an end-to-end deadline.
A caller promises to stop waiting after two hundred milliseconds, then sends work to a host whose local monotonic clock has an unrelated epoch. Copying the caller's raw deadline number can make the remote host believe the work expired long ago or remains valid for years. Propagation must preserve the remaining budget while respecting clock domains. That also requires accounting for time already spent, reserving necessary return work, and deciding what cancellation means when a remote effect may already have happened.
A deadline belongs to a clock domain
On one host, an absolute local deadline can be represented as a suitable elapsed-clock reading plus a duration. Comparing later readings against that same deadline avoids repeatedly granting a fresh timeout after interruptions or retries. The epoch and semantics are part of its type, even if the programming language stores everything in the same integer. A reading from another machine, a wall-time clock, or a previous boot is not interchangeable. Include suspension behavior and rate assumptions when the real requirement is elapsed physical time rather than merely progress of one chosen local clock.
A remaining-duration budget can cross hosts without requiring equal monotonic epochs. The receiver establishes its own local deadline using that duration and its own appropriate clock. However, duration propagation is not free passage through the network: serialization, transit, queueing, and dispatch consume end-to-end time. Transport libraries have particular deadline-propagation and cancellation rules; inspect their actual contract. If a protocol cannot bound or account for a stage, it cannot prove an exact cross-host physical deadline solely by sending a number of milliseconds. The caller can still enforce when it stops waiting, while downstream cleanup remains a separate obligation.
Subtract elapsed work and reserve the rest of the path
When a service starts a downstream call, derive its budget from the parent's remaining time instead of reusing the original request timeout. Reserve time for required return handling, local cleanup, and any modeled communication margin. Clamp negative results to zero and fail or cancel according to the application's contract rather than letting an unsigned subtraction create an enormous timeout. Parallel subcalls can share a common parent deadline; sequential retries consume the same shrinking budget. A per-attempt cap may further restrict each try, but it must not extend the parent deadline.
Absolute wall-time propagation is another possible protocol only when hosts share a sufficiently justified time scale and error contract. It needs conservative handling of the clock uncertainty that a raw date string hides. Relative propagation avoids the epoch comparison but still needs sensible accounting for time in transit and differences in elapsed-clock behavior. gRPC documents propagation using timeouts derived from deadlines and deducting time already elapsed; language support and application cancellation handling still matter. Read the generated or framework behavior in your stack rather than assuming that every child operation automatically inherits the request's entire lifetime policy.
Stopping a wait is not undoing a remote effect
An expired caller deadline can stop the local wait while the server is still executing or has already committed an effect whose response was lost. Cancellation is usually cooperative: expensive loops, external work, and cleanup paths must observe it through the runtime's supported mechanisms. It does not roll back an arbitrary database or external service action merely because the client no longer wants the reply. Keep operation identities and outcome-reconciliation rules for ambiguous completion. A retry after timeout can otherwise duplicate the effect while appearing to be a harmless continuation of the same user request.
The queue lab isolates why waiting work consumes useful time even when clock conversion is correct. Compare separate fixed-rate runs at arrival 4/service 2 and arrival 2/service 4. Before each, Reset, re-set both rates, predict growth or drainage from four requests, then Play or Step. The second fresh backlog reaches zero after two seconds in this fluid model; it does not continue the first run's accumulated work. Neither trajectory implements deadlines, request identities, network transit, or cancellation. The narrower lesson is that preserving a budget numerically cannot supply missing service capacity or guarantee the completion time of an individual queued request.
Work it through
Translate a budget without translating an epoch
A caller starts with 200 ms at local monotonic time 50.000 s and dispatches after 30 ms of local work. In this fictional bound model, reserve at most 10 ms outbound transit and 20 ms for the remaining return/finalization path. Receiver time at arrival is 834.000 s. Ignore clock-rate error for the arithmetic.
The caller’s fixed local deadline is 50.200 s. At dispatch its remaining budget is 170 ms; the original 200 ms must not be granted again.
Subtract the stated 10 ms outbound allowance and 20 ms reserved path, leaving 140 ms for receiver-side work. The worst-case budget accounting is 30+10+140+20=200 ms.
The receiver uses its own epoch:834.000 s+0.140 s gives local deadline 834.140 s. This number is never compared directly with the caller’s50.200 s deadline.
The receiver gets 140 ms under the explicit transport and return allowances. Unknown delays outside those assumptions would require a weaker claim or different accounting, not an invented shared epoch.
The living notebook
Explore the model
Interactive lab · queue
A valid time budget does not create service capacity
Compare separate fixed-rate runs at λ=4,μ=2 and λ=2,μ=4. For each: Reset, re-set both rates, predict from a fresh four-request backlog, then Play or Step. The stable fluid run drains in two seconds. Edits retain elapsed time and are not live rate switches.
- Fluid backlog
- 4
- Net rate · λ − μ
- −1 /s
- M/M/1 mean residence
- 1 s
Fluid backlog starts at 4 and follows max(0, 4 + (λ − μ)t). The separate M/M/1 residence-time formula assumes Poisson arrivals, exponential service and λ < μ. Parameter changes pause playback and recompute the model at the current elapsed time. Reset restores both parameters and returns time to zero. Playback starts paused. Adjust either parameter, then choose Play or Step.
Look forThe model contains no deadlines or clock-domain translation. It illustrates aggregate capacity pressure only; its separate M/M/1 mean needs the stated stable stochastic assumptions and is not an individual deadline guarantee.
Pause & reason
Check your understanding
Your turn
Try it yourself
A120 ms parent budget has spent 25 ms locally. Reserve 15 ms for modeled outbound transit and 20 ms for the return path. What child processing budget remains, and what is its local deadline if the receiver reads 9.000 s?
Take a moment to make a prediction or work it out on paper. Open a hint when you need one.
Give me a hint
Subtract all three consumed or reserved amounts; then add only the child duration to the receiver’s reading.
Compare with the solution
The child budget is 120−25−15−20=60 ms. Its receiver-local deadline is 9.060 s under the stated model. A later retry must recompute from the parent’s remaining time instead of receiving another fresh 60 ms without regard to elapsed work.
Keep the idea
Take it with you
- An absolute deadline is meaningful only within its identified clock domain.
- Propagate shrinking duration budgets with explicit transport and return allowances.
- Timeout and cancellation do not prove that a remote effect was undone or never happened.
Read further
Original sources and deeper explanations to follow at your own pace.
Optional progress, saved in this browser when available. Revisit any lesson at any time.
Lesson not marked complete.