-
Notifications
You must be signed in to change notification settings - Fork 3
/
messages.scala
65 lines (51 loc) · 2.8 KB
/
messages.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package saft
/** Base trait for messages that are sent between servers and clients. Messages are be classified:
*
* - basing on the recipient (whether the message is sent '''to''' a server or a client)
* - basing on the sender (if a message is sent '''from''' a server)
* - if the message is a '''request''', or a '''response'''
*/
sealed trait Message
/** A message (request or response) that can be sent to a server. */
sealed trait ToServerMessage extends Message
/** A message (request or response) that can be sent from a server. */
sealed trait FromServerMessage extends Message:
def term: Term
/** A message that is a request; always to a server. */
sealed trait RequestMessage extends ToServerMessage
/** A message that is a response, either to a client or a server. */
sealed trait ResponseMessage extends Message
/** A message that can be sent to a client; always a response. */
sealed trait ToClientMessage extends ResponseMessage
//
case class RequestVote(term: Term, candidateId: NodeId, lastLog: Option[LogIndexTerm]) extends RequestMessage with FromServerMessage
case class RequestVoteResponse(term: Term, voteGranted: Boolean) extends ResponseMessage with ToServerMessage with FromServerMessage
case class AppendEntries(
term: Term,
leaderId: NodeId,
prevLog: Option[LogIndexTerm],
entries: Vector[LogEntry],
leaderCommit: Option[LogIndex]
) extends RequestMessage
with FromServerMessage
/** The extra [[followerId]], [[prevLog]] and [[entryCount]] are needed to correlate the response & request, so that the leader can update
* [[LeaderState.nextIndex]] and [[LeaderState.matchIndex]] appropriately. Given an [[AppendEntries]] request message, a response can be
* created using [[AppendEntriesResponse.to]].
* @param followerId
* The id of the node which responds to the append entries request.
* @param entryCount
* The number of entries sent using [[AppendEntries]].
*/
case class AppendEntriesResponse(term: Term, success: Boolean, followerId: NodeId, prevLog: Option[LogIndexTerm], entryCount: Int)
extends ResponseMessage
with ToServerMessage
with FromServerMessage
object AppendEntriesResponse:
def to(followerId: NodeId, appendEntries: AppendEntries)(term: Term, success: Boolean): AppendEntriesResponse =
AppendEntriesResponse(term, success, followerId, appendEntries.prevLog, appendEntries.entries.length)
case class NewEntry(data: LogData) extends RequestMessage
sealed trait NewEntryAddedResponse extends ToClientMessage
/** Response sent when a new entry is successfully replicated and committed. */
case object NewEntryAddedSuccessfullyResponse extends NewEntryAddedResponse
/** Response sent in case a [[NewEntry]] is received by a non-leader node. */
case class RedirectToLeaderResponse(leaderId: Option[NodeId]) extends NewEntryAddedResponse