pub struct ReliableWriter { /* private fields */ }Expand description
Ein Reliable-Writer mit 0..N Reader-Proxies.
Implementations§
Source§impl ReliableWriter
impl ReliableWriter
Sourcepub fn new(cfg: ReliableWriterConfig) -> Self
pub fn new(cfg: ReliableWriterConfig) -> Self
Erzeugt einen leeren Writer.
§Panics
cfg.fragment_size == 0cfg.mtu < 20(RTPS-Header passt nicht rein)
Sourcepub fn reader_proxies(&self) -> &[ReaderProxy]
pub fn reader_proxies(&self) -> &[ReaderProxy]
Read-only-Slice der registrierten Reader-Proxies.
Sourcepub fn reader_proxy_count(&self) -> usize
pub fn reader_proxy_count(&self) -> usize
Anzahl registrierter Reader-Proxies.
Sourcepub fn remove_samples_up_to(&mut self, up_to_exclusive: SequenceNumber) -> usize
pub fn remove_samples_up_to(&mut self, up_to_exclusive: SequenceNumber) -> usize
Entfernt Samples mit SN < up_to_exclusive aus dem Cache. Wird
von hoeheren Layern fuer Lifespan-Expire genutzt (Spec §2.2.3.16):
abgelaufene Samples verschwinden so, dass auch spaete
Reader-Proxies sie nicht mehr bekommen.
Sourcepub fn cache(&self) -> &HistoryCache
pub fn cache(&self) -> &HistoryCache
History-Cache (read-only).
Sourcepub fn heartbeat_count(&self) -> i32
pub fn heartbeat_count(&self) -> i32
Anzahl gesendeter HEARTBEATs.
Sourcepub fn nackfrag_count(&self) -> i32
pub fn nackfrag_count(&self) -> i32
Anzahl empfangener NACK_FRAGs.
Sourcepub fn unknown_src_count(&self) -> u64
pub fn unknown_src_count(&self) -> u64
Anzahl ACKNACK/NACK_FRAG-Nachrichten von unbekannten Quellen
seit Writer-Start. Typische Ursachen: Misrouting auf Multicast,
veraltete Proxies nach remove_reader_proxy, GUID-Spoofing.
Sourcepub fn fragment_size(&self) -> u32
pub fn fragment_size(&self) -> u32
Aktuelle Fragment-Size-Konfiguration.
Sourcepub fn all_samples_acknowledged(&self) -> bool
pub fn all_samples_acknowledged(&self) -> bool
Prueft, ob alle Reader-Proxies den aktuell hoechsten Sample-SN
im Cache bereits acknowledged haben. Liefert true auch wenn
der Cache leer ist oder keine Proxies existieren (nichts zu
bestaetigen).
Spec-Basis fuer DataWriter::wait_for_acknowledgments
(OMG DDS 1.4 §2.2.2.4.2.22).
Sourcepub fn add_reader_proxy(&mut self, proxy: ReaderProxy)
pub fn add_reader_proxy(&mut self, proxy: ReaderProxy)
Fuegt einen Reader-Proxy hinzu. Idempotent: wenn ein Proxy mit
gleichem remote_reader_guid existiert, wird er ersetzt.
Setzt last_heartbeat = None, damit der naechste tick() sofort
einen Heartbeat an alle Proxies (inkl. den neuen) emittiert.
RTPS §8.4.15.4: frisch hinzugefuegter ReaderProxy muss Gelegenheit
zu AckNack bekommen, sonst wartet er bis zur naechsten periodischen
Heartbeat-Runde (Default 1 s) — und bei spaet-gewireten Proxies
(nach Cache-Inserts) ist das die einzige Moeglichkeit, die frueh
eingefuegten Samples nachzuliefern, da write_sample_with_datagrams
nur direkt sendet, wenn der Proxy synchron ist.
Sourcepub fn remove_reader_proxy(&mut self, guid: Guid) -> Option<ReaderProxy>
pub fn remove_reader_proxy(&mut self, guid: Guid) -> Option<ReaderProxy>
Entfernt den Proxy mit gegebener GUID.
Sourcepub fn write(
&mut self,
payload: &[u8],
) -> Result<Vec<OutboundDatagram>, WireError>
pub fn write( &mut self, payload: &[u8], ) -> Result<Vec<OutboundDatagram>, WireError>
Schreibt einen neuen Sample und fan-outet an alle Proxies.
Pro Proxy entsteht (aggregiert):
- 1 DATA-Datagram wenn
payload.len() <= fragment_size - N DATA_FRAG-Datagramme (je Fragment 1 Datagram, kein Mix)
§Errors
SN-Overflow, Cache voll, Body zu gross.
Sourcepub fn write_with_heartbeat(
&mut self,
payload: &[u8],
now: Duration,
) -> Result<Vec<OutboundDatagram>, WireError>
pub fn write_with_heartbeat( &mut self, payload: &[u8], now: Duration, ) -> Result<Vec<OutboundDatagram>, WireError>
D.5e Phase-2: Write + piggyback HEARTBEAT in einer Operation.
Cyclone DDS und FastDDS senden bei jedem write() zusaetzlich
einen HEARTBEAT, damit der Reader sofort einen ACKNACK triggern
kann. Ohne piggyback muss der Reader bis zum naechsten periodic-
HB (default 100 ms) warten — das wird bei 1-in-flight-Roundtrip
zum Latenz-Floor.
Diese Methode ist ein Superset von Self::write: emittiert
alle DATA-Datagrams und haengt pro matched Reader-Proxy ein
HEARTBEAT-Datagram an. last_heartbeat = now wird gesetzt damit
tick() nicht doppelt feuert.
§Errors
Wire-Encode-Fehler.
Sourcepub fn handle_acknack(
&mut self,
src_guid: Guid,
base: SequenceNumber,
requested: impl IntoIterator<Item = SequenceNumber>,
)
pub fn handle_acknack( &mut self, src_guid: Guid, base: SequenceNumber, requested: impl IntoIterator<Item = SequenceNumber>, )
Verarbeitet eine eingegangene ACKNACK von src_guid.
Unbekannter Sender → no-op.
Sourcepub fn handle_nackfrag(&mut self, src_guid: Guid, nf: &NackFragSubmessage)
pub fn handle_nackfrag(&mut self, src_guid: Guid, nf: &NackFragSubmessage)
Verarbeitet ein eingegangenes NACK_FRAG von src_guid.
Sourcepub fn write_lifecycle(
&mut self,
key_hash: [u8; 16],
status_bits: u32,
) -> Result<Vec<OutboundDatagram>, WireError>
pub fn write_lifecycle( &mut self, key_hash: [u8; 16], status_bits: u32, ) -> Result<Vec<OutboundDatagram>, WireError>
Sendet einen Lifecycle-Marker (dispose/unregister) an alle matched
Reader. Allokiert eine neue Sequence-Number, persistiert eine
CacheChange mit dem entsprechenden ChangeKind und baut pro
Reader-Proxy eine DATA mit Key-Hash + StatusInfo.
status_bits ist die ODER-Verknuepfung der gewuenschten Bits aus
crate::inline_qos::status_info:
- DISPOSED: NotAliveDisposed
- UNREGISTERED: NotAliveUnregistered
- DISPOSED | UNREGISTERED: NotAliveDisposedUnregistered
§Errors
Wire-Encode-Fehler oder Sequence-Number-Overflow.
Trait Implementations§
Source§impl Clone for ReliableWriter
impl Clone for ReliableWriter
Source§fn clone(&self) -> ReliableWriter
fn clone(&self) -> ReliableWriter
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more