Skip to content

Commit

Permalink
Chore: move protobuf implementation to separate files
Browse files Browse the repository at this point in the history
  • Loading branch information
drmingdrmer committed Feb 4, 2025
1 parent fbf4ced commit ce83ecc
Show file tree
Hide file tree
Showing 9 changed files with 146 additions and 130 deletions.
142 changes: 12 additions & 130 deletions examples/raft-kv-memstore-grpc/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
#![allow(clippy::uninlined_format_args)]

use crate::protobuf as pb;
use crate::typ::*;

pub mod grpc;
pub mod network;
pub mod store;
#[cfg(test)]
mod test;

pub mod protobuf {
tonic::include_proto!("openraftpb");
}

#[path = "../../utils/declare_types.rs"]
pub mod typ;

mod pb_impl;

pub type NodeId = u64;
#[cfg(test)]
mod test_store;

use crate::protobuf as pb;

openraft::declare_raft_types!(
/// Declare the type configuration for example K/V store.
Expand All @@ -25,129 +30,6 @@ openraft::declare_raft_types!(
SnapshotData = Vec<u8>,
);

pub type NodeId = u64;
pub type LogStore = store::LogStore;
pub type StateMachineStore = store::StateMachineStore;

pub mod protobuf {
tonic::include_proto!("openraftpb");
}

#[path = "../../utils/declare_types.rs"]
pub mod typ;

impl From<pb::LogId> for LogId {
fn from(proto_log_id: pb::LogId) -> Self {
LogId::new(proto_log_id.term, proto_log_id.index)
}
}

impl From<pb::VoteRequest> for VoteRequest {
fn from(proto_vote_req: pb::VoteRequest) -> Self {
let vote = proto_vote_req.vote.unwrap();
let last_log_id = proto_vote_req.last_log_id.map(|log_id| log_id.into());
VoteRequest::new(vote, last_log_id)
}
}

impl From<pb::VoteResponse> for VoteResponse {
fn from(proto_vote_resp: pb::VoteResponse) -> Self {
let vote = proto_vote_resp.vote.unwrap();
let last_log_id = proto_vote_resp.last_log_id.map(|log_id| log_id.into());
VoteResponse::new(vote, last_log_id, proto_vote_resp.vote_granted)
}
}

impl From<pb::AppendEntriesRequest> for AppendEntriesRequest {
fn from(proto_req: pb::AppendEntriesRequest) -> Self {
AppendEntriesRequest {
vote: proto_req.vote.unwrap(),
prev_log_id: proto_req.prev_log_id.map(|log_id| log_id.into()),
entries: proto_req.entries,
leader_commit: proto_req.leader_commit.map(|log_id| log_id.into()),
}
}
}

impl From<AppendEntriesRequest> for pb::AppendEntriesRequest {
fn from(value: AppendEntriesRequest) -> Self {
pb::AppendEntriesRequest {
vote: Some(value.vote),
prev_log_id: value.prev_log_id.map(|log_id| log_id.into()),
entries: value.entries,
leader_commit: value.leader_commit.map(|log_id| log_id.into()),
}
}
}

impl From<pb::AppendEntriesResponse> for AppendEntriesResponse {
fn from(r: pb::AppendEntriesResponse) -> Self {
if let Some(higher) = r.rejected_by {
return AppendEntriesResponse::HigherVote(higher);
}

if r.conflict {
return AppendEntriesResponse::Conflict;
}

if let Some(log_id) = r.last_log_id {
AppendEntriesResponse::PartialSuccess(Some(log_id.into()))
} else {
AppendEntriesResponse::Success
}
}
}

impl From<AppendEntriesResponse> for pb::AppendEntriesResponse {
fn from(r: AppendEntriesResponse) -> Self {
match r {
AppendEntriesResponse::Success => pb::AppendEntriesResponse {
rejected_by: None,
conflict: false,
last_log_id: None,
},
AppendEntriesResponse::PartialSuccess(p) => pb::AppendEntriesResponse {
rejected_by: None,
conflict: false,
last_log_id: p.map(|log_id| log_id.into()),
},
AppendEntriesResponse::Conflict => pb::AppendEntriesResponse {
rejected_by: None,
conflict: true,
last_log_id: None,
},
AppendEntriesResponse::HigherVote(v) => pb::AppendEntriesResponse {
rejected_by: Some(v),
conflict: false,
last_log_id: None,
},
}
}
}

impl From<LogId> for pb::LogId {
fn from(log_id: LogId) -> Self {
pb::LogId {
term: *log_id.committed_leader_id(),
index: log_id.index(),
}
}
}

impl From<VoteRequest> for pb::VoteRequest {
fn from(vote_req: VoteRequest) -> Self {
pb::VoteRequest {
vote: Some(vote_req.vote),
last_log_id: vote_req.last_log_id.map(|log_id| log_id.into()),
}
}
}

impl From<VoteResponse> for pb::VoteResponse {
fn from(vote_resp: VoteResponse) -> Self {
pb::VoteResponse {
vote: Some(vote_resp.vote),
vote_granted: vote_resp.vote_granted,
last_log_id: vote_resp.last_log_id.map(|log_id| log_id.into()),
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
use crate::pb;
use crate::typ::AppendEntriesRequest;

impl From<pb::AppendEntriesRequest> for AppendEntriesRequest {
fn from(proto_req: pb::AppendEntriesRequest) -> Self {
AppendEntriesRequest {
vote: proto_req.vote.unwrap(),
prev_log_id: proto_req.prev_log_id.map(|log_id| log_id.into()),
entries: proto_req.entries,
leader_commit: proto_req.leader_commit.map(|log_id| log_id.into()),
}
}
}

impl From<AppendEntriesRequest> for pb::AppendEntriesRequest {
fn from(value: AppendEntriesRequest) -> Self {
pb::AppendEntriesRequest {
vote: Some(value.vote),
prev_log_id: value.prev_log_id.map(|log_id| log_id.into()),
entries: value.entries,
leader_commit: value.leader_commit.map(|log_id| log_id.into()),
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
use crate::pb;
use crate::typ::AppendEntriesResponse;

impl From<pb::AppendEntriesResponse> for AppendEntriesResponse {
fn from(r: pb::AppendEntriesResponse) -> Self {
if let Some(higher) = r.rejected_by {
return AppendEntriesResponse::HigherVote(higher);
}

if r.conflict {
return AppendEntriesResponse::Conflict;
}

if let Some(log_id) = r.last_log_id {
AppendEntriesResponse::PartialSuccess(Some(log_id.into()))
} else {
AppendEntriesResponse::Success
}
}
}

impl From<AppendEntriesResponse> for pb::AppendEntriesResponse {
fn from(r: AppendEntriesResponse) -> Self {
match r {
AppendEntriesResponse::Success => pb::AppendEntriesResponse {
rejected_by: None,
conflict: false,
last_log_id: None,
},
AppendEntriesResponse::PartialSuccess(p) => pb::AppendEntriesResponse {
rejected_by: None,
conflict: false,
last_log_id: p.map(|log_id| log_id.into()),
},
AppendEntriesResponse::Conflict => pb::AppendEntriesResponse {
rejected_by: None,
conflict: true,
last_log_id: None,
},
AppendEntriesResponse::HigherVote(v) => pb::AppendEntriesResponse {
rejected_by: Some(v),
conflict: false,
last_log_id: None,
},
}
}
}
17 changes: 17 additions & 0 deletions examples/raft-kv-memstore-grpc/src/pb_impl/impl_log_id.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
use crate::pb;
use crate::typ::LogId;

impl From<LogId> for pb::LogId {
fn from(log_id: LogId) -> Self {
pb::LogId {
term: *log_id.committed_leader_id(),
index: log_id.index(),
}
}
}

impl From<pb::LogId> for LogId {
fn from(proto_log_id: pb::LogId) -> Self {
LogId::new(proto_log_id.term, proto_log_id.index)
}
}
19 changes: 19 additions & 0 deletions examples/raft-kv-memstore-grpc/src/pb_impl/impl_vote_request.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
use crate::pb;
use crate::typ::VoteRequest;

impl From<VoteRequest> for pb::VoteRequest {
fn from(vote_req: VoteRequest) -> Self {
pb::VoteRequest {
vote: Some(vote_req.vote),
last_log_id: vote_req.last_log_id.map(|log_id| log_id.into()),
}
}
}

impl From<pb::VoteRequest> for VoteRequest {
fn from(proto_vote_req: pb::VoteRequest) -> Self {
let vote = proto_vote_req.vote.unwrap();
let last_log_id = proto_vote_req.last_log_id.map(|log_id| log_id.into());
VoteRequest::new(vote, last_log_id)
}
}
20 changes: 20 additions & 0 deletions examples/raft-kv-memstore-grpc/src/pb_impl/impl_vote_response.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use crate::pb;
use crate::typ::VoteResponse;

impl From<VoteResponse> for pb::VoteResponse {
fn from(vote_resp: VoteResponse) -> Self {
pb::VoteResponse {
vote: Some(vote_resp.vote),
vote_granted: vote_resp.vote_granted,
last_log_id: vote_resp.last_log_id.map(|log_id| log_id.into()),
}
}
}

impl From<pb::VoteResponse> for VoteResponse {
fn from(proto_vote_resp: pb::VoteResponse) -> Self {
let vote = proto_vote_resp.vote.unwrap();
let last_log_id = proto_vote_resp.last_log_id.map(|log_id| log_id.into());
VoteResponse::new(vote, last_log_id, proto_vote_resp.vote_granted)
}
}
5 changes: 5 additions & 0 deletions examples/raft-kv-memstore-grpc/src/pb_impl/mod.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
//! Implements traits for protobuf types
mod impl_append_entries_request;
mod impl_append_entries_response;
mod impl_client_write_response;
mod impl_entry;
mod impl_leader_id;
mod impl_log_id;
mod impl_membership;
mod impl_snapshot_request;
mod impl_vote;
mod impl_vote_request;
mod impl_vote_response;
File renamed without changes.
2 changes: 2 additions & 0 deletions examples/utils/declare_types.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
//! Declare the Raft type with the TypeConfig.
// Reference the containing module's type config.
use super::TypeConfig;

Expand Down

0 comments on commit ce83ecc

Please sign in to comment.