- 23 Sep, 2021 2 commits
-
-
Shaya Potter authored
this is the small modifications needed for raftlib to support timeout now rpc 1) add a flag to requestvote type to tell other nodes its overriding normal chec 2) new send_timeoutnow callback to send a timeout now rpc at right time 3) call said callback is we've marked the node as timeout now and in raft_appendentries_response raft_get_current_idx(me_) == r->current_idx (i.e. response says the node's idx is up to date with leader) 4) add helper functions to set/get/reset timeout flag on node structs for targeted node. how it would be used by client 1) client of libraft will call raft_transfer_leader(raft_server_t* me_, raft_node_id_t node_id) to target the node they want to transfer to. 2) client of libraft will provide the send_timeoutnow() callback for the actual sending of the rpc 3) client of libraft will modify their existing notify_state_event() callback to observe the result of the timeout now operation. if it receives a RAFT_STATE_LEADERSHIP_TRANSFER_FAILED, then the transfer failed if it received a RAFT_STATE_FOLLOWER, then it inspects for the actual leader to see if its the expected one and can return that it was transferred to expected node or not if it received a RAFT_STATE_CANDIDATE, then the transfer also failed, as the targeted node sent a request vote which removed leadership, but wasn't able to win the election. With PreVote, this latter case should be very rare.
-
Ozan Tezcan authored
Define separate callback function for node id retrieval
-
- 22 Sep, 2021 1 commit
-
-
Shaya Potter authored
* fix read queue test to be more accurate 1) each server's set of nodes, keeps the max msg_id its seen from that node when that node has been later 1a) because of this get_max_seen now operates on a server's nodes, not on the server itself b 2) virtraft encodes the leader id into the "arg" (with a user redefinable multiplier) it sends as part of the callback, so when we get the callback, we can know what leader its for and check its voters for correctness.
-
- 15 Sep, 2021 2 commits
-
-
Ozan Tezcan authored
-
Ozan Tezcan authored
-
- 14 Sep, 2021 2 commits
-
-
Ozan Tezcan authored
-
Ozan Tezcan authored
* prevote implementation
-
- 12 Sep, 2021 1 commit
-
-
Shaya Potter authored
* add a read_queue test to virtraft every iteration we push a read_queue request and the handler and an we pass to it set a variable on calling. we can use this to make sure that the read_queue doesn't get too far from the iteration. i.e. we pass the leader's msg_id and can check to ensure that leader's msg_id doesn't get too far from the msg_id (variable) we see in read_queue test this is analog to the current log applying deadlock test. * implements msg_id checking in virtraft for verification of read_queue requests When we pop an entry off the read_queue with the can_read flag, we verify across all nodes that the majority of nodes have accepted from the leader a msg_id past what this read_queue entry needs. the problem with this is, that until now, msg_id was private to each server instance and has no relevance to the followre nodes except to include it back in response. we change that to have the followers store the max msg_id they've seen from their current leader using that, in the read_queue_handler we can verify that the leader's voting nodes have a quorum past the msg_id variable that the handler will return to ensure that this read_queue handler call is correct.
-
- 09 Sep, 2021 1 commit
-
-
Ozan Tezcan authored
Unknown node handling
-
- 01 Sep, 2021 1 commit
-
-
Shaya Potter authored
the problem we have is that 2 appendentries can be in process in parallel Howver, the response handler doesn't expect this, it will reset the next_idx in both, but currently resets next_idx based on next_idx's value, not the old value that was the basis of prev_log_idx. Solution: return prev_log_idx in the response Problem with solution: prev_log_idx is not always based on next_idx from node, but can be based on a snapshot idx if it no longer exists. I haven't coded this yet, but perhaps can determine if the prev_log_idx that is returned is the snapshot_idx and if so, then dont increment by 1. Its possible we could pass even another flag into the appendentries struct to say if its a snapshot, but that's ugly. In addition, we increment msg_id on each appendentries so that if a response comes back out of order and we have already accepted the later response, we just ignore this response. In addition, on appendentry response, even if the appendentry wasn't a success, as long as its the same term as us (i.e. we are still the leader) then for leader/quorum purposes, that is sufficient, so move up set_last_ack to right after term test.
-
- 31 Aug, 2021 1 commit
-
-
Ozan Tezcan authored
-
- 24 Aug, 2021 1 commit
-
-
Shaya Potter authored
1) don't skip setting next_idx for an inactive node on become_leader() 2) in raft_send_appendentries() short circuit and don't send anything if inactive
-
- 19 Aug, 2021 1 commit
-
-
Ozan Tezcan authored
code refactor
-
- 18 Aug, 2021 2 commits
-
-
Ozan Tezcan authored
Implemented check-quorum
-
Shaya Potter authored
we were using wrong printf modifiers, now we check them and fixed all of them so no warnings/errors
-
- 11 Aug, 2021 2 commits
-
-
Ozan Tezcan authored
Fix : Added missing va_end() and naming change for the log function
-
Ozan Tezcan authored
-
- 06 Aug, 2021 1 commit
-
-
Ozan Tezcan authored
-
- 04 Aug, 2021 1 commit
-
-
Shaya Potter authored
create a self documenting function name instead of throwing in a bunch of conditions
-
- 03 Aug, 2021 1 commit
-
-
Shaya Potter authored
Before, we only did "auto commit" of entries if the number of voters == 1. As we can have a "non voting leader", this is wrong, as the voter can be another node, not the leader, therefore we add a condition to ensure that the leader is a voter too, so that we know that the leader is the single voter.
-
- 02 Aug, 2021 1 commit
-
-
Shaya Potter authored
major bug in terms of election as term wasn't being increased in cases of partioned network where a demote was received but not applied. + adds an assert to the existing test of promotion to leader if only voter to ensure term is incremented as fixed by this PR
-
- 30 Jul, 2021 1 commit
-
-
Shaya Potter authored
this commit changes libraft's from using the DEMOTE_NODE log entry which would then initiate a REMOVE_NODE log entry on the DEMOTE's commit, to only using a REMOVE. * add the removal of the active node flag on append of REMOVE and (add back if reverted) * modify is_voting to check for active state as well this enables simplifying appending and reverting nodes, as we shouldn't be touching voting state, (as a removing node might not be voting yet), only its active state. and as the is_voting check also now checks for active state, simplifies a lot of code that manually tested both. * add a test for reversion of a non voting node removal previously, the code could not handle demoting/removing a non voting node, as demote would want to unset the voting flag (which a non voting node obviously doesn't have), and would therefore fail an assertion. with the new code, we no longer unset the voting flag in removal, and this test make sure both the is_voting and is_active return as expected through a process of add/removal/revert
-
- 27 Jul, 2021 1 commit
-
-
Shaya Potter authored
raft_get_last_log_term() is used for filling in vote requests, except it didn't match 100% with the logic in should_grant_vote * update test to prove that change works as needed previous test tested when we don't snapshot everything, but code was broken when we did. modified test tested only when we snapshot everything, now we do both in sequence. * use raft_get_last_log_term in __should_grant_vote() also modify __should_grant_vote to take a raft_server_t instead of raft_server_privat_t so its not constantly casting it to void.
-
- 26 Jul, 2021 1 commit
-
-
Shaya Potter authored
before we were able to promote a "ready" but not applied nonvoting node to a voting state, which means it would change the calculation as could vote for itself to be added. * fix tests that check for has_sufficient_logs because of a fix put in to not allow a node to be added until its "addition" as a non voter was comitted, that broke existing tests where that flag wasn't being set and testing that the nodes could be promoted * add a test that has_sufficient_logs will fail if addition not committed yet code before would add a node as a voter (via has_sufficient_logs) even if the initial non voter addition wasn't committed the test for this in the code actually tested after setting addition_committed. add a test that does the same without that flag being set and expects that has_sufficient_logs will not be set
-
- 19 Jul, 2021 1 commit
-
-
Shaya Potter authored
current_leader points to the node object corresponding to the leader node. But we are about to free() it. to prevent an access after free, have to unset it here.
-
- 11 May, 2021 1 commit
-
-
Shaya Potter authored
Before this commit, active and voting flags were ignored resulting with a result that does not agree with `raft_get_num_voting_nodes()` and an assertion. This could be seen when a leader node gets removed while a read operation is in progress.
-
- 29 May, 2020 1 commit
-
-
Yossi Gottlieb authored
Fix for a special case where quorum reads are attempted on a single node cluster before anything else was written.
-
- 27 May, 2020 1 commit
-
-
Yossi Gottlieb authored
-
- 26 May, 2020 1 commit
-
-
Yossi Gottlieb authored
If snapshot is on the same term, avoid resetting voted_for to prevent an additional vote. If snapshot is on a newer term, reset and persist term and vote.
-
- 24 May, 2020 1 commit
-
-
Yossi Gottlieb authored
-
- 16 Apr, 2020 1 commit
-
-
Yossi Gottlieb authored
-
- 23 Mar, 2020 2 commits
-
-
Yossi Gottlieb authored
During joint consensus, we need to deliver entries to demoted and removed nodes so they can gracefully shut down. This also fixes an issue with raft_send_appendentries_all() which aborted on first delivery error, creating artificial cluster partitions. This problem is further aggravated when attempting to deliver to inactive nodes.
-
Yossi Gottlieb authored
Turns out documentation is not up to date regarding the process of node removal, and it the current implementation assumes a two-phase process is always required (i.e. DEMOTE followed by REMOVE).
-
- 12 Mar, 2020 2 commits
-
-
Yossi Gottlieb authored
The no-op entry gets committed as soon as a new leader is elected, in order to establish the commit index and prevent stale reads.
-
Yossi Gottlieb authored
This fixes an issue with virtraft2 which was not able to perform REMOVE_NODE when DEMOTE_NODE was applied. The previous fix of directly removing nodes was not aligned with how virtraft2 manages nodes.
-
- 10 Mar, 2020 1 commit
-
-
Yossi Gottlieb authored
The limit for enforcing a single uncommitted voting change must apply to remove node as well. It seems like it was left out considering only the case where it follows DEMOTE_NODE, but that's not really required.
-
- 19 Dec, 2018 1 commit
-
-
Yossi Gottlieb authored
This makes it possible to request a consistent read without having to commit it as a log operation. For every read request an AE heartbeat is delivered and a quorum response is expected.
-
- 18 Dec, 2018 1 commit
-
-
Yossi Gottlieb authored
-
- 13 Dec, 2018 1 commit
-
-
Yossi Gottlieb authored
-
- 11 Dec, 2018 1 commit
-
-
Yossi Gottlieb authored
-