a653rs_linux_core/
health.rs1use 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 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}