raftify/request/common/
confchange_request.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use std::net::SocketAddr;

use crate::raft::eraftpb::{self, ConfChangeSingle, ConfChangeTransition, ConfChangeV2};
use crate::raft_service;

#[derive(Debug, Clone)]
pub struct ConfChangeRequest {
    pub changes: Vec<ConfChangeSingle>,
    pub addrs: Vec<SocketAddr>,
}

impl From<ConfChangeRequest> for ConfChangeV2 {
    fn from(conf_change_request: ConfChangeRequest) -> Self {
        if conf_change_request.addrs.len() != conf_change_request.changes.len() {
            panic!("addrs and changes must have the same length");
        }

        let mut conf_change_v2 = ConfChangeV2::default();
        conf_change_v2.set_changes(conf_change_request.changes);
        conf_change_v2.set_context(bincode::serialize(&conf_change_request.addrs).unwrap());

        if conf_change_request.addrs.len() > 1 {
            conf_change_v2.set_transition(ConfChangeTransition::Explicit);
        }

        conf_change_v2
    }
}

impl From<ConfChangeV2> for ConfChangeRequest {
    fn from(cc_v2: ConfChangeV2) -> Self {
        let changes = cc_v2
            .get_changes()
            .iter()
            .map(|change| ConfChangeSingle {
                node_id: change.node_id,
                change_type: change.change_type,
            })
            .collect();

        let addrs: Vec<SocketAddr> = bincode::deserialize(cc_v2.get_context()).unwrap();

        Self { changes, addrs }
    }
}

impl From<raft_service::ChangeConfigArgs> for ConfChangeRequest {
    fn from(conf_change_request: raft_service::ChangeConfigArgs) -> Self {
        let changes = conf_change_request
            .changes
            .into_iter()
            .map(|change| ConfChangeSingle {
                node_id: change.node_id,
                change_type: change.change_type,
            })
            .collect();

        let addrs = conf_change_request
            .addrs
            .into_iter()
            .map(|addr| addr.parse().unwrap())
            .collect();

        Self { changes, addrs }
    }
}

impl From<ConfChangeRequest> for raft_service::ChangeConfigArgs {
    fn from(conf_change_request: ConfChangeRequest) -> Self {
        let changes = conf_change_request
            .changes
            .into_iter()
            .map(|change| eraftpb::ConfChangeSingle {
                node_id: change.node_id,
                change_type: change.change_type,
            })
            .collect();

        let addrs = conf_change_request
            .addrs
            .into_iter()
            .map(|addr| addr.to_string())
            .collect();

        Self { changes, addrs }
    }
}