raft_message.h 2.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * Copyright (c) 2019 TAOS Data, Inc. <cli@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/>.
 */

#ifndef _TD_LIBS_SYNC_RAFT_MESSAGE_H
#define _TD_LIBS_SYNC_RAFT_MESSAGE_H

#include "sync.h"
20
#include "sync_type.h"
21 22 23 24 25 26 27 28 29 30 31

/** 
 * below define message type which handled by Raft node thread
 * internal message, which communicate in threads, start with RAFT_MSG_INTERNAL_*,
 * internal message use pointer only, need not to be decode/encode
 * outter message start with RAFT_MSG_*, need to implement its decode/encode functions
 **/
typedef enum RaftMessageType {
  // client propose a cmd
  RAFT_MSG_INTERNAL_PROP = 1,

32 33
  // node election timeout
  RAFT_MSG_INTERNAL_ELECTION = 2,
34

35 36
  RAFT_MSG_VOTE = 3,
  RAFT_MSG_VOTE_RESP = 4,
37

38 39
  RAFT_MSG_PRE_VOTE = 5,
  RAFT_MSG_PRE_VOTE_RESP = 6,
40 41 42 43 44 45 46 47
} RaftMessageType;

typedef struct RaftMsgInternal_Prop {
  const SSyncBuffer *pBuf;
  bool isWeak;
  void* pData;
} RaftMsgInternal_Prop;

48 49 50 51 52 53 54 55 56
typedef struct RaftMsgInternal_Election {

} RaftMsgInternal_Election;

typedef struct RaftMsg_PreVoteResp {
  bool reject;
} RaftMsg_PreVoteResp;

typedef struct SSyncMessage {
57
  RaftMessageType msgType;
58
  SyncTerm term;
59 60 61 62 63
  SyncNodeId from;
  SyncNodeId to;

  union {
    RaftMsgInternal_Prop propose;
64 65 66 67

    RaftMsgInternal_Election election;

    RaftMsg_PreVoteResp preVoteResp;
68
  };
69
} SSyncMessage;
70

71 72
static FORCE_INLINE SSyncMessage* syncInitPropMsg(SSyncMessage* pMsg, const SSyncBuffer* pBuf, void* pData, bool isWeak) {
  *pMsg = (SSyncMessage) {
73
    .msgType = RAFT_MSG_INTERNAL_PROP,
74
    .term = 0,
75 76 77 78 79 80 81 82 83 84
    .propose = (RaftMsgInternal_Prop) {
      .isWeak = isWeak,
      .pBuf = pBuf,
      .pData = pData,
    },
  };

  return pMsg;
}

85 86 87 88 89 90 91 92 93 94 95 96 97
static FORCE_INLINE SSyncMessage* syncInitElectionMsg(SSyncMessage* pMsg, SyncNodeId from) {
  *pMsg = (SSyncMessage) {
    .msgType = RAFT_MSG_INTERNAL_ELECTION,
    .term = 0,
    .from = from,
    .election = (RaftMsgInternal_Election) {

    },
  };

  return pMsg;
}

98 99 100 101 102 103 104 105
static FORCE_INLINE bool syncIsInternalMsg(RaftMessageType msgType) {
  return msgType == RAFT_MSG_INTERNAL_PROP ||
         msgType == RAFT_MSG_INTERNAL_ELECTION;
}

static FORCE_INLINE RaftMessageType SyncRaftVoteRespMsgType(RaftMessageType msgType) {
  if (msgType == RAFT_MSG_VOTE) return RAFT_MSG_PRE_VOTE_RESP;
  return RAFT_MSG_PRE_VOTE_RESP;
106 107
}

108
void syncFreeMessage(const SSyncMessage* pMsg);
109

110 111 112
// message handlers
void syncRaftHandleElectionMessage(SSyncRaft* pRaft, const SSyncMessage* pMsg);

113
#endif  /* _TD_LIBS_SYNC_RAFT_MESSAGE_H */