raftify/request/common/
confchange_request.rs

1use 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}