Improved get_state method efficiency.

This commit is contained in:
Cutieguwu
2025-02-19 14:06:51 -05:00
parent 4307e8741c
commit c8a98ea3cb

View File

@@ -71,7 +71,7 @@ impl From<Cluster> for MapCluster {
}
#[derive(Clone, Copy, Debug, Deserialize, PartialEq)]
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, PartialOrd)]
pub enum Status {
Untested,
ForIsolation(u8),
@@ -191,33 +191,21 @@ impl MapFile {
/// Get current recovery status.
pub fn get_state(self) -> Status {
let mut recover_status = Status::Damaged;
let mut cluster_stage: Option<u8> = Option::None;
for cluster in self.map {
match cluster.status {
Status::Untested => return Status::Untested,
Status::ForIsolation(cs) => {
if recover_status == Status::Damaged {
recover_status = cluster.status;
} else {
cluster_stage = Some(cs);
Status::ForIsolation(_) => {
if recover_status == Status::Damaged
|| cluster.status < recover_status {
// Note that recover_status after first condition is
// only ever Status::ForIsolation(_), thus PartialEq,
// PartialOrd are useful for comparing the internal value.
recover_status = cluster.status
}
},
Status::Damaged => (),
}
if cluster_stage.is_some() {
let recover_stage = match recover_status {
Status::ForIsolation(rs) => rs,
_ => unreachable!(),
};
if cluster_stage.unwrap() < recover_stage {
recover_status = cluster.status
}
cluster_stage = None
}
}
recover_status