Skip to content

Commit

Permalink
Implement follower
Browse files Browse the repository at this point in the history
  • Loading branch information
resetius committed Nov 23, 2023
1 parent 9d6a330 commit 2f6e9fd
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 8 deletions.
24 changes: 22 additions & 2 deletions src/raft.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,27 @@ TRaft::TRaft(int node, const TNodeDict& nodes, const std::shared_ptr<ITimeSource
, LastTime(TimeSource->Now())
{ }

std::unique_ptr<TResult> TRaft::OnRequestVote(TMessageHolder<TRequestVoteRequest> message) {
return nullptr;
}

std::unique_ptr<TResult> TRaft::OnAppendEntries(TMessageHolder<TAppendEntriesRequest> message) {
return nullptr;
}

std::unique_ptr<TResult> TRaft::Follower(ITimeSource::Time now, TMessageHolder<TMessage> message) {
if (auto maybeTimeout = message.Maybe<TTimeout>()) {
if (now - LastTime > TTimeout::Election) {
return std::make_unique<TResult>(TResult {
.NextStateName = EState::CANDIDATE,
.UpdateLastTime = true
});
}
} else if (auto maybeRequestVote = message.Maybe<TRequestVoteRequest>()) {
return OnRequestVote(std::move(maybeRequestVote.Cast()));
} else if (auto maybeAppendEntries = message.Maybe<TAppendEntriesRequest>()) {
return OnAppendEntries(maybeAppendEntries.Cast());
}
return nullptr;
}

Expand Down Expand Up @@ -95,7 +115,7 @@ void TRaft::ApplyResult(ITimeSource::Time now, std::unique_ptr<TResult> result,
Nodes[m->Dst]->Send(m);
}
}
if (result->NextStateName) {
StateName = static_cast<EState>(result->NextStateName);
if (result->NextStateName != EState::NONE) {
StateName = result->NextStateName;
}
}
12 changes: 6 additions & 6 deletions src/raft.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,21 +64,18 @@ struct TVolatileState {
TVolatileState& MergeMatchIndex(const std::vector<int>& matchIndex);
};

struct TResult;

enum class EState: int {
NONE = 0,
CANDIDATE = 1,
FOLLOWER = 2,
LEADER = 3,
};

using TStateFunc = std::function<std::unique_ptr<TResult>(uint64_t now, const TMessageHolder<TMessage>& message)>;

struct TResult {
std::unique_ptr<TState> NextState;
std::unique_ptr<TVolatileState> NextVolatileState;
int NextStateName;
bool UpdateLastTime;
EState NextStateName = EState::NONE;
bool UpdateLastTime = false;
TMessageHolder<TMessage> Message;
std::vector<TMessageHolder<TAppendEntriesRequest>> Messages;
};
Expand All @@ -101,6 +98,9 @@ class TRaft {
std::unique_ptr<TResult> Candidate(ITimeSource::Time now, TMessageHolder<TMessage> message);
std::unique_ptr<TResult> Leader(ITimeSource::Time now, TMessageHolder<TMessage> message);

std::unique_ptr<TResult> OnRequestVote(TMessageHolder<TRequestVoteRequest> message);
std::unique_ptr<TResult> OnAppendEntries(TMessageHolder<TAppendEntriesRequest> message);

int Id;
TNodeDict Nodes;
std::shared_ptr<ITimeSource> TimeSource;
Expand Down

0 comments on commit 2f6e9fd

Please sign in to comment.