job submit and support run in worker

This commit is contained in:
Rongsong Shen 2025-11-28 17:24:31 +08:00
parent 3630e38a07
commit e497dd1b69
18 changed files with 502 additions and 236 deletions

View file

@ -12,8 +12,11 @@
#include <readline/history.h>
#include <readline/readline.h>
#include <cjson/cJSON.h>
#include "client.h"
#include "controller.capnp.h"
#include "idgen.h"
#include "xce/types.h"
typedef int (*cmd_func_t)(int, char*[]);
@ -97,7 +100,8 @@ static void handler(int, siginfo_t*, void*);
#define CLOCKID CLOCK_REALTIME
#define SIG SIGRTMIN
static timer_t timerid;
static timer_t timerid;
static idgen_ctx_t idctx;
static setting_t settings[] = {
{ (char*)"host", (char*)NULL, (char*)"localhost" },
@ -562,12 +566,12 @@ int cmd_workerlist(int argc, char* argv[])
return rc;
}
printf("%-20s%-8s%-15s%-15s%12s%12s%12s%12s%12s%12s\n", "HostName",
printf("%-20s%-8s%-25s%-25s%12s%12s%12s%12s%12s%12s\n", "HostName",
"Status", "HostType", "HostModel", "CPUfactor", "MaxCPU", "MaxMem",
"MaxSwap", "MaxTmp", "NDisks");
for (i = 0; i < rc; i++) {
printf("%-20s%-8s%-15s%-15s%12f%12d%12f%12f%12f%12d\n",
printf("%-20s%-8s%-25s%-25s%12f%12d%12f%12f%12f%12d\n",
workers[i]->name, worker_status_str(workers[i]->status),
workers[i]->attrs->hosttype, workers[i]->attrs->hostmodel,
workers[i]->attrs->cpufactor, workers[i]->attrs->maxcpus,
@ -619,16 +623,21 @@ int cmd_joblist(int argc, char* argv[])
return rc;
}
printf("%-16s%-10s%-10s%-8s%-16s%-16s%-16s%10s%30s\n", "JobId", "User",
printf("%-26s%-10s%-10s%-8s%-16s%-16s%-16s%10s%30s\n", "JobId", "User",
"Queue", "State", "SubmitTime", "StartTime", "FinishTime", "NTasks",
"Command");
for (i = 0; i < rc; i++) {
printf("%-16ld%-10s%-10s%-8s%-16ld%-16ld%-16ld%4d,%-5d%30s\n",
jobs[i]->jobid, jobs[i]->user, jobs[i]->queue,
char buf[128];
fmt_jobid(buf, sizeof(buf) - 1, jobs[i]->jobid);
printf("%-26s%-10s%-10s%-8s%-16ld%-16ld%-16ld%4d,%-5d%30s\n", buf,
jobs[i]->submit->user, jobs[i]->submit->queue,
job_state_str(jobs[i]->state), jobs[i]->queue_time,
jobs[i]->start_time, jobs[i]->finish_time, jobs[i]->mintasks,
jobs[i]->maxtasks, jobs[i]->start_info->cmdline);
jobs[i]->start_time, jobs[i]->finish_time,
jobs[i]->submit->mintasks, jobs[i]->submit->maxtasks,
jobs[i]->submit->start_info->cmdline);
}
free(jobs);
@ -723,7 +732,7 @@ int cmd_jobrun(int argc, char* argv[])
nhosts++;
break;
case 'j':
jobid = atol(optarg);
parse_jobid(&jobid, optarg);
if (jobid == 0) {
printf("you need to specify a positive jobid with -j");
return -1;
@ -756,19 +765,76 @@ int cmd_jobrun(int argc, char* argv[])
return 0;
}
static int build_job_envs(xce_job_submit_t* submit)
{
char* names[] = { "PATH", "LSAN_OPTIONS", NULL };
int i;
cJSON* top;
cJSON* envars;
char* exdata;
top = cJSON_CreateObject();
if (top == NULL) {
return -1;
}
envars = cJSON_CreateObject();
if (envars == NULL) {
return -1;
}
cJSON_AddItemToObject(top, "sub_env_vars", envars);
for (i = 0; names[i] != NULL; i++) {
cJSON* val;
char* s = getenv(names[i]);
if (s == NULL) {
s = "";
}
val = cJSON_CreateString(s);
cJSON_AddItemToObject(envars, names[i], val);
}
exdata = cJSON_Print(top);
submit->submit->start_info->exdata = exdata;
cJSON_Delete(top);
return 0;
}
static int build_job_exdata(xce_job_submit_t* submit)
{
build_job_envs(submit);
return 0;
}
int cmd_jobsub(int argc, char* argv[])
{
int rc = 0;
xce_job_submit_t submit;
int opt;
uint64_t jobid;
uint32_t min = 1, max = 1;
int rc = 0;
job_submit_data_t submit;
xce_job_submit_t jobsubmit = { .submit = &submit };
int opt;
uint64_t jobid;
uint32_t min = 1, max = 1;
uint32_t arsize = 1;
char jobidStr[128];
optind = 1;
memset(&submit, 0x0, sizeof(submit));
submit.start_info
= (job_startinfo_t*)calloc(1, sizeof(*(submit.start_info)));
if (submit.start_info == NULL) {
perror("calloc");
return -ENOMEM;
}
while ((opt = getopt(argc, argv, "u:q:R:c:x:n:")) != -1) {
while ((opt = getopt(argc, argv, "u:q:R:c:x:n:a:")) != -1) {
switch (opt) {
case 'u':
submit.user = strdup(optarg);
@ -780,10 +846,10 @@ int cmd_jobsub(int argc, char* argv[])
submit.resreq = strdup(optarg);
break;
case 'c':
submit.cmdline = strdup(optarg);
submit.start_info->cmdline = strdup(optarg);
break;
case 'x':
submit.exdata = strdup(optarg);
submit.start_info->exdata = strdup(optarg);
break;
case 'n':
if (strchr(optarg, (int)',') != NULL) {
@ -805,6 +871,12 @@ int cmd_jobsub(int argc, char* argv[])
max = min;
}
break;
case 'a':
arsize = atoi(optarg);
if (arsize <= 0) {
arsize = 1;
}
break;
default:
printf(
"jobsub -u <user> -q <queue> -R <resreq> -c <command line>\n");
@ -827,7 +899,7 @@ int cmd_jobsub(int argc, char* argv[])
return -EINVAL;
}
if (NULLSTR(submit.cmdline)) {
if (NULLSTR(submit.start_info->cmdline)) {
printf("you need to specify job command with -c\n");
return -EINVAL;
}
@ -839,7 +911,24 @@ int cmd_jobsub(int argc, char* argv[])
submit.mintasks = min;
submit.maxtasks = max;
rc = xcecli_jobsubmit(active_ctx->ctx, &submit, &jobid);
idgen(&idctx, 0, 0, arsize, &(jobsubmit.jobid));
if (NULLSTR(submit.start_info->execuser)) {
submit.start_info->execuser = strdup(submit.user);
}
if (NULLSTR(submit.start_info->exechome)) {
submit.start_info->exechome = strdup("/tmp");
}
if (NULLSTR(submit.start_info->execcwd)) {
submit.start_info->execcwd = strdup("/tmp");
}
build_job_exdata(&jobsubmit);
jobsubmit.array_size = arsize;
rc = xcecli_jobsubmit(active_ctx->ctx, &jobsubmit, &jobid);
if (rc < 0) {
SET_ERROR(-rc);
perror("xcecli_jobsubmit");
@ -849,10 +938,13 @@ int cmd_jobsub(int argc, char* argv[])
FREEUP(submit.user);
FREEUP(submit.queue);
FREEUP(submit.resreq);
FREEUP(submit.cmdline);
FREEUP(submit.exdata);
FREEUP(submit.start_info->cmdline);
FREEUP(submit.start_info->exdata);
FREEUP(submit.start_info);
printf("jobsubmit ok: JobId: %lu\n", jobid);
fmt_jobid(jobidStr, sizeof(jobidStr) - 1, array_jobid(jobid));
printf("jobsubmit ok: JobId: %s\n", jobidStr);
return 0;
}
@ -940,7 +1032,7 @@ int cmd_jobkill(int argc, char* argv[])
signo = atoi(optarg);
break;
case 'j':
jobid = atol(optarg);
parse_jobid(&jobid, optarg);
break;
default:
break;
@ -986,7 +1078,7 @@ int cmd_jobckpt(int argc, char* argv[])
ckptoption.kill = 1;
break;
case 'j':
jobid = atol(optarg);
parse_jobid(&jobid, optarg);
break;
case 'm':
ckptoption.method = optarg;
@ -1146,7 +1238,7 @@ int cmd_runtasks(int argc, char* argv[])
dir = strdup(optarg);
break;
case 'j':
jobid = atol(optarg);
parse_jobid(&jobid, optarg);
break;
case 't':
launch_type = strdup(optarg);
@ -1268,7 +1360,7 @@ int cmd_jobfinish(int argc, char* argv[])
while ((opt = getopt(argc, argv, "j:c:")) != -1) {
switch (opt) {
case 'j':
jobid = atol(optarg);
parse_jobid(&jobid, optarg);
break;
case 'c':
code = atoi(optarg);
@ -2242,6 +2334,8 @@ int main(int argc, char* argv[])
memset(&run_jobs, 0x0, sizeof(run_jobs));
memset(&run_tasks, 0x0, sizeof(run_tasks));
idgen_ctx_init(&idctx);
while (!done) {
char* s;
int rc;