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:
+20
-5
@@ -3,6 +3,7 @@ use tokio_stream::wrappers::ReceiverStream;
|
||||
|
||||
use crate::pb::pack_service_client::PackServiceClient;
|
||||
use crate::pb::*;
|
||||
use crate::pack::CancellableReceiverStream;
|
||||
|
||||
use super::{GitksService, into_status};
|
||||
|
||||
@@ -14,8 +15,8 @@ remote_client!(
|
||||
|
||||
#[tonic::async_trait]
|
||||
impl pack_service_server::PackService for GitksService {
|
||||
type UploadPackStream = ReceiverStream<Result<UploadPackResponse, tonic::Status>>;
|
||||
type ReceivePackStream = ReceiverStream<Result<ReceivePackResponse, tonic::Status>>;
|
||||
type UploadPackStream = CancellableReceiverStream<Result<UploadPackResponse, tonic::Status>>;
|
||||
type ReceivePackStream = CancellableReceiverStream<Result<ReceivePackResponse, tonic::Status>>;
|
||||
type PackObjectsStream = ReceiverStream<Result<PackfileChunk, tonic::Status>>;
|
||||
|
||||
async fn advertise_refs(
|
||||
@@ -112,7 +113,12 @@ impl pack_service_server::PackService for GitksService {
|
||||
.upload_pack(tokio_stream::wrappers::ReceiverStream::new(rx))
|
||||
.await?;
|
||||
let out = super::bridge_server_stream(resp.into_inner());
|
||||
return Ok(tonic::Response::new(out));
|
||||
// Create a dummy cancel token for the forwarded stream
|
||||
let cancel_token = tokio_util::sync::CancellationToken::new();
|
||||
let cancel_guard = cancel_token.drop_guard();
|
||||
return Ok(tonic::Response::new(
|
||||
crate::pack::CancellableReceiverStream::new(out, cancel_guard),
|
||||
));
|
||||
}
|
||||
crate::metrics::record_rpc_error(&m, &err);
|
||||
return Err(err);
|
||||
@@ -182,7 +188,12 @@ impl pack_service_server::PackService for GitksService {
|
||||
.receive_pack(tokio_stream::wrappers::ReceiverStream::new(rx))
|
||||
.await?;
|
||||
let out = super::bridge_server_stream(resp.into_inner());
|
||||
return Ok(tonic::Response::new(out));
|
||||
// Create a dummy cancel token for the forwarded stream
|
||||
let cancel_token = tokio_util::sync::CancellationToken::new();
|
||||
let cancel_guard = cancel_token.drop_guard();
|
||||
return Ok(tonic::Response::new(
|
||||
crate::pack::CancellableReceiverStream::new(out, cancel_guard),
|
||||
));
|
||||
}
|
||||
crate::metrics::record_rpc_error(&m, &err);
|
||||
return Err(err);
|
||||
@@ -333,7 +344,11 @@ impl pack_service_server::PackService for GitksService {
|
||||
inputs.push(msg?);
|
||||
}
|
||||
let _rate = self
|
||||
.acquire_rate_limit(inputs.first().and_then(|r: &IndexPackRequest| r.repository.as_ref()))
|
||||
.acquire_rate_limit(
|
||||
inputs
|
||||
.first()
|
||||
.and_then(|r: &IndexPackRequest| r.repository.as_ref()),
|
||||
)
|
||||
.await?;
|
||||
let repo = self.repo_label(inputs.first().and_then(|r| r.repository.as_ref()));
|
||||
let span = tracing::info_span!("pack.index_pack", %repo);
|
||||
|
||||
Reference in New Issue
Block a user