Skip to main content

tatara_core/cluster/
roles.rs

1use serde::{Deserialize, Serialize};
2use tracing::info;
3
4use super::types::NodeRoles;
5
6/// Role configuration loaded from config or pinned explicitly.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct RoleConfig {
9    #[serde(default = "default_true")]
10    pub voter: bool,
11    #[serde(default = "default_true")]
12    pub worker: bool,
13    #[serde(default = "default_priority")]
14    pub voter_priority: u32,
15}
16
17impl Default for RoleConfig {
18    fn default() -> Self {
19        Self {
20            voter: true,
21            worker: true,
22            voter_priority: 10,
23        }
24    }
25}
26
27impl From<RoleConfig> for NodeRoles {
28    fn from(cfg: RoleConfig) -> Self {
29        NodeRoles {
30            voter: cfg.voter,
31            worker: cfg.worker,
32            voter_priority: cfg.voter_priority,
33        }
34    }
35}
36
37/// Determines effective roles for this node.
38///
39/// If roles are explicitly pinned in config, use those.
40/// Otherwise, default to both voter + worker (every node can do everything).
41pub fn resolve_roles(config: &RoleConfig) -> NodeRoles {
42    let roles = NodeRoles::from(config.clone());
43
44    info!(
45        voter = roles.voter,
46        worker = roles.worker,
47        priority = roles.voter_priority,
48        "Node roles resolved"
49    );
50
51    roles
52}
53
54fn default_true() -> bool {
55    true
56}
57
58fn default_priority() -> u32 {
59    10
60}