]> git.proxmox.com Git - proxmox.git/commitdiff
proxmox-sys: imported pbs-tools/src/task.rs (as worker_task_context.rs)
authorDietmar Maurer <dietmar@proxmox.com>
Fri, 19 Nov 2021 08:27:23 +0000 (09:27 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 19 Nov 2021 09:05:06 +0000 (10:05 +0100)
Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
proxmox-sys/Cargo.toml
proxmox-sys/debian/changelog
proxmox-sys/src/lib.rs
proxmox-sys/src/worker_task_context.rs [new file with mode: 0644]

index 11b130a7a9a5cb1aad5d00dbda211985a970caa6..433e13dd15f9728bc246bdeecbde29b01f0d9293 100644 (file)
@@ -12,6 +12,7 @@ exclude = [ "debian" ]
 anyhow = "1.0"
 base64 = "0.12"
 libc = "0.2.107"
+log = "0.4"
 nix = "0.19.1"
 zstd = { version = "0.6", features = [ "bindgen" ] }
 
index 39a719df0fd4d2fb9306832736350e11809d051a..487b22596a4d0d948acd1dc83d630d2e8e1f90f4 100644 (file)
@@ -1,4 +1,4 @@
-rust-proxmox-sys (0.1.0) unstable; urgency=medium
+rust-proxmox-sys (0.1.0) stable; urgency=medium
 
   * imported pbs-tools/src/crypt.rs
 
@@ -6,7 +6,9 @@ rust-proxmox-sys (0.1.0) unstable; urgency=medium
 
   * imported pbs-tools/src/logrotate.rs (with various cleanups)
 
+  * imported pbs-tools/src/task.rs (as worker_task_context.rs)
+
   * initial release
 
- -- Proxmox Support Team <support@proxmox.com>  Fri, 19 Nov 2021 07:19:19 +0100
+ -- Proxmox Support Team <support@proxmox.com>  Fri, 19 Nov 2021 09:44:01 +0100
 
index 057c22cf4c7655655f90f9d8dc33c10ef9b2cb86..2033384984a129ef37434d13cc4bd8caa7b4b615 100644 (file)
@@ -1,3 +1,4 @@
 pub mod crypt;
 pub mod logrotate;
 pub mod process_locker;
+pub mod worker_task_context;
diff --git a/proxmox-sys/src/worker_task_context.rs b/proxmox-sys/src/worker_task_context.rs
new file mode 100644 (file)
index 0000000..0c2d05a
--- /dev/null
@@ -0,0 +1,92 @@
+use anyhow::{bail, Error};
+
+/// Worker task abstraction
+///
+/// A worker task is a long running task, which usually logs output into a separate file.
+pub trait WorkerTaskContext: Send + Sync {
+
+    /// Test if there was a request to abort the task.
+    fn abort_requested(&self) -> bool;
+
+    /// If the task should be aborted, this should fail with a reasonable error message.
+    fn check_abort(&self) -> Result<(), Error> {
+        if self.abort_requested() {
+            bail!("abort requested - aborting task");
+        }
+        Ok(())
+    }
+
+    /// Test if there was a request to shutdown the server.
+    fn shutdown_requested(&self) -> bool;
+
+
+    /// This should fail with a reasonable error message if there was
+    /// a request to shutdown the server.
+    fn fail_on_shutdown(&self) -> Result<(), Error> {
+        if self.shutdown_requested() {
+            bail!("Server shutdown requested - aborting task");
+        }
+        Ok(())
+    }
+
+    /// Create a log message for this task.
+    fn log(&self, level: log::Level, message: &std::fmt::Arguments);
+}
+
+/// Convenience implementation:
+impl<T: WorkerTaskContext + ?Sized> WorkerTaskContext for std::sync::Arc<T> {
+    fn abort_requested(&self) -> bool {
+        <T as WorkerTaskContext>::abort_requested(&*self)
+    }
+
+    fn check_abort(&self) -> Result<(), Error> {
+        <T as WorkerTaskContext>::check_abort(&*self)
+    }
+
+    fn shutdown_requested(&self) -> bool {
+        <T as WorkerTaskContext>::shutdown_requested(&*self)
+    }
+
+    fn fail_on_shutdown(&self) -> Result<(), Error> {
+        <T as WorkerTaskContext>::fail_on_shutdown(&*self)
+    }
+
+    fn log(&self, level: log::Level, message: &std::fmt::Arguments) {
+        <T as WorkerTaskContext>::log(&*self, level, message)
+    }
+}
+
+#[macro_export]
+macro_rules! task_error {
+    ($task:expr, $($fmt:tt)+) => {{
+        $crate::worker_task_context::WorkerTaskContext::log(&*$task, log::Level::Error, &format_args!($($fmt)+))
+    }};
+}
+
+#[macro_export]
+macro_rules! task_warn {
+    ($task:expr, $($fmt:tt)+) => {{
+        $crate::worker_task_context::WorkerTaskContext::log(&*$task, log::Level::Warn, &format_args!($($fmt)+))
+    }};
+}
+
+#[macro_export]
+macro_rules! task_log {
+    ($task:expr, $($fmt:tt)+) => {{
+        $crate::worker_task_context::WorkerTaskContext::log(&*$task, log::Level::Info, &format_args!($($fmt)+))
+    }};
+}
+
+#[macro_export]
+macro_rules! task_debug {
+    ($task:expr, $($fmt:tt)+) => {{
+        $crate::worker_task_context::WorkerTaskContext::log(&*$task, log::Level::Debug, &format_args!($($fmt)+))
+    }};
+}
+
+#[macro_export]
+macro_rules! task_trace {
+    ($task:expr, $($fmt:tt)+) => {{
+        $crate::worker_task_context::WorkerTaskContext::log(&*$task, log::Level::Trace, &format_args!($($fmt)+))
+    }};
+}