{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":680528063,"defaultBranch":"main","name":"openraft","ownerLogin":"getong","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2023-08-19T14:37:37.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/3949379?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1706518581.0","currentOid":""},"activityList":{"items":[{"before":"681d04dac6a99ae8d0a6307756e839ff0a21291f","after":"5d75cf21f71b083b2b8acd8ffdd8993c1bfce36f","ref":"refs/heads/main","pushedAt":"2024-09-14T16:51:13.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: Chunk read log entry and check range on startup\n\n- Implement chunk-based reading of committed log entries when\n re-applying to state machine upon startup.\n\n- Add validation for log entry indexes, to avoid applying wrong entries\n to state machine.","shortMessageHtmlLink":"Refactor: Chunk read log entry and check range on startup"}},{"before":"c28ad9bcbfe4b0e5981b42d5e45933c71162f2c3","after":"681d04dac6a99ae8d0a6307756e839ff0a21291f","ref":"refs/heads/main","pushedAt":"2024-09-13T12:25:25.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Fix: When a Leader starts up, it should re-apply all logs\n\nWhen a node starts up as the Leader, it now re-applies all logs at once.\n\nPreviously:\n- New Leader only updated IO progress\n- Committed log ID remained unchanged\n\nNow:\n- New Leader updates IO progress\n- Triggers update of committed log ID\n\n- Fix: #1246","shortMessageHtmlLink":"Fix: When a Leader starts up, it should re-apply all logs"}},{"before":"bcc9ac2cbe9f85af69ba00a85597b21f756d61ad","after":"c28ad9bcbfe4b0e5981b42d5e45933c71162f2c3","ref":"refs/heads/main","pushedAt":"2024-09-11T16:28:24.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Doc: Example description in README","shortMessageHtmlLink":"Doc: Example description in README"}},{"before":"0063194c7f1e3d3c15402ada1f3ecdcbe5e9ebe4","after":"bcc9ac2cbe9f85af69ba00a85597b21f756d61ad","ref":"refs/heads/main","pushedAt":"2024-09-06T06:31:43.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Fix: Prevent panic when calling `Raft::change_membership()` on uninitialized node\n\nPreviously, `change_membership()` assumed the current membership config was\nalways non-empty and used the last config entry. However, uninitialized\nnodes lack a membership config, leading to panics.\n\nThis commit adds checks to prevent `change_membership()` from panicking","shortMessageHtmlLink":"Fix: Prevent panic when calling Raft::change_membership() on uninit…"}},{"before":"8cde48f7c2d1ac3d4339effed7f9b378ed7a9620","after":"0063194c7f1e3d3c15402ada1f3ecdcbe5e9ebe4","ref":"refs/heads/main","pushedAt":"2024-09-01T15:44:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Doc: update doc of heartbeat metric","shortMessageHtmlLink":"Doc: update doc of heartbeat metric"}},{"before":"fbfa01871b9243b7ed37facbfc9943a461f09349","after":"8cde48f7c2d1ac3d4339effed7f9b378ed7a9620","ref":"refs/heads/main","pushedAt":"2024-09-01T14:24:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Doc: Add documentation for `AsyncRuntime::Watch` traits\n\nAdd comprehensive documentation for the `Watch` trait and its associated traits\nin the `AsyncRuntime` module. This improves code clarity and helps developers\nunderstand the purpose and usage and behavior of these traits.\n\n- Fix: #1238","shortMessageHtmlLink":"Doc: Add documentation for AsyncRuntime::Watch traits"}},{"before":"c279fb86021f9d5f62f87941cb7abb1d004f4a52","after":"fbfa01871b9243b7ed37facbfc9943a461f09349","ref":"refs/heads/main","pushedAt":"2024-08-31T15:11:54.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Chore: fix lint warnings","shortMessageHtmlLink":"Chore: fix lint warnings"}},{"before":"e54a1fd4b981eec389af2a0dfb4541206d6190cc","after":"c279fb86021f9d5f62f87941cb7abb1d004f4a52","ref":"refs/heads/main","pushedAt":"2024-08-18T12:24:09.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Feature: Add MPSC channel to AsyncRuntime\n\n`AsyncRuntime` trait defines the async-runtime such as tokio to run\nOpenraft. This commit add MPSC abstraction to `AsyncRuntime` and\nMPSC implementations to tokio based runtime and monoio based runtime.","shortMessageHtmlLink":"Feature: Add MPSC channel to AsyncRuntime"}},{"before":"2ae45507fe334f7ec8887972ad23e601da5c6e57","after":"e54a1fd4b981eec389af2a0dfb4541206d6190cc","ref":"refs/heads/main","pushedAt":"2024-08-15T13:29:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: Move storage struct into separate files","shortMessageHtmlLink":"Refactor: Move storage struct into separate files"}},{"before":"b72ea560c11c125a842d1acd3bf2614ee947b57d","after":"2ae45507fe334f7ec8887972ad23e601da5c6e57","ref":"refs/heads/main","pushedAt":"2024-08-13T09:34:39.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: Remove `request_id` from replication\n\nThe `request_id` was used to track request/response pairs between\n`RaftCore` and `ReplicationCore` in a one-request, one-response mode. To\nsupport streaming replication, which requires a one-request,\nmany-response mode, `request_id` has been removed in this\ncommit.","shortMessageHtmlLink":"Refactor: Remove request_id from replication"}},{"before":"c6f4a779e0bb563788c4187381065162e76ea996","after":"b72ea560c11c125a842d1acd3bf2614ee947b57d","ref":"refs/heads/main","pushedAt":"2024-08-07T09:19:59.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Feature: monoio runtime support\n\n- Add monoio runtime in a separate crate.\n\n- Test: test MonoioRuntime with `Suite::test_all()`\n\n- Add CI: run monoio unit tests with a separate job, because it does\n belong to the workspace","shortMessageHtmlLink":"Feature: monoio runtime support"}},{"before":"662d888327cb4b25d2da195e6069b44f35c43a62","after":"c6f4a779e0bb563788c4187381065162e76ea996","ref":"refs/heads/main","pushedAt":"2024-08-06T14:02:23.000Z","pushType":"push","commitsCount":6,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: Snapshot with same last log id can be installed","shortMessageHtmlLink":"Refactor: Snapshot with same last log id can be installed"}},{"before":"94c820c3047aa07da41bb6bd1524f9dc00eeed02","after":"662d888327cb4b25d2da195e6069b44f35c43a62","ref":"refs/heads/main","pushedAt":"2024-08-03T19:37:50.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: ignore notification for Leader/Candidate when node is in such state","shortMessageHtmlLink":"Refactor: ignore notification for Leader/Candidate when node is in su…"}},{"before":"7fa0f9b77b37c4bf2e63c8601160a3e10c3e17e3","after":"94c820c3047aa07da41bb6bd1524f9dc00eeed02","ref":"refs/heads/main","pushedAt":"2024-08-02T13:30:44.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Fix: (0.10) Clarify that receiving an equal vote does not grant leadership.\n\nA node's `vote` may be updated when a leader observes a higher vote.\nIn such cases, the leader updates its local vote and steps down.\nHowever, this vote update does not imply that the node accepts the\nhigher vote as valid for leadership, as it has not yet compared their\nlogs.\n\nIn this commit, re-enable `VoteResponse.vote_granted` to indicate a vote\nis granted.","shortMessageHtmlLink":"Fix: (0.10) Clarify that receiving an equal vote does not grant leade…"}},{"before":"5c82dfd9077e81fc81ac334005ae722795be3814","after":"7fa0f9b77b37c4bf2e63c8601160a3e10c3e17e3","ref":"refs/heads/main","pushedAt":"2024-08-01T14:11:14.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: Use stored lease in `RaftState.vote` for election decisions\n\nThis commit modifies the election process within the Raft algorithm to\nconsider the lease duration stored in `RaftState.vote` when determining\nwhether a follower or candidate should initiate an election to become\nthe new leader. Previously, this decision was based solely on a static\nconfiguration value.","shortMessageHtmlLink":"Refactor: Use stored lease in RaftState.vote for election decisions"}},{"before":"28c934ca94394c9faff7053c34fefb2d2a2c9a48","after":"5c82dfd9077e81fc81ac334005ae722795be3814","ref":"refs/heads/main","pushedAt":"2024-07-30T15:35:08.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: Replace async Mutex for `RaftInner.core_state` with standard Mutex and a watch channel\n\nIn this commit, when joining the `RaftCore` task, the `core_state` is\nfirst switched from `Running` to `Joining`. The thread then blocks\nwhile awaiting the completion of the `RaftCore` task. Any other threads\nobserving the `Joining` state will wait for the first thread to finish\nby monitoring a `watch` channel created by the initial thread.","shortMessageHtmlLink":"Refactor: Replace async Mutex for RaftInner.core_state with standar…"}},{"before":"6c7527fdfea9f485282e39f9e1e4dc157bc3ffd3","after":"28c934ca94394c9faff7053c34fefb2d2a2c9a48","ref":"refs/heads/main","pushedAt":"2024-07-30T06:02:37.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Chore: fix doc and refine variable names","shortMessageHtmlLink":"Chore: fix doc and refine variable names"}},{"before":"590d9438c51d7d0e5ff6be2a681a60ccfd1608f2","after":"6c7527fdfea9f485282e39f9e1e4dc157bc3ffd3","ref":"refs/heads/main","pushedAt":"2024-07-29T12:39:19.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Feature: Add `Raft::external_state_machine_request()` to run a function inside state machine\n\nAdd `Raft::external_state_machine_request()` in a fire-and-forget manner,\nand `Raft::with_state_machine()` blocks waiting on the response.\n\nIf the input StateMachine is a different type from the one in\n`RaftCore`, `with_state_machine()` an error, while\n`external_state_machine_request()` silently ignores it.\n\nOther changes: move OptionalSerde, OptionalSync, OptionalSync from\n`openraft::` to `openraft::base::`","shortMessageHtmlLink":"Feature: Add Raft::external_state_machine_request() to run a functi…"}},{"before":"ec42d9a1772dc48769f3f43218f43f3340ac9d2d","after":"590d9438c51d7d0e5ff6be2a681a60ccfd1608f2","ref":"refs/heads/main","pushedAt":"2024-07-26T14:27:13.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: replace tokio oneshot with the one configured","shortMessageHtmlLink":"Refactor: replace tokio oneshot with the one configured"}},{"before":"ab35b2885c758d84bcd85618b9af94b1b08a4d23","after":"ec42d9a1772dc48769f3f43218f43f3340ac9d2d","ref":"refs/heads/main","pushedAt":"2024-07-25T16:51:07.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: `RaftMetrics::heartbeat` stores last-acked timestamp instead of duration since last ack\n\nOther changes: Display human readable Instant in log","shortMessageHtmlLink":"Refactor: RaftMetrics::heartbeat stores last-acked timestamp instea…"}},{"before":"bcc566ed997f12ff598fa130056453df714c6d9d","after":"ab35b2885c758d84bcd85618b9af94b1b08a4d23","ref":"refs/heads/main","pushedAt":"2024-07-25T05:36:36.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Feature: add absolute timestamp `RaftMetrics::last_quorum_acked`\n\n`RaftMetrics::last_quorum_acked` is the absolute timestamp of the most\nrecent time point that is accepted by a quorum via `AppendEntries` RPC.\nThis field is a wrapped `Instant` type: `SerdeInstant` which support\nserde for `Instant`. This field is added as a replacement of\n`millis_since_quorum_ack`, which is a relative time.\n\n`SerdeInstant` serialize `Instant` into a u64 in nano seconds since January 1, 1970 UTC.\n\nNote: Serialization and deserialization are not perfectly accurate and\ncan be indeterministic, resulting in minor variations each time. These\ndeviations(could be smaller or greater) are typically less than a\nmicrosecond (10^-6 seconds).","shortMessageHtmlLink":"Feature: add absolute timestamp RaftMetrics::last_quorum_acked"}},{"before":"ab96d1a3722d4279b94be78184576ab2bb5b0a67","after":"bcc566ed997f12ff598fa130056453df714c6d9d","ref":"refs/heads/main","pushedAt":"2024-07-24T15:50:02.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Doc: \"learners\" in the `change_membership()` doc shoudl be \"nodes\", which represent both voters and learners","shortMessageHtmlLink":"Doc: \"learners\" in the change_membership() doc shoudl be \"nodes\", w…"}},{"before":"4bd821d627689c9dc8bad3b1e4d45bcadf70c6ca","after":"ab96d1a3722d4279b94be78184576ab2bb5b0a67","ref":"refs/heads/main","pushedAt":"2024-07-24T02:54:24.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Doc: Add example explaining why `LogIOId` must be `(CommittedLeaderId, LogId)`","shortMessageHtmlLink":"Doc: Add example explaining why LogIOId must be `(CommittedLeaderId…"}},{"before":"4318f4e33b8431feab188c895fd3e7fe71843c28","after":"4bd821d627689c9dc8bad3b1e4d45bcadf70c6ca","ref":"refs/heads/main","pushedAt":"2024-07-23T12:57:47.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Chore: add test to ensure change_membership(.., retain=false) wont remove existing learners","shortMessageHtmlLink":"Chore: add test to ensure change_membership(.., retain=false) wont re…"}},{"before":"0325f7d15306acfc57c9ef611cda2f2fe83978d5","after":"4318f4e33b8431feab188c895fd3e7fe71843c28","ref":"refs/heads/main","pushedAt":"2024-07-23T05:59:30.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: use test_harness to build unittest harness\n\n`#[test_harness::test(harness = func)]` builds the harness for test\nfunction in a more structural way.","shortMessageHtmlLink":"Refactor: use test_harness to build unittest harness"}},{"before":"c323974598dd5698ce819bccd173ed34aa8cade7","after":"0325f7d15306acfc57c9ef611cda2f2fe83978d5","ref":"refs/heads/main","pushedAt":"2024-07-21T16:32:30.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: remove `replication::Response::StorageError`\n\nWhne a `StorageError` occurs locally during replication,\nthe `RaftCore` has to be shutdown at once. in this case, just send a\ngeneric notification `Notification::StorageError`. There is no need for\n`replication::Response` to contain `StorageError`.","shortMessageHtmlLink":"Refactor: remove replication::Response::StorageError"}},{"before":"53abbfc19003d57253a931052d09dae23af9e4d3","after":"c323974598dd5698ce819bccd173ed34aa8cade7","ref":"refs/heads/main","pushedAt":"2024-07-21T09:47:23.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Doc: add algorithm AppendEntries uses to local last matching log id\n\n- Fix: #124","shortMessageHtmlLink":"Doc: add algorithm AppendEntries uses to local last matching log id"}},{"before":"3ae6b4bfe2d13e633e437373f6c1b716b167bfa3","after":"53abbfc19003d57253a931052d09dae23af9e4d3","ref":"refs/heads/main","pushedAt":"2024-07-15T15:23:16.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: log significant events with `Display`\n\nThis commit refines our logging strategy by utilizing the `Display`\ntrait instead of `Debug` for significant events. This change is aimed at\nproducing logs that are easier to read and understand.\n\nThree kinds of significant events are logged at DEBUG level:\n\n- `input`: the `RaftMsg`s received by `RaftCore`, such as client-write\n or AppendEntries request from the Leader.\n\n- `cmd`: the `Command` outputted by `Engine` to execute by storage or\n network layer, such as `AppendInputEntries` or `ReplicateCommitted`.\n\n- `notify`: the `Notification`s received by `RaftCore` from storage or\n network.\n\nExample significant event logs:\n```\nRAFT_event id=0 cmd: Commit: seq: 5, (T1-N0.4, T1-N0.5]\nRAFT_event id=1 input: AppendEntries: vote=, prev_log_id=T1-N0.5, leader_commit=T1-N0.5, entries=[]\nRAFT_event id=0 notify: sm::Result(command_seq:5, Ok(ApplyResult([5, 6), last_applied=T1-N0.5, entries=[T1-N0.5])))\nRAFT_event id=0 input: ClientWriteRequest\n```","shortMessageHtmlLink":"Refactor: log significant events with Display"}},{"before":"1b4ec53df2c548757607261e88287a2fd6cb5131","after":"3ae6b4bfe2d13e633e437373f6c1b716b167bfa3","ref":"refs/heads/main","pushedAt":"2024-07-12T18:03:39.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: rename notify to notification","shortMessageHtmlLink":"Refactor: rename notify to notification"}},{"before":"e69aea1c33f65e472458d52d89d81db5ac6e2918","after":"1b4ec53df2c548757607261e88287a2fd6cb5131","ref":"refs/heads/main","pushedAt":"2024-07-10T15:43:12.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"getong","name":"gerald","path":"/getong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3949379?s=80&v=4"},"commit":{"message":"Refactor: Abstract the watch channel into a traits (#1167)\n\n* Refactor: Abstract the watch channel into a traits","shortMessageHtmlLink":"Refactor: Abstract the watch channel into a traits (databendlabs#1167)"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0xNFQxNjo1MToxMy4wMDAwMDBazwAAAAS2ULeU","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNy0xMFQxNTo0MzoxMi4wMDAwMDBazwAAAAR77syx"}},"title":"Activity · getong/openraft"}