upid: use systemd escape to decode/encode the worker_id

This way we can store values containing "/" and ":".
This commit is contained in:
Dietmar Maurer 2020-10-22 08:24:37 +02:00
parent 5eb9dd0c8a
commit 4ebda996e5
7 changed files with 22 additions and 15 deletions

View File

@ -496,13 +496,13 @@ pub fn verify(
match (backup_type, backup_id, backup_time) { match (backup_type, backup_id, backup_time) {
(Some(backup_type), Some(backup_id), Some(backup_time)) => { (Some(backup_type), Some(backup_id), Some(backup_time)) => {
worker_id = format!("{}_{}_{}_{:08X}", store, backup_type, backup_id, backup_time); worker_id = format!("{}:{}/{}/{:08X}", store, backup_type, backup_id, backup_time);
let dir = BackupDir::new(backup_type, backup_id, backup_time)?; let dir = BackupDir::new(backup_type, backup_id, backup_time)?;
backup_dir = Some(dir); backup_dir = Some(dir);
worker_type = "verify_snapshot"; worker_type = "verify_snapshot";
} }
(Some(backup_type), Some(backup_id), None) => { (Some(backup_type), Some(backup_id), None) => {
worker_id = format!("{}_{}_{}", store, backup_type, backup_id); worker_id = format!("{}:{}/{}", store, backup_type, backup_id);
let group = BackupGroup::new(backup_type, backup_id); let group = BackupGroup::new(backup_type, backup_id);
backup_group = Some(group); backup_group = Some(group);
worker_type = "verify_group"; worker_type = "verify_group";
@ -668,7 +668,7 @@ fn prune(
keep_yearly: param["keep-yearly"].as_u64(), keep_yearly: param["keep-yearly"].as_u64(),
}; };
let worker_id = format!("{}_{}_{}", store, backup_type, backup_id); let worker_id = format!("{}:{}/{}", store, backup_type, backup_id);
let mut prune_result = Vec::new(); let mut prune_result = Vec::new();

View File

@ -86,7 +86,7 @@ async move {
bail!("unexpected http version '{:?}' (expected version < 2)", parts.version); bail!("unexpected http version '{:?}' (expected version < 2)", parts.version);
} }
let worker_id = format!("{}_{}_{}", store, backup_type, backup_id); let worker_id = format!("{}:{}/{}", store, backup_type, backup_id);
let env_type = rpcenv.env_type(); let env_type = rpcenv.env_type();

View File

@ -506,7 +506,7 @@ impl BackupEnvironment {
return Ok(()); return Ok(());
} }
let worker_id = format!("{}_{}_{}_{:08X}", let worker_id = format!("{}:{}/{}/{:08X}",
self.datastore.name(), self.datastore.name(),
self.backup_dir.group().backup_type(), self.backup_dir.group().backup_type(),
self.backup_dir.group().backup_id(), self.backup_dir.group().backup_id(),

View File

@ -342,7 +342,7 @@ pub fn list_tasks(
if info.upid.worker_type == "backup" || info.upid.worker_type == "restore" || if info.upid.worker_type == "backup" || info.upid.worker_type == "restore" ||
info.upid.worker_type == "prune" info.upid.worker_type == "prune"
{ {
let prefix = format!("{}_", store); let prefix = format!("{}:", store);
if !worker_id.starts_with(&prefix) { return None; } if !worker_id.starts_with(&prefix) { return None; }
} else if info.upid.worker_type == "garbage_collection" { } else if info.upid.worker_type == "garbage_collection" {
if worker_id != store { return None; } if worker_id != store { return None; }

View File

@ -108,7 +108,7 @@ fn upgrade_to_backup_reader_protocol(
//let files = BackupInfo::list_files(&path, &backup_dir)?; //let files = BackupInfo::list_files(&path, &backup_dir)?;
let worker_id = format!("{}_{}_{}_{:08X}", store, backup_type, backup_id, backup_dir.backup_time()); let worker_id = format!("{}:{}/{}/{:08X}", store, backup_type, backup_id, backup_dir.backup_time());
WorkerTask::spawn("reader", Some(worker_id), userid.clone(), true, move |worker| { WorkerTask::spawn("reader", Some(worker_id), userid.clone(), true, move |worker| {
let mut env = ReaderEnvironment::new( let mut env = ReaderEnvironment::new(

View File

@ -628,7 +628,7 @@ async fn schedule_task_log_rotate() {
parse_calendar_event, compute_next_event}; parse_calendar_event, compute_next_event};
let worker_type = "logrotate"; let worker_type = "logrotate";
let job_id = "task-archive"; let job_id = "task_archive";
let last = match jobstate::last_run_time(worker_type, job_id) { let last = match jobstate::last_run_time(worker_type, job_id) {
Ok(time) => time, Ok(time) => time,

View File

@ -75,11 +75,6 @@ impl UPID {
if worker_type.contains(bad) { if worker_type.contains(bad) {
bail!("illegal characters in worker type '{}'", worker_type); bail!("illegal characters in worker type '{}'", worker_type);
} }
if let Some(ref worker_id) = worker_id {
if worker_id.contains(bad) {
bail!("illegal characters in worker id '{}'", worker_id);
}
}
static WORKER_TASK_NEXT_ID: AtomicUsize = AtomicUsize::new(0); static WORKER_TASK_NEXT_ID: AtomicUsize = AtomicUsize::new(0);
@ -112,13 +107,21 @@ impl std::str::FromStr for UPID {
fn from_str(s: &str) -> Result<Self, Self::Err> { fn from_str(s: &str) -> Result<Self, Self::Err> {
if let Some(cap) = PROXMOX_UPID_REGEX.captures(s) { if let Some(cap) = PROXMOX_UPID_REGEX.captures(s) {
let worker_id = if cap["wid"].is_empty() {
None
} else {
let wid = crate::tools::systemd::unescape_unit(&cap["wid"])?;
Some(wid)
};
Ok(UPID { Ok(UPID {
pid: i32::from_str_radix(&cap["pid"], 16).unwrap(), pid: i32::from_str_radix(&cap["pid"], 16).unwrap(),
pstart: u64::from_str_radix(&cap["pstart"], 16).unwrap(), pstart: u64::from_str_radix(&cap["pstart"], 16).unwrap(),
starttime: i64::from_str_radix(&cap["starttime"], 16).unwrap(), starttime: i64::from_str_radix(&cap["starttime"], 16).unwrap(),
task_id: usize::from_str_radix(&cap["task_id"], 16).unwrap(), task_id: usize::from_str_radix(&cap["task_id"], 16).unwrap(),
worker_type: cap["wtype"].to_string(), worker_type: cap["wtype"].to_string(),
worker_id: if cap["wid"].is_empty() { None } else { Some(cap["wid"].to_string()) }, worker_id,
userid: cap["userid"].parse()?, userid: cap["userid"].parse()?,
node: cap["node"].to_string(), node: cap["node"].to_string(),
}) })
@ -133,7 +136,11 @@ impl std::fmt::Display for UPID {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let wid = if let Some(ref id) = self.worker_id { id } else { "" }; let wid = if let Some(ref id) = self.worker_id {
crate::tools::systemd::escape_unit(id, false)
} else {
String::new()
};
// Note: pstart can be > 32bit if uptime > 497 days, so this can result in // Note: pstart can be > 32bit if uptime > 497 days, so this can result in
// more that 8 characters for pstart // more that 8 characters for pstart