src/server/worker_task.rs: implement read_task_list()
This commit is contained in:
		@ -8,7 +8,6 @@ use futures::*;
 | 
			
		||||
use std::sync::{Arc, Mutex};
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use std::io::{BufRead, BufReader};
 | 
			
		||||
use std::fs::File;
 | 
			
		||||
 | 
			
		||||
@ -101,41 +100,6 @@ impl std::fmt::Display for UPID {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct WorkerTaskInfo {
 | 
			
		||||
    upid: UPID,
 | 
			
		||||
    progress: f64, // 0..1
 | 
			
		||||
    abort_requested: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn running_worker_tasks() -> Vec<WorkerTaskInfo> {
 | 
			
		||||
 | 
			
		||||
    let mut list = vec![];
 | 
			
		||||
 | 
			
		||||
    for (_task_id, worker) in WORKER_TASK_LIST.lock().unwrap().iter() {
 | 
			
		||||
        let data = worker.data.lock().unwrap();
 | 
			
		||||
        let info = WorkerTaskInfo {
 | 
			
		||||
            upid: worker.upid.clone(),
 | 
			
		||||
            progress: data.progress,
 | 
			
		||||
            abort_requested: worker.abort_requested.load(Ordering::SeqCst),
 | 
			
		||||
        };
 | 
			
		||||
        list.push(info);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    list
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn read_active_tasks() -> Result<(), Error> {
 | 
			
		||||
 | 
			
		||||
    let data = tools::file_get_json(PROXMOX_BACKUP_ACTIVE_TASK_FN!(), Some(json!([])))?;
 | 
			
		||||
 | 
			
		||||
    println!("GOT {:?}", data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn parse_worker_status_line(line: &str) -> Result<(String, UPID, Option<(i64, String)>), Error> {
 | 
			
		||||
 | 
			
		||||
    let data = line.splitn(3, ' ').collect::<Vec<&str>>();
 | 
			
		||||
@ -152,6 +116,7 @@ fn parse_worker_status_line(line: &str) -> Result<(String, UPID, Option<(i64, St
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Returns the absolute path to the task log file
 | 
			
		||||
pub fn upid_log_path(upid: &UPID) -> std::path::PathBuf {
 | 
			
		||||
    let mut path = std::path::PathBuf::from(PROXMOX_BACKUP_TASK_DIR!());
 | 
			
		||||
    path.push(format!("{:02X}", upid.pstart % 256));
 | 
			
		||||
@ -187,7 +152,25 @@ fn upid_read_status(upid: &UPID) -> Result<String, Error> {
 | 
			
		||||
    Ok(status)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn update_active_workers(new_upid: Option<&UPID>) -> Result<(), Error> {
 | 
			
		||||
/// Task details including parsed UPID
 | 
			
		||||
///
 | 
			
		||||
/// If there is no `state`, the task is still running.
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct TaskListInfo {
 | 
			
		||||
    /// The parsed UPID
 | 
			
		||||
    pub upid: UPID,
 | 
			
		||||
    /// UPID string representation
 | 
			
		||||
    pub upid_str: String,
 | 
			
		||||
    /// Task `(endtime, status)` if already finished
 | 
			
		||||
    ///
 | 
			
		||||
    /// The `status` ise iether `unknown`, `OK`, or `ERROR: ...`
 | 
			
		||||
    pub state: Option<(i64, String)>, // endtime, status
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// atomically read/update the task list, update status of finished tasks
 | 
			
		||||
// new_upid is added to the list when specified.
 | 
			
		||||
// Returns a sorted list of known tasks,
 | 
			
		||||
fn update_active_workers(new_upid: Option<&UPID>) -> Result<Vec<TaskListInfo>, Error> {
 | 
			
		||||
 | 
			
		||||
    let my_pid  = unsafe { libc::getpid() };
 | 
			
		||||
    let my_pid_stat = tools::procfs::read_proc_pid_stat(my_pid)?;
 | 
			
		||||
@ -205,13 +188,6 @@ fn update_active_workers(new_upid: Option<&UPID>) -> Result<(), Error> {
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    #[derive(Debug)]
 | 
			
		||||
    struct TaskListInfo {
 | 
			
		||||
        upid: UPID,
 | 
			
		||||
        upid_str: String,
 | 
			
		||||
        state: Option<(i64, String)>, // endtime, status
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let mut active_list = vec![];
 | 
			
		||||
    let mut finish_list = vec![];
 | 
			
		||||
 | 
			
		||||
@ -282,7 +258,9 @@ fn update_active_workers(new_upid: Option<&UPID>) -> Result<(), Error> {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let mut task_list: Vec<&TaskListInfo> = task_hash.values().collect();
 | 
			
		||||
    let mut task_list: Vec<TaskListInfo> = vec![];
 | 
			
		||||
    for (_, info) in task_hash { task_list.push(info); }
 | 
			
		||||
 | 
			
		||||
    task_list.sort_unstable_by(|a, b| {
 | 
			
		||||
        match (&a.state, &b.state) {
 | 
			
		||||
            (Some(s1), Some(s2)) => s1.0.cmp(&s2.0),
 | 
			
		||||
@ -306,9 +284,15 @@ fn update_active_workers(new_upid: Option<&UPID>) -> Result<(), Error> {
 | 
			
		||||
 | 
			
		||||
    drop(lock);
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
    Ok(task_list)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Returns a sorted list of known tasks
 | 
			
		||||
///
 | 
			
		||||
/// The list is sorted by `(starttime, endtime)` in ascending order
 | 
			
		||||
pub fn read_task_list() -> Result<Vec<TaskListInfo>, Error> {
 | 
			
		||||
    update_active_workers(None)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Launch long running worker tasks.
 | 
			
		||||
///
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user