1. 12 Sep, 2021 1 commit
    • Shaya Potter's avatar
      add a read_queue test to virtraft (#41) · bdd0797f
      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.
      bdd0797f
  2. 09 Sep, 2021 1 commit
  3. 01 Sep, 2021 1 commit
    • Shaya Potter's avatar
      include the prev_log_idx in the appendentry response (#45) · 64747dee
      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.
      64747dee
  4. 31 Aug, 2021 1 commit
  5. 24 Aug, 2021 1 commit
  6. 19 Aug, 2021 1 commit
  7. 18 Aug, 2021 2 commits
  8. 11 Aug, 2021 2 commits
  9. 06 Aug, 2021 1 commit
  10. 04 Aug, 2021 1 commit
  11. 03 Aug, 2021 1 commit
    • Shaya Potter's avatar
      Improve entry "vote/append couting" in the case of a leader demotion (#13) · 99e3d4a6
      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.
      
      99e3d4a6
  12. 02 Aug, 2021 1 commit
  13. 30 Jul, 2021 1 commit
    • Shaya Potter's avatar
      remove REMOVE_NODE log type and include its semantics in DEMOTE (#25) · d4d15e04
      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
      d4d15e04
  14. 27 Jul, 2021 1 commit
    • Shaya Potter's avatar
      match up raft_get_last_log_term() to should_grant_vote() (#14) · fab583d6
      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.
      fab583d6
  15. 26 Jul, 2021 1 commit
    • Shaya Potter's avatar
      only promote node to voting when its nonvoting has been applied (#12) · 600cf4fe
      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
      600cf4fe
  16. 19 Jul, 2021 1 commit
  17. 11 May, 2021 1 commit
    • Shaya Potter's avatar
      Fix quorum_msg_id assert (#3) · 93186886
      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.
      93186886
  18. 29 May, 2020 1 commit
  19. 27 May, 2020 1 commit
  20. 26 May, 2020 1 commit
  21. 24 May, 2020 1 commit
  22. 16 Apr, 2020 1 commit
  23. 23 Mar, 2020 2 commits
    • Yossi Gottlieb's avatar
      Fix issue with AE not delivered to removed nodes. · 02fda63f
      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.
      02fda63f
    • Yossi Gottlieb's avatar
      Revert commits c3064082 and da936a95. · 2c105362
      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).
      2c105362
  24. 12 Mar, 2020 2 commits
    • Yossi Gottlieb's avatar
      Add RAFT_LOGTYPE_NO_OP. · 5d7915f3
      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.
      5d7915f3
    • Yossi Gottlieb's avatar
      Fix virtraft membership tests. · c3064082
      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.
      c3064082
  25. 10 Mar, 2020 1 commit
    • Yossi Gottlieb's avatar
      Fix: multiple REMOVE_NODE permitted. · da936a95
      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.
      da936a95
  26. 19 Dec, 2018 1 commit
    • Yossi Gottlieb's avatar
      Read request handling support. · 84362fa7
      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.
      84362fa7
  27. 18 Dec, 2018 1 commit
  28. 13 Dec, 2018 1 commit
  29. 11 Dec, 2018 1 commit
  30. 09 Dec, 2018 1 commit
  31. 06 Dec, 2018 1 commit
  32. 16 Oct, 2018 1 commit
    • Yossi Gottlieb's avatar
      Fix a memory leak with log_clear. · 89d793a0
      Yossi Gottlieb authored
      This is probably most common when loading a snapshot.  Currently it is
      only possibly to free allocated entry memory on log_pop and log_poll,
      but neither are called on log_reset().
      
      This is a quick and non-breaking fix.  A better but not backward
      compatible option can be to have a free function callback as part of
      the entry itself (automatically called when needed, not by log_pop or
      log_poll).  This would also make it easier to avoid redundant buffer
      allocs/copies on the app side.
      89d793a0
  33. 08 Oct, 2018 1 commit
  34. 04 Oct, 2018 2 commits
  35. 27 Sep, 2018 1 commit
    • Yossi Gottlieb's avatar
      AE error response not properly handled. · 5e336b8f
      Yossi Gottlieb authored
      Errors were ignored if node's match_idx==next_idx-1, I assume (??) as a
      precaution against silently feeding a node that is not monotonic.
      
      However this does not consider the case where send_appendentries()
      relies on snapshot_last_idx which may be greater than the node's index.
      5e336b8f