feat(cluster): implement Raft consensus with tracing and HTTP support

- Add Raft log and snapshot mechanisms for distributed consensus
- Integrate hyper HTTP server and client libraries for network communication
- Enhance tracing capabilities with structured logging and spans
- Add dependency tracking for new consensus-related crates
- Implement snapshot storage with serialization and persistence
- Add remote repository synchronization via Raft commands
- Include comprehensive tracing instrumentation across services
This commit is contained in:
zhenyi
2026-06-10 18:33:42 +08:00
parent 0207cde234
commit c32a7cad2f
10 changed files with 453 additions and 6 deletions
+36
View File
@@ -283,8 +283,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/FindCommit");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.find_commit", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.find_commit(inner).map_err(into_status)?;
tracing::info!(%repo, "find_commit done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -296,8 +300,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/ListCommitsByOid");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.list_commits_by_oid", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.list_commits_by_oid(inner).map_err(into_status)?;
tracing::info!(%repo, count = resp.commits.len(), "list_commits_by_oid done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -309,8 +317,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CommitIsAncestor");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.commit_is_ancestor", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.commit_is_ancestor(inner).map_err(into_status)?;
tracing::info!(%repo, is_ancestor = resp.is_ancestor, "commit_is_ancestor done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -322,8 +334,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CheckObjectsExist");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.check_objects_exist", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.check_objects_exist(inner).map_err(into_status)?;
tracing::info!(%repo, "check_objects_exist done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -335,8 +351,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CommitsByMessage");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.commits_by_message", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.commits_by_message(inner).map_err(into_status)?;
tracing::info!(%repo, count = resp.commits.len(), "commits_by_message done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -348,8 +368,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/GetCommitStats");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.get_commit_stats", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.get_commit_stats(inner).map_err(into_status)?;
tracing::info!(%repo, additions = resp.additions, deletions = resp.deletions, changed_files = resp.changed_files, "get_commit_stats done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -361,8 +385,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/LastCommitForPath");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.last_commit_for_path", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.last_commit_for_path(inner).map_err(into_status)?;
tracing::info!(%repo, "last_commit_for_path done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -374,8 +402,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CountCommits");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.count_commits", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.count_commits(inner).map_err(into_status)?;
tracing::info!(%repo, count = resp.count, "count_commits done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -387,8 +419,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CountDivergingCommits");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.count_diverging_commits", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.count_diverging_commits(inner).map_err(into_status)?;
tracing::info!(%repo, left = resp.left_count, right = resp.right_count, "count_diverging_commits done");
m.record("ok");
Ok(tonic::Response::new(resp))
}