From 4318d6756f9284d86b8d2a8a200a6dba0e404712 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 3 Dec 2023 19:01:25 +0300 Subject: [PATCH] fixed --- Planner/Supervisor.h | 1 - Planner/Task.h | 140 +++++++++++++++++++++++-------------------- 2 files changed, 75 insertions(+), 66 deletions(-) diff --git a/Planner/Supervisor.h b/Planner/Supervisor.h index de2c6dcb..f89a9de3 100644 --- a/Planner/Supervisor.h +++ b/Planner/Supervisor.h @@ -112,7 +112,6 @@ public: case Execution: if (task->getState() == WorkspaceReady) { activeCount++; - task->start_time = Utils::getAbsoluteTime(); task->Start(); } else if (task->getState() == Running) { diff --git a/Planner/Task.h b/Planner/Task.h index 7d998f75..cb246abb 100644 --- a/Planner/Task.h +++ b/Planner/Task.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "File.h" #include "Utils.h" #include "Global.h" @@ -33,64 +35,67 @@ enum TestType { Performance, //2 }; -class Task { -protected: +class Task { +protected: long id; - int maxtime; + int maxtime; int kernels; //получение зависит от типа задачи. - String workspace; - TaskState state; + String workspace; + TaskState state; + std::chrono::system_clock::time_point start_time; + public: - long long start_time; - String printState(){ - switch(state){ - case Inactive: - return String("Inactive"); - case Waiting: - return String("Waiting"); - case WorkspaceCreated: - return String("WorkspaceCreated"); - case WorkspaceReady: - return String("WorkspaceReady"); - case Running: - return String("Running"); - case Canceled: - return String("Canceled"); - case Finished: - return String("Finished"); - case FinishedAbortedByTimeout: - return String("FinishedAbortedByTimeout"); - case FinishedAbortedByUser: - return String("FinishedAbortedByUser"); - case Done: - return String("Done"); - case DoneWithErrors: - return String("DoneWithErrors"); - case AbortedByTimeout: - return String("AbortedByTimeout"); - case AbortedByUser: - return String("AbortedByUser"); - case Crushed: - return String("Crushed"); - case WrongTestFormat: - return String("WrongTestFormat"); - case InternalError: - return String("InternalError"); - case Queued: - return String("Queued"); - case NoSuchTask: - return String("NoSuchTask"); - case FailedToQueue: - return String("FailedToQueue"); - case AbortingByUser: - return String("AbortingByUser"); - default: - return "?"; - } - } + String printState() { + switch (state) { + case Inactive: + return String("Inactive"); + case Waiting: + return String("Waiting"); + case WorkspaceCreated: + return String("WorkspaceCreated"); + case WorkspaceReady: + return String("WorkspaceReady"); + case Running: + return String("Running"); + case Canceled: + return String("Canceled"); + case Finished: + return String("Finished"); + case FinishedAbortedByTimeout: + return String("FinishedAbortedByTimeout"); + case FinishedAbortedByUser: + return String("FinishedAbortedByUser"); + case Done: + return String("Done"); + case DoneWithErrors: + return String("DoneWithErrors"); + case AbortedByTimeout: + return String("AbortedByTimeout"); + case AbortedByUser: + return String("AbortedByUser"); + case Crushed: + return String("Crushed"); + case WrongTestFormat: + return String("WrongTestFormat"); + case InternalError: + return String("InternalError"); + case Queued: + return String("Queued"); + case NoSuchTask: + return String("NoSuchTask"); + case FailedToQueue: + return String("FailedToQueue"); + case AbortingByUser: + return String("AbortingByUser"); + default: + return "?"; + } + } //-------------->> + void setStart() { start_time = std::chrono::system_clock::now(); } + long getId() { return id; } long setId(String* id_s) { return id = strtol(id_s->getCharArray(), NULL, 10); @@ -129,9 +134,9 @@ public: int getKernels() const { return kernels; } - virtual void Start(bool dontCheck = false) { - + void Start(bool dontCheck = false) { if (kernels <= freeKernels || dontCheck) { + setStart(); system(getStartCommand().getCharArray()); state = Running; //- @@ -140,7 +145,7 @@ public: //- } } - + //return 'true' if done, 'false' - if running virtual bool Check() { if (Utils::Exists(workspace + "/DONE")) @@ -149,17 +154,22 @@ public: if (Utils::Exists(workspace + "/TIMEOUT")) { state = AbortedByTimeout; //todo определить по интервалу времени на всякий случай. - }else if (Utils::Exists(workspace+"/INTERRUPT")){ - state=AbortedByUser; - } else { - long long now = Utils::getAbsoluteTime(); - long long delta = now-start_time; - if (maxtime diff_time = end_time - start_time; + + if (maxtime * 1.1 < diff_time.count()) { + printf("SET STATUS ABORTED by timer to %ld with time %f sec / %f sec", id, diff_time.count(), maxtime * 1.1); + state = AbortedByTimeout; + } + } + } + + if (state != Running) { //- busyKernels = Utils::min(busyKernels - kernels, maxKernels); freeKernels = Utils::max(0, maxKernels - busyKernels);