pub struct InstanceTracker { /* private fields */ }Expand description
Thread-safer Tracker — wird sowohl im DataWriter als auch im DataReader instanziiert.
Implementations§
Source§impl InstanceTracker
impl InstanceTracker
Sourcepub fn new() -> Self
pub fn new() -> Self
Neuer Tracker mit eigenem InstanceHandleAllocator.
Sourcepub fn with_allocator(allocator: Arc<InstanceHandleAllocator>) -> Self
pub fn with_allocator(allocator: Arc<InstanceHandleAllocator>) -> Self
Tracker mit shared Allocator (z.B. wenn Writer und Reader im selben Participant ihre Handles aus demselben Pool ziehen).
Sourcepub fn register(
&self,
keyhash: KeyHash,
key_holder: Vec<u8>,
timestamp: Option<Time>,
) -> InstanceHandle
pub fn register( &self, keyhash: KeyHash, key_holder: Vec<u8>, timestamp: Option<Time>, ) -> InstanceHandle
Registriert die Instanz, wenn sie noch nicht bekannt ist; sonst reaktiviert sie nur (Spec §2.2.2.4.2.5).
Liefert immer den (stabilen) InstanceHandle zurueck.
Sourcepub fn should_deliver_under_time_based_filter(
&self,
keyhash: &KeyHash,
sample_ts: Time,
min_separation_nanos: u128,
) -> bool
pub fn should_deliver_under_time_based_filter( &self, keyhash: &KeyHash, sample_ts: Time, min_separation_nanos: u128, ) -> bool
Spec §2.2.3.12 TIME_BASED_FILTER — entscheidet, ob ein
Sample mit sample_ts ans User-API geliefert werden darf.
false wenn t - last_delivered_ts < min_separation (drop);
true sonst (deliver).
Bei unbekannter Instanz oder erstem Sample (kein
last_delivered_ts) ist immer true.
Sourcepub fn should_deliver_under_destination_order(
&self,
keyhash: &KeyHash,
source_ts: Time,
by_source_timestamp: bool,
) -> bool
pub fn should_deliver_under_destination_order( &self, keyhash: &KeyHash, source_ts: Time, by_source_timestamp: bool, ) -> bool
Spec §2.2.3.18 DESTINATION_ORDER — entscheidet, ob ein Sample
mit source_ts ans User-API geliefert werden darf.
BY_RECEPTION_TIMESTAMP: immer true. BY_SOURCE_TIMESTAMP:
nur wenn source_ts strikt groesser als last_delivered_ts
dieser Instanz ist (Tie-Breaker bei gleichem Timestamp via
Writer-GUID kommt im typisierten Pfad).
Sourcepub fn record_delivery(&self, keyhash: &KeyHash, sample_ts: Time)
pub fn record_delivery(&self, keyhash: &KeyHash, sample_ts: Time)
Markiert dass ein Sample mit sample_ts ans User-API geliefert
wurde (Spec §2.2.3.12 — fuer naechste Filter-Entscheidung).
Sourcepub fn lookup(&self, keyhash: &KeyHash) -> Option<InstanceHandle>
pub fn lookup(&self, keyhash: &KeyHash) -> Option<InstanceHandle>
Lookup ohne Mutation (Spec §2.2.2.4.2.14 lookup_instance).
Sourcepub fn get_by_handle(&self, handle: InstanceHandle) -> Option<InstanceState>
pub fn get_by_handle(&self, handle: InstanceHandle) -> Option<InstanceState>
Liefert eine Kopie des State-Snapshots fuer einen Handle.
Sourcepub fn get_by_keyhash(&self, keyhash: &KeyHash) -> Option<InstanceState>
pub fn get_by_keyhash(&self, keyhash: &KeyHash) -> Option<InstanceState>
Liefert eine Kopie des State-Snapshots fuer einen KeyHash.
Sourcepub fn get_key_holder(&self, handle: InstanceHandle) -> Option<Vec<u8>>
pub fn get_key_holder(&self, handle: InstanceHandle) -> Option<Vec<u8>>
Liefert den Key-Holder-Bytes-Stream fuer einen Handle (Spec
§2.2.2.4.2.13 get_key_value).
Sourcepub fn dispose(&self, handle: InstanceHandle, timestamp: Option<Time>) -> bool
pub fn dispose(&self, handle: InstanceHandle, timestamp: Option<Time>) -> bool
Markiert die Instanz als NOT_ALIVE_DISPOSED (Spec
§2.2.2.4.2.10 dispose).
Liefert false wenn die Instanz nicht bekannt ist.
Sourcepub fn unregister(
&self,
handle: InstanceHandle,
timestamp: Option<Time>,
) -> bool
pub fn unregister( &self, handle: InstanceHandle, timestamp: Option<Time>, ) -> bool
Dekrementiert den Writer-Counter; faellt er auf 0, geht die
Instanz nach NOT_ALIVE_NO_WRITERS (Spec §2.2.2.4.2.7).
Sourcepub fn should_accept_sample_under_exclusive_ownership(
&self,
keyhash: &KeyHash,
writer_guid: [u8; 16],
writer_strength: i32,
) -> bool
pub fn should_accept_sample_under_exclusive_ownership( &self, keyhash: &KeyHash, writer_guid: [u8; 16], writer_strength: i32, ) -> bool
Spec §2.2.3.10 OWNERSHIP=EXCLUSIVE Strength-Selection.
Liefert true wenn ein Sample vom Writer mit
(writer_guid, writer_strength) fuer die Instanz keyhash
akzeptiert werden soll.
Algorithmus (Spec §2.2.3.10):
- Kein aktueller Owner → akzeptiere + setze als Owner.
- Strength > current → akzeptiere + ersetze Owner.
- Strength == current und guid > current_guid → akzeptiere (Spec-Tie-Breaker via lexikographisch hoehere Guid).
- Strength < current → reject.
- Strength == current und guid < current → reject.
- Strength == current und guid == current → akzeptiere (selber Writer).
Sourcepub fn clear_owner_for_writer(&self, writer_guid: [u8; 16]) -> usize
pub fn clear_owner_for_writer(&self, writer_guid: [u8; 16]) -> usize
Spec §2.2.3.23 — bei Liveliness-Loss eines Writers: clear-Owner fuer alle Instanzen, deren Owner dieser Writer war. Naechster Sample triggert Failover-Selection.
Sourcepub fn clear_owner_for_writer_prefix(&self, prefix: [u8; 12]) -> usize
pub fn clear_owner_for_writer_prefix(&self, prefix: [u8; 12]) -> usize
Wie Self::clear_owner_for_writer, aber Match nach den ersten
12 Bytes der GUID (GuidPrefix). Erlaubt Failover wenn nur die
Participant-Identitaet (z.B. via SPDP-Lease-Expiry) bekannt ist.
Sourcepub fn autopurge(
&self,
now: Time,
autopurge_disposed_delay_nanos: u128,
autopurge_nowriter_delay_nanos: u128,
) -> usize
pub fn autopurge( &self, now: Time, autopurge_disposed_delay_nanos: u128, autopurge_nowriter_delay_nanos: u128, ) -> usize
Spec §2.2.3.22 READER_DATA_LIFECYCLE — purgt Instanzen, deren
Disposed/NoWriter-Marker laenger als der jeweilige Delay her ist.
now ist die Caller-side Wall-Clock; die Delays sind in Nanoseconds.
Liefert die Anzahl entfernter Instanzen.
Lazy-Purge: wird vom Read-Pfad (oder einem Background-Tick) gerufen. Spec laesst die Strategie offen — wir loeschen die betroffene Instanz vollstaendig, sodass nachfolgende read/take sie nicht mehr sehen.
Sourcepub fn observe_sample(
&self,
keyhash: KeyHash,
key_holder: Vec<u8>,
timestamp: Option<Time>,
) -> (InstanceHandle, bool)
pub fn observe_sample( &self, keyhash: KeyHash, key_holder: Vec<u8>, timestamp: Option<Time>, ) -> (InstanceHandle, bool)
Reader-seitiger Hook: Markiert, dass ein Sample fuer diese
Instanz angekommen ist. Liefert (handle, war_neu), wo
war_neu == true heisst dass diese Instanz vorher unbekannt war
oder die Reader-View frisch zurueckgesetzt wurde (view_state = NEW).
Sourcepub fn mark_view_seen(&self, handle: InstanceHandle)
pub fn mark_view_seen(&self, handle: InstanceHandle)
Reader-seitig: nach erstem read/take einer Instanz wird ihr
View-State auf NOT_NEW gesetzt.
Sourcepub fn drain_samples(&self, handle: InstanceHandle, n: u32)
pub fn drain_samples(&self, handle: InstanceHandle, n: u32)
Reader-seitig: nach take reduziert sich samples_in_cache
um n.
Sourcepub fn ordered_handles(&self) -> Vec<InstanceHandle>
pub fn ordered_handles(&self) -> Vec<InstanceHandle>
Listet alle Instanz-Handles in stabiler Reihenfolge (BTreeMap-
Order ueber KeyHash). Spec §2.2.2.5.3.28 read_next_instance.
Sourcepub fn next_handle_after(
&self,
previous: InstanceHandle,
) -> Option<InstanceHandle>
pub fn next_handle_after( &self, previous: InstanceHandle, ) -> Option<InstanceHandle>
Liefert das erste Handle, dessen Sortier-Ordnung strikt
hinter previous_handle liegt (oder das erste ueberhaupt, wenn
previous == HANDLE_NIL). Spec §2.2.2.5.3.28.