zerodds-durability-service
Services — Durability. Standalone Durability-Service for topics with
TRANSIENTorPERSISTENTdurability; the retention contract comes fromDURABILITY_SERVICE(OMG DDS 1.4 §2.2.3.5), the architecture follows ADR 0009.
- Source: crates/durability-service
- API docs: docs.rs/zerodds-durability-service
zerodds-durability-service is the library behind the durability daemon.
Towards RTPS the service is an ordinary participant. For each served topic it
- ingests samples through a
RELIABLE/TRANSIENT_LOCAL/KEEP_ALLreader, which also receives the history of a writer that was already running; - stores each sample in a
DurabilityStorefromzerodds-durability-store; - delivers the stored history to late-joining readers through a
TRANSIENT_LOCALwriter, also after the process of the original writer has ended; - fills that writer from the store when it starts serving a topic, so the history of a
PERSISTENTtopic is available after a restart of the service without any application writer.
The service uses two participants per domain, one for ingest and one for replay. They ignore each other before any endpoint exists, so the ingest reader never matches the replay writer. Samples are deduplicated on the GUID and sequence number of the source writer, so a writer's history received together with its live stream, or received again after a restart of the service, is stored once.
- Retention contract.
Contract::from_qosderives it from theDurabilityServiceQosPolicya discovered writer announces (PID_DURABILITY_SERVICE). If the announced policy equals the DDS default (KEEP_LAST(1), all limits unlimited), which on the wire cannot be told apart from an unset policy, the default configured for the daemon applies. A per-topiccontractin the daemon configuration takes precedence. Order: configuration, discovered QoS, daemon default. - Two writers with different policies. The contract of the first
discovered writer stays in force for the topic. A different announcement from a later writer
is not applied; it is reported as
ServiceEvent::ConflictingDurabilityService. - Keyed topics. Keyedness is read from the RTPS
entityKindoctet of the writer. Keyed topics are stored and replayed per instance;KEEP_LASTapplies per instance key, dispose/unregister andmax_instancesfollow the contract. A replayed sample with a known source carriesPID_ORIGINAL_WRITER_INFOwith the GUID and sequence number of the original writer. - Restart.
serveandserve_typedpersist type name, keyedness and contract asTopicMetain the store.serve_if_storedserves a topic from this metadata immediately, without waiting for a writer or reader to be discovered. - Reader without writer. A discovered reader alone does not start serving
a topic, because
DURABILITY_SERVICEis a Topic/DataWriter policy only. Serving requires storedTopicMetaor a discovered writer. - Cleanup. A background thread calls
DurabilityStore::cleanupevery 30 seconds, so an unregistered instance is purged once itsservice_cleanup_delayhas elapsed. - Events.
DurabilityService::eventsreturns the most recent events (at most 256):AutoServeFailed,ConflictingDurabilityService,ReplayWriteFailed,ServedFromStoredMeta,TopicMetaMismatch. Each event is also written to stderr as one line.
Entry points: DurabilityService::start, start_with_config,
serve, serve_typed, serve_if_stored,
serve_discovered, enable_auto_discovery, contract_of,
served_topics, events, shutdown.
Spec anchors
- OMG DDS 1.4 §2.2.3.5 (
DURABILITY_SERVICE: retention contract,service_cleanup_delay), §2.2.2.5.1.13 (dispose/unregister, forwarded to the replay writer). - DDSI-RTPS 2.5 §9.3.1.2 (
entityKindand keyedness), §8.7.9 (sending stored data on behalf of the original writer), §9.6.3.9 (PID_STATUS_INFObits of forwarded lifecycle markers).
Consumers
zerodds-durability-service-bin, which builds the daemonzerodds-durability-svc(man page).
Features
rt(off by default): enableszerodds-dcps/rt, i.e. real-time scheduling and CPU affinity forthreads.*settings viazerodds-rt-linux. Without it the daemon refuses such a setting with "feature missing".
Status
std,#![forbid(unsafe_code)]. Safety classification in the crate docs: STANDARD.- Library only, no binary.
- Test functions in the source: 8 in
src/lib.rs, 9 intests/(one per file).tests/external_cyclone.rsis marked#[ignore]and needs an external CycloneDDS writer fromtests/cyclone-harness/.
zerodds-durability-service
Dienste — Durability. Eigenständiger Durability-Service für Topics mit Durability
TRANSIENToderPERSISTENT; der Aufbewahrungsvertrag kommt ausDURABILITY_SERVICE(OMG DDS 1.4 §2.2.3.5), die Architektur folgt ADR 0009.
- Quelle: crates/durability-service
- API-Docs: docs.rs/zerodds-durability-service
zerodds-durability-service ist die Bibliothek hinter dem Daemon des
Durability-Service. Gegenüber RTPS ist der Dienst ein gewöhnlicher Participant. Für jedes
bediente Topic
- nimmt er Samples über einen Reader mit
RELIABLE/TRANSIENT_LOCAL/KEEP_ALLauf; dieser erhält auch die Historie eines Writers, der schon vorher lief; - legt er jedes Sample in einem
DurabilityStoreauszerodds-durability-storeab; - liefert er die gespeicherte Historie über einen Writer mit
TRANSIENT_LOCALan spät hinzukommende Reader aus, auch nachdem der Prozess des ursprünglichen Writers beendet ist; - füllt er diesen Writer beim Start der Bedienung eines Topics aus dem Speicher, sodass
die Historie eines Topics mit
PERSISTENTnach einem Neustart des Dienstes ohne jeden Writer der Anwendung verfügbar ist.
Der Dienst verwendet zwei Participants pro Domain, einen für die Aufnahme und einen für die Wiedergabe. Beide ignorieren sich gegenseitig, bevor ein Endpoint existiert; der Reader der Aufnahme passt daher nie zum Writer der Wiedergabe. Samples werden über GUID und Sequenznummer des Quell-Writers dedupliziert: Die Historie eines Writers, die zusammen mit seinem laufenden Datenstrom oder nach einem Neustart des Dienstes erneut eintrifft, wird einmal gespeichert.
- Aufbewahrungsvertrag.
Contract::from_qosleitet ihn aus derDurabilityServiceQosPolicyab, die ein entdeckter Writer ankündigt (PID_DURABILITY_SERVICE). Entspricht die angekündigte Policy dem DDS-Standardwert (KEEP_LAST(1), alle Grenzen unbegrenzt), der auf der Leitung nicht von einer nicht gesetzten Policy zu unterscheiden ist, gilt der für den Daemon konfigurierte Standardwert. Eincontractpro Topic in der Konfiguration des Daemons hat Vorrang. Reihenfolge: Konfiguration, entdeckte QoS, Standardwert des Daemons. - Zwei Writer mit unterschiedlichen Policies. Für das Topic bleibt der
Vertrag des zuerst entdeckten Writers in Kraft. Eine abweichende Ankündigung eines späteren
Writers wird nicht übernommen, sondern als
ServiceEvent::ConflictingDurabilityServicegemeldet. - Topics mit Key. Ob ein Topic einen Key hat, wird aus dem RTPS-Oktett
entityKinddes Writers gelesen. Topics mit Key werden pro Instanz gespeichert und wiedergegeben;KEEP_LASTgilt pro Instanzschlüssel, Dispose/Unregister undmax_instancesfolgen dem Vertrag. Ein wiedergegebenes Sample mit bekannter Quelle trägtPID_ORIGINAL_WRITER_INFOmit GUID und Sequenznummer des ursprünglichen Writers. - Neustart.
serveundserve_typedlegen Typname, Key-Eigenschaft und Vertrag alsTopicMetaim Speicher ab.serve_if_storedbedient ein Topic sofort aus diesen Metadaten, ohne auf die Entdeckung eines Writers oder Readers zu warten. - Reader ohne Writer. Ein entdeckter Reader allein startet die Bedienung
eines Topics nicht, weil
DURABILITY_SERVICEnur eine Policy von Topic und DataWriter ist. Die Bedienung setzt gespeicherteTopicMetaoder einen entdeckten Writer voraus. - Bereinigung. Ein Hintergrund-Thread ruft alle 30 Sekunden
DurabilityStore::cleanupauf; eine abgemeldete Instanz wird entfernt, sobald ihrservice_cleanup_delayabgelaufen ist. - Ereignisse.
DurabilityService::eventsliefert die jüngsten Ereignisse (höchstens 256):AutoServeFailed,ConflictingDurabilityService,ReplayWriteFailed,ServedFromStoredMeta,TopicMetaMismatch. Jedes Ereignis wird zusätzlich als eine Zeile auf stderr ausgegeben.
Einstiegspunkte: DurabilityService::start, start_with_config,
serve, serve_typed, serve_if_stored,
serve_discovered, enable_auto_discovery, contract_of,
served_topics, events, shutdown.
Spec-Anker
- OMG DDS 1.4 §2.2.3.5 (
DURABILITY_SERVICE: Aufbewahrungsvertrag,service_cleanup_delay), §2.2.2.5.1.13 (Dispose/Unregister, an den Writer der Wiedergabe weitergereicht). - DDSI-RTPS 2.5 §9.3.1.2 (
entityKindund Key-Eigenschaft), §8.7.9 (Senden gespeicherter Daten im Namen des ursprünglichen Writers), §9.6.3.9 (Bits vonPID_STATUS_INFOfür weitergereichte Lebenszyklus-Markierungen).
Konsumenten
zerodds-durability-service-bin, das den Daemonzerodds-durability-svcbaut (Man-Page).
Features
rt(standardmäßig aus): schaltetzerodds-dcps/rtein, also Echtzeit-Scheduling und CPU-Affinität für Einstellungen unterthreads.*überzerodds-rt-linux. Ohne das Feature lehnt der Daemon eine solche Einstellung mit "feature missing" ab.
Status
std,#![forbid(unsafe_code)]. Einstufung in der Crate-Dokumentation (safety classification): STANDARD.- Nur Bibliothek, kein Binary.
- Testfunktionen im Quelltext: 8 in
src/lib.rs, 9 intests/(eine pro Datei).tests/external_cyclone.rsist mit#[ignore]markiert und braucht einen externen CycloneDDS-Writer austests/cyclone-harness/.