Inconsistent Messaging: Generic Listener & Dispatch
I have discovered some inconsistencies in how we handle messaging when dispatched from generic listener modules.
Self-Dispatch
On the current master branch, modules which listen to all messages and dispatch messages also dispatch messages to themselves:
(D) (E: 1) [R:Relay:dut_myinput_myoutput] Relaying 1 filtered messages
(D) (E: 1) [R:Relay:dut_myinput_myoutput] Relaying message without a name with 1 objects from detector dut
(T) (E: 1) [R:Relay:dut_myinput_myoutput] Sending message Message<allpix::MCParticle> from Relay:dut_myinput_myoutput to DetectorHistogrammer:dut_myoutput
(T) (E: 1) [R:Relay:dut_myinput_myoutput] Sending message Message<allpix::MCParticle> from Relay:dut_myinput_myoutput to generic listener Relay:dut_myinput_myoutput
Here, a detector module with input/output parameters set dispatches a message of type MCParticle
to the subsequent (named) DetectorHistogrammer as well as to itself. This should not happen.
Inconsistent handling of input/output Parameters
The input
parameter is ignored for generic listeners, however, their output
parameter is correctly set when dispatching messages. There is no warning or error that the input
parameter cannot be used, it is simply silently ignored.
(T) (E: 1) [R:DepositionGeant4] Sending message Message<allpix::MCParticle> from DepositionGeant4 to generic listener Relay:dut_myinput_myoutput
(T) (E: 1) [R:DepositionGeant4] Relay received Message<allpix::MCParticle> without a name
(T) (E: 1) [R:DepositionGeant4] Accepting message with object Message<allpix::MCParticle> for dispatch
Here, a unique module (DepositionGeant4) sends an unnamed message of type MCParticle
to a module with unique identifier Relay:dut_myinput_myoutput
, i.e. a detector module for dut
with input and output parameter specified. This should not happen.
Unnamed-only (Feature)
It is currently not possible to only listen to "unnamed" messages.
Cross-posting
Related to above feature request, we have an issue if the generic listener module is a detector module and appears multiple times, because messages will be replicated from one instance to the other, leaving the ones executed later with a bunch of messages they should never have received. This eventually leads to a multiplication of the message itself:
(T) Running event 1 [Relay:dut_myinput_myoutput]
(D) (E: 1) [R:Relay:dut_myinput_myoutput] Relaying 1 filtered messages
(D) (E: 1) [R:Relay:dut_myinput_myoutput] Relaying message without a name with 1 objects from detector dut
(T) (E: 1) [R:Relay:dut_myinput_myoutput] Sending message Message<allpix::MCParticle> from Relay:dut_myinput_myoutput to DetectorHistogrammer:dut_myoutput
(T) (E: 1) [R:Relay:dut_myinput_myoutput] Sending message Message<allpix::MCParticle> from Relay:dut_myinput_myoutput to generic listener Relay:dut_myinput_myoutput
(T) (E: 1) [R:Relay:dut_myinput_myoutput] Relay received Message<allpix::MCParticle> named myoutput
(T) (E: 1) [R:Relay:dut_myinput_myoutput] Accepting message with object Message<allpix::MCParticle> for dispatch
(T) (E: 1) [R:Relay:dut_myinput_myoutput] Sending message Message<allpix::MCParticle> from Relay:dut_myinput_myoutput to generic listener Relay:dut_myoutput2
(T) (E: 1) [R:Relay:dut_myinput_myoutput] Relay received Message<allpix::MCParticle> named myoutput
(T) (E: 1) [R:Relay:dut_myinput_myoutput] Accepting message with object Message<allpix::MCParticle> for dispatch
(T) Running event 1 [Relay:dut_myoutput2]
(D) (E: 1) [R:Relay:dut_myoutput2] Relaying 2 filtered messages
(D) (E: 1) [R:Relay:dut_myoutput2] Relaying message without a name with 1 objects from detector dut
(T) (E: 1) [R:Relay:dut_myoutput2] Sending message Message<allpix::MCParticle> from Relay:dut_myoutput2 to DetectorHistogrammer:dut_myoutput2
(T) (E: 1) [R:Relay:dut_myoutput2] Sending message Message<allpix::MCParticle> from Relay:dut_myoutput2 to generic listener Relay:dut_myinput_myoutput
(T) (E: 1) [R:Relay:dut_myoutput2] Relay received Message<allpix::MCParticle> named myoutput2
(T) (E: 1) [R:Relay:dut_myoutput2] Accepting message with object Message<allpix::MCParticle> for dispatch
(T) (E: 1) [R:Relay:dut_myoutput2] Sending message Message<allpix::MCParticle> from Relay:dut_default to generic listener Relay:dut_default
(T) (E: 1) [R:Relay:dut_myoutput2] Relay received Message<allpix::MCParticle> named myoutput2
(T) (E: 1) [R:Relay:dut_myoutput2] Accepting message with object Message<allpix::MCParticle> for dispatch
(D) (E: 1) [R:Relay:dut_myoutput2] Relaying message named myoutput with 1 objects from detector dut
(T) (E: 1) [R:Relay:dut_myoutput2] Sending message Message<allpix::MCParticle> from Relay:dut_myoutput2 to DetectorHistogrammer:dut_myoutput2
(F) (E: 1) [R:Relay:dut_myoutput2] Error during execution of run:
Unexpected message Message<allpix::MCParticle> received by module DetectorHistogrammer:dut_myoutput2 (only a single one expected per event)
As you can see, the messages keep bouncing back and forth.
I would suggest fixing this only for the reworked messaging system from !231 (merged)