[erlang-questions] Pid after node restart

Fred Hebert mononcqc@REDACTED
Tue Sep 30 17:58:05 CEST 2014


On 09/29, Pavel Baturko wrote:
> My case is:
> I have 2 connected nodes.
>
>  [snip]
>
> Could someone explain this behavior?
> What is changing in internal pid representation after node restart so
> comparison in step 10 returns false? And why comparison in step 11 returns
> true?

The visual pid representation you see isn't the full thing.

Interesting for this is to look at the external term format:
http://erlang.org/doc/apps/erts/erl_ext_dist.html#id88514

    1       N       4   4       1
    103     Node    ID  Serial  Creation

    Encode a process identifier object (obtained from spawn/3 or friends).
    The ID and Creation fields works just like in REFERENCE_EXT, while the
    Serial field is used to improve safety. In ID, only 15 bits are
    significant; the rest should be 0.

    [..]

    Creation is a byte containing a node serial number that makes it
    possible to separate old (crashed) nodes from a new one.

What this tells us is that each pid you send around contains the full
node name (internally you may have a hash, which is X in <X.Y.Z>).
Locally, 'X' is always printed as '0' to be easy to recognize.

Y and Z are then two counters you have in there, and hidden in it is the
'Creation' 

Looking at your list:
> 
>    1. On node 1 I generate a pid P (<0.X.0>)
>    2. P is transfered to node 2 (on node 2 I receive it as <Y.X.0>)
>    3. P is transfered back from node 2 to node 1 (I'm receiving it as P2)
>    4. P2 is recognized as local pid (<0.X.0>)

This is covered by the node ID and local/remote printing of pids

>    5. I can compare P and P2 on node 1 and they are identical

Covered by internal pid structure.

>    6. I'm restarting node 1
>    7. On node 1 I generate the same pid P as in step 1 (<0.X.0>)

The Creation id is likely set propelry there.

>    8. I repeat step 3, again receive initial pid as P2
>    9. P2 is recognized as local pid (<0.X.0>) - as before
>    10. But now P == P2 returns false.
>    11. Also P == list_to_pid(pid_to_list(P2)) returns true

The creation byte is likely what's at play there. You can
term_to_binary(P) and term_to_binary(P2) to confirm the difference in
there.

list_to_pid does some fancy pants evaluation, but term_to_binary and
binary_to_term will do the full form lossless serialization.

Regards,
Fred.



More information about the erlang-questions mailing list