You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Initial-peers WAN topology with a cycle (N>=3 routers) enters a self-sustaining SEDP subscription-announcement storm; does DDS-Pipe v1.5.3 (#196) cover the multi-hop case? #548
Three DDS Router instances (v3.5.1, also reproduced on v3.5.2) in an initial-peers unicast full mesh enter a self-sustaining discovery storm carrying no user data: ~1 CPU core per router and ~17,000 pkt/s on the WAN link, sustained indefinitely, with every application publisher stopped.
We root-caused it with an RTPS capture and believe it is closely related to the two-pipe discovery saturation fixed in DDS-Pipe #196 (v1.5.3) — but our case is the N>=3 cyclic WAN generalization, which #196's N=2 single-domain reproduction does not cover. We are testing v3.5.3 now and will report results here; filing so the topology-level behavior is on record either way.
Environment
DDS Router v3.5.1 (also v3.5.2), built from source via ddsrouter.repos (Fast DDS v3.6.1, DDS-Pipe v1.5.1/v1.5.2)
Per router: one local participant (its own domain, ~8 participants with a handful of endpoints) + one initial-peers WAN participant; ~6-topic allowlist with explicit RELIABLE/VOLATILE/KEEP_LAST QoS pinned
Topology: every router's WAN participant dials every other (full mesh) — at N=3 the graph contains a cycle
Observed
With all application publishers stopped:
topology
per-router CPU
1 router
0.1 %
2 routers
0.0 % (stable >2 min)
3 routers
~106–111 % each
back to 2 (stop the 3rd)
still ~120 % — does not recover
2 routers, both restarted
0.0 % — cleared
RTPS capture on the WAN link (20,000 frames in 1.15 s ≈ 17,400 pkt/s):
Essentially every DATA submessage is from ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER (0x000004c2). Only 3 SPDP announcements in the whole capture; zero user data.
The SEDP subscriptions writers' sequence numbers advance ~4,400/s per router — new samples, not retransmits — while only 4 distinct guidPrefixes appear. It is re-announcement, not endpoint proliferation.
The same five allowlisted topics are re-announced ~3,000x/s each. The one allowlisted topic with no reader never appears — pinning the loop to subscription mirroring specifically.
Behavioral fingerprints
Publisher-independent — full intensity with every user publisher stopped.
Needs real seed endpoints — 3 routers plus trivial talkers on otherwise-empty domains stay at 0.0 %; the storm needs a moderately rich endpoint graph on the local domains.
Needs the third router — two routers with the identical config are silent.
It latches — removing the third router does not clear it; only restarting the routers does. Once triggered it appears to be a state of the SEDP writers, not a function of the live topology.
Our understanding of the mechanism
Each router mirrors subscriptions discovered on its WAN participant onto its local participant and re-announces them to every WAN peer. With three mutually-visible routers the announcement echo always has a fresh destination, and (pre-v1.5.3) the unconditional re-announcement in Track::update_reader_partitions → CommonReader::update_partitions → update_reader(...) lets it free-run — the same amplifier #196 fixed for two pipes on one domain.
Endpoint::discoverer_participant_id names the local participant that saw the endpoint, so there is nothing in the current data model that could suppress a cycle spanning more than one hop: no origin marker that survives a hop, no hop count, no TTL.
Questions
Is DDS-Pipe v1.5.3 / Build Fast DDS for Windows on build_fastdds workflow #196 expected to make cyclic N>=3 initial-peers topologies converge, or is announce-on-change damping only guaranteed for the two-pipe case? (We will post our v3.5.3 measurements here.)
Is a cyclic router topology a supported configuration at all? The repeater use-case page documents hub topologies only, and we found no documented topology restrictions. If cycles are out of contract, a note in the docs (and ideally a startup warning) would save others this diagnosis.
Would you be open to a discovery-plane analogue of RepeaterDataFilter — e.g. stamping an origin-router property on mirrored endpoints (the app_id/app_metadata PropertyPolicy hook already exists in CommonParticipant) plus a hop limit, so redundant router graphs are safe by construction? We may be able to contribute a reproduction and/or a patch.
We can share pcaps and the full reproduction recipe.
Summary
Three DDS Router instances (v3.5.1, also reproduced on v3.5.2) in an initial-peers unicast full mesh enter a self-sustaining discovery storm carrying no user data: ~1 CPU core per router and ~17,000 pkt/s on the WAN link, sustained indefinitely, with every application publisher stopped.
We root-caused it with an RTPS capture and believe it is closely related to the two-pipe discovery saturation fixed in DDS-Pipe #196 (v1.5.3) — but our case is the N>=3 cyclic WAN generalization, which #196's N=2 single-domain reproduction does not cover. We are testing v3.5.3 now and will report results here; filing so the topology-level behavior is on record either way.
Environment
ddsrouter.repos(Fast DDS v3.6.1, DDS-Pipe v1.5.1/v1.5.2)FASTDDS_BUILTIN_TRANSPORTS=UDPv4,--reload-time 0localparticipant (its own domain, ~8 participants with a handful of endpoints) + oneinitial-peersWAN participant; ~6-topic allowlist with explicit RELIABLE/VOLATILE/KEEP_LAST QoS pinnedObserved
With all application publishers stopped:
RTPS capture on the WAN link (20,000 frames in 1.15 s ≈ 17,400 pkt/s):
ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER(0x000004c2). Only 3 SPDP announcements in the whole capture; zero user data.Behavioral fingerprints
Our understanding of the mechanism
Each router mirrors subscriptions discovered on its WAN participant onto its local participant and re-announces them to every WAN peer. With three mutually-visible routers the announcement echo always has a fresh destination, and (pre-v1.5.3) the unconditional re-announcement in
Track::update_reader_partitions→CommonReader::update_partitions→update_reader(...)lets it free-run — the same amplifier #196 fixed for two pipes on one domain.Endpoint::discoverer_participant_idnames the local participant that saw the endpoint, so there is nothing in the current data model that could suppress a cycle spanning more than one hop: no origin marker that survives a hop, no hop count, no TTL.Questions
RepeaterDataFilter— e.g. stamping an origin-router property on mirrored endpoints (theapp_id/app_metadataPropertyPolicy hook already exists inCommonParticipant) plus a hop limit, so redundant router graphs are safe by construction? We may be able to contribute a reproduction and/or a patch.We can share pcaps and the full reproduction recipe.