1
0
mirror of https://github.com/OpenNebula/one.git synced 2024-12-23 17:33:56 +03:00

B #629: Execute only first scheduled action (#1657)

(cherry picked from commit 22222bfeef)
This commit is contained in:
Pavel Czerný 2022-01-04 13:45:42 +01:00 committed by Ruben S. Montero
parent 5591f88a3b
commit 1242fbca95
No known key found for this signature in database
GPG Key ID: A0CEA6FA880A1D87
3 changed files with 105 additions and 69 deletions

View File

@ -99,7 +99,13 @@ public:
int parse(std::string& error, bool clean); int parse(std::string& error, bool clean);
/** /**
* @param stime time when the time was started for relative time specs * @param stime time when the VM was started for relative time specs
* @return action execution time. Returns -1 on error
*/
time_t get_time(time_t stime);
/**
* @param stime time when the VM was started for relative time specs
* @return true if the action needs to be executed. * @return true if the action needs to be executed.
*/ */
bool is_due(time_t stime); bool is_due(time_t stime);

View File

@ -1693,27 +1693,40 @@ int Scheduler::do_scheduled_actions()
const map<int, ObjectXML*> vms = vmapool->get_objects(); const map<int, ObjectXML*> vms = vmapool->get_objects();
string action_st, args_st, error_msg;
string time_str = one_util::log_time(time(0));
for (auto vm_it=vms.begin(); vm_it != vms.end(); vm_it++) for (auto vm_it=vms.begin(); vm_it != vms.end(); vm_it++)
{ {
vm = static_cast<VirtualMachineXML *>(vm_it->second); vm = static_cast<VirtualMachineXML *>(vm_it->second);
SchedActions sas = vm->get_actions(); SchedActions sas = vm->get_actions();
for ( auto action : sas) SchedAction* first_action = nullptr;
{
ostringstream oss;
if (!action->is_due(vm->get_stime())) for (auto action : sas)
{
auto stime = vm->get_stime();
if (!action->is_due(stime))
{ {
continue; continue;
} }
action_st = action->vector_value("ACTION"); if (!first_action ||
args_st = action->vector_value("ARGS"); first_action->get_time(stime) > action->get_time(stime))
{
// Only first is_due action with lower time will be executed
first_action = action;
}
}
if (!first_action)
{
return 0;
}
ostringstream oss;
string error_msg;
string action_st = first_action->vector_value("ACTION");
int rc = VirtualMachineXML::parse_action_name(action_st); int rc = VirtualMachineXML::parse_action_name(action_st);
@ -1726,6 +1739,8 @@ int Scheduler::do_scheduled_actions()
} }
else else
{ {
string args_st = first_action->vector_value("ARGS");
rc = vmapool->action(vm->get_oid(), action_st, args_st, error_msg); rc = vmapool->action(vm->get_oid(), action_st, args_st, error_msg);
if (rc == 0) if (rc == 0)
@ -1733,13 +1748,13 @@ int Scheduler::do_scheduled_actions()
time_t done_time = time(0); time_t done_time = time(0);
time_t next_time; time_t next_time;
action->remove("MESSAGE"); first_action->remove("MESSAGE");
action->replace("DONE", done_time); first_action->replace("DONE", done_time);
do do
{ {
next_time = action->next_action(); next_time = first_action->next_action();
} while ( next_time < done_time && next_time != -1 ); } while ( next_time < done_time && next_time != -1 );
oss << "Success."; oss << "Success.";
@ -1750,24 +1765,25 @@ int Scheduler::do_scheduled_actions()
{ {
ostringstream oss_aux; ostringstream oss_aux;
string time_str = one_util::log_time(time(0));
oss_aux << time_str << " : " << error_msg; oss_aux << time_str << " : " << error_msg;
action->replace("MESSAGE", oss_aux.str()); first_action->replace("MESSAGE", oss_aux.str());
oss << "Failure. " << error_msg; oss << "Failure. " << error_msg;
} }
if (!vm->update_sched_action(action)) if (!vm->update_sched_action(first_action))
{ {
ostringstream oss; ostringstream oss;
action->to_xml(oss); first_action->to_xml(oss);
NebulaLog::warn("SCHED", string("Unable to update sched action: ") NebulaLog::warn("SCHED", string("Unable to update sched action: ")
+ oss.str()); + oss.str());
} }
NebulaLog::log("VM", Log::INFO, oss); NebulaLog::log("VM", Log::INFO, oss);
} }
}
return 0; return 0;
} }

View File

@ -295,15 +295,12 @@ static int days_in_period(SchedAction::Repeat& r, int month, int year)
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
bool SchedAction::is_due(time_t stime) time_t SchedAction::get_time(time_t stime)
{ {
time_t action_time, done_time, origin = 0; time_t action_time, origin = 0;
int repeat;
std::istringstream iss; std::istringstream iss;
bool has_done = vector_value("DONE", done_time) == 0;
bool has_repeat = vector_value("REPEAT", repeat) == 0;
std::string action_time_s = vector_value("TIME"); std::string action_time_s = vector_value("TIME");
if ( action_time_s[0] == '+' ) if ( action_time_s[0] == '+' )
@ -318,12 +315,29 @@ bool SchedAction::is_due(time_t stime)
if (iss.fail() || !iss.eof()) if (iss.fail() || !iss.eof())
{ {
return false; return -1;
} }
action_time += origin; action_time += origin;
return ((!has_done || done_time < action_time || has_repeat) return action_time;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
bool SchedAction::is_due(time_t stime)
{
time_t action_time, done_time, origin = 0;
int repeat;
bool has_done = vector_value("DONE", done_time) == 0;
bool has_repeat = vector_value("REPEAT", repeat) == 0;
action_time = get_time(stime);
return (action_time != -1)
&& ((!has_done || done_time < action_time || has_repeat)
&& action_time < time(0)); && action_time < time(0));
} }