- 22 Jun, 2023 1 commit
-
-
Ozan Tezcan authored
-
- 20 Jun, 2023 1 commit
-
-
Ozan Tezcan authored
Free memory on raft_destroy() and raft_log_free()
-
- 23 May, 2023 1 commit
-
-
Ozan Tezcan authored
-
- 10 May, 2023 3 commits
-
-
Ozan Tezcan authored
Consider the snapshot delivery scenario: - Follower receives the last chunk, calls store_snapshot_chunk() succesfully and updates its snapshot_recv_offset. Later it calls load_snapshot() but it fails. - Follower returns failure response. In the response, "offset" will be zero. So, follower requests leader to start snapshot delivery from the beginning. - Leader sends the first chunk. Follower rejects the message as its snapshot_recv_offset is not zero (Actually, follower has stored all the bytes, snapshot_recv_offset is equal to snapshot size). Follower returns this offset in the response. - Leader calls get_snapshot_chunk() callback for the received offset from the follower. As there are no more bytes to send, get_snapshot_chunk() returns RAFT_ERR_DONE and leader skips sending snapshot req. This bug causes leader to stop sending appendreq/snapshotreq to the follower until leader takes another snapshot. Follower starts an election as it doesn't hear from the leader but other nodes won't vote for it as the rest of the cluster operates fine. Solution is to consider store_snapshot_chunk() and load_snapshot() as an atomic unit. So, if load_snapshot() fails, we return the response as if like we didn't store the last chunk. Leader will send the same chunk again and we can retry the operation.
-
Ozan Tezcan authored
Normally, receiver side has checks if the chunk is for the correct index and offset. Adding snapshot_index to raft_snapshot_resp_t just to be sure we don't update snapshot offset for the node unnecessarily. Also, it makes debugging easier as we know the snapshot index that response refers to.
-
Shaya Potter authored
Record counts for raft RPC stats, sending / retrieving / success / failure and the like. cover append entry, requestvote (including prevote) and snapshots --------- Co-authored-by:
Ozan Tezcan <ozantezcan@gmail.com>
-
- 09 May, 2023 1 commit
-
-
Ozan Tezcan authored
-
- 04 May, 2023 1 commit
-
-
Ozan Tezcan authored
Currently, entry len type is unsigned int which limits entry size to 4 gb. Changing it to raft_size_t (unsigned long long) to allow larger entries.
-
- 15 Apr, 2023 1 commit
-
-
Ozan Tezcan authored
`raft_entry_t` has `id` field which is used for debugging purposes. Currently, it has the value of zero but we can assign a random value by default. User might override it if required.
-
- 13 Apr, 2023 1 commit
-
-
Ozan Tezcan authored
-
- 27 Dec, 2022 1 commit
-
-
Shaya Potter authored
enables users of libraft to group raft entries into sessions. Co-authored-by:
Ozan Tezcan <ozantezcan@gmail.com>
-
- 31 Oct, 2022 1 commit
-
-
Ozan Tezcan authored
In C, enum constants are `int` but currently, `type` variable in entry struct is `short`. Changed it to `int` to provide type-safety.
-
- 26 Oct, 2022 1 commit
-
-
Ozan Tezcan authored
-
- 25 Oct, 2022 2 commits
-
-
Ozan Tezcan authored
This PR refactors code regarding `term` handling inside `raft_recv_appendentries()` and `raft_recv_snapshot()` without introducing any logic changes. - Deleted `raft_receive_term()` function: This function sets the node as follower in certain cases. Although, it misses the pre-candidate state. We already set the node as follower inside `raft_accept_leader()`. (With the correct check that also handles pre-candidate state). - Moved `raft_reset_transfer_leader()` into `raft_accept_leader()`. Leader transfer is completed when we accept a leader. So, it makes sense to move it into `raft_accept_leader()`. - Added some tests to verify node becomes follower even on a pre-candidate state when a request is received with same or higher term.
-
Ozan Tezcan authored
Refactored raft_recv_appendentries() just to simplify the flow. This PR should not introduce any behavioral change. Only exception is previously, some tests were manually creating an append request with prev_log_idx:0 and prev_log_term:1. This is not possible and it cannot happen without manually creating append requests. Term of the entry at index 0 cannot be 1. (it is zero by definition). Fixed these tests as part of this PR.
-
- 20 Oct, 2022 1 commit
-
-
Ozan Tezcan authored
-
- 03 Oct, 2022 1 commit
-
-
Hanna Fadida authored
-
- 28 Sep, 2022 1 commit
-
-
Ozan Tezcan authored
Fix `term` and `request_term` identifiers in request_vote_resp debug log statement. Previously : `term: rt`, `request_term: t` After the fix: `term: t`, `request_term: rt` Introduced by https://github.com/RedisLabs/raft/pull/127
-
- 22 Sep, 2022 1 commit
-
-
Ozan Tezcan authored
Documentation fix Co-authored-by:
Hanna Fadida <hanna.fadida@redislabs.com>
-
- 20 Sep, 2022 1 commit
-
-
Ozan Tezcan authored
Revert some changes from https://github.com/RedisLabs/raft/pull/141 I've realized these functions might be required, either for snapshotting process or testing. e.g: `raft_node_set_voting()` is required after snapshot: https://github.com/RedisLabs/raft/blame/master/docs/Using.md#L306 For now, we can keep them in raft.h . Over time, we can revisit this decision and move into raft_private.h if necessary.
-
- 19 Sep, 2022 4 commits
-
-
Ozan Tezcan authored
Documentation fixes Co-authored-by:
Hanna Fadida <hanna.fadida@redislabs.com>
-
Ozan Tezcan authored
Documentation
-
Ozan Tezcan authored
If a node receives a snapshot with snapshot_last_idx, it checks if it already has the snapshot and informs leader accordingly. The problem is the receiver node may not have a snapshot but log entries more than snapshot_last_idx: e.g Leader: snapshot_last_idx : 50 Follower: snapshot_last_idx:0, last log entry index: 100 If the leader tries to send snapshot to the follower (with snapshot last index:50), currently, follower accepts the snapshot. As follower already has entries upto index 100, snapshot is unnecessary. After delivery is complete, to load the snapshot, follower will call raft_begin_load_snapshot(). This function realizes the snapshot was unnecessary and it fails. It is harmless but snapshot delivery was unnecessary. This PR prevents this issue earlier by checking last log index instead of snapshot last index. Also, added more virtraft tests with auto-flush on. (This is a different pattern, it might help with detecting these issues)
-
Ozan Tezcan authored
Moved internal functions to raft_internal.h Still, application can include raft_private.h use internal functions (not suggested).
-
- 12 Sep, 2022 3 commits
-
-
Ozan Tezcan authored
A node can receive responses from followers who are not aware of they have been removed from the cluster configuration. In this case, recv_ family functions can be called without a node structure. We should ignore these messages. We should also ignore snapshot and appendentries responses if we are not leader anymore. Returning an error code for this case does not make sense because application cannot do anything but ignore the error code. This PR changes return value to zero for these cases.
-
Ozan Tezcan authored
Added a helper function to get string representation of an error code.
-
Ozan Tezcan authored
Refactor callback comments. - Regroup related callbacks. - Move optional callbacks to the bottom and indicate "(optional)".
-
- 05 Sep, 2022 1 commit
-
-
Ozan Tezcan authored
Revert change for sending timeout message. Introduced by https://github.com/RedisLabs/raft/pull/127. This PR deleted the check to prevent sending duplicate timeout messages.
-
- 04 Sep, 2022 1 commit
-
-
Ozan Tezcan authored
Propagate error codes from persist_metadata() callback
-
- 30 Aug, 2022 1 commit
-
-
Ozan Tezcan authored
Refactor debug logging and change log callback e.g: 19 --> 13, sent snapshot_resp id:27712, t:24, s:1, o:4096, lc:0 14 --> 17, sent requestvote_req pv:1, t:25, ci:14, lli:6848, llt:23 14 <-- 17, recv requestvote_resp pv:1, t:25, rt:24, vg:0 Breaking changes: raft_log_f() callback will not pass node_id_t anymore. Sender and receiver will be part of the log line as you can see above.
-
- 29 Aug, 2022 3 commits
-
-
Ozan Tezcan authored
Simplied pop callback. Previously, libraft was passing a callback(raft_entry_notify_f) to the pop callback. The application was supposed to call that callback for each removed entry. Libraft can loop over the entries and call the required functions itself. So, we can delete raft_entry_notify_f from the pop callback just to simplify API. In addition to that, this PR removes raft_pop_entry() function which doesn't have a use-case, as far as I can see. We can use raft_delete_entry_from_idx(me, raft_get_current_idx()) instead if required.
-
Ozan Tezcan authored
Add raft_get_last_applied_term()
-
Ozan Tezcan authored
Fix style issues in raft_log.c raft_node.c and raft_server_properties.c
-
- 28 Aug, 2022 1 commit
-
-
Ozan Tezcan authored
In https://github.com/RedisLabs/raft/pull/118, we introduced raft_restore_snapshot() which makes raft_set_snapshot_metadata() obsolete.
-
- 25 Aug, 2022 2 commits
-
-
Ozan Tezcan authored
-
Ozan Tezcan authored
Configuration changes are special in Raft. They take effect whenever the related log entries are appended. On a restart, we should go over the log entries and rebuild the configuration. Adding raft_restore_log() function for this purpose. Overall, on a restart, application should do: Load the snapshot and call raft_restore_snapshot() Load the log entries and call raft_restore_log() Read the metadata file and call raft_restore_metadata().
-
- 23 Aug, 2022 3 commits
-
-
Yehoshua (Josh) Hershberg authored
-
Ozan Tezcan authored
-
Ozan Tezcan authored
Combine raft_persist_vote_f and raft_persist_term_f into a single callback: raft_persist_metadata_f. Users should persist vote and term into a single metadata file. After a restart, application should call raft_restore_metadata() to restore vote and term
-
- 22 Aug, 2022 1 commit
-
-
Ozan Tezcan authored
Use typedef instead of the actual type
-