[erlang-questions] Semantics of send
Johan Montelius
johanmon@REDACTED
Thu Apr 29 10:23:04 CEST 2010
On Wed, 28 Apr 2010 23:14:23 +0200, Richard Carlsson
<carlsson.richard@REDACTED> wrote:
>> What is the semantics of send? In the following example:
>>
>> to_a_or_to_ab_or_to_none(A, B) ->
>> A ! foo,
>> B ! bar,
>> crash().
>>
>> If B receives bar is it then so that A receives foo?
>There are no such guarantees unless A=B (that is, if both
> messages are from the same sender to the same receiver).
Not even then does it hold true.
On Thu, 29 Apr 2010 00:48:18 +0200, Richard O'Keefe <ok@REDACTED>
wrote:
>> And where is the behavior stated?
>
> Both the "Erlang Programming" book and the "Programming Erlang" book
> explain it, it's in the documentation, ...
Yes but not in the Reference Manual.
> transport between nodes is inherently unreliable. Message
> transport _within_ a node is normally taken as reliable,
> but even then, it's possible for process A itself to die
> before all messages sent to it are delivered.
There is certainly a difference in reliability in the implementation of
in-node message sending and ex-node sending. I (without having looked in
the src) would think that it is guaranteed in the case above that if bar
reached the message queue of B then foo reaches the message queue of A.
On Wed, 28 Apr 2010 16:43:45 +0200, Joe Armstrong <erlang@REDACTED> wrote:
> ... Links between nodes are ultimately are
> layered on top of messaging - so even if a process dies, you cannot
> assume the exit will always be delivered.
I think we should be able to reply on some signals, signals that can be
generated locally i.e. DOWN/noconnection.
I know that reliable message sending is not guaranteed by the
implementation but from the specification in the Reference Manual you
would think it so. The statement in the Reference Manual is quite
different from Barklund and Virding draft specification of Erlang 10.6.2:
"There are situations where it is not reasonable to require that all
signals arrive at their destination, ..."
It is also different from Svensson and Fredlunds description in "A More
Accurate Semantics for Distributed Erlang" where it is made clear that
message sending between nodes is unreliable and that messages can be
dropped.
In the end there is of course always situations where you don't know if a
message arrived or not but there are situations where you do know and you
can also determine if it could be that a message was lost. I think the
language should take advantage of this.
The semantic description of send should be tied to signals and especially
the noconnection signal. If a message is possibly dropped then a
noconnection signal should be sent to both the sender and receiver.
In the case above, if the sender receives a noconnection signal it knows
that foo might not have arrived. A is also informed that messages could
have been dropped (even if foo actually did arrive).
It could be that this is guaranteed by the system today and that is of
course good but it should be in the specification of the language. If we
had this then I think implementing fault tolerant distributed algorithms
would be much easier. In stead of sending ack-messages on the application
level one could rely on the fact that messages did arrive or a
noconnection signal is generated.
Johan
--
Dr Johan Montelius
Royal Institute of Technology - KTH
School of Information and Communication Technology - ICT
More information about the erlang-questions
mailing list