planner_improve #1

Merged
M merged 10 commits from planner_improve into main 2023-12-03 16:20:11 +00:00
6 changed files with 110 additions and 79 deletions
Showing only changes of commit 786d702c72 - Show all commits

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include "String.h"
#include "Text.h"
#include "Text.h"
class File { class File {
FILE* ptr; FILE* ptr;
public: public:
@@ -15,6 +16,9 @@ public:
fprintf(ptr, "%s\n", text.getCharArray()); fprintf(ptr, "%s\n", text.getCharArray());
} }
~File() { ~File() {
Close();
}
void Close() {
if (ptr != NULL) { if (ptr != NULL) {
fclose(ptr); fclose(ptr);
ptr = NULL; ptr = NULL;

View File

@@ -3,23 +3,25 @@ using namespace std;
#if __cplusplus >= 201703L #if __cplusplus >= 201703L
#include <filesystem> #include <filesystem>
#else
#include <unistd.h>
#endif #endif
#include "CompilationSupervisor.h" #include "CompilationSupervisor.h"
#include "RunSupervisor.h" #include "RunSupervisor.h"
#include "Global.h" #include "Global.h"
#include <unistd.h>
#include <signal.h> #include <signal.h>
//https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB_(Unix) //https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB_(Unix)
void hdl(int sig) void hdl(int sig)
{ {
String file_name = "GOT_SIGNAL_AT_"+String(Utils::getAbsoluteTime()); String file_name = "GOT_SIGNAL_AT_"+ String(Utils::getAbsoluteTime());
FILE * res = fopen(file_name.getCharArray(),"w"); FILE * res = fopen(file_name.getCharArray(),"w");
fprintf(res,"%d\n", sig); fprintf(res,"%d\n", sig);
fclose(res); fclose(res);
} }
void set_handlers(){ void set_handlers() {
#ifndef _WIN32
struct sigaction act; struct sigaction act;
memset(&act, 0, sizeof(act)); memset(&act, 0, sizeof(act));
act.sa_handler = hdl; act.sa_handler = hdl;
@@ -80,7 +82,9 @@ void set_handlers(){
sigaction(SIGVTALRM, &act, 0); sigaction(SIGVTALRM, &act, 0);
sigaction(SIGXCPU, &act, 0); sigaction(SIGXCPU, &act, 0);
sigaction(SIGXFSZ, &act, 0); sigaction(SIGXFSZ, &act, 0);
#endif
} }
int main(int argc, char ** argv) int main(int argc, char ** argv)
{ {
//+ //+
@@ -104,7 +108,12 @@ int main(int argc, char ** argv)
userWorkspace.println(); userWorkspace.println();
packageWorkspace.println(); packageWorkspace.println();
printf("%d\n", maxKernels); printf("%d\n", maxKernels);
#ifndef _WIN32
int pid = getpid(); int pid = getpid();
#else
int pid = _getpid();
#endif
printf("PID=%d\n", pid); printf("PID=%d\n", pid);
File pidFile("PID", String(pid)); File pidFile("PID", String(pid));
pidFile.Close(); pidFile.Close();

View File

@@ -22,12 +22,14 @@ public:
virtual String getStatePrefix() { virtual String getStatePrefix() {
return String("Running"); return String("Running");
} }
virtual void Finalize() {
/*
virtual void Finalize(){
this->state = Archivation; this->state = Archivation;
saveState(); saveState();
printf("Archivation started\n"); printf("Archivation started\n");
Utils::ZipFolder(String("./"), String("archive.zip")); Utils::ZipFolder(String("./"),String("archive.zip"));
printf("Archivation ended\n"); printf("Archivation ended\n");
} }
*/
}; };

View File

@@ -74,7 +74,12 @@ public:
sprintf(body, "%d", s); sprintf(body, "%d", s);
} }
} }
String(long s) { String(long s) {
String((long long)s);
}
String(long long s) {
length = 0; length = 0;
body = new char[1]; body = new char[1];
body[0] = '\0'; body[0] = '\0';
@@ -87,7 +92,7 @@ public:
} }
length = size; length = size;
body = new char[size + 1]; body = new char[size + 1];
sprintf(body, "%ld", s); sprintf(body, "%lld", s);
} }
} }

View File

