Skip to content

Durable replay resets the deadline timer for a late joiner

Rule 40 · applies to the subscriber · Back to all rules

Wastes effort and can mislead monitoring. Replayed historical samples reset the reader's deadline timer, so the deadline reflects replay timing rather than the live publishing cadence.

If you set Durability = TRANSIENT_LOCAL or stronger together with Deadline period is finite
Wastes resources
  • Settings involved: Durability and Deadline
  • What QoS Guard checks: [DEADLN.period ≠ ∞] ∧ [DURABL ≥ TRAN_LOCAL]

Example

A late joiner receives a burst of retained samples, which resets its deadline clock and briefly hides a genuinely slow publisher.

How to fix it

Expect deadline timing to be dominated by replay right after a late join, and judge live cadence only once replay settles.

Why this rule is flagged

What the DDS specification says

The DDS specification does not settle this case on its own, so the rule rests on the engine's implementation and direct measurement.


What the engine source code shows

Cyclone DDS renews the reader deadline timer from the normal sample insertion path. Historical samples replayed by TRANSIENT_LOCAL durability enter that same path, so replay can refresh deadline tracking.

Cyclone DDS implementation evidence

// dds_rhc_default.c: postprocess_instance_update renews deadline on sample insertion.
static void postprocess_instance_update(
        struct dds_rhc_default *rhc,
        struct rhc_instance **instptr,
        const struct trigger_info_pre *pre,
        const struct trigger_info_post *post,
        struct trigger_info_qcond *trig_qc)
{
    struct rhc_instance *inst = *instptr;
#ifdef DDS_HAS_DEADLINE_MISSED
    if (inst->deadline_reg)
    {
        deadline_renew_instance_locked(&rhc->deadline, &inst->deadline);
    }
    else
    {
        deadline_register_instance_locked(
                &rhc->deadline, &inst->deadline, ddsrt_time_monotonic());
        inst->deadline_reg = 1;
    }
#endif
}

What the measurements show

Item Value
Dataset Download CSV
Fixed QoS setting DURABL = TRANSIENT_LOCAL
Tested variable DEADLN.period
Tested values DEADLN.period ∈ {-1 ms, 100 ms, 200 ms}
Rule-relevant case DURABL = TRANSIENT_LOCAL with late-joining reader replay under tested deadline settings
Tested engines / versions Fast DDS 2.6.11 (Humble), Fast DDS 2.14.6 (Jazzy), Cyclone DDS 0.10.5
Network setting RTT ∈ {1 ms, 50 ms}, loss ∈ {0%, 20%}, PP = 50 ms, message size = 1024 B
Engine Tested setting Observed behavior
Fast DDS 2.6.11 (Humble) DURABL = TRANSIENT_LOCAL, DEADLN.period ∈ {-1 ms, 100 ms, 200 ms} Profile accepted and delivered in the Humble measurement summary
Fast DDS 2.14.6 (Jazzy) DURABL = TRANSIENT_LOCAL, DEADLN.period ∈ {-1 ms, 100 ms, 200 ms} Late-join replay was recovered in most tested cases; some no-delivery runs occurred for DEADLN.period = -1 ms and DEADLN.period = 200 ms
Cyclone DDS 0.10.5 DURABL = TRANSIENT_LOCAL, DEADLN.period ∈ {-1 ms, 100 ms, 200 ms} Late-join replay was recovered in all tested cases