m4_comment([$Id: ex_comm.so,v 1.9 2006/08/24 17:59:56 bostic Exp $]) m4_ref_title(m4_db Replication, Ex_rep_base: a TCP/IP based communication infrastructure,, rep/ex, rep/ex_rq) m4_p([dnl Applications which use the Base replication API must implement a communication infrastructure. The communication infrastructure consists of three parts: a way to map environment IDs to particular sites, the functions to get and receive messages, and the application architecture that supports the particular communication infrastructure used (for example, individual threads per communicating site, a shared message handler for all sites, a hybrid solution). The communication infrastructure for ex_rep_base is implemented in the file m4_path(ex_rep/base/rep_net.c), and each part of that infrastructure is described as follows.]) m4_p([dnl Ex_rep_base maintains a table of environment ID to TCP/IP port mappings. A pointer to this table is stored in a structure pointed to by the app_private field of the m4_ref(DbEnv) object so it can be accessed by any function that has the database environment handle. The table is represented by a machtab_t structure which contains a reference to a linked list of member_t's, both of which are defined in m4_path(ex_rep/base/rep_net.c). Each member_t contains the host and port identification, the environment ID, and a file descriptor.]) m4_p([dnl This design is particular to this application and communication infrastructure, but provides an indication of the sort of functionality that is needed to maintain the application-specific state for a TCP/IP-based infrastructure. The goal of the table and its interfaces is threefold: First, it must guarantee that given an environment ID, the send function can send a message to the appropriate place. Second, when given the special environment ID m4_ref(DB_EID_BROADCAST), the send function can send messages to all the machines in the group. Third, upon receipt of an incoming message, the receive function can correctly identify the sender and pass the appropriate environment ID to the m4_ref(rep_message) method.]) m4_p([dnl Mapping a particular environment ID to a specific port is accomplished by looping through the linked list until the desired environment ID is found. Broadcast communication is implemented by looping through the linked list and sending to each member found. Since each port communicates with only a single other environment, receipt of a message on a particular port precisely identifies the sender.]) m4_p([dnl This is implemented in the quote_send, quote_send_broadcast and quote_send_one functions, which can be found in m4_path(ex_rep/base/rep_net.c).]) m4_p([dnl The example provided is merely one way to satisfy these requirements, and there are alternative implementations as well. For instance, instead of associating separate socket connections with each remote environment, an application might instead label each message with a sender identifier; instead of looping through a table and sending a copy of a message to each member of the replication group, the application could send a single message using a broadcast protocol.]) m4_p([dnl The quote_send function is passed as the callback to m4_ref(rep_set_transport); m4_db automatically sends messages as needed for replication. The receive function is a mirror to the quote_send_one function. It is not a callback function (the application is responsible for collecting messages and calling m4_ref(rep_message) on them as is convenient). In the sample application, all messages transmitted are m4_db messages that get handled by m4_ref(rep_message), however, this is not always going to be the case. The application may want to pass its own messages across the same channels, distinguish between its own messages and those of m4_db, and then pass only the m4_db ones to m4_ref(rep_message).]) m4_p([dnl The final component of the communication infrastructure is the process model used to communicate with all the sites in the replication group. Each site creates a thread of control that listens on its designated socket (as specified by the m4_option(m) command line argument) and then creates a new channel for each site that contacts it. In addition, each site explicitly connects to the sites specified in the m4_option(o) command line argument. This is a fairly standard TCP/IP process architecture and is implemented by the following functions (all in m4_path(ex_rep/base/rep_net.c)).]) m4_page_footer