a653rs_linux_core/
health.rs

1//! Health control types
2use serde::{Deserialize, Serialize};
3
4use crate::error::SystemError;
5
6#[derive(Debug, Serialize, Deserialize, Clone, Copy)]
7pub enum RecoveryAction {
8    Module(ModuleRecoveryAction),
9    Partition(PartitionRecoveryAction),
10}
11
12#[derive(Debug, Serialize, Deserialize, Clone, Copy)]
13pub enum ModuleRecoveryAction {
14    Ignore,
15    Shutdown,
16    Reset,
17}
18
19#[derive(Debug, Serialize, Deserialize, Clone, Copy)]
20pub enum PartitionRecoveryAction {
21    Idle,
22    ColdStart,
23    WarmStart,
24}
25
26#[derive(Debug, Serialize, Deserialize, Clone)]
27pub struct PartitionHMTable {
28    pub partition_init: RecoveryAction,
29    pub segmentation: RecoveryAction,
30    pub time_duration_exceeded: RecoveryAction,
31    pub application_error: RecoveryAction,
32    pub panic: RecoveryAction,
33    pub floating_point_error: RecoveryAction,
34    pub cgroup: RecoveryAction,
35}
36
37impl PartitionHMTable {
38    pub fn try_action(&self, err: SystemError) -> Option<RecoveryAction> {
39        match err {
40            SystemError::PartitionInit => Some(self.partition_init),
41            SystemError::Segmentation => Some(self.segmentation),
42            SystemError::TimeDurationExceeded => Some(self.time_duration_exceeded),
43            SystemError::ApplicationError => Some(self.application_error),
44            SystemError::Panic => Some(self.panic),
45            SystemError::FloatingPoint => Some(self.floating_point_error),
46            SystemError::CGroup => Some(self.cgroup),
47            _ => None,
48        }
49    }
50}
51
52impl Default for PartitionHMTable {
53    fn default() -> Self {
54        Self {
55            partition_init: RecoveryAction::Module(ModuleRecoveryAction::Ignore),
56            segmentation: RecoveryAction::Partition(PartitionRecoveryAction::WarmStart),
57            //segmentation: RecoveryAction::Module(ModuleRecoveryAction::Reset),
58            time_duration_exceeded: RecoveryAction::Module(ModuleRecoveryAction::Ignore),
59            floating_point_error: RecoveryAction::Partition(PartitionRecoveryAction::WarmStart),
60            panic: RecoveryAction::Partition(PartitionRecoveryAction::WarmStart),
61            application_error: RecoveryAction::Partition(PartitionRecoveryAction::WarmStart),
62            cgroup: RecoveryAction::Partition(PartitionRecoveryAction::WarmStart),
63        }
64    }
65}
66
67#[derive(Debug, Serialize, Deserialize, Clone)]
68pub struct ModuleInitHMTable {
69    pub config: ModuleRecoveryAction,
70    pub module_config: ModuleRecoveryAction,
71    pub partition_config: ModuleRecoveryAction,
72    pub partition_init: ModuleRecoveryAction,
73    pub panic: ModuleRecoveryAction,
74}
75
76impl ModuleInitHMTable {
77    pub fn try_action(&self, err: SystemError) -> Option<ModuleRecoveryAction> {
78        match err {
79            SystemError::Config => Some(self.config),
80            SystemError::ModuleConfig => Some(self.module_config),
81            SystemError::PartitionConfig => Some(self.partition_config),
82            SystemError::PartitionInit => Some(self.partition_init),
83            SystemError::Panic => Some(self.panic),
84            _ => None,
85        }
86    }
87}
88
89impl Default for ModuleInitHMTable {
90    fn default() -> Self {
91        Self {
92            config: ModuleRecoveryAction::Shutdown,
93            module_config: ModuleRecoveryAction::Shutdown,
94            partition_config: ModuleRecoveryAction::Shutdown,
95            partition_init: ModuleRecoveryAction::Shutdown,
96            panic: ModuleRecoveryAction::Shutdown,
97        }
98    }
99}
100
101#[derive(Debug, Serialize, Deserialize, Clone)]
102pub struct ModuleRunHMTable {
103    pub partition_init: ModuleRecoveryAction,
104    pub panic: ModuleRecoveryAction,
105}
106
107impl ModuleRunHMTable {
108    pub fn try_action(&self, err: SystemError) -> Option<ModuleRecoveryAction> {
109        match err {
110            SystemError::PartitionInit => Some(self.partition_init),
111            SystemError::Panic => Some(self.panic),
112            _ => None,
113        }
114    }
115}
116
117impl Default for ModuleRunHMTable {
118    fn default() -> Self {
119        Self {
120            partition_init: ModuleRecoveryAction::Shutdown,
121            panic: ModuleRecoveryAction::Shutdown,
122        }
123    }
124}