raftify/request/common/
confchange_request.rs1use std::net::SocketAddr;
2
3use crate::raft::eraftpb::{self, ConfChangeSingle, ConfChangeTransition, ConfChangeV2};
4use crate::raft_service;
5
6#[derive(Debug, Clone)]
7pub struct ConfChangeRequest {
8 pub changes: Vec<ConfChangeSingle>,
9 pub addrs: Vec<SocketAddr>,
10}
11
12impl From<ConfChangeRequest> for ConfChangeV2 {
13 fn from(conf_change_request: ConfChangeRequest) -> Self {
14 if conf_change_request.addrs.len() != conf_change_request.changes.len() {
15 panic!("addrs and changes must have the same length");
16 }
17
18 let mut conf_change_v2 = ConfChangeV2::default();
19 conf_change_v2.set_changes(conf_change_request.changes);
20 conf_change_v2.set_context(bincode::serialize(&conf_change_request.addrs).unwrap());
21
22 if conf_change_request.addrs.len() > 1 {
23 conf_change_v2.set_transition(ConfChangeTransition::Explicit);
24 }
25
26 conf_change_v2
27 }
28}
29
30impl From<ConfChangeV2> for ConfChangeRequest {
31 fn from(cc_v2: ConfChangeV2) -> Self {
32 let changes = cc_v2
33 .get_changes()
34 .iter()
35 .map(|change| ConfChangeSingle {
36 node_id: change.node_id,
37 change_type: change.change_type,
38 })
39 .collect();
40
41 let addrs: Vec<SocketAddr> = bincode::deserialize(cc_v2.get_context()).unwrap();
42
43 Self { changes, addrs }
44 }
45}
46
47impl From<raft_service::ChangeConfigArgs> for ConfChangeRequest {
48 fn from(conf_change_request: raft_service::ChangeConfigArgs) -> Self {
49 let changes = conf_change_request
50 .changes
51 .into_iter()
52 .map(|change| ConfChangeSingle {
53 node_id: change.node_id,
54 change_type: change.change_type,
55 })
56 .collect();
57
58 let addrs = conf_change_request
59 .addrs
60 .into_iter()
61 .map(|addr| addr.parse().unwrap())
62 .collect();
63
64 Self { changes, addrs }
65 }
66}
67
68impl From<ConfChangeRequest> for raft_service::ChangeConfigArgs {
69 fn from(conf_change_request: ConfChangeRequest) -> Self {
70 let changes = conf_change_request
71 .changes
72 .into_iter()
73 .map(|change| eraftpb::ConfChangeSingle {
74 node_id: change.node_id,
75 change_type: change.change_type,
76 })
77 .collect();
78
79 let addrs = conf_change_request
80 .addrs
81 .into_iter()
82 .map(|addr| addr.to_string())
83 .collect();
84
85 Self { changes, addrs }
86 }
87}