From: Hannes Laimer <h.laimer@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup 2/2] proxy: extract commonly used logic for scheduling into new function
Date: Thu, 29 Oct 2020 11:37:49 +0100 [thread overview]
Message-ID: <20201029103749.109210-3-h.laimer@proxmox.com> (raw)
In-Reply-To: <20201029103749.109210-1-h.laimer@proxmox.com>
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
src/bin/proxmox-backup-proxy.rs | 188 ++++++++++----------------------
1 file changed, 56 insertions(+), 132 deletions(-)
diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs
index 21c5e9fb..9222b075 100644
--- a/src/bin/proxmox-backup-proxy.rs
+++ b/src/bin/proxmox-backup-proxy.rs
@@ -402,48 +402,19 @@ async fn schedule_datastore_prune() {
continue;
}
- let event = match parse_calendar_event(&event_str) {
- Ok(event) => event,
- Err(err) => {
- eprintln!("unable to parse schedule '{}' - {}", event_str, err);
- continue;
- }
- };
-
let worker_type = "prune";
+ if check_schedule(worker_type.to_string(), event_str.clone(), store.clone()) {
+ let job = match Job::new(worker_type, &store) {
+ Ok(job) => job,
+ Err(_) => continue, // could not get lock
+ };
- let last = match jobstate::last_run_time(worker_type, &store) {
- Ok(time) => time,
- Err(err) => {
- eprintln!("could not get last run time of {} {}: {}", worker_type, store, err);
- continue;
- }
- };
+ let userid = Userid::backup_userid().clone();
- let next = match compute_next_event(&event, last, false) {
- Ok(Some(next)) => next,
- Ok(None) => continue,
- Err(err) => {
- eprintln!("compute_next_event for '{}' failed - {}", event_str, err);
- continue;
+ if let Err(err) = do_prune_job(job, prune_options, store.clone(), &userid, Some(event_str)) {
+ eprintln!("unable to start datastore prune job {} - {}", &store, err);
}
- };
-
- let now = proxmox::tools::time::epoch_i64();
-
- if next > now { continue; }
-
- let job = match Job::new(worker_type, &store) {
- Ok(job) => job,
- Err(_) => continue, // could not get lock
- };
-
- let userid = Userid::backup_userid().clone();
-
- if let Err(err) = do_prune_job(job, prune_options, store.clone(), &userid, Some(event_str)) {
- eprintln!("unable to start datastore prune job {} - {}", &store, err);
}
-
}
}
@@ -476,46 +447,18 @@ async fn schedule_datastore_sync_jobs() {
None => continue,
};
- let event = match parse_calendar_event(&event_str) {
- Ok(event) => event,
- Err(err) => {
- eprintln!("unable to parse schedule '{}' - {}", event_str, err);
- continue;
- }
- };
-
let worker_type = "syncjob";
+ if check_schedule(worker_type.to_string(), event_str.clone(), job_id.clone()) {
+ let job = match Job::new(worker_type, &job_id) {
+ Ok(job) => job,
+ Err(_) => continue, // could not get lock
+ };
- let last = match jobstate::last_run_time(worker_type, &job_id) {
- Ok(time) => time,
- Err(err) => {
- eprintln!("could not get last run time of {} {}: {}", worker_type, job_id, err);
- continue;
- }
- };
+ let userid = Userid::backup_userid().clone();
- let next = match compute_next_event(&event, last, false) {
- Ok(Some(next)) => next,
- Ok(None) => continue,
- Err(err) => {
- eprintln!("compute_next_event for '{}' failed - {}", event_str, err);
- continue;
+ if let Err(err) = do_sync_job(job, job_config, &userid, Some(event_str)) {
+ eprintln!("unable to start datastore sync job {} - {}", &job_id, err);
}
- };
-
- let now = proxmox::tools::time::epoch_i64();
-
- if next > now { continue; }
-
- let job = match Job::new(worker_type, &job_id) {
- Ok(job) => job,
- Err(_) => continue, // could not get lock
- };
-
- let userid = Userid::backup_userid().clone();
-
- if let Err(err) = do_sync_job(job, job_config, &userid, Some(event_str)) {
- eprintln!("unable to start datastore sync job {} - {}", &job_id, err);
}
}
}
@@ -546,38 +489,17 @@ async fn schedule_datastore_verify_jobs() {
Some(ref event_str) => event_str.clone(),
None => continue,
};
- let event = match parse_calendar_event(&event_str) {
- Ok(event) => event,
- Err(err) => {
- eprintln!("unable to parse schedule '{}' - {}", event_str, err);
- continue;
- }
- };
+
let worker_type = "verificationjob";
- let last = match jobstate::last_run_time(worker_type, &job_id) {
- Ok(time) => time,
- Err(err) => {
- eprintln!("could not get last run time of {} {}: {}", worker_type, job_id, err);
- continue;
- }
- };
- let next = match compute_next_event(&event, last, false) {
- Ok(Some(next)) => next,
- Ok(None) => continue,
- Err(err) => {
- eprintln!("compute_next_event for '{}' failed - {}", event_str, err);
- continue;
+ if check_schedule(worker_type.to_string(), event_str.clone(), job_id.clone()) {
+ let job = match Job::new(&worker_type, &job_id) {
+ Ok(job) => job,
+ Err(_) => continue, // could not get lock
+ };
+ let userid = Userid::backup_userid().clone();
+ if let Err(err) = do_verification_job(job, job_config, &userid, Some(event_str)) {
+ eprintln!("unable to start datastore verification job {} - {}", &job_id, err);
}
- };
- let now = proxmox::tools::time::epoch_i64();
- if next > now { continue; }
- let job = match Job::new(worker_type, &job_id) {
- Ok(job) => job,
- Err(_) => continue, // could not get lock
- };
- let userid = Userid::backup_userid().clone();
- if let Err(err) = do_verification_job(job, job_config, &userid, Some(event_str)) {
- eprintln!("unable to start datastore verification job {} - {}", &job_id, err);
}
}
}
@@ -587,38 +509,10 @@ async fn schedule_task_log_rotate() {
let worker_type = "logrotate";
let job_id = "task_archive";
- let last = match jobstate::last_run_time(worker_type, job_id) {
- Ok(time) => time,
- Err(err) => {
- eprintln!("could not get last run time of task log archive rotation: {}", err);
- return;
- }
- };
-
// schedule daily at 00:00 like normal logrotate
let schedule = "00:00";
- let event = match parse_calendar_event(schedule) {
- Ok(event) => event,
- Err(err) => {
- // should not happen?
- eprintln!("unable to parse schedule '{}' - {}", schedule, err);
- return;
- }
- };
-
- let next = match compute_next_event(&event, last, false) {
- Ok(Some(next)) => next,
- Ok(None) => return,
- Err(err) => {
- eprintln!("compute_next_event for '{}' failed - {}", schedule, err);
- return;
- }
- };
-
- let now = proxmox::tools::time::epoch_i64();
-
- if next > now {
+ if !check_schedule(worker_type.to_string(), schedule.to_string(), job_id.to_string()) {
// if we never ran the rotation, schedule instantly
match jobstate::JobState::load(worker_type, job_id) {
Ok(state) => match state {
@@ -783,6 +677,36 @@ async fn generate_host_stats(save: bool) {
});
}
+fn check_schedule(worker_type: String, event_str: String, id: String) -> bool {
+ let event = match parse_calendar_event(&event_str) {
+ Ok(event) => event,
+ Err(err) => {
+ eprintln!("unable to parse schedule '{}' - {}", event_str, err);
+ return false;
+ }
+ };
+
+ let last = match jobstate::last_run_time(&worker_type, &id) {
+ Ok(time) => time,
+ Err(err) => {
+ eprintln!("could not get last run time of {} {}: {}", worker_type, id, err);
+ return false;
+ }
+ };
+
+ let next = match compute_next_event(&event, last, false) {
+ Ok(Some(next)) => next,
+ Ok(None) => return false,
+ Err(err) => {
+ eprintln!("compute_next_event for '{}' failed - {}", event_str, err);
+ return false;
+ }
+ };
+
+ let now = proxmox::tools::time::epoch_i64();
+ next <= now
+}
+
fn gather_disk_stats(disk_manager: Arc<DiskManage>, path: &Path, rrd_prefix: &str, save: bool) {
match proxmox_backup::tools::disks::disk_usage(path) {
--
2.20.1
next prev parent reply other threads:[~2020-10-29 10:38 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-29 10:37 [pbs-devel] [PATCH proxmox-backup 0/2] proxy: scheduling cleanup Hannes Laimer
2020-10-29 10:37 ` [pbs-devel] [PATCH proxmox-backup 1/2] proxy: move prune logic into new file Hannes Laimer
2020-10-29 10:37 ` Hannes Laimer [this message]
2020-10-29 11:21 ` [pbs-devel] [PATCH proxmox-backup 0/2] proxy: scheduling cleanup Dietmar Maurer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201029103749.109210-3-h.laimer@proxmox.com \
--to=h.laimer@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox