merge job rusage and pending reason support

This commit is contained in:
Rongsong Shen 2025-12-16 14:36:28 +08:00
parent 30824ae5ea
commit cb0c7fe9e7
82 changed files with 4280 additions and 2561 deletions

151
src/lib/preason.c Normal file
View file

@ -0,0 +1,151 @@
#include <errno.h>
#include "preason.h"
#include "utils.h"
void erase_job_preason(xce_job_preason_t* reasons)
{
if (reasons == NULL) {
return;
}
if (reasons->host_based_reasons != NULL) {
int i;
for (i = 0; i < reasons->nhost_reasons; i++) {
if (reasons->host_based_reasons[i] != NULL) {
FREEUP(reasons->host_based_reasons[i]->host);
FREEUP(reasons->host_based_reasons[i]);
}
}
FREEUP(reasons->host_based_reasons);
reasons->nhost_reasons = 0;
}
if (reasons->res_based_reasons != NULL) {
int i;
for (i = 0; i < reasons->nres_reasons; i++) {
if (reasons->res_based_reasons[i] == NULL) {
continue;
}
FREEUP(reasons->res_based_reasons[i]->resource);
FREEUP(reasons->res_based_reasons[i]->host);
FREEUP(reasons->res_based_reasons[i]);
}
FREEUP(reasons->res_based_reasons);
reasons->nres_reasons = 0;
}
reasons->main_reason = 0;
}
static int add_host_preason(xce_job_preason_t* reasons, int code, char* host)
{
xce_host_reason_t** p;
xce_host_reason_t* p1;
char* h;
int count;
if ((reasons == NULL) || (host == NULL)) {
return -EINVAL;
}
h = strdup(host);
if (h == NULL) {
return -ENOMEM;
}
p1 = (xce_host_reason_t*)calloc(1, sizeof(*p1));
if (p1 == NULL) {
FREEUP(h);
return -ENOMEM;
}
p1->reason = code;
p1->host = h;
count = reasons->nhost_reasons;
p = (xce_host_reason_t**)realloc(reasons->host_based_reasons,
(count + 1) * sizeof(xce_host_reason_t*));
if (p == NULL) {
FREEUP(h);
FREEUP(p1);
return -ENOMEM;
}
reasons->host_based_reasons = p;
reasons->host_based_reasons[count] = p1;
reasons->nhost_reasons++;
return reasons->nhost_reasons;
}
static int add_res_preason(xce_job_preason_t* reasons, int code, char* host,
char* res)
{
xce_res_reason_t** p;
char* h;
char* r;
int count;
xce_res_reason_t* p1;
if ((reasons == NULL) || (host == NULL) || (res == NULL)) {
return -EINVAL;
}
h = strdup(host);
r = strdup(res);
p1 = (xce_res_reason_t*)calloc(1, sizeof(*p1));
if ((h == NULL) || (r == NULL) || (p1 == NULL)) {
FREEUP(h);
FREEUP(r);
FREEUP(p1);
return -ENOMEM;
}
p1->host = h;
p1->resource = r;
p1->reason = code;
count = reasons->nres_reasons;
p = (xce_res_reason_t**)realloc(reasons->res_based_reasons,
(count + 1) * sizeof(*p));
if (p == NULL) {
FREEUP(h);
FREEUP(r);
FREEUP(p1);
return -ENOMEM;
}
reasons->res_based_reasons = p;
reasons->res_based_reasons[count] = p1;
reasons->nres_reasons++;
return reasons->nres_reasons;
}
int add_job_preason(xce_job_preason_t* reasons, int code, char* host, char* res)
{
int rc = 0;
if ((host == NULL) && (res == NULL)) {
/* set main reason */
erase_job_preason(reasons);
reasons->main_reason = code;
} else if (res == NULL) {
/* set host reason */
rc = add_host_preason(reasons, code, host);
} else {
/* set resource reason */
rc = add_res_preason(reasons, code, host, res);
}
return rc;
}