Best-effort delivery with manual liveliness
Rule 5 · applies to publishers and subscribers · Back to all rules
Breaks a guarantee. Liveliness assertions can be lost, so the reader may report the writer as lost even though it is alive.
If you set Reliability = BEST_EFFORT together with Liveliness = MANUAL_BY_TOPIC
Breaks a guarantee
- Settings involved: Reliability and Liveliness
- What QoS Guard checks:
[LIVENS = MANUAL] ∧ [RELIAB = BEST_EFFORT]
Example
A heartbeat publisher asserts liveliness manually over best-effort. Under packet loss the subscriber sees false liveliness-lost events.
How to fix it
Use RELIABLE when liveliness is asserted manually, so the assertions are retransmitted instead of dropped.
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 direct measurement.
What the engine source code shows
The behavior here does not depend on a specific engine's implementation, so the rule follows from the measurements.
What the measurements show
| Item | Value |
|---|---|
| Dataset | Download CSV |
| Fixed QoS setting | None |
| Tested variable | RELIAB.kind, LIVENS.kind, LIVENS.lease_duration |
| Tested values | RELIAB ∈ {BEST_EFFORT, RELIABLE}, LIVENS ∈ {AUTOMATIC, MANUAL_BY_TOPIC}, lease_duration ∈ {150 ms, 300 ms} |
| Rule-relevant case | RELIAB = BEST_EFFORT, LIVENS = MANUAL_BY_TOPIC |
| 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, loss = 0%, PP = 50 ms, message size = 1024 B |
| Engine | Tested setting | Observed behavior |
|---|---|---|
| Fast DDS 2.6.11 (Humble) | RELIAB = BEST_EFFORT, LIVENS = MANUAL_BY_TOPIC |
Profile accepted, matched, and delivered. |
| Fast DDS 2.14.6 (Jazzy) | RELIAB = BEST_EFFORT, LIVENS = MANUAL_BY_TOPIC |
Profile accepted, matched, and delivered; liveliness_lost = 2, reader_not_alive = 2 |
| Cyclone DDS 0.10.5 | RELIAB = BEST_EFFORT, LIVENS = MANUAL_BY_TOPIC |
Profile creation/matching failed; reader_not_alive = 1 |