Unisys.JCR.2 1.3.2 DDS Protocol valuetype Class interactionUse Interaction Component View Data types realize Abstraction Protocol Discovery DomainParticipant Participant ParticipantDiscovery discovered_participant_add a_participant_desc discovered_participant_remove a_guid DiscoveredParticipantData SimpleDiscovery SPDPbuiltinParticipantWriter SPDPbuiltinParticipantReader SPDPdiscoveredParticipantData leaseDuration ParcicipantDiscoveryImpl DiscoveredWriterData DiscoveredReaderData contentFilter documentation documentation > DiscoveredTopicData BuiltinEndpoints builtinParticipantReader rtpsBuiltinParticipantWriter builtinSubscriptionsWriter builtinParticipantWriter rtpsBuiltinParticipantReader SEDPbuiltinTopicsWriter SEDPbuiltinPublicationsReader builtinPublicationsWriter BuiltinEndpointSet_t PARTICIPANT_WRITER = 0x2 PARTICIPANT_READER = 0x1 PUBLICATIONS_WRITER = 0x8 PUBLICATIONS_READER = 0x4 SUBSCRPTIONS_WRITER = 0x20 SUBSCRIPTIONS_READER = 0x10 TOPIC_WRITER = 0x80 TOPIC_READER = 0x40 builtinPublicationsReader SEDPbuiltinSubscriptionsReader builtinTopicsReader SEDPbuiltinPublicationsWriter SEDPbuiltinSubscriptionsWriter SEDPbuiltinTopicsReader builtinSubscriptionsReader builtinTopicsWriter ModelElement ContentFilterProperty_t Contents of the respective HistoryCache <<contains>> <<contains>> <<contains>> <<contains>> <<contains>> Indicates the type of the data-objects contained in the HistoryCache Behavior (Analysis) - Behavior sequence diagram SequenceDiagram Interaction (Analysis) - Best-efforts communications SequenceDiagram Interaction (Analysis) - Reliable communications SequenceDiagram Interaction dw writer_cache w reader_cache r dr User1 User2 Instance dw1 hc1 Instance3 User3 dw2 wc2 w2 rc2 r2 dr2 User4 network Overview whc rhc remove_change( seq_num ) remove_change seq_num add_change( a_change ) add_change a_change return new_change( kind, data, a_handle ) kind data a_handle return finish() remove_change( seq_num ) seq_num return return write( data, a_handle ) write data a_handle take() get_change( seq_num ) seq_num return return ACKNACK ReaderProxy.acked_changes_set( seq_num ) acked_changes_set ReaderProxy seq_num is_acked_by_all( seq_num ) seq_num return seq_num return a_change return DATA; HEARTBEAT add_change( a_change ) add_change a_change return DATA DATA; HEARTBEAT ACKNACK user Writer Behavior alive new DDS DataWriter/ new RTPS Writer delete DDS DataWriter delete RTPS Writer DW::dispose(data, handle)/ if ( W::topicKind == WITH_KEY ) { a_change := W::new_change(NOT_ALIVE_DISPOSED, <nil>, handle) WHC::add_change(a_change) } DW::write(data, handle)/ a_change := W::new_change(ALIVE, data, handle) WHC::add_change(a_change) DW::unregister(data, handle)/ if ( W::topicKind==WITH_KEY ) { a_change := W::new_change(NOT_ALIVE_UNREGISTERED, <nil>, handle) WHC::add_change(a_change) } BE StatefulWriter WithKey send_data send_gap ready_to_send pushing idle ready new ReaderProxy RP::unsent_changes() != <empty> RP::unsent_changes() == <empty> is_relevant == true send DATA (seq_num_next) is_relevant == false send GAP (seq_num_next) RP::can_send() == true change := RP::next_unsent_change() send DATA(change) | GAP(change.seq_num) delete ReaderProxy WHC::add_change(a_change) add a_change to RP::changes_for_reader BE StatefulReader WithKey waiting accept new WriterProxy delete WriterProxy RHC::add_change( a_change ) add a_change {WP::received_changes} update WP::irrelevant_changes q [a_change.seq_num > MAX{WP::received_changes}] a_change := DATA | GAP/ next_expected_sn := WP::received_changes_max() + 1 DATA expected_seq_num := WP::available_changes_max()+1 a_change_list := GAP else else GAP FOREACH seq_num IN GAP.irrelevant_changes_list WP::irrelevant_changes_set(seq_num) a_change.sequenceNumber >= expected_seq_num a_change := DATA RHC::add_change(a_change) WP::received_change_set(a_change.sequenceNumber) WP::lost_changes_update(a_change.sequenceNumber) obsolete Reliable Stateful Writer pushing announcing idle repairing waiting must_repair new ReaderProxy/ RP::unsent_changes != <empty> RP::unsent_changes == <empty> RP::can_send() == true seq_num_next := RP::unsent_changes_min() RP::unsent_changes_remove(seq_num_next) is_relevant := RP::is_relevant(seq_num_next) if (is_relevant) send DATA (seq_num_next) else send GAP (seq_num_next) WHC:get_change_max() == RP:acked_changes_min() WHC:get_change_max() > RP:acked_changes_min() W::repeatAnnouncePeriod send HEARTBEAT.F ACKNACK RP::requested_changes_add(ACKNACK,requested_sns) RP::acked_changes_add(ACKNACK.acked_sns) PR::requested_changes != <empty> RP::requested_changes == <empty> W::responseDelayDuration ACKNACK RP::requested_changes_add(ACKNACK,requested_sns) RP::acked_changes_add(ACKNACK.acked_sns) RP::can_send() == true seq_num_next := RP::requested_changes_min() RP::requested_changes_remove(seq_num_next) is_relevant := RP::is_relevant(seq_num_next) if (is_relevant) send DATA (seq_num_next) else send GAP (seq_num_next) delete WriterProxy is_relevant send DATA (seq_num_next) obsolete Reliable StatefulReader waiting may_send_ack must_send_ack ready new WriterProxy HEARTBEAT HEARTBEAT.F == 1 HEARTBEAT.F == 0 WP::missing_changes != <empty> GAP foreach change in GAP do: RHC::add_change(change) WP::received_changes_add(change) WP::missing_changes_remove(change) WP::irrelevant_changes_add(change) HEARTBEAT seq_num) WP::missing_changes_update(HEARTBEAT delete ReaderProxy WP::missing_changes == <empty> R::responseDelayDuration send ACKNACK DATA a_change := DATA RHC::add_change(a_change) WP::received_changes_add(a_change) WP::missing_changes_remove(a_change) Reliable StatefulWriter announcing idle pushing repairing must_repair waiting ready RP::requested_changes() == <empty> new ReaderProxy/ RP::can_send() == true change := RP::next_requested_change() send DATA(change) | GAP(change.seq_num) RP::requested_changes() != <empty> RP::unsent_changes() != <empty> RP::unsent_changes() == <empty> W::heartbeatPeriod send HEARTBEAT(FinalFlag:=NOT_SET) RP::unacked_changes() == <empty> RP::unacked_changes != <empty> W::nackResponseDelay ACKNACK RP::acked_changes_set(ACKNACK) RP::requested_changes_set(ACKNACK) RP::can_send() == true change := RP::next_unsent_change() send DATA(change) | GAP(change.seq_num) ACKNACK RP::acked_changes_set(ACKNACK) RP::requested_changes_set(ACKNACK) delete ReaderProxy is_relevant send DATA (seq_num_next) WHC::add_change(a_change) add a_change to RP::changes_for_reader WHC::remove_change(a_change) ChangeForReader status Acknowledged Unsent Requested Unacknowledged Underway New received NACK(seq_num) received ACK(seq_num) W::pushMode == true W::pushMode == false RP::nackSuppressionDuration sent DATA(seq_num) | sent GAP(seq_num) new ChangeForReader (seq_num) Reliable StatefulReader must_send_ack may_send_ack waiting ready WP::missing_changes() != <empty> new WriterProxy HEARTBEAT firstSN) WP::missing_changes_update(HEARTBEAT.lastSN) WP::lost_changes_update(HEARTBEAT GAP FOREACH seq_num IN GAP. WP::irrelevant_change_set (seq_num) WP::missing_changes() == <empty> HEARTBEAT.FinalFlag==SET DATA sequenceNumber) a_change := DATA RHC::add_change (a_change) WP::received_change_set ( a_change R::heartbeatResponseDelay send ACKNACK HEARTBEAT.FinalFlag==NOT_SET HEARTBEAT delete WriterProxy Reliable StatelessWriter announcing idle pushing repairing waiting must_repair new ReaderLocator/ RL::requested_changes() != <empty> RL::unsent_changes() == <empty> RL::unsent_changes() != <empty> RL::can_send() == true change := RL::next_requested_change() send DATA(change.seq_num) | GAP(change.seq_num) RL::requested_changes() == <empty> W::nackResponseDelay RP:unacked_changes != <empty> RP:unacked_changes() == <empty> W::heartbeatPeriod send HEARTBEAT(FinalFlag=SET) ACKNACK RL::requested_changes_set(ACKNACK) ACKNACK RL::requested_changes_set(ACKNACK) RL::can_send() == true change := RL::next_unsent_change() send DATA(change.seq_num) delete ReaderLocator is_relevant send DATA (seq_num_next) BE StatelessReader Behavior waiting DATA else delete RTPS Reader new RTPS Reader GAP FOREACH seq_num IN GAP.gapList R::irrelevant_changes_set(seq_num) DATA a_change := DATA RHC::add_change(a_change) Reader Behavior alive delete DDS DataReader delete RTPS Reader new DDS DataReader/ new RTPS Reader DR::take()/ a_change_list = new(); FOREACH change in R::available_changes() { a_change_list += change; R::reader_cache.remove_change(a_change); } RETURN a_change_list; DR::read()/ a_change_list = new(); FOREACH change in R::available_changes() { a_change_list += change; } RETURN a_change_list; ChangeFromWriter status Received Lost Missing Requested Unknown received DATA(seq_num) | received NOKEYDATA(seq_num) | received GAP(seq_num) received HB( firstSN > seq_num ) received HB (firstSN <= seq_num <= lastSN ) sent NACK ( seq_num ) new ChangeFromWriter (seq_num ) BE StatelessWriter Behavior idle pushing announcing pushing idle repairing waiting must_repair RL::can_send() == true change := RL::next_unsent_change() send DATA(change.seq_num) | GAP(change.seq_num) RL::unsent_changes() != <empty> RL::unsent_changes() == <empty> delete ReaderLocator new ReaderLocator is_relevant send DATA (seq_num_next) RP:unacked_changes() == <empty> RP:unacked_changes != <empty> ACKNACK RL::requested_changes_set(ACKNACK) ACKNACK RL::requested_changes_set(ACKNACK) W::responseDelayDuration RL::requested_changes() == <empty> RL::can_send() == true change := RL::next_requested_change() send DATA(change.seq_num) | GAP(change.seq_num) RL::requested_changes() != <empty> RL::can_send() == true change := RL::next_unsent_change() send DATA(change.seq_num) | GAP(change.seq_num) W::repeatAnnouncePeriod send HEARTBEAT(FinalFlag=SET) RL::unsent_changes() != <empty> RL::unsent_changes() == <empty> new ReaderLocator/ Messages Header protocol version vendorId guidPrefix NoKeyData readerId writerId writerSN inlineQos serializedData Submessage Message Heartbeat readerId writerId firstSN lastSN count AckNack readerId writerId readerSNState count Gap readerId writerId gapStart gapList Data extraFlags octetsToInlineQos readerId writerId writerSN inlineQos serializedData InfoSource protocolVersion vendorId guidPrefix InfoDestination guidPrefix InfoTimestamp timestamp InfoReplyIp4 unicastLocator multicastLocator Pad VendorId_t LifecycleState SubmessageKind SubmessageFlagKind 1 1 1 1 1 -1 1 1 Receiver sourceVersion sourceVendorId sourceGuidPrefix destGuidPrefix unicastReplyLocatorList multicastReplyLocatorList haveTimestamp timestamp submessage-element Class parameter SubmessageHeader submessageId submessageLength flags 8 8 1 1 1 1 1 1 -1 -1 InfoReply multicastLocatorList unicastLocatorList SubmessageElements EntityId value KeyHash GuidPrefix value LocatorUDPv4 value LocatorList value -1 -1 Parameter parameterId length value length length ParameterList ProtocolVersion value SequenceNumber value SequenceNumberSet base set -1 -1 SubmessageElement Timestamp value VendorId value SerializedPayload value -1 -1 Count value Flags value 32 32 value SerializedPayloadFragment value -1 -1 ProtocolVersion_t ProtocolId_t suffix prefix KeyHashPrefix_t KeyHashSuffix_t Protocol Messages SubmessageFlag FragmentNumber value FragmentNumber_t FragmentNumberSet base set -1 -1 DataFrag extraFlags octetsToInlineQos readerId writerId writerSN inlineQos serializedData fragmentStartingNum fragmentsInSubmessage dataSize fragmentSize NoKeyDataFrag readerId writerId writerSN inlineQos serializedData fragmentStartingNum fragmentsInSubmessage dataSize fragmentSize NackFrag readerId writerId fragmentNumberState count writerSN HeartbeatFrag readerId writerId writerSN lastFragmentNum count Structure Domain Entity guid Endpoint Participant protocolVersion PROTOCOL_VERSION_1_0 vendorId PROTOCOL_VENDOR_UNKNOWN defaultUnicastLocatorList {} defaultMulticastLocatorList {} topicKind reliabilityLevel unicastLocatorList -1 -1 multicastLocatorList -1 -1 Writer pushMode heartbeatPeriod nackResponseDelay new_change kind data a_handle nackSuppressionDuration lastChangeSequenceNumber 0 Reader Enumeration expectsInlineQos FALSE heartbeatResponseDelay heartbeatSuppressionDuration ReaderProxy remoteReaderGuid expectsInlineQos FALSE unicastLocatorList -1 -1 acked_changes_set seq_num next_requested_change next_unsent_change requested_changes requested_changes_set unsent_changes multicastLocatorList -1 -1 unacked_changes WriterProxy remoteWriterGuid unicastLocatorList 0 -1 multicastLocatorList 0 -1 available_changes_max irrelevant_change_set lost_changes_update missing_changes_update received_change_set missing_changes SingleKeyWriter Generalization SingleKeyReader Generalization MultiKeyWriter Generalization MultiKeyReader Generalization CacheChange kind writerGuid instanceHandle sequenceNumber Data HistoryCache add_change a_change remove_change seq_num get_change seq_num get_seq_num_min get_seq_num_max StatefulWriter Generalization is_acked_by_all seq_num matched_reader_add a_proxy matched_reader_remove StatefulReader Generalization matched_writer_add a_proxy matched_writer_remove matched_writer_lookup StatelessWriter Generalization resendDataPeriod reader_locator_add a_locator reader_locator_remove unsent_changes_reset StatelessReader Generalization ReaderLocator locator -1 -1 next_requested_change next_unsent_change requested_changes requested_changes_set unsent_changes