/** * Copyright (c) 2013, Willem-Hendrik Thiart * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * @file * @brief Representation of a peer * @author Willem Thiart himself@willemthiart.com * @version 0.1 */ #include #include #include #include #include "raft.h" #define RAFT_NODE_VOTED_FOR_ME 1 #define RAFT_NODE_VOTING 1 << 1 #define RAFT_NODE_HAS_SUFFICIENT_LOG 1 << 2 typedef struct { void* udata; int next_idx; int match_idx; int flags; int id; } raft_node_private_t; raft_node_t* raft_node_new(void* udata, int id) { raft_node_private_t* me; me = (raft_node_private_t*)calloc(1, sizeof(raft_node_private_t)); me->udata = udata; me->next_idx = 1; me->match_idx = 0; me->id = id; me->flags = RAFT_NODE_VOTING; return (raft_node_t*)me; } int raft_node_get_next_idx(raft_node_t* me_) { raft_node_private_t* me = (raft_node_private_t*)me_; return me->next_idx; } void raft_node_set_next_idx(raft_node_t* me_, int nextIdx) { raft_node_private_t* me = (raft_node_private_t*)me_; /* log index begins at 1 */ me->next_idx = nextIdx < 1 ? 1 : nextIdx; } int raft_node_get_match_idx(raft_node_t* me_) { raft_node_private_t* me = (raft_node_private_t*)me_; return me->match_idx; } void raft_node_set_match_idx(raft_node_t* me_, int matchIdx) { raft_node_private_t* me = (raft_node_private_t*)me_; me->match_idx = matchIdx; } void* raft_node_get_udata(raft_node_t* me_) { raft_node_private_t* me = (raft_node_private_t*)me_; return me->udata; } void raft_node_set_udata(raft_node_t* me_, void* udata) { raft_node_private_t* me = (raft_node_private_t*)me_; me->udata = udata; } void raft_node_vote_for_me(raft_node_t* me_, const int vote) { raft_node_private_t* me = (raft_node_private_t*)me_; if (vote) me->flags |= RAFT_NODE_VOTED_FOR_ME; else me->flags &= ~RAFT_NODE_VOTED_FOR_ME; } int raft_node_has_vote_for_me(raft_node_t* me_) { raft_node_private_t* me = (raft_node_private_t*)me_; return (me->flags & RAFT_NODE_VOTED_FOR_ME) != 0; } void raft_node_set_voting(raft_node_t* me_, int voting) { raft_node_private_t* me = (raft_node_private_t*)me_; if (voting) me->flags |= RAFT_NODE_VOTING; else me->flags &= ~RAFT_NODE_VOTING; } int raft_node_is_voting(raft_node_t* me_) { raft_node_private_t* me = (raft_node_private_t*)me_; return (me->flags & RAFT_NODE_VOTING) != 0; } void raft_node_set_has_sufficient_logs(raft_node_t* me_) { raft_node_private_t* me = (raft_node_private_t*)me_; me->flags |= RAFT_NODE_HAS_SUFFICIENT_LOG; } int raft_node_has_sufficient_logs(raft_node_t* me_) { raft_node_private_t* me = (raft_node_private_t*)me_; return (me->flags & RAFT_NODE_HAS_SUFFICIENT_LOG) != 0; } int raft_node_get_id(raft_node_t* me_) { raft_node_private_t* me = (raft_node_private_t*)me_; return me->id; }