From 40432bbf5be2ae57df90a77f245c2f71b3c61794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Madon?= <mael.madon@irit.fr> Date: Tue, 18 Jul 2023 14:00:34 +0200 Subject: [PATCH] refac: move logger to ReplayUser to simplify calls to behaviors --- src/users/broker.cpp | 1 + src/users/response_behaviors.cpp | 51 +++++++++++----------------- src/users/response_behaviors.hpp | 29 ++++++---------- src/users/user_replay.cpp | 45 +++++++++++++------------ src/users/user_replay.hpp | 53 ++++++++++++++--------------- src/users/user_windows.cpp | 57 ++++++++++++++++---------------- src/users/user_windows.hpp | 1 - 7 files changed, 110 insertions(+), 127 deletions(-) diff --git a/src/users/broker.cpp b/src/users/broker.cpp index e36b7f2..4e4f917 100644 --- a/src/users/broker.cpp +++ b/src/users/broker.cpp @@ -1,6 +1,7 @@ #include "broker.hpp" #include "users/user.hpp" #include "json_workload.hpp" +#include "response_behaviors.hpp" #include <boost/format.hpp> #include <fstream> diff --git a/src/users/response_behaviors.cpp b/src/users/response_behaviors.cpp index fc292be..2ee63e5 100644 --- a/src/users/response_behaviors.cpp +++ b/src/users/response_behaviors.cpp @@ -4,23 +4,13 @@ #include "../pempek_assert.hpp" -void log_behavior(LoggerUserStat *logger, shared_ptr<Job> &job, - std::string behavior_name, long delay_time, double random_value) -{ - if (logger) - { - logger->add_stat( - job, std::move(behavior_name), delay_time, random_value); - } -} - -bool rigid_job(shared_ptr<Job> job, Profile *profile, User *user, - LoggerUserStat *logger, double random_number) +bool rigid_job(shared_ptr<Job> job, Profile *profile, ReplayUser *user, + double random_number) { Parser::profile_from_duration(profile, job->profile, user->user_name); /* Log... */ - log_behavior(logger, job, "rigid", 0, random_number); + user->log_behavior(job, "rigid", 0, random_number); user->dm_stat[2 * RIGID]++; user->dm_stat[2 * RIGID + 1] += job->nb_requested_resources * std::stol(job->profile); @@ -29,11 +19,10 @@ bool rigid_job(shared_ptr<Job> job, Profile *profile, User *user, return true; } -bool renounce_job(shared_ptr<Job> job, User *user, LoggerUserStat *logger, - double random_number) +bool renounce_job(shared_ptr<Job> job, ReplayUser *user, double random_number) { /* Log... */ - log_behavior(logger, job, "renonce", 0, random_number); + user->log_behavior(job, "renonce", 0, random_number); user->dm_stat[2 * RENONCED]++; user->dm_stat[2 * RENONCED + 1] += job->nb_requested_resources * std::stol(job->profile); @@ -43,7 +32,7 @@ bool renounce_job(shared_ptr<Job> job, User *user, LoggerUserStat *logger, } bool reconfig_job(shared_ptr<Job> job, Profile *profile, double alpha, - User *user, LoggerUserStat *logger, double random_number) + ReplayUser *user, double random_number) { int orig_nb_core = job->nb_requested_resources; @@ -54,7 +43,7 @@ bool reconfig_job(shared_ptr<Job> job, Profile *profile, double alpha, /* Log... */ user->dm_stat[2 * RECONF]++; user->dm_stat[2 * RECONF + 1] += orig_nb_core * std::stol(job->profile); - log_behavior(logger, job, "reconfig", 0.0, random_number); + user->log_behavior(job, "reconfig", 0.0, random_number); /* Reconfig: divide by two rounded up the nb or cores requested */ int n = (orig_nb_core + 1) / 2; @@ -76,8 +65,8 @@ bool reconfig_job(shared_ptr<Job> job, Profile *profile, double alpha, return true; } -bool degrad_space_job(shared_ptr<Job> &job, Profile *profile, User *user, - LoggerUserStat *logger, double random_number) +bool degrad_space_job(shared_ptr<Job> &job, Profile *profile, ReplayUser *user, + double random_number) { int orig_nb_core = job->nb_requested_resources; @@ -88,7 +77,7 @@ bool degrad_space_job(shared_ptr<Job> &job, Profile *profile, User *user, /* Log... */ user->dm_stat[2 * DEGRADED]++; user->dm_stat[2 * DEGRADED + 1] += orig_nb_core * std::stol(job->profile); - log_behavior(logger, job, "degrad", 0, random_number); + user->log_behavior(job, "degrad", 0, random_number); /* Spatial degradiation: divide by two rounded up the nb or * cores requested, and keep the original duration */ @@ -99,13 +88,13 @@ bool degrad_space_job(shared_ptr<Job> &job, Profile *profile, User *user, return true; } -bool degrad_time_job(shared_ptr<Job> &job, Profile *profile, User *user, - LoggerUserStat *logger, double random_number) +bool degrad_time_job(shared_ptr<Job> &job, Profile *profile, ReplayUser *user, + double random_number) { long original_time = std::stol(job->profile); /* Log... */ - log_behavior(logger, job, "degrad_time", 0, random_number); + user->log_behavior(job, "degrad_time", 0, random_number); user->dm_stat[2 * DEGRADED]++; user->dm_stat[2 * DEGRADED + 1] += (job->nb_requested_resources) * original_time; @@ -119,13 +108,12 @@ bool degrad_time_job(shared_ptr<Job> &job, Profile *profile, User *user, } bool delay_job(double new_time, shared_ptr<Job> job, - UserSubmitQueue *original_trace, User *user, LoggerUserStat *logger, - double random_number) + UserSubmitQueue *original_trace, ReplayUser *user, double random_number) { /* Log... */ - log_behavior( - logger, job, "delay", new_time - job->submission_time, random_number); + user->log_behavior( + job, "delay", new_time - job->submission_time, random_number); user->dm_stat[2 * DELAYED]++; user->dm_stat[2 * DELAYED + 1] += job->nb_requested_resources * std::stol(job->profile); @@ -139,12 +127,11 @@ bool delay_job(double new_time, shared_ptr<Job> job, } bool C_you_later_job(double next_time, shared_ptr<Job> job, - UserSubmitQueue *original_trace, User *user, LoggerUserStat *logger, - double random_number) + UserSubmitQueue *original_trace, ReplayUser *user, double random_number) { /* Log... */ - log_behavior(logger, job, "C_you_later", next_time - job->submission_time, - random_number); + user->log_behavior( + job, "C_you_later", next_time - job->submission_time, random_number); user->dm_stat[2 * DELAYED]++; user->dm_stat[2 * DELAYED + 1] += job->nb_requested_resources * std::stol(job->profile); diff --git a/src/users/response_behaviors.hpp b/src/users/response_behaviors.hpp index 8d62de3..1dcd0d5 100644 --- a/src/users/response_behaviors.hpp +++ b/src/users/response_behaviors.hpp @@ -1,7 +1,6 @@ #include "json_workload.hpp" -#include "log_user_stat.hpp" #include "queue.hpp" -#include "user.hpp" +#include "user_replay.hpp" using namespace std; @@ -16,28 +15,22 @@ enum Behavior CONSIDER_RECONF }; -void log_behavior(LoggerUserStat *logger, shared_ptr<Job> &job, - std::string behavior_name, long delay_time, double random_value); - -bool rigid_job(shared_ptr<Job> job, Profile *profile, User *user, - LoggerUserStat *logger, double random_number); - -bool renounce_job(shared_ptr<Job> job, User *user, LoggerUserStat *logger, +bool rigid_job(shared_ptr<Job> job, Profile *profile, ReplayUser *user, double random_number); +bool renounce_job(shared_ptr<Job> job, ReplayUser *user, double random_number); + bool reconfig_job(shared_ptr<Job> job, Profile *profile, double alpha, - User *user, LoggerUserStat *logger, double random_number); + ReplayUser *user, double random_number); -bool degrad_space_job(shared_ptr<Job> &job, Profile *profile, User *user, - LoggerUserStat *logger, double random_number); +bool degrad_space_job(shared_ptr<Job> &job, Profile *profile, ReplayUser *user, + double random_number); -bool degrad_time_job(shared_ptr<Job> &job, Profile *profile, User *user, - LoggerUserStat *logger, double random_number); +bool degrad_time_job(shared_ptr<Job> &job, Profile *profile, ReplayUser *user, + double random_number); bool delay_job(double new_time, shared_ptr<Job> job, - UserSubmitQueue *original_trace, User *user, LoggerUserStat *logger, - double random_number); + UserSubmitQueue *original_trace, ReplayUser *user, double random_number); bool C_you_later_job(double next_time, shared_ptr<Job> job, - UserSubmitQueue *original_trace, User *user, LoggerUserStat *logger, - double random_number); \ No newline at end of file + UserSubmitQueue *original_trace, ReplayUser *user, double random_number); \ No newline at end of file diff --git a/src/users/user_replay.cpp b/src/users/user_replay.cpp index 409dca4..082264a 100644 --- a/src/users/user_replay.cpp +++ b/src/users/user_replay.cpp @@ -1,4 +1,5 @@ #include "users/user_replay.hpp" +#include "users/response_behaviors.hpp" #include "../pempek_assert.hpp" #include "json_workload.hpp" @@ -81,6 +82,16 @@ void ReplayUser::jobs_to_submit(double date, std::list<shared_ptr<Job>> &jobs, = lround(original_trace->top()->submission_time); } +void ReplayUser::log_behavior(shared_ptr<Job> &job, std::string behavior_name, + long delay_time, double random_value) +{ + if (logger) + { + logger->add_stat( + job, std::move(behavior_name), delay_time, random_value); + } +} + /* ReplayUserRigid */ ReplayUserRigid::ReplayUserRigid( std::string name, const rapidjson::Value ¶m, DMWindow *window) @@ -107,7 +118,7 @@ bool ReplayUserRigid::handle_job( /* If demand response mode: use behavior function handling the log etc. */ if (dm_window && dm_window->date_in_dm_window(date)) { - return rigid_job(job, profile, this, logger, -1); + return rigid_job(job, profile, this, -1); } /* Otherwise: just generate the corresponding profile by hand */ @@ -134,6 +145,7 @@ bool DMWindow::date_in_dm_window(double date) return date >= inf && date < sup; } +/* DMUserReconfig */ DMUserReconfig::DMUserReconfig( std::string name, const rapidjson::Value ¶m, DMWindow *window) { @@ -167,6 +179,7 @@ void DMUserReconfig::jobs_to_submit(double date, ReplayUser::jobs_to_submit(date, jobs, profiles); } +/* DMUserDegrad */ DMUserDegrad::DMUserDegrad( std::string name, const rapidjson::Value ¶m, DMWindow *window) { @@ -189,6 +202,7 @@ void DMUserDegrad::jobs_to_submit(double date, std::list<shared_ptr<Job>> &jobs, ReplayUser::jobs_to_submit(date, jobs, profiles); } +/* DMUserRenonce */ DMUserRenonce::DMUserRenonce( std::string name, const rapidjson::Value ¶m, DMWindow *window) { @@ -211,6 +225,7 @@ void DMUserRenonce::jobs_to_submit(double date, ReplayUser::jobs_to_submit(date, jobs, profiles); } +/* DMUserDelay */ DMUserDelay::DMUserDelay( std::string name, const rapidjson::Value ¶m, DMWindow *window) { @@ -244,13 +259,9 @@ bool DMUserReconfig::handle_job( this->dm_stat[2 * CONSIDER_RECONF]++; if (job->nb_requested_resources > 1) - { - return reconfig_job(job, profile, alpha, this, logger, -1.0); - } - else - { - return rigid_job(job, profile, this, logger, -1.0); - } + return reconfig_job(job, profile, alpha, this, -1.0); + + return rigid_job(job, profile, this, -1.0); } bool DMUserDegrad::handle_job( @@ -264,22 +275,16 @@ bool DMUserDegrad::handle_job( this->dm_stat[2 * CONSIDER_DEGRADED]++; if (job->nb_requested_resources > 1) - { - return degrad_space_job(job, profile, this, logger, -1); - } - else - { - return rigid_job(job, profile, this, logger, -1); - } + return degrad_space_job(job, profile, this, -1); + + return rigid_job(job, profile, this, -1); } bool DMUserRenonce::handle_job( double date, shared_ptr<Job> job, Profile *profile) { if (dm_window->date_in_dm_window(date)) - { - return renounce_job(job, this, logger, -1); - } + return renounce_job(job, this, -1); Parser::profile_from_duration(profile, job->profile, user_name); return true; @@ -288,9 +293,7 @@ bool DMUserRenonce::handle_job( bool DMUserDelay::handle_job(double date, shared_ptr<Job> job, Profile *profile) { if (dm_window->date_in_dm_window(date)) - { - return delay_job(dm_window->sup, job, original_trace, this, logger, -1); - } + return delay_job(dm_window->sup, job, original_trace, this, -1); Parser::profile_from_duration(profile, job->profile, user_name); return true; diff --git a/src/users/user_replay.hpp b/src/users/user_replay.hpp index 338422f..10ffd4f 100644 --- a/src/users/user_replay.hpp +++ b/src/users/user_replay.hpp @@ -3,11 +3,10 @@ */ #pragma once #include "json_workload.hpp" -#include "users/user.hpp" -#include "users/response_behaviors.hpp" -#include <random> #include "queue.hpp" #include "users/log_user_stat.hpp" +#include "users/user.hpp" +#include <random> /** * The demand response window during which the users are enclined to reduce * their consumption. (semi-closed interval [inf, sup[) @@ -20,20 +19,21 @@ struct DMWindow bool date_in_dm_window(double date); }; - class ReplayUser : public User { public: virtual ~ReplayUser(); long next_submission(); - virtual void jobs_to_submit( - double date, std::list<shared_ptr<Job>> &jobs, std::list<const Profile *> &profiles); + virtual void jobs_to_submit(double date, std::list<shared_ptr<Job>> &jobs, + std::list<const Profile *> &profiles); + void log_behavior(shared_ptr<Job> &job, std::string behavior_name, + long delay_time, double random_value); protected: /** * To be called by the constructor of each ReplayUser children. - * Initialize user name and variables associated with handling the original - * trace. + * Initialize user name and variables associated with handling the + * original trace. */ void init_ReplayUser(std::string name, const rapidjson::Value ¶m); @@ -41,13 +41,16 @@ protected: * A job is read in the original trace. Handle it depending on the user * behavior and returns if it should still be executed now. */ - virtual bool handle_job(double date, shared_ptr<Job>job, Profile *profile) = 0; + virtual bool handle_job(double date, shared_ptr<Job> job, Profile *profile) + = 0; +public: + long dm_stat[14] = { 0 }; + protected: std::string input_json; UserSubmitQueue *original_trace; DMWindow *dm_window = nullptr; - int dm_stat[14] = { 0 }; LoggerUserStat *logger = nullptr; /* Keep track of profiles to not send them twice to Batsim */ @@ -65,14 +68,13 @@ public: std::string name, const rapidjson::Value ¶m, DMWindow *window); ~ReplayUserRigid(); long next_submission(); - void jobs_to_submit( - double date, std::list<shared_ptr<Job>> &jobs, std::list<const Profile *> &profiles); + void jobs_to_submit(double date, std::list<shared_ptr<Job>> &jobs, + std::list<const Profile *> &profiles); protected: - bool handle_job(double date, shared_ptr<Job>job, Profile *profile); + bool handle_job(double date, shared_ptr<Job> job, Profile *profile); }; - /****************************************************************************** *********************** Users "demand response" ****************************** *****************************************************************************/ @@ -87,13 +89,12 @@ public: std::string name, const rapidjson::Value ¶m, DMWindow *dm_window); ~DMUserReconfig(); long next_submission(); - void jobs_to_submit( - double date, std::list<shared_ptr<Job>> &jobs, std::list<const Profile *> &profiles); + void jobs_to_submit(double date, std::list<shared_ptr<Job>> &jobs, + std::list<const Profile *> &profiles); protected: - virtual bool handle_job(double date, shared_ptr<Job> job, - Profile *profile); - double alpha = 1.0; // for the speedup model + virtual bool handle_job(double date, shared_ptr<Job> job, Profile *profile); + double alpha = 1.0; // for the speedup model }; /** @@ -107,8 +108,8 @@ public: std::string name, const rapidjson::Value ¶m, DMWindow *dm_window); ~DMUserDegrad(); long next_submission(); - void jobs_to_submit( - double date, std::list<shared_ptr<Job>> &jobs, std::list<const Profile *> &profiles); + void jobs_to_submit(double date, std::list<shared_ptr<Job>> &jobs, + std::list<const Profile *> &profiles); protected: bool handle_job(double date, shared_ptr<Job> job, Profile *profile); @@ -118,15 +119,15 @@ protected: * @brief * @details */ -class DMUserRenonce : virtual public ReplayUser +class DMUserRenonce : virtual public ReplayUser { public: DMUserRenonce( std::string name, const rapidjson::Value ¶m, DMWindow *dm_window); ~DMUserRenonce(); long next_submission(); - void jobs_to_submit( - double date, std::list<shared_ptr<Job>> &jobs, std::list<const Profile *> &profiles); + void jobs_to_submit(double date, std::list<shared_ptr<Job>> &jobs, + std::list<const Profile *> &profiles); protected: bool handle_job(double date, shared_ptr<Job> job, Profile *profile); @@ -143,8 +144,8 @@ public: std::string name, const rapidjson::Value ¶m, DMWindow *dm_window); ~DMUserDelay(); long next_submission(); - void jobs_to_submit( - double date, std::list<shared_ptr<Job>> &jobs, std::list<const Profile *> &profiles); + void jobs_to_submit(double date, std::list<shared_ptr<Job>> &jobs, + std::list<const Profile *> &profiles); protected: bool handle_job(double date, shared_ptr<Job> job, Profile *profile); diff --git a/src/users/user_windows.cpp b/src/users/user_windows.cpp index fdd8a2c..432e52f 100644 --- a/src/users/user_windows.cpp +++ b/src/users/user_windows.cpp @@ -1,6 +1,7 @@ #include "user_windows.hpp" #include "../pempek_assert.hpp" +#include "users/response_behaviors.hpp" DMWindow_list::DMWindow_list(const IntervalSet &interval) { @@ -201,21 +202,21 @@ bool DMUserMultiBehavior::exec_red_behavior_mono( { if (behavior_number == R_RENONCE_MONO) { - return renounce_job(job, this, logger, random_number); + return renounce_job(job, this, random_number); } if (behavior_number == R_C_YOU_LATER_MONO) { return C_you_later_job( - date + 3600, job, original_trace, this, logger, random_number); + date + 3600, job, original_trace, this, random_number); } if (behavior_number == R_DEGRAD_MONO) { - log_behavior(logger, job, "consider_degrad", 0, random_number); - return degrad_time_job(job, profile, this, logger, random_number); + log_behavior(job, "consider_degrad", 0, random_number); + return degrad_time_job(job, profile, this, random_number); } if (behavior_number == R_RIGID_MONO) { - return rigid_job(job, profile, this, logger, random_number); + return rigid_job(job, profile, this, random_number); } PPK_ASSERT_ERROR(false, "Undefined behavior number..."); @@ -239,8 +240,7 @@ bool DMUserMultiBehavior::red_window_behavior_mono_core( } /* if none of the above we launch the job without changing anything Rigid strategy*/ - return rigid_job( - job, profile, this, logger, behavior / red_prob_total_mono_core); + return rigid_job(job, profile, this, behavior / red_prob_total_mono_core); } bool DMUserMultiBehavior::exec_red_behavior_multi( @@ -249,26 +249,26 @@ bool DMUserMultiBehavior::exec_red_behavior_multi( { if (behavior_number == R_RENONCE_MULTI) { - return renounce_job(job, this, logger, random_number); + return renounce_job(job, this, random_number); } if (behavior_number == R_C_YOU_LATER_MULTI) { return C_you_later_job( - date + 3600, job, original_trace, this, logger, random_number); + date + 3600, job, original_trace, this, random_number); } if (behavior_number == R_DEGRAD_MULTI) { - log_behavior(logger, job, "consider_degrad", 0, random_number); - return degrad_space_job(job, profile, this, logger, random_number); + log_behavior(job, "consider_degrad", 0, random_number); + return degrad_space_job(job, profile, this, random_number); } if (behavior_number == R_RECONFIG_MULTI) { - log_behavior(logger, job, "consider_reconfig", 0, random_number); - return reconfig_job(job, profile, 1.0, this, logger, random_number); + log_behavior(job, "consider_reconfig", 0, random_number); + return reconfig_job(job, profile, 1.0, this, random_number); } if (behavior_number == R_RIGID_MULTI) { - return rigid_job(job, profile, this, logger, random_number); + return rigid_job(job, profile, this, random_number); } else { @@ -292,8 +292,7 @@ bool DMUserMultiBehavior::red_window_behavior_multi_core( i, date, job, profile, behavior / red_prob_total_multi_core); } } - return rigid_job( - job, profile, this, logger, behavior / red_prob_total_multi_core); + return rigid_job(job, profile, this, behavior / red_prob_total_multi_core); } bool DMUserMultiBehavior::red_window_behavior( @@ -321,14 +320,14 @@ bool DMUserMultiBehavior::yellow_window_behavior_mono_core( total_probability += yellow_prob_mono_core[Y_DEGRAD_MONO]; if (behavior < total_probability) { - log_behavior(logger, job, "consider_degrad", 0, - behavior / yellow_prob_total_mono_core); + log_behavior( + job, "consider_degrad", 0, behavior / yellow_prob_total_mono_core); return degrad_time_job( - job, profile, this, logger, behavior / yellow_prob_total_mono_core); + job, profile, this, behavior / yellow_prob_total_mono_core); } // if none of the above we launch the job without i.e. rigid strategy return rigid_job( - job, profile, this, logger, behavior / yellow_prob_total_mono_core); + job, profile, this, behavior / yellow_prob_total_mono_core); } bool DMUserMultiBehavior::yellow_window_behavior_multi_core( shared_ptr<Job> job, Profile *profile) @@ -338,22 +337,22 @@ bool DMUserMultiBehavior::yellow_window_behavior_multi_core( total_probability += yellow_prob_multi_core[Y_RECONFIG_MULTI]; if (behavior < total_probability) { - log_behavior(logger, job, "consider_reconfig", 0, - behavior / yellow_prob_total_multi_core); - return reconfig_job(job, profile, 1.0, this, logger, + log_behavior(job, "consider_reconfig", 0, behavior / yellow_prob_total_multi_core); + return reconfig_job( + job, profile, 1.0, this, behavior / yellow_prob_total_multi_core); } total_probability += yellow_prob_multi_core[Y_DEGRAD_MULTI]; if (behavior < total_probability) { - log_behavior(logger, job, "consider_degrad", 0, - behavior / yellow_prob_total_multi_core); - return degrad_space_job(job, profile, this, logger, - behavior / yellow_prob_total_multi_core); + log_behavior( + job, "consider_degrad", 0, behavior / yellow_prob_total_multi_core); + return degrad_space_job( + job, profile, this, behavior / yellow_prob_total_multi_core); } // if none of the above we launch the job without i.e. rigid strategy return rigid_job( - job, profile, this, logger, behavior / yellow_prob_total_multi_core); + job, profile, this, behavior / yellow_prob_total_multi_core); } bool DMUserMultiBehavior::yellow_window_behavior( shared_ptr<Job> &job, Profile *profile) @@ -392,6 +391,6 @@ bool DMUserMultiBehavior::handle_job( } else { - return rigid_job(job, profile, this, logger, 1.0); + return rigid_job(job, profile, this, 1.0); } } diff --git a/src/users/user_windows.hpp b/src/users/user_windows.hpp index d326899..a7fd8f5 100644 --- a/src/users/user_windows.hpp +++ b/src/users/user_windows.hpp @@ -82,7 +82,6 @@ protected: std::mt19937 random_gen; std::uniform_real_distribution<double> distribution = std::uniform_real_distribution<double>(0.0, 1.0); - LoggerUserStat *logger = nullptr ; double parse_proba_param(const rapidjson::Value & param, const std::vector<string> & config_param,std::vector<double> & probability_array, -- GitLab