Skip to content

Commit

Permalink
IPROTO: Add info about IPROTO_RAFT* requests (#2816)
Browse files Browse the repository at this point in the history
Add information about RAFT-related constants and description of the IPROTO_RAFT request

Closes #2814
  • Loading branch information
veod32 authored Apr 25, 2022
1 parent 3520560 commit a443c85
Showing 1 changed file with 38 additions and 0 deletions.
38 changes: 38 additions & 0 deletions doc/dev_guide/internals/box_protocol.rst
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ The IPROTO constants that identify requests that we will mention in this section
IPROTO_ROLLBACK=0x10
IPROTO_RAFT_CONFIRM=0x28
IPROTO_RAFT_ROLLBACK=0x29
IPROTO_RAFT=0x1e
IPROTO_RAFT_PROMOTE=0x1f
IPROTO_RAFT_DEMOTE=0x20
IPROTO_PING=0x40
IPROTO_JOIN=0x41
IPROTO_SUBSCRIBE=0x42
Expand Down Expand Up @@ -132,6 +135,10 @@ The IPROTO constants that appear within requests or responses that we will descr
IPROTO_FIELD_IS_NULLABLE=0x03
IPROTO_FIELD_IS_AUTOINCREMENT=0x04
IPROTO_FIELD_SPAN=0x05
IPROTO_RAFT_TERM=0x00
IPROTO_RAFT_VOTE=0x01
IPROTO_RAFT_STATE=0x02
IPROTO_RAFT_VCLOCK=0x03
To denote message descriptions we will say ``msgpack(...)`` and within it we will use modified
`YAML <https://en.wikipedia.org/wiki/YAML>`_ so: |br|
Expand Down Expand Up @@ -1406,6 +1413,37 @@ IPROTO_FLAG_COMMIT (0x01) will be set if this is the last message for a transact
IPROTO_FLAG_WAIT_SYNC (0x02) will be set if this is the last message for a transaction which cannot be completed immediately,
IPROTO_FLAG_WAIT_ACK (0x04) will be set if this is the last message for a synchronous transaction.

.. _box_protocol-raft:

IPROTO_RAFT = 0x1e
~~~~~~~~~~~~~~~~~~

A node broadcasts the IPROTO_RAFT request to all the replicas connected to it when the RAFT state of the node changes.
It can be any actions changing the state, like starting a new election, bumping the term, voting for another node, becoming the leader, and so on.

If there should be a response, for example, in case of a vote request to other nodes, the response will also be an IPROTO_RAFT message.
In this case, the node should be connected as a replica to another node from which the response is expected because the response is sent via the replication channel.
In other words, there should be a full-mesh connection between the nodes.

.. cssclass:: highlight
.. parsed-literal::
# <size>
msgpack(:samp:`{{MP_UINT unsigned integer = size(<header>) + size(<body>)}}`)
# <header>
msgpack({
IPROTO_REQUEST_TYPE: IPROTO_RAFT,
IPROTO_REPLICA_ID: :samp:`{{MP_INT integer}}`, # ID of the replica which the request came from
})
# <body>
msgpack({
IPROTO_RAFT_TERM: :samp:`{{MP_UINT unsigned integer}}`, # RAFT term of the instance
IPROTO_RAFT_VOTE: :samp:`{{MP_UINT unsigned integer}}`, # Instance vote in the current term (if any).
IPROTO_RAFT_STATE: :samp:`{{MP_UINT unsigned integer}}`, # Instance state; one of the three numbers: 1---follower, 2---candidate, 3---leader.
IPROTO_RAFT_VCLOCK: :samp:`{{MP_ARRAY {{MP_INT SRV_ID, MP_INT SRV_LSN}, {MP_INT SRV_ID, MP_INT SRV_LSN}, ...}}}` # Current vclock of the instance. Presents only on the instances in the "candidate" state (IPROTO_RAFT_STATE == 2).
})
.. _box_protocol-illustration:

Examples
Expand Down

0 comments on commit a443c85

Please sign in to comment.