syncRequestVote.c 2.3 KB
Newer Older
M
Minghao Li 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#include "syncRequestVote.h"

M
Minghao Li 已提交
18
int32_t syncNodeRequestVote(SSyncNode* ths, const SyncRequestVote* pMsg) {
M
Minghao Li 已提交
19 20 21 22 23 24 25 26 27 28 29
  // TLA+ Spec
  // RequestVote(i, j) ==
  //    /\ state[i] = Candidate
  //    /\ j \notin votesResponded[i]
  //    /\ Send([mtype         |-> RequestVoteRequest,
  //             mterm         |-> currentTerm[i],
  //             mlastLogTerm  |-> LastTerm(log[i]),
  //             mlastLogIndex |-> Len(log[i]),
  //             msource       |-> i,
  //             mdest         |-> j])
  //    /\ UNCHANGED <<serverVars, candidateVars, leaderVars, logVars>>
M
Minghao Li 已提交
30 31
}

M
Minghao Li 已提交
32
int32_t syncNodeOnRequestVoteCb(SSyncNode* ths, SyncRequestVote* pMsg) {
M
Minghao Li 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
  // TLA+ Spec
  // HandleRequestVoteRequest(i, j, m) ==
  //    LET logOk == \/ m.mlastLogTerm > LastTerm(log[i])
  //                 \/ /\ m.mlastLogTerm = LastTerm(log[i])
  //                    /\ m.mlastLogIndex >= Len(log[i])
  //        grant == /\ m.mterm = currentTerm[i]
  //                 /\ logOk
  //                 /\ votedFor[i] \in {Nil, j}
  //    IN /\ m.mterm <= currentTerm[i]
  //       /\ \/ grant  /\ votedFor' = [votedFor EXCEPT ![i] = j]
  //          \/ ~grant /\ UNCHANGED votedFor
  //       /\ Reply([mtype        |-> RequestVoteResponse,
  //                 mterm        |-> currentTerm[i],
  //                 mvoteGranted |-> grant,
  //                 \* mlog is used just for the `elections' history variable for
  //                 \* the proof. It would not exist in a real implementation.
  //                 mlog         |-> log[i],
  //                 msource      |-> i,
  //                 mdest        |-> j],
  //                 m)
  //       /\ UNCHANGED <<state, currentTerm, candidateVars, leaderVars, logVars>>
M
Minghao Li 已提交
54
}