diff --git a/src/meta_plugin/digest.rs b/src/meta_plugin/digest.rs index 98d8bf9..92ec33d 100644 --- a/src/meta_plugin/digest.rs +++ b/src/meta_plugin/digest.rs @@ -6,6 +6,7 @@ use crate::meta_plugin::MetaPlugin; #[derive(Debug, Clone, Default)] pub struct DigestSha256MetaPlugin { hasher: Sha256, + is_finalized: bool, meta_name: String, outputs: std::collections::HashMap, options: std::collections::HashMap, @@ -38,6 +39,7 @@ impl DigestSha256MetaPlugin { DigestSha256MetaPlugin { hasher: Sha256::new(), + is_finalized: false, meta_name: "digest_sha256".to_string(), outputs: final_outputs, options: final_options, @@ -50,6 +52,14 @@ impl DigestSha256MetaPlugin { } impl MetaPlugin for DigestSha256MetaPlugin { + fn is_finalized(&self) -> bool { + self.is_finalized + } + + fn set_finalized(&mut self, finalized: bool) { + self.is_finalized = finalized; + } + fn initialize(&mut self) -> crate::meta_plugin::MetaPluginResponse { crate::meta_plugin::MetaPluginResponse { metadata: Vec::new(), @@ -58,6 +68,14 @@ impl MetaPlugin for DigestSha256MetaPlugin { } fn finalize(&mut self) -> crate::meta_plugin::MetaPluginResponse { + // If already finalized, don't process again + if self.is_finalized { + return crate::meta_plugin::MetaPluginResponse { + metadata: Vec::new(), + is_finalized: true, + }; + } + let mut metadata = Vec::new(); // Finalize the hash @@ -72,6 +90,9 @@ impl MetaPlugin for DigestSha256MetaPlugin { ) { metadata.push(meta_data); } + + // Mark as finalized + self.is_finalized = true; crate::meta_plugin::MetaPluginResponse { metadata, @@ -80,6 +101,14 @@ impl MetaPlugin for DigestSha256MetaPlugin { } fn update(&mut self, data: &[u8]) -> crate::meta_plugin::MetaPluginResponse { + // If already finalized, don't process more data + if self.is_finalized { + return crate::meta_plugin::MetaPluginResponse { + metadata: Vec::new(), + is_finalized: true, + }; + } + self.hasher.update(data); crate::meta_plugin::MetaPluginResponse { metadata: Vec::new(), @@ -120,6 +149,7 @@ impl MetaPlugin for DigestSha256MetaPlugin { #[derive(Debug, Clone, Default)] pub struct ReadTimeMetaPlugin { start_time: Option, + is_finalized: bool, meta_name: String, outputs: std::collections::HashMap, options: std::collections::HashMap, @@ -152,6 +182,7 @@ impl ReadTimeMetaPlugin { ReadTimeMetaPlugin { start_time: None, + is_finalized: false, meta_name: "read_time".to_string(), outputs: final_outputs, options: final_options, @@ -164,7 +195,23 @@ impl ReadTimeMetaPlugin { } impl MetaPlugin for ReadTimeMetaPlugin { + fn is_finalized(&self) -> bool { + self.is_finalized + } + + fn set_finalized(&mut self, finalized: bool) { + self.is_finalized = finalized; + } + fn finalize(&mut self) -> crate::meta_plugin::MetaPluginResponse { + // If already finalized, don't process again + if self.is_finalized { + return crate::meta_plugin::MetaPluginResponse { + metadata: Vec::new(), + is_finalized: true, + }; + } + let mut metadata = Vec::new(); if let Some(start_time) = self.start_time { @@ -180,6 +227,9 @@ impl MetaPlugin for ReadTimeMetaPlugin { metadata.push(meta_data); } } + + // Mark as finalized + self.is_finalized = true; crate::meta_plugin::MetaPluginResponse { metadata, @@ -188,6 +238,14 @@ impl MetaPlugin for ReadTimeMetaPlugin { } fn update(&mut self, _data: &[u8]) -> crate::meta_plugin::MetaPluginResponse { + // If already finalized, don't process more data + if self.is_finalized { + return crate::meta_plugin::MetaPluginResponse { + metadata: Vec::new(), + is_finalized: true, + }; + } + if self.start_time.is_none() { self.start_time = Some(Instant::now()); } @@ -230,6 +288,7 @@ impl MetaPlugin for ReadTimeMetaPlugin { pub struct ReadRateMetaPlugin { start_time: Option, bytes_read: u64, + is_finalized: bool, meta_name: String, outputs: std::collections::HashMap, options: std::collections::HashMap, @@ -263,6 +322,7 @@ impl ReadRateMetaPlugin { ReadRateMetaPlugin { start_time: None, bytes_read: 0, + is_finalized: false, meta_name: "read_rate".to_string(), outputs: final_outputs, options: final_options, @@ -275,7 +335,23 @@ impl ReadRateMetaPlugin { } impl MetaPlugin for ReadRateMetaPlugin { + fn is_finalized(&self) -> bool { + self.is_finalized + } + + fn set_finalized(&mut self, finalized: bool) { + self.is_finalized = finalized; + } + fn finalize(&mut self) -> crate::meta_plugin::MetaPluginResponse { + // If already finalized, don't process again + if self.is_finalized { + return crate::meta_plugin::MetaPluginResponse { + metadata: Vec::new(), + is_finalized: true, + }; + } + let mut metadata = Vec::new(); if let Some(start_time) = self.start_time { @@ -295,6 +371,9 @@ impl MetaPlugin for ReadRateMetaPlugin { metadata.push(meta_data); } } + + // Mark as finalized + self.is_finalized = true; crate::meta_plugin::MetaPluginResponse { metadata, @@ -303,6 +382,14 @@ impl MetaPlugin for ReadRateMetaPlugin { } fn update(&mut self, data: &[u8]) -> crate::meta_plugin::MetaPluginResponse { + // If already finalized, don't process more data + if self.is_finalized { + return crate::meta_plugin::MetaPluginResponse { + metadata: Vec::new(), + is_finalized: true, + }; + } + if self.start_time.is_none() { self.start_time = Some(Instant::now()); }