When a process is moved from a source to a destination node its new location is
saved on the source node. Initially, no information about the move is sent to
the processes holding references to the migrated process. As a consequence,
they continue to send messages to the old location, which forwards them to the
new location. If a message reaches a node whilst a process' execution has been
suspended pending the completion of migration then they are buffered. After the
execution of the suspended process is resumed on the destination computer, all
buffered messages are forwarded.
If a process migrates several times, then a chain of forwarding pointers (a.k.a.
proxies) exists. This is undesirable for several reasons. If any of the nodes
holding a forwarding pointer in the chain fails, then the object becomes
unreachable (<#2596#> i.e.<#2596#> there are residual dependencies). In addition, all
messages to the migrated object must now be retransmitted several times before
they are received. This increases the network load and increases the delay,
potentially to the point at which message timeouts expire and the senders come
to believe that the process no longer exists.
One way around this a problem is to piggyback the new location of the object on
the reply to (the first) messages sent by a process to the old location. At the
same time, the whole chain of pointers is updated to point to the last known
location. This means that after a move (or series of moves) a pointer chain is
followed only once by a particular process; subsequent messages go directly to
the last known location.
A second technique to reduce communications costs using this method is known as
`short circuiting'. When a process migrates back to a node which already has a
forwarding pointer for it (<#2597#> i.e.<#2597#> it has been there before) then the
forwarding pointer is deleted. An messages arriving at the node are not then
propagated around the chain unnecessarily, they go directly to the object.