# `raft_message` — RPC messages

The `raft_message` struct holds information about a single RPC message being received or sent over the network.

## Data types

enum raft_message_type

  RPC message type codes.

      enum raft_event_type {
          RAFT_APPEND_ENTRIES = 1,
          RAFT_APPEND_ENTRIES_RESULT,
          RAFT_REQUEST_VOTE,
          RAFT_REQUEST_VOTE_RESULT,
          RAFT_INSTALL_SNAPSHOT,
          RAFT_TIMEOUT_NOW
      };

struct raft_message

  Union of all RPC message structs, plus information about the sender or the receiver (depending on whether the message is being sent or received).

      struct raft_message
      {
          enum raft_message_type type; /* RPC type code */
          raft_id server_id;           /* ID of sending or destination server */
          const char *server_address;  /* Address of sending or destination server */
          union {                      /* Type-specific data */
              struct raft_request_vote request_vote;
              struct raft_request_vote_result request_vote_result;
              struct raft_append_entries append_entries;
              struct raft_append_entries_result append_entries_result;
              struct raft_install_snapshot install_snapshot;
              struct raft_timeout_now timeout_now;
          };
      };

### RequestVote

struct raft_request_vote

  Holds the parameters of a RequestVote RPC message.

      struct raft_request_vote
      {
          unsigned char version;     /* Message format version. */
          raft_term term;            /* Candidate's term */
          raft_id candidate_id;      /* ID of the server requesting the vote */
          raft_index last_log_index; /* Index of candidate's last log entry */
          raft_index last_log_term;  /* Term of log entry at last_log_index */
          bool disrupt_leader;       /* True if current leader should be discarded */
          bool pre_vote;             /* True if this is a pre-vote request */
      };

### RequestVote result

struct raft_request_vote_result

  Holds the parameters of a RequestVote RPC result message.

      struct raft_append_entries_result
      {
          unsigned char version;     /* Message format version */
          raft_term term;            /* Receiver's current_term */
          raft_index rejected;       /* If non-zero, the index that was rejected */
          raft_index last_log_index; /* Receiver's last log entry index, as hint */
          unsigned short features;   /* Feature flags (since version 1) */
          unsigned short capacity;   /* Reserved disk capacity for log entries */
      };

### AppendEntries

struct raft_append_entries

  Holds the parameters of an AppendEntries RPC request message.

      struct raft_append_entries
      {
          unsigned char version;      /* Message format version */
          raft_term term;             /* Leader's term */
          raft_index prev_log_index;  /* Index of log entry preceeding new ones */
          raft_term prev_log_term;    /* Term of entry at prev_log_index */
          raft_index leader_commit;   /* Leader's commit index */
          struct raft_entry *entries; /* Log entries to append */
          unsigned n_entries;         /* Size of the log entries array */
      };

### AppendEntries result

struct raft_append_entries_result

  Holds the parameters of an AppendEntries RPC result message.

      struct raft_append_entries_result
      {
          unsigned char version;     /* Message format version */
          raft_term term;            /* Receiver's current_term */
          raft_index rejected;       /* If non-zero, the index that was rejected */
          raft_index last_log_index; /* Receiver's last log entry index, as hint */
          unsigned short features;   /* Feature flags (since version 1) */
          unsigned short capacity;   /* Reserved disk capacity for log entries */
      };

### InstallSnapshot

struct raft_install_snapshot

  Holds the parameters of an InstallSnapshot RPC request message.

      struct raft_install_snapshot
      {
          unsigned char version;          /* Message format version */
          raft_term term;                 /* Leader's term */
          raft_index last_index;          /* Index of last entry in the snapshot */
          raft_term last_term;            /* Term of last_index */
          struct raft_configuration conf; /* Config as of last_index */
          raft_index conf_index;          /* Commit index of conf */
          struct raft_buffer data;        /* Raw snapshot data */
      };

### TimeoutNow

struct raft_timeout_now

  Holds the parameters of a TimeoutNow RPC request message.

      struct raft_timeout_now
      {
          unsigned char version;     /* Message format version */
          raft_term term;            /* Leader's term */
          raft_index last_log_index; /* Index of leader's last log entry */
          raft_index last_log_term;   /* Term of log entry at last_log_index */
      };