@@ -5,7 +5,8 @@
#include <vector> #include <vector>
#include <queue> #include <queue>
#include "File.h" #include "File.h"
#include "Task.h" #include "Task.h"
#include "Array.h"
enum SupervisorState { enum SupervisorState {
WorkspacesCreation, //0 WorkspacesCreation, //0
@@ -87,8 +88,8 @@ public:
//todo обязательно убрать отладочную печать. //todo обязательно убрать отладочную печать.
printf("tasks count = %ld\n", this->getLength()); printf("tasks count = %ld\n", this->getLength());
while (this->state != End) { while (this->state != End) {
// printf("state=%d\n", this->state); // printf("state=%d\n", this->state);
// printf("max=%d; busy=%d; free=%d\n", maxKernels, busyKernels, freeKernels); // printf("max=%d; busy=%d; free=%d\n", maxKernels, busyKernels, freeKernels);
activeCount = 0; activeCount = 0;
for (long i = 0; i < this->getLength(); ++i) { for (long i = 0; i < this->getLength(); ++i) {
T* task = this->get(i); T* task = this->get(i);
@@ -111,6 +112,7 @@ public:
case Execution: case Execution:
if (task->getState() == WorkspaceReady) { if (task->getState() == WorkspaceReady) {
activeCount++; activeCount++;
task->start_time = Utils::getAbsoluteTime();
task->Start(); task->Start();
} }
else if (task->getState() == Running) { else if (task->getState() == Running) {
@@ -119,17 +121,18 @@ public:
} }
break; break;
default: default:
// printf("id = %ld; state = %d\n", task->getId(), task->getState()); // printf("id = %ld; state = %d\n", task->getId(), task->getState());
break; break;
} }
} }
// printf("active count = %d\n", activeCount); // printf("active count = %d\n", activeCount);
if (activeCount == 0) if (activeCount == 0)
changeState(); changeState();
Utils::Sleep(2); Utils::Sleep(2);
} }
} }
void DoWithSchedule(int maxKernels) { void DoWithSchedule(int maxKernels) {
saveState(); saveState();
@@ -162,7 +165,7 @@ public:
long activeTasks = 0; long activeTasks = 0;
long done = 0; long done = 0;
for (auto& task : this->getElements()) { for (auto& task : this->getElements()) {
if (task->getState() == WorkspaceReady) { if (task->getState() == WorkspaceReady) {
activeTasks++; activeTasks++;
sortedByKernelNeeds[task->getKernels()].push(task); sortedByKernelNeeds[task->getKernels()].push(task);
@@ -183,7 +186,7 @@ public:
for (auto& elem : sortedByKernelNeeds) { for (auto& elem : sortedByKernelNeeds) {
int freeKernels = maxKernels - busyKernels; int freeKernels = maxKernels - busyKernels;
int kernelsNeeded = elem.first; int kernelsNeeded = elem.first;
while (kernelsNeeded <= freeKernels && elem.second.size()) { while (kernelsNeeded <= freeKernels && elem.second.size()) {
T* task = elem.second.front(); T* task = elem.second.front();
elem.second.pop(); elem.second.pop();
@@ -201,18 +204,18 @@ public:
//если ядер не осталось, то нет смысла дальше смотреть //если ядер не осталось, то нет смысла дальше смотреть
if (freeKernels == 0) if (freeKernels == 0)
break; break;
} }
// очищаем от пустых ключей // очищаем от пустых ключей
for (auto& empty : emptyKeys) for (auto& empty : emptyKeys)
sortedByKernelNeeds.erase(empty); sortedByKernelNeeds.erase(empty);
// проверяем нет ли завершившихся задач // проверяем нет ли завершившихся задач
for (auto it = activeTaskSet.begin(); it != activeTaskSet.end(); ) for (auto it = activeTaskSet.begin(); it != activeTaskSet.end(); )
{ {
T* task = *(it); T* task = *(it);
if (task->Check()) { if (task->Check()) {
it++; it++;
activeTaskSet.erase(task); activeTaskSet.erase(task);
@@ -225,7 +228,7 @@ public:
} }
it++; it++;
} }
if (oldActiveTasks != activeTasks) if (oldActiveTasks != activeTasks)
printf("done %ld / %ld\n", done, this->getLength()); printf("done %ld / %ld\n", done, this->getLength());
} }
@@ -234,10 +237,11 @@ public:
} }
virtual void Finalize() {} virtual void Finalize() {}
void saveState() { void saveState() {
Utils::Sleep(1); //чтобы не было одинаковых по дате файлов. Utils::Sleep(1); //чтобы не было одинаковых по дате файлов.
String stateFile = packageWorkspace + "/state/" + getStatePrefix() + printState(); String stateFile = packageWorkspace + "/state/" + getStatePrefix() + printState();
//printf("stateFile=<%s>\n", stateFile.getCharArray()); //printf("stateFile=<%s>\n", stateFile.getCharArray());
File tmp(stateFile, Utils::getDate()); File(stateFile, Utils::getDate());
} }
}; };

View File

@@ -32,61 +32,64 @@ enum TestType {
Correctness, //1 Correctness, //1
Performance, //2 Performance, //2
}; };
class Task { class Task {
protected: protected:
long id; long id;
int maxtime;
int maxtime;
int kernels; //получение зависит от типа задачи. int kernels; //получение зависит от типа задачи.
String workspace; String workspace;
TaskState state; TaskState state;
public: public:
String printState() { long start_time;
switch (state) { String printState(){
case Inactive: switch(state){
return String("Inactive"); case Inactive:
case Waiting: return String("Inactive");
return String("Waiting"); case Waiting:
case WorkspaceCreated: return String("Waiting");
return String("WorkspaceCreated"); case WorkspaceCreated:
case WorkspaceReady: return String("WorkspaceCreated");
return String("WorkspaceReady"); case WorkspaceReady:
case Running: return String("WorkspaceReady");
return String("Running"); case Running:
case Canceled: return String("Running");
return String("Canceled"); case Canceled:
case Finished: return String("Canceled");
return String("Finished"); case Finished:
case FinishedAbortedByTimeout: return String("Finished");
return String("FinishedAbortedByTimeout"); case FinishedAbortedByTimeout:
case FinishedAbortedByUser: return String("FinishedAbortedByTimeout");
return String("FinishedAbortedByUser"); case FinishedAbortedByUser:
case Done: return String("FinishedAbortedByUser");
return String("Done"); case Done:
case DoneWithErrors: return String("Done");
return String("DoneWithErrors"); case DoneWithErrors:
case AbortedByTimeout: return String("DoneWithErrors");
return String("AbortedByTimeout"); case AbortedByTimeout:
case AbortedByUser: return String("AbortedByTimeout");
return String("AbortedByUser"); case AbortedByUser:
case Crushed: return String("AbortedByUser");
return String("Crushed"); case Crushed:
case WrongTestFormat: return String("Crushed");
return String("WrongTestFormat"); case WrongTestFormat:
case InternalError: return String("WrongTestFormat");
return String("InternalError"); case InternalError:
case Queued: return String("InternalError");
return String("Queued"); case Queued:
case NoSuchTask: return String("Queued");
return String("NoSuchTask"); case NoSuchTask:
case FailedToQueue: return String("NoSuchTask");
return String("FailedToQueue"); case FailedToQueue:
case AbortingByUser: return String("FailedToQueue");
return String("AbortingByUser"); case AbortingByUser:
default: return String("AbortingByUser");
return "?"; default:
} return "?";
} }
}
//-------------->> //-------------->>
long getId() { return id; } long getId() { return id; }
long setId(String* id_s) { long setId(String* id_s) {
@@ -146,13 +149,17 @@ public:
if (Utils::Exists(workspace + "/TIMEOUT")) { if (Utils::Exists(workspace + "/TIMEOUT")) {
state = AbortedByTimeout; state = AbortedByTimeout;
//todo определить по интервалу времени на всякий случай. //todo определить по интервалу времени на всякий случай.
}else if (Utils::Exists(workspace+"/INTERRUPT")){
state=AbortedByUser;
} else {
long now = Utils::getAbsoluteTime();
long delta = now-start_time;
if (maxtime<delta){
state=AbortedByTimeout;
}
} }
else if (Utils::Exists(workspace + "/INTERRUPT")) { }
state = AbortedByUser; if (state!=Running){
}
}
if (state != Running) {
//- //-
busyKernels = Utils::min(busyKernels - kernels, maxKernels); busyKernels = Utils::min(busyKernels - kernels, maxKernels);
freeKernels = Utils::max(0, maxKernels - busyKernels); freeKernels = Utils::max(0, maxKernels - busyKernels);