From c01110c45356d12b8d973a1a80f1e051018dcb20 Mon Sep 17 00:00:00 2001 From: Millian Poquet <millian.poquet@inria.fr> Date: Tue, 29 Jan 2019 18:15:59 +0100 Subject: [PATCH] [code] stop CALL_ME_LATER once all jobs finished --- src/algo/energy_bf.cpp | 28 ++++++++++++ src/algo/energy_bf.hpp | 3 ++ ...energy_bf_monitoring_inertial_shutdown.cpp | 44 +++++++++++-------- src/algo/energy_bf_monitoring_period.cpp | 17 ++++--- src/algo/energy_bf_monitoring_period.hpp | 1 + 5 files changed, 68 insertions(+), 25 deletions(-) diff --git a/src/algo/energy_bf.cpp b/src/algo/energy_bf.cpp index ed51dd9..7f3cb76 100644 --- a/src/algo/energy_bf.cpp +++ b/src/algo/energy_bf.cpp @@ -1343,3 +1343,31 @@ bool EnergyBackfilling::is_fake_job(const std::string & job_id) { return boost::starts_with(job_id, "fakejob_"); } + +bool EnergyBackfilling::contains_any_fake_job(const Schedule &schedule) +{ + for (auto slice_it = schedule.begin(); slice_it != schedule.end(); ++slice_it) + { + for (auto mit : slice_it->allocated_jobs) + { + const Job * job = mit.first; + if (is_fake_job(job->id)) + return true; + } + } + return false; +} + +bool EnergyBackfilling::contains_any_nonfake_job(const Schedule &schedule) +{ + for (auto slice_it = schedule.begin(); slice_it != schedule.end(); ++slice_it) + { + for (auto mit : slice_it->allocated_jobs) + { + const Job * job = mit.first; + if (!is_fake_job(job->id)) + return true; + } + } + return false; +} diff --git a/src/algo/energy_bf.hpp b/src/algo/energy_bf.hpp index b66526b..cba51a3 100644 --- a/src/algo/energy_bf.hpp +++ b/src/algo/energy_bf.hpp @@ -156,6 +156,9 @@ protected: static bool is_potential_sleep_job(const std::string & job_id); static bool is_fake_job(const std::string & job_id); + static bool contains_any_fake_job(const Schedule & schedule); + static bool contains_any_nonfake_job(const Schedule & schedule); + protected: Schedule _schedule; bool _debug = false; diff --git a/src/algo/energy_bf_monitoring_inertial_shutdown.cpp b/src/algo/energy_bf_monitoring_inertial_shutdown.cpp index da2477c..3da4934 100644 --- a/src/algo/energy_bf_monitoring_inertial_shutdown.cpp +++ b/src/algo/energy_bf_monitoring_inertial_shutdown.cpp @@ -120,26 +120,34 @@ void EnergyBackfillingMonitoringInertialShutdown::make_decisions(double date, "Invalid nb_machines_sedated_for_being_idle value: %d\n", _nb_machines_sedated_for_being_idle); - // Let's remove finished jobs from the schedule - for (const string & ended_job_id : _jobs_ended_recently) + if (!_jobs_ended_recently.empty()) { - const Job * ended_job = (*_workload)[ended_job_id]; - ++_nb_jobs_completed; - - PPK_ASSERT_ERROR(_schedule.contains_job(ended_job), - "Invalid schedule: job '%s' just finished, " - "but it not in the schedule...\n%s", - ended_job_id.c_str(), _schedule.to_string().c_str()); - PPK_ASSERT_ERROR(!_queue->contains_job(ended_job), - "Job '%s' just ended, but it is still in the " - "queue...\nQueue : %s", - ended_job_id.c_str(), - _queue->to_string().c_str()); - - // Let's remove the finished job from the schedule - _schedule.remove_job(ended_job); - } + // Let's remove finished jobs from the schedule + for (const string & ended_job_id : _jobs_ended_recently) + { + const Job * ended_job = (*_workload)[ended_job_id]; + ++_nb_jobs_completed; + PPK_ASSERT_ERROR(_schedule.contains_job(ended_job), + "Invalid schedule: job '%s' just finished, " + "but it not in the schedule...\n%s", + ended_job_id.c_str(), _schedule.to_string().c_str()); + PPK_ASSERT_ERROR(!_queue->contains_job(ended_job), + "Job '%s' just ended, but it is still in the " + "queue...\nQueue : %s", + ended_job_id.c_str(), + _queue->to_string().c_str()); + + // Let's remove the finished job from the schedule + _schedule.remove_job(ended_job); + } + + // Stop sending CALL_ME_LATER if all jobs have been executed. + if (_no_more_static_job_to_submit_received && + _queue->is_empty() && + !EnergyBackfilling::contains_any_nonfake_job(_schedule)) + _stop_sending_call_me_later = true; + } // Let's update the first slice of the schedule update_first_slice_taking_sleep_jobs_into_account(date); diff --git a/src/algo/energy_bf_monitoring_period.cpp b/src/algo/energy_bf_monitoring_period.cpp index 95b0777..4da14ad 100644 --- a/src/algo/energy_bf_monitoring_period.cpp +++ b/src/algo/energy_bf_monitoring_period.cpp @@ -65,13 +65,16 @@ void EnergyBackfillingMonitoringPeriod::on_requested_call(double date) // Let's execute on_monitoring_stage on_monitoring_stage(date); - // Let's request a call for the next monitoring stage - _next_monitoring_period_expected_date = date + _period_between_monitoring_stages; - _decision->add_call_me_later((double)(_next_monitoring_period_expected_date), date); - _nb_call_me_later_running++; - - LOG_F(INFO, "EnergyBackfillingMonitoringPeriod: 'Chose to launch a call_me_later at %g", - (double)_next_monitoring_period_expected_date); + if (!_stop_sending_call_me_later) + { + // Let's request a call for the next monitoring stage + _next_monitoring_period_expected_date = date + _period_between_monitoring_stages; + _decision->add_call_me_later((double)(_next_monitoring_period_expected_date), date); + _nb_call_me_later_running++; + + LOG_F(INFO, "EnergyBackfillingMonitoringPeriod: 'Chose to launch a call_me_later at %g", + (double)_next_monitoring_period_expected_date); + } } } diff --git a/src/algo/energy_bf_monitoring_period.hpp b/src/algo/energy_bf_monitoring_period.hpp index 70553d5..525e27f 100644 --- a/src/algo/energy_bf_monitoring_period.hpp +++ b/src/algo/energy_bf_monitoring_period.hpp @@ -29,6 +29,7 @@ public: protected: std::string _output_dir; + bool _stop_sending_call_me_later = false; private: bool _monitoring_period_launched = false; -- GitLab