refactor(actor): implement Raft consensus algorithm for cluster leader election

- Add voting mechanism with term tracking and vote persistence
- Implement election triggering logic with majority vote counting
- Add primary/replica role transition handling with state management
- Integrate health check failure detection for automatic elections
- Refactor actor messaging system for distributed coordination
- Update repository registration to query cluster for existing primary
- Add broadcast mechanism for role change notifications
- Implement proper term comparison and duplicate request filtering
- Upgrade dependency versions including tokio-util for async utilities
- Optimize code formatting and line wrapping for improved readability
- Remove redundant blank lines and improve code structure consistency
- Enhance error logging and trace information for debugging purposes
This commit is contained in:
zhenyi
2026-06-10 12:35:10 +08:00
parent ab32e8826e
commit 9a0c26e5f6
40 changed files with 1184 additions and 449 deletions
+28 -7
View File
@@ -4,8 +4,15 @@ use crate::pb::*;
impl GitBare {
/// Update mirror from a remote URL (fetch + update all refs).
pub fn update_remote_mirror(&self, request: UpdateRemoteMirrorRequest) -> GitResult<UpdateRemoteMirrorResponse> {
let remote_name = if request.remote_name.is_empty() { "origin" } else { &request.remote_name };
pub fn update_remote_mirror(
&self,
request: UpdateRemoteMirrorRequest,
) -> GitResult<UpdateRemoteMirrorResponse> {
let remote_name = if request.remote_name.is_empty() {
"origin"
} else {
&request.remote_name
};
// Add or update remote
let remote_check = std::process::Command::new("git")
@@ -114,12 +121,19 @@ impl GitBare {
}
}
Ok(UpdateRemoteMirrorResponse { ok: true, error: String::new() })
Ok(UpdateRemoteMirrorResponse {
ok: true,
error: String::new(),
})
}
/// Fetch from a remote URL without mirroring.
pub fn fetch_remote(&self, request: FetchRemoteRequest) -> GitResult<FetchRemoteResponse> {
let remote_name = if request.remote_name.is_empty() { "origin" } else { &request.remote_name };
let remote_name = if request.remote_name.is_empty() {
"origin"
} else {
&request.remote_name
};
// Ensure remote exists
let exists = std::process::Command::new("git")
@@ -158,8 +172,12 @@ impl GitBare {
remote_name.to_string(),
];
if request.prune { args.push("--prune".to_string()); }
if request.force { args.push("--force".to_string()); }
if request.prune {
args.push("--prune".to_string());
}
if request.force {
args.push("--force".to_string());
}
if request.refspecs.is_empty() {
args.push("+refs/heads/*:refs/heads/*".to_string());
@@ -187,7 +205,10 @@ impl GitBare {
});
}
Ok(FetchRemoteResponse { ok: true, error: String::new() })
Ok(FetchRemoteResponse {
ok: true,
error: String::new(),
})
}
/// Clone a repository from a remote URL (bare + mirror).