Instead of forking every minute, check whether a job has to be run and only fork if there is a pending job.
Signed-off-by: Filip Schauer <[email protected]> --- Backup jobs are registered in the jobs.cfg file, while replication jobs are registered in the replication.cfg file. Integrating replication into PVE::Jobs would move replication jobs into jobs.cfg, breaking backwards compatibility. PVE/Jobs.pm | 21 ++++++++++++++++++++- PVE/Service/pvescheduler.pm | 11 ++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/PVE/Jobs.pm b/PVE/Jobs.pm index bd323332..5643bd15 100644 --- a/PVE/Jobs.pm +++ b/PVE/Jobs.pm @@ -258,13 +258,14 @@ sub get_last_runtime { return $state->{time} // 0; } -sub run_jobs { +sub get_pending { my ($first_run) = @_; synchronize_job_states_with_config(); my $jobs_cfg = cfs_read_file('jobs.cfg'); my $nodename = PVE::INotify::nodename(); + my @pending_jobs = (); foreach my $id (sort keys %{$jobs_cfg->{ids}}) { my $cfg = $jobs_cfg->{ids}->{$id}; @@ -292,6 +293,24 @@ sub run_jobs { next if !defined($next_sync) || time() < $next_sync; # not yet its (next) turn + push @pending_jobs, $id; + } + + return @pending_jobs; +} + +sub run_jobs { + my (@scheduled_jobs) = @_; + + synchronize_job_states_with_config(); + + my $jobs_cfg = cfs_read_file('jobs.cfg'); + + foreach my $id (@scheduled_jobs) { + my $cfg = $jobs_cfg->{ids}->{$id} or next; + my $type = $cfg->{type}; + my $schedule = delete $cfg->{schedule}; + my $plugin = PVE::Job::Registry->lookup($type); if (starting_job($id, $type)) { PVE::Cluster::cfs_update(); diff --git a/PVE/Service/pvescheduler.pm b/PVE/Service/pvescheduler.pm index 40be5977..7b6b3e99 100755 --- a/PVE/Service/pvescheduler.pm +++ b/PVE/Service/pvescheduler.pm @@ -100,19 +100,16 @@ sub run { my $first_run = 1; my $run_jobs = sub { - # TODO: actually integrate replication in PVE::Jobs and do not always fork here, we could - # do the state lookup and check if there's new work scheduled before doing so, e.g., by - # extending the PVE::Jobs interfacae e.g.; - # my $scheduled_jobs = PVE::Jobs::get_pending() or return; - # forked { PVE::Jobs::run_jobs($scheduled_jobs) } + # TODO: actually integrate replication in PVE::Jobs and do not always fork here $fork->('replication', sub { PVE::API2::Replication::run_jobs(undef, sub {}, 0, 1); }); + my @pending_jobs = PVE::Jobs::get_pending($first_run); $fork->('jobs', sub { - PVE::Jobs::run_jobs($first_run); - }); + PVE::Jobs::run_jobs(@pending_jobs); + }) if (@pending_jobs); $first_run = 0; }; -- 2.39.2 _______________________________________________ pve-devel mailing list [email protected] https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
