The Relay server is implemented as a multithreaded application. Three types of threads handle the server's responsibilities:
The Propagator thread does not distinguish server connections from client connections when propagating an update. Therefore, to avoid cyclic propagation of an update, the Update message has a flag to tell the Propagator whether the message came from a client or a server. If the message came from a client, the Propagator broadcasts it to all connections. The update is sent back to where it originated so that any new objects become part of the shared state at that client. If the message came from a server, all connections except the one the message was received from are notified of the update.
Figure 4.1: Update propagation through a hierarchy of servers. The system
prevents propagation cycles between servers. (I) shows an update
originating at a client of the root server. (II) shows an update
originating from a client of a child of the root server.
The Listener thread examines and modifies updates to impose a global name space and eventual consistency on cached objects